diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2db006c..e0d48cb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -83,7 +83,9 @@
     decompression routines.
   * Added `IOOverrides` and `HttpOverrides` to aid in writing tests that wish to
     mock varios `dart:io` objects.
-  * Added `Stdin.hasTerminal`.
+  * Added `Stdin.hasTerminal`, which is true if stdin is attached to a terminal.
+  * Added `waitForEventSync`, which suspends execution until an asynchronous
+    event oocurs.
 
 * `dart:isolate`
   * Rename `IMMEDIATE` and `BEFORE_NEXT_EVENT` on `Isolate` to `immediate` and
@@ -109,6 +111,16 @@
 
 ### Tool Changes
 
+* Analyzer
+
+The analyzer will no longer issue a warning when a generic type parameter is
+used as the type in an instance check. For example:
+    ```dart
+    test<T>() {
+      print(3 is T); // No warning
+    }
+    ```
+
 * Pub
 
   * Git dependencies may now include a `path` parameter, indicating that the
diff --git a/DEPS b/DEPS
index 1c6c875..642a59a 100644
--- a/DEPS
+++ b/DEPS
@@ -91,7 +91,7 @@
   "isolate_tag": "@1.1.0",
   "jinja2_rev": "@2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_tag": "@2.0.4",
-  "linter_tag": "@0.1.40",
+  "linter_tag": "@0.1.41",
   "logging_tag": "@0.11.3+1",
   "markdown_tag": "@1.0.0",
   "matcher_tag": "@0.12.1+4",
diff --git a/pkg/analysis_server/lib/src/computer/computer_closingLabels.dart b/pkg/analysis_server/lib/src/computer/computer_closingLabels.dart
index 71c5ff3..15fe295 100644
--- a/pkg/analysis_server/lib/src/computer/computer_closingLabels.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_closingLabels.dart
@@ -7,9 +7,6 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/src/generated/source.dart';
 
-// TODO(devoncarew): We should look into not creating any labels until there's
-// at least 2 levels of nesting.
-
 /**
  * A computer for [CompilationUnit] closing labels.
  */
@@ -17,6 +14,8 @@
   final LineInfo _lineInfo;
   final CompilationUnit _unit;
   final List<ClosingLabel> _closingLabels = [];
+  final Set<ClosingLabel> hasNestingSet = new Set();
+  final Set<ClosingLabel> isSingleLineSet = new Set();
 
   DartUnitClosingLabelsComputer(this._lineInfo, this._unit);
 
@@ -25,7 +24,20 @@
    */
   List<ClosingLabel> compute() {
     _unit.accept(new _DartUnitClosingLabelsComputerVisitor(this));
-    return _closingLabels;
+
+    return _closingLabels.where((ClosingLabel label) {
+      // Filter labels that don't have some nesting.
+      // Filter labels that start and end on the same line.
+      return hasNestingSet.contains(label) && !isSingleLineSet.contains(label);
+    }).toList();
+  }
+
+  void setHasNesting(ClosingLabel label) {
+    hasNestingSet.add(label);
+  }
+
+  void setSingleLine(ClosingLabel label) {
+    isSingleLineSet.add(label);
   }
 }
 
@@ -37,24 +49,33 @@
   final DartUnitClosingLabelsComputer computer;
 
   int interpolatedStringsEntered = 0;
+  List<ClosingLabel> labelStack = [];
 
   _DartUnitClosingLabelsComputerVisitor(this.computer);
 
   @override
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    ClosingLabel label;
+
     if (node.argumentList != null) {
-      var label = node.constructorName.type.name.name;
+      String labelText = node.constructorName.type.name.name;
       if (node.constructorName.name != null) {
-        label += ".${node.constructorName.name.name}";
+        labelText += ".${node.constructorName.name.name}";
       }
       // We override the node used for doing line calculations because otherwise
       // constructors that split over multiple lines (but have parens on same
       // line) would incorrectly get labels, because node.start on an instance
       // creation expression starts at the start of the expression.
-      _addLabel(node, label, checkLinesUsing: node.argumentList);
+      label = _addLabel(node, labelText, checkLinesUsing: node.argumentList);
     }
 
-    return super.visitInstanceCreationExpression(node);
+    if (label != null) _pushLabel(label);
+
+    try {
+      return super.visitInstanceCreationExpression(node);
+    } finally {
+      if (label != null) _popLabel();
+    }
   }
 
   @override
@@ -62,11 +83,19 @@
     final NodeList<TypeAnnotation> args = node.typeArguments?.arguments;
     final String typeName = args != null ? args[0]?.toString() : null;
 
+    ClosingLabel label;
+
     if (typeName != null) {
-      _addLabel(node, "<$typeName>[]");
+      label = _addLabel(node, "<$typeName>[]");
     }
 
-    return super.visitListLiteral(node);
+    if (label != null) _pushLabel(label);
+
+    try {
+      return super.visitListLiteral(node);
+    } finally {
+      if (label != null) _popLabel();
+    }
   }
 
   @override
@@ -79,10 +108,11 @@
     }
   }
 
-  void _addLabel(AstNode node, String label, {AstNode checkLinesUsing}) {
+  ClosingLabel _addLabel(AstNode node, String label,
+      {AstNode checkLinesUsing}) {
     // Never add labels if we're inside strings.
     if (interpolatedStringsEntered > 0) {
-      return;
+      return null;
     }
 
     checkLinesUsing = checkLinesUsing ?? node;
@@ -92,14 +122,32 @@
     final LineInfo_Location end =
         computer._lineInfo.getLocation(checkLinesUsing.end - 1);
 
-    int spannedLines = end.lineNumber - start.lineNumber;
-    if (spannedLines < 1) {
-      return;
-    }
-
     final ClosingLabel closingLabel =
         new ClosingLabel(node.offset, node.length, label);
 
+    int spannedLines = end.lineNumber - start.lineNumber;
+    if (spannedLines < 1) {
+      computer.setSingleLine(closingLabel);
+    }
+
+    ClosingLabel parent = _currentLabel;
+    if (parent != null) {
+      computer.setHasNesting(parent);
+      computer.setHasNesting(closingLabel);
+    }
+
     computer._closingLabels.add(closingLabel);
+
+    return closingLabel;
+  }
+
+  void _pushLabel(ClosingLabel label) {
+    labelStack.add(label);
+  }
+
+  ClosingLabel get _currentLabel => labelStack.isEmpty ? null : labelStack.last;
+
+  void _popLabel() {
+    labelStack.removeLast();
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/common_usage_sorter.dart b/pkg/analysis_server/lib/src/services/completion/dart/common_usage_sorter.dart
index a515bed..6f84fd8 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/common_usage_sorter.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/common_usage_sorter.dart
@@ -16,6 +16,7 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
 
 part 'common_usage_sorter.g.dart';
@@ -101,27 +102,44 @@
 /**
  * An [AstVisitor] used to determine the best defining type of a node.
  */
-class _BestTypeVisitor extends GeneralizingAstVisitor<DartType> {
+class _BestTypeVisitor extends UnifyingAstVisitor<DartType> {
   /**
    * The entity which the completed text will replace (or which will be
    * displaced once the completed text is inserted).  This may be an AstNode or
-   * a Token, or it may be null if the cursor is after all tokens in the file.
+   * a Token, or it may be `null` if the cursor is after all tokens in the file.
    * See field of the same name in [CompletionTarget].
    */
   final Object entity;
 
   _BestTypeVisitor(this.entity);
 
+  @override
   DartType visitConstructorName(ConstructorName node) =>
       node.period != null && node.name == entity ? node.type?.type : null;
 
+  @override
+  DartType visitNamedExpression(NamedExpression node) {
+    AstNode parent = node.parent;
+    if (parent is ArgumentListImpl) {
+      List<ParameterElement> params = parent.correspondingStaticParameters;
+      if (params != null) {
+        int index = parent.arguments.indexOf(node);
+        return params[index]?.type;
+      }
+    }
+    return super.visitNamedExpression(node);
+  }
+
+  @override
   DartType visitNode(AstNode node) {
     return null;
   }
 
+  @override
   DartType visitPrefixedIdentifier(PrefixedIdentifier node) =>
       node.identifier == entity ? node.prefix?.bestType : null;
 
+  @override
   DartType visitPropertyAccess(PropertyAccess node) =>
       node.propertyName == entity ? node.realTarget?.bestType : null;
 }
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
index 8e1519e..a43d978 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
@@ -113,14 +113,14 @@
 
   @override
   Future<List<SearchMatch>> searchTopLevelDeclarations(String pattern) async {
-    List<SearchMatch> allDeclarations = [];
+    Set<Element> allElements = new Set<Element>();
     RegExp regExp = new RegExp(pattern);
     List<AnalysisDriver> drivers = _drivers.toList();
     for (AnalysisDriver driver in drivers) {
       List<Element> elements = await driver.search.topLevelElements(regExp);
-      allDeclarations.addAll(elements.map(SearchMatchImpl.forElement));
+      allElements.addAll(elements);
     }
-    return allDeclarations;
+    return allElements.map(SearchMatchImpl.forElement).toList();
   }
 
   Future<List<SearchResult>> _searchDirectSubtypes(ClassElement type) async {
diff --git a/pkg/analysis_server/test/benchmarks_test.dart b/pkg/analysis_server/test/benchmarks_test.dart
index 5c6ecc1..4cd4a46 100644
--- a/pkg/analysis_server/test/benchmarks_test.dart
+++ b/pkg/analysis_server/test/benchmarks_test.dart
@@ -53,7 +53,7 @@
         );
         expect(r.exitCode, 0,
             reason: 'exit: ${r.exitCode}\n${r.stdout}\n${r.stderr}');
-      }, skip: true); // #31554
+      });
     }
   });
 }
diff --git a/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart b/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
index e437193..4420642 100644
--- a/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
@@ -12,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(OptionsIntegrationTest);
+    defineReflectiveTests(OptionsIntegrationTest_PreviewDart2);
   });
 }
 
@@ -79,3 +80,9 @@
     expect(error.location.startColumn, 7);
   }
 }
+
+@reflectiveTest
+class OptionsIntegrationTest_PreviewDart2 extends OptionsIntegrationTest {
+  @override
+  bool get usePreviewDart2 => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/error_test.dart b/pkg/analysis_server/test/integration/analysis/error_test.dart
index 1c32caa..fe968d7 100644
--- a/pkg/analysis_server/test/integration/analysis/error_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/error_test.dart
@@ -12,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisErrorIntegrationTest);
+    defineReflectiveTests(AnalysisErrorIntegrationTest_PreviewDart2);
   });
 }
 
@@ -98,3 +99,23 @@
     expect(errors, isEmpty);
   }
 }
+
+@reflectiveTest
+class AnalysisErrorIntegrationTest_PreviewDart2
+    extends AnalysisErrorIntegrationTest {
+  @override
+  bool get usePreviewDart2 => true;
+
+  @override
+  @failingTest
+  test_super_mixins_disabled() {
+    // Disabling super mixins is not supported in the new FE.
+    return super.test_super_mixins_disabled();
+  }
+
+  @override
+  test_super_mixins_enabled() {
+    // This does pass with the new FE.
+    return super.test_super_mixins_enabled();
+  }
+}
diff --git a/pkg/analysis_server/test/integration/analysis/get_errors_nonStandard_sdk.dart b/pkg/analysis_server/test/integration/analysis/get_errors_nonStandard_sdk.dart
index 289a332..0d18844 100644
--- a/pkg/analysis_server/test/integration/analysis/get_errors_nonStandard_sdk.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_errors_nonStandard_sdk.dart
@@ -17,6 +17,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisDomainGetErrorsTest);
+    defineReflectiveTests(AnalysisDomainGetErrorsTest_PreviewDart2);
   });
 }
 
@@ -97,3 +98,10 @@
     expect(errors[0].code, 'unused_import');
   }
 }
+
+@reflectiveTest
+class AnalysisDomainGetErrorsTest_PreviewDart2
+    extends AnalysisDomainGetErrorsTest {
+  @override
+  bool get usePreviewDart2 => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/get_errors_test.dart b/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
index 2f39542..c8a518f 100644
--- a/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
@@ -12,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetErrorsTest);
+    defineReflectiveTests(GetErrorsTest_PreviewDart2);
   });
 }
 
@@ -34,3 +35,9 @@
     return analysisFinished.then((_) => finishTest());
   }
 }
+
+@reflectiveTest
+class GetErrorsTest_PreviewDart2 extends GetErrorsTest {
+  @override
+  bool get usePreviewDart2 => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/get_hover_test.dart b/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
index 55be6ca..352df8c 100644
--- a/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
@@ -14,6 +14,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisGetHoverIntegrationTest);
+    defineReflectiveTests(AnalysisGetHoverIntegrationTest_PreviewDart2);
   });
 }
 
@@ -187,3 +188,17 @@
     });
   }
 }
+
+@reflectiveTest
+class AnalysisGetHoverIntegrationTest_PreviewDart2
+    extends AnalysisGetHoverIntegrationTest {
+  @override
+  bool get usePreviewDart2 => true;
+
+  @override
+  @failingTest
+  test_getHover() {
+    // TODO(devoncarew): NoSuchMethodError: The getter 'canonicalName' was called on null.
+    return super.test_getHover();
+  }
+}
diff --git a/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart b/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
index 7433df5..4823a1a 100644
--- a/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
@@ -15,6 +15,8 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisGetImportedElementsIntegrationTest);
+    defineReflectiveTests(
+        AnalysisGetImportedElementsIntegrationTest_PreviewDart2);
   });
 }
 
@@ -138,3 +140,10 @@
     }
   }
 }
+
+@reflectiveTest
+class AnalysisGetImportedElementsIntegrationTest_PreviewDart2
+    extends AnalysisGetImportedElementsIntegrationTest {
+  @override
+  bool get usePreviewDart2 => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/get_library_dependencies_test.dart b/pkg/analysis_server/test/integration/analysis/get_library_dependencies_test.dart
index 51a7659..dda8e99 100644
--- a/pkg/analysis_server/test/integration/analysis/get_library_dependencies_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_library_dependencies_test.dart
@@ -11,6 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetLibraryDependenciesTest);
+    defineReflectiveTests(GetLibraryDependenciesTest_PreviewDart2);
   });
 }
 
@@ -45,3 +46,10 @@
     expect(map.keys, isEmpty);
   }
 }
+
+@reflectiveTest
+class GetLibraryDependenciesTest_PreviewDart2
+    extends GetLibraryDependenciesTest {
+  @override
+  bool get usePreviewDart2 => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart b/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
index 9725e58..e9757fb 100644
--- a/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
@@ -12,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetNavigationTest);
+    defineReflectiveTests(GetNavigationTest_PreviewDart2);
   });
 }
 
@@ -65,3 +66,13 @@
     expect(result.targets, isEmpty);
   }
 }
+
+@reflectiveTest
+class GetNavigationTest_PreviewDart2 extends GetNavigationTest {
+  @override
+  bool get usePreviewDart2 => true;
+
+  @override
+  @failingTest
+  test_navigation() => super.test_navigation();
+}
diff --git a/pkg/analysis_server/test/integration/analysis/get_reachable_sources_test.dart b/pkg/analysis_server/test/integration/analysis/get_reachable_sources_test.dart
index 150c67f..532002c 100644
--- a/pkg/analysis_server/test/integration/analysis/get_reachable_sources_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_reachable_sources_test.dart
@@ -13,6 +13,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetReachableSourcesTest);
+    defineReflectiveTests(GetReachableSourcesTest_PreviewDart2);
   });
 }
 
@@ -47,3 +48,9 @@
     expect(sources[url], contains('dart:core'));
   }
 }
+
+@reflectiveTest
+class GetReachableSourcesTest_PreviewDart2 extends GetReachableSourcesTest {
+  @override
+  bool get usePreviewDart2 => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/highlights_test.dart b/pkg/analysis_server/test/integration/analysis/highlights_test.dart
index 64d3313..8091efa 100644
--- a/pkg/analysis_server/test/integration/analysis/highlights_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/highlights_test.dart
@@ -12,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisHighlightsTest);
+    defineReflectiveTests(AnalysisHighlightsTest_PreviewDart2);
   });
 }
 
@@ -144,3 +145,13 @@
     });
   }
 }
+
+@reflectiveTest
+class AnalysisHighlightsTest_PreviewDart2 extends AnalysisHighlightsTest {
+  @override
+  bool get usePreviewDart2 => true;
+
+  @override
+  @failingTest
+  test_highlights() => super.test_highlights();
+}
diff --git a/pkg/analysis_server/test/integration/analysis/highlights_test2.dart b/pkg/analysis_server/test/integration/analysis/highlights_test2.dart
index 2e672288..7d7314b 100644
--- a/pkg/analysis_server/test/integration/analysis/highlights_test2.dart
+++ b/pkg/analysis_server/test/integration/analysis/highlights_test2.dart
@@ -14,6 +14,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisHighlightsTest);
+    defineReflectiveTests(AnalysisHighlightsTest_PreviewDart2);
   });
 }
 
@@ -164,3 +165,9 @@
     });
   }
 }
+
+@reflectiveTest
+class AnalysisHighlightsTest_PreviewDart2 extends AnalysisHighlightsTest {
+  @override
+  bool get usePreviewDart2 => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/lint_test.dart b/pkg/analysis_server/test/integration/analysis/lint_test.dart
index 699b43b..803c4a1 100644
--- a/pkg/analysis_server/test/integration/analysis/lint_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/lint_test.dart
@@ -12,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(LintIntegrationTest);
+    defineReflectiveTests(LintIntegrationTest_PreviewDart2);
   });
 }
 
@@ -81,3 +82,9 @@
     expect(error.type, AnalysisErrorType.LINT);
   }
 }
+
+@reflectiveTest
+class LintIntegrationTest_PreviewDart2 extends LintIntegrationTest {
+  @override
+  bool get usePreviewDart2 => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/navigation_test.dart b/pkg/analysis_server/test/integration/analysis/navigation_test.dart
index a514323..bad4f91 100644
--- a/pkg/analysis_server/test/integration/analysis/navigation_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/navigation_test.dart
@@ -12,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisNavigationTest);
+    defineReflectiveTests(AnalysisNavigationTest_PreviewDart2);
   });
 }
 
@@ -134,3 +135,13 @@
         'TypeParameter field;', 'TypeParameter>', ElementKind.TYPE_PARAMETER);
   }
 }
+
+@reflectiveTest
+class AnalysisNavigationTest_PreviewDart2 extends AnalysisNavigationTest {
+  @override
+  bool get usePreviewDart2 => true;
+
+  @override
+  @failingTest
+  test_navigation() => super.test_navigation();
+}
diff --git a/pkg/analysis_server/test/integration/analysis/occurrences_test.dart b/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
index 94c942c..78f8ca4 100644
--- a/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
@@ -12,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(OccurrencesTest);
+    defineReflectiveTests(OccurrencesTest_PreviewDart2);
   });
 }
 
@@ -66,3 +67,9 @@
     });
   }
 }
+
+@reflectiveTest
+class OccurrencesTest_PreviewDart2 extends OccurrencesTest {
+  @override
+  bool get usePreviewDart2 => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/outline_test.dart b/pkg/analysis_server/test/integration/analysis/outline_test.dart
index bef8bd2..048ae85 100644
--- a/pkg/analysis_server/test/integration/analysis/outline_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/outline_test.dart
@@ -12,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(OutlineTest);
+    defineReflectiveTests(OutlineTest_PreviewDart2);
   });
 }
 
@@ -82,3 +83,9 @@
     });
   }
 }
+
+@reflectiveTest
+class OutlineTest_PreviewDart2 extends OutlineTest {
+  @override
+  bool get usePreviewDart2 => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/overrides_test.dart b/pkg/analysis_server/test/integration/analysis/overrides_test.dart
index 32c238c..ca1bdbea 100644
--- a/pkg/analysis_server/test/integration/analysis/overrides_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/overrides_test.dart
@@ -11,6 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(OverridesTest);
+    defineReflectiveTests(OverridesTest_PreviewDart2);
   });
 }
 
@@ -120,3 +121,9 @@
     });
   }
 }
+
+@reflectiveTest
+class OverridesTest_PreviewDart2 extends OverridesTest {
+  @override
+  bool get usePreviewDart2 => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/package_root_test.dart b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
index d2e1c2c..8423906 100644
--- a/pkg/analysis_server/test/integration/analysis/package_root_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
@@ -13,6 +13,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetAnalysisRootsTest);
+    defineReflectiveTests(SetAnalysisRootsTest_PreviewDart2);
   });
 }
 
@@ -77,3 +78,9 @@
     });
   }
 }
+
+@reflectiveTest
+class SetAnalysisRootsTest_PreviewDart2 extends SetAnalysisRootsTest {
+  @override
+  bool get usePreviewDart2 => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart b/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
index 11b7ceb..792e290 100644
--- a/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
@@ -17,6 +17,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ReanalyzeTest);
+    defineReflectiveTests(ReanalyzeTest_PreviewDart2);
   });
 }
 
@@ -47,3 +48,9 @@
     });
   }
 }
+
+@reflectiveTest
+class ReanalyzeTest_PreviewDart2 extends ReanalyzeTest {
+  @override
+  bool get usePreviewDart2 => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart b/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
index 8740ef0..23693a7 100644
--- a/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
@@ -11,6 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ReanalyzeTest);
+    defineReflectiveTests(ReanalyzeTest_PreviewDart2);
   });
 }
 
@@ -38,3 +39,9 @@
     });
   }
 }
+
+@reflectiveTest
+class ReanalyzeTest_PreviewDart2 extends ReanalyzeTest {
+  @override
+  bool get usePreviewDart2 => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart b/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
index f6c1d61..80869a9 100644
--- a/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
@@ -10,6 +10,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetAnalysisRootsTest);
+    defineReflectiveTests(SetAnalysisRootsTest_PreviewDart2);
   });
 }
 
@@ -30,3 +31,9 @@
     expect(currentAnalysisErrors[pathname], isEmpty);
   }
 }
+
+@reflectiveTest
+class SetAnalysisRootsTest_PreviewDart2 extends SetAnalysisRootsTest {
+  @override
+  bool get usePreviewDart2 => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart b/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
index 9d49157..3ee248a 100644
--- a/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
@@ -11,6 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetGeneralSubscriptionsTest);
+    defineReflectiveTests(SetGeneralSubscriptionsTest_PreviewDart2);
   });
 }
 
@@ -38,3 +39,10 @@
         true);
   }
 }
+
+@reflectiveTest
+class SetGeneralSubscriptionsTest_PreviewDart2
+    extends SetGeneralSubscriptionsTest {
+  @override
+  bool get usePreviewDart2 => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart b/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
index 10cb1a0..6a07229 100644
--- a/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
@@ -11,6 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetPriorityFilesTest);
+    defineReflectiveTests(SetPriorityFilesTest_PreviewDart2);
   });
 }
 
@@ -28,3 +29,9 @@
     expect(status.analysis.isAnalyzing, false);
   }
 }
+
+@reflectiveTest
+class SetPriorityFilesTest_PreviewDart2 extends SetPriorityFilesTest {
+  @override
+  bool get usePreviewDart2 => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart b/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
index 9524b4d..1656f80 100644
--- a/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
@@ -10,6 +10,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetSubscriptionsTest);
+    defineReflectiveTests(SetSubscriptionsTest_PreviewDart2);
   });
 }
 
@@ -30,3 +31,9 @@
     expect(currentAnalysisErrors[pathname], isEmpty);
   }
 }
+
+@reflectiveTest
+class SetSubscriptionsTest_PreviewDart2 extends SetSubscriptionsTest {
+  @override
+  bool get usePreviewDart2 => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart b/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
index d44cce7..c42ee65 100644
--- a/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
@@ -11,6 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(UpdateContentTest);
+    defineReflectiveTests(UpdateContentTest_PreviewDart2);
   });
 }
 
@@ -50,3 +51,16 @@
     });
   }
 }
+
+@reflectiveTest
+class UpdateContentTest_PreviewDart2 extends UpdateContentTest {
+  @override
+  bool get usePreviewDart2 => true;
+
+  @override
+  @failingTest
+  test_updateContent_list() {
+    // TODO(devoncarew): Class '_CompileTimeError' not found in library 'dart:core'.
+    return super.test_updateContent_list();
+  }
+}
diff --git a/pkg/analysis_server/test/integration/analysis/update_content_test.dart b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
index 0e307b3..ac2644b 100644
--- a/pkg/analysis_server/test/integration/analysis/update_content_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
@@ -11,6 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(UpdateContentTest);
+    defineReflectiveTests(UpdateContentTest_PreviewDart2);
   });
 }
 
@@ -105,3 +106,9 @@
     expect(errors2[0].location.file, equals(pathname));
   }
 }
+
+@reflectiveTest
+class UpdateContentTest_PreviewDart2 extends UpdateContentTest {
+  @override
+  bool get usePreviewDart2 => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/update_options_test.dart b/pkg/analysis_server/test/integration/analysis/update_options_test.dart
index 1172d78..f4d9610 100644
--- a/pkg/analysis_server/test/integration/analysis/update_options_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_options_test.dart
@@ -11,6 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(UpdateOptionsTest);
+    defineReflectiveTests(UpdateOptionsTest_PreviewDart2);
   });
 }
 
@@ -45,3 +46,9 @@
     expect(getErrors(pathname), hasLength(1));
   }
 }
+
+@reflectiveTest
+class UpdateOptionsTest_PreviewDart2 extends UpdateOptionsTest {
+  @override
+  bool get usePreviewDart2 => true;
+}
diff --git a/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart b/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
index f2b5bd3..b3f4e19 100644
--- a/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
+++ b/pkg/analysis_server/test/integration/completion/get_suggestions_test.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.
 
-import 'dart:async';
-
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
@@ -124,18 +122,4 @@
 class GetSuggestionsTest_PreviewDart2 extends GetSuggestionsTest {
   @override
   bool get usePreviewDart2 => true;
-
-  @override
-  @failingTest
-  Future test_getSuggestions() => super.test_getSuggestions();
-
-  @override
-  @failingTest
-  Future test_getSuggestions_onlyOverlay() =>
-      super.test_getSuggestions_onlyOverlay();
-
-  @override
-  @failingTest
-  Future test_getSuggestions_onlyOverlay_noWait() =>
-      super.test_getSuggestions_onlyOverlay_noWait();
 }
diff --git a/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart b/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
index 69acbdf..4a3e3e9 100644
--- a/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
@@ -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.
 
-import 'dart:async';
-
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/integration/edit/organize_directives_test.dart b/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
index 429c143..cc94235 100644
--- a/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
+++ b/pkg/analysis_server/test/integration/edit/organize_directives_test.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.
 
-import 'dart:async';
-
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
index 2430ec8..3cf0ef7 100644
--- a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
@@ -142,22 +142,6 @@
     return new ArgListContributor();
   }
 
-  fail_test_Annotation_local_constructor_named_param_10() async {
-    addTestSource('''
-class A { const A({int one, String two: 'defaultValue'}); }
-@A(two: '2' ^) main() { }''');
-    await computeSuggestions();
-    assertSuggestions([', one: ']);
-  }
-
-  fail_test_Annotation_local_constructor_named_param_9() async {
-    addTestSource('''
-class A { const A({int one, String two: 'defaultValue'}); }
-@A(two: '2'^) main() { }''');
-    await computeSuggestions();
-    assertSuggestions([', one: ']);
-  }
-
   test_Annotation_imported_constructor_named_param() async {
     addSource('/libA.dart', '''
 library libA; class A { const A({int one, String two: 'defaultValue'}); }''');
@@ -176,6 +160,15 @@
         namedArgumentsWithTypes: {'one': 'int', 'two': 'String'});
   }
 
+  @failingTest
+  test_Annotation_local_constructor_named_param_10() async {
+    addTestSource('''
+class A { const A({int one, String two: 'defaultValue'}); }
+@A(two: '2' ^) main() { }''');
+    await computeSuggestions();
+    assertSuggestions([', one: ']);
+  }
+
   test_Annotation_local_constructor_named_param_11() async {
     addTestSource('''
 class A { const A({int one, String two: 'defaultValue'}); }
@@ -240,6 +233,15 @@
     assertSuggestions(['one: ,']);
   }
 
+  @failingTest
+  test_Annotation_local_constructor_named_param_9() async {
+    addTestSource('''
+class A { const A({int one, String two: 'defaultValue'}); }
+@A(two: '2'^) main() { }''');
+    await computeSuggestions();
+    assertSuggestions([', one: ']);
+  }
+
   test_Annotation_local_constructor_named_param_negative() async {
     addTestSource('''
 class A { const A(int one, int two, int three, {int four, String five:
@@ -344,31 +346,6 @@
         defaultArgumentListTextRanges: null);
   }
 
-  test_ArgumentList_Flutter_InstanceCreationExpression_slivers() async {
-    configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code +
-          '\nclass CustomScrollView extends Widget { CustomScrollView('
-          '\n{List<Widget> slivers}){}}'
-    });
-
-    addTestSource('''
-import 'package:flutter/src/widgets/framework.dart';
-
-build() => new CustomScrollView(
-    ^
-  );
-''');
-
-    await computeSuggestions();
-
-    assertSuggest('slivers: <Widget>[],',
-        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        relevance: DART_RELEVANCE_NAMED_PARAMETER,
-        defaultArgListString: null,
-        selectionOffset: 18,
-        defaultArgumentListTextRanges: null);
-  }
-
   test_ArgumentList_Flutter_InstanceCreationExpression_children_dynamic() async {
     // Ensure we don't generate unneeded <dynamic> param if a future API doesn't
     // type it's children.
@@ -419,6 +396,31 @@
         defaultArgListString: null);
   }
 
+  test_ArgumentList_Flutter_InstanceCreationExpression_slivers() async {
+    configureFlutterPkg({
+      'src/widgets/framework.dart': flutter_framework_code +
+          '\nclass CustomScrollView extends Widget { CustomScrollView('
+          '\n{List<Widget> slivers}){}}'
+    });
+
+    addTestSource('''
+import 'package:flutter/src/widgets/framework.dart';
+
+build() => new CustomScrollView(
+    ^
+  );
+''');
+
+    await computeSuggestions();
+
+    assertSuggest('slivers: <Widget>[],',
+        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
+        relevance: DART_RELEVANCE_NAMED_PARAMETER,
+        defaultArgListString: null,
+        selectionOffset: 18,
+        defaultArgumentListTextRanges: null);
+  }
+
   test_ArgumentList_Flutter_MethodExpression_children() async {
     // Ensure we don't generate params for a method call
     configureFlutterPkg({
diff --git a/pkg/analysis_server/test/services/completion/dart/common_usage_sorter_test.dart b/pkg/analysis_server/test/services/completion/dart/common_usage_sorter_test.dart
index 3aa6d41..b578713 100644
--- a/pkg/analysis_server/test/services/completion/dart/common_usage_sorter_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/common_usage_sorter_test.dart
@@ -48,8 +48,26 @@
     assertNoResult('A');
   }
 
+  test_namedArgument_enum() async {
+    addTestFile('''
+enum E {e1, e2}
+f({E e}) {}
+main() {
+  f(e: ^);
+}
+''');
+    await getSuggestionsWith(<String, List<String>>{});
+    expect(replacementOffset, equals(completionOffset));
+    expect(replacementLength, equals(0));
+    assertHasResult(CompletionSuggestionKind.INVOCATION, 'E');
+    assertHasResult(CompletionSuggestionKind.INVOCATION, 'E.e1',
+        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_INCREMENT);
+    assertHasResult(CompletionSuggestionKind.INVOCATION, 'E.e2',
+        relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_INCREMENT);
+  }
+
   test_PrefixedIdentifier_field() async {
-    // SimpleIdentifier  PrefixedIdentifeir  ExpressionStatement
+    // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
     addTestFile('class A {static int s1; static int s2; x() {A.^}}');
     await getSuggestionsWith({
       '.A': ['s2']
@@ -65,7 +83,7 @@
   }
 
   test_PrefixedIdentifier_field_inPart() async {
-    // SimpleIdentifier  PrefixedIdentifeir  ExpressionStatement
+    // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
     addFile('/project/bin/myLib.dart',
         'library L; part "$testFile"; class A {static int s2;}');
     addTestFile('part of L; foo() {A.^}');
@@ -82,7 +100,7 @@
   }
 
   test_PrefixedIdentifier_getter() async {
-    // SimpleIdentifier  PrefixedIdentifeir  ExpressionStatement
+    // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
     addTestFile('class A {int get g1 => 1; int get g2 => 2; x() {new A().^}}');
     await getSuggestionsWith({
       '.A': ['g2']
@@ -98,7 +116,7 @@
   }
 
   test_PrefixedIdentifier_setter() async {
-    // SimpleIdentifier  PrefixedIdentifeir  ExpressionStatement
+    // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
     addTestFile('class A {set s1(v) {}; set s2(v) {}; x() {new A().^}}');
     await getSuggestionsWith({
       '.A': ['s2']
@@ -114,7 +132,7 @@
   }
 
   test_PrefixedIdentifier_static_method() async {
-    // SimpleIdentifier  PrefixedIdentifeir  ExpressionStatement
+    // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
     addTestFile('import "dart:async"; class A {x() {Future.^}}');
     await getSuggestionsWith({
       'dart.async.Future': ['value', 'wait']
diff --git a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
index 3bac1ad..deff0db 100644
--- a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
@@ -279,35 +279,6 @@
     return new KeywordContributor();
   }
 
-  fail_import_partial() async {
-    addTestSource('imp^ import "package:foo/foo.dart"; import "bar.dart";');
-    await computeSuggestions();
-    // TODO(danrubel) should not suggest declaration keywords
-    assertNotSuggested('class');
-  }
-
-  fail_import_partial4() async {
-    addTestSource('^ imp import "package:foo/foo.dart";');
-    await computeSuggestions();
-    // TODO(danrubel) should not suggest declaration keywords
-    assertNotSuggested('class');
-  }
-
-  fail_import_partial5() async {
-    addTestSource('library libA; imp^ import "package:foo/foo.dart";');
-    await computeSuggestions();
-    // TODO(danrubel) should not suggest declaration keywords
-    assertNotSuggested('class');
-  }
-
-  fail_import_partial6() async {
-    addTestSource(
-        'library bar; import "zoo.dart"; imp^ import "package:foo/foo.dart";');
-    await computeSuggestions();
-    // TODO(danrubel) should not suggest declaration keywords
-    assertNotSuggested('class');
-  }
-
   test_after_class() async {
     addTestSource('class A {} ^');
     await computeSuggestions();
diff --git a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
index 8df73bd..da59376 100644
--- a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
@@ -22,18 +22,6 @@
     return new StaticMemberContributor();
   }
 
-  fail_enumConst_deprecated() async {
-    addTestSource('@deprecated enum E { one, two } main() {E.^}');
-    await computeSuggestions();
-    assertNotSuggested('E');
-    // TODO(danrubel) Investigate why enum suggestion is not marked
-    // as deprecated if enum ast element is deprecated
-    assertSuggestEnumConst('one', isDeprecated: true);
-    assertSuggestEnumConst('two', isDeprecated: true);
-    assertNotSuggested('index');
-    assertSuggestField('values', 'List<E>', isDeprecated: true);
-  }
-
   test_enumConst() async {
     addTestSource('enum E { one, two } main() {E.^}');
     await computeSuggestions();
@@ -96,6 +84,19 @@
     assertSuggestField('values', 'List<E>');
   }
 
+  @failingTest
+  test_enumConst_deprecated() async {
+    addTestSource('@deprecated enum E { one, two } main() {E.^}');
+    await computeSuggestions();
+    assertNotSuggested('E');
+    // TODO(danrubel) Investigate why enum suggestion is not marked
+    // as deprecated if enum ast element is deprecated
+    assertSuggestEnumConst('one', isDeprecated: true);
+    assertSuggestEnumConst('two', isDeprecated: true);
+    assertNotSuggested('index');
+    assertSuggestField('values', 'List<E>', isDeprecated: true);
+  }
+
   test_keyword() async {
     addTestSource('class C { static C get instance => null; } main() {C.in^}');
     await computeSuggestions();
diff --git a/pkg/analysis_server/test/services/search/search_engine_test.dart b/pkg/analysis_server/test/services/search/search_engine_test.dart
index 6c3bb33..678806c 100644
--- a/pkg/analysis_server/test/services/search/search_engine_test.dart
+++ b/pkg/analysis_server/test/services/search/search_engine_test.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -23,12 +24,12 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(SearchEngineImpl2Test);
+    defineReflectiveTests(SearchEngineImplTest);
   });
 }
 
 @reflectiveTest
-class SearchEngineImpl2Test {
+class SearchEngineImplTest {
   final MemoryResourceProvider provider = new MemoryResourceProvider();
   DartSdk sdk;
   final ByteStore byteStore = new MemoryByteStore();
@@ -392,31 +393,81 @@
     expect(
         matches.where((match) => !match.libraryElement.isInSdk), hasLength(4));
 
-    void assertHasElement(String name) {
-      expect(
-          matches,
-          contains(predicate((SearchMatch m) =>
-              m.kind == MatchKind.DECLARATION && m.element.name == name)));
+    void assertHasOneElement(String name) {
+      Iterable<SearchMatch> nameMatches = matches.where((SearchMatch m) =>
+          m.kind == MatchKind.DECLARATION && m.element.name == name);
+      expect(nameMatches, hasLength(1));
     }
 
-    assertHasElement('A');
-    assertHasElement('a');
-    assertHasElement('B');
-    assertHasElement('b');
+    assertHasOneElement('A');
+    assertHasOneElement('a');
+    assertHasOneElement('B');
+    assertHasOneElement('b');
   }
 
-  AnalysisDriver _newDriver() => new AnalysisDriver(
-      scheduler,
-      logger,
-      provider,
-      byteStore,
-      contentOverlay,
-      null,
-      new SourceFactory(
-          [new DartUriResolver(sdk), new ResourceUriResolver(provider)],
-          null,
-          provider),
-      new AnalysisOptionsImpl()..strongMode = true);
+  test_searchTopLevelDeclarations_dependentPackage() async {
+    var a = _p('/a/lib/a.dart');
+    provider.newFile(a, '''
+class A {}
+''');
+    var driver1 = _newDriver();
+    driver1.addFile(a);
+
+    // The package:b uses the class A from the package:a,
+    // so it sees the declaration the element A.
+    var b = _p('/b/lib/b.dart');
+    provider.newFile(b, '''
+import 'package:a/a.dart';
+class B extends A {}
+''');
+    var driver2 = _newDriver(
+        packageUriResolver: new PackageMapUriResolver(provider, {
+      'a': [provider.getFile(a).parent]
+    }));
+    driver2.addFile(b);
+
+    while (scheduler.isAnalyzing) {
+      await new Future.delayed(new Duration(milliseconds: 1));
+    }
+
+    var searchEngine = new SearchEngineImpl([driver1, driver2]);
+    List<SearchMatch> matches =
+        await searchEngine.searchTopLevelDeclarations('.*');
+    // We get exactly two items: A and B.
+    // I.e. we get exactly one A.
+    expect(
+        matches.where((match) => !match.libraryElement.isInSdk), hasLength(2));
+
+    void assertHasOneElement(String name) {
+      Iterable<SearchMatch> nameMatches = matches.where((SearchMatch m) =>
+          m.kind == MatchKind.DECLARATION && m.element.name == name);
+      expect(nameMatches, hasLength(1));
+    }
+
+    assertHasOneElement('A');
+    assertHasOneElement('B');
+  }
+
+  AnalysisDriver _newDriver({UriResolver packageUriResolver}) {
+    var resolvers = <UriResolver>[
+      new DartUriResolver(sdk),
+      new ResourceUriResolver(provider)
+    ];
+    if (packageUriResolver != null) {
+      resolvers.add(packageUriResolver);
+    }
+    resolvers.add(new ResourceUriResolver(provider));
+
+    return new AnalysisDriver(
+        scheduler,
+        logger,
+        provider,
+        byteStore,
+        contentOverlay,
+        null,
+        new SourceFactory(resolvers, null, provider),
+        new AnalysisOptionsImpl()..strongMode = true);
+  }
 
   String _p(String path) => provider.convertPath(path);
 }
diff --git a/pkg/analysis_server/test/src/computer/closingLabels_computer_test.dart b/pkg/analysis_server/test/src/computer/closingLabels_computer_test.dart
index 533d072..aaf6879 100644
--- a/pkg/analysis_server/test/src/computer/closingLabels_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/closingLabels_computer_test.dart
@@ -30,13 +30,15 @@
   test_adjacentLinesExcluded() async {
     String content = """
 void myMethod() {
-  return /*1*/new Thing(1,
-    2)/*1:Thing*/;
+  return /*1*/new Wrapper(
+    /*2*/new Thing(1,
+      2)/*2:Thing*/
+  )/*1:Wrapper*/;
 }
 """;
 
     var labels = await _computeElements(content);
-    _compareLabels(labels, content, expectedLabelCount: 1);
+    _compareLabels(labels, content, expectedLabelCount: 2);
   }
 
   /// When constructors span many like this, the node's start position is on the first line
@@ -74,13 +76,24 @@
     _compareLabels(labels, content, expectedLabelCount: 0);
   }
 
-  test_constConstructor() async {
+  test_noLabelsForOneElement() async {
     String content = """
-void myMethod() {
-  return /*1*/const Class(
-    1,
-    2
-  )/*1:Class*/;
+Widget build(BuildContext context) {
+  return new Row(
+  );
+}
+""";
+
+    var labels = await _computeElements(content);
+    _compareLabels(labels, content, expectedLabelCount: 0);
+  }
+
+  test_labelsShownForMultipleElements() async {
+    String content = """
+Widget build(BuildContext context) {
+  return /*1*/new Row(
+    child: new RaisedButton(),
+  )/*1:Row*/;
 }
 """;
 
@@ -88,18 +101,51 @@
     _compareLabels(labels, content, expectedLabelCount: 1);
   }
 
-  test_constNamedConstructor() async {
+  test_labelsShownForMultipleElements_2() async {
     String content = """
-void myMethod() {
-  return /*1*/const Class.fromThing(
-    1,
-    2
-  )/*1:Class.fromThing*/;
+Widget build(BuildContext context) {
+  return /*1*/new Row(
+    child: /*2*/new RaisedButton(
+      onPressed: increment,
+    )/*2:RaisedButton*/,
+  )/*1:Row*/;
 }
 """;
 
     var labels = await _computeElements(content);
-    _compareLabels(labels, content, expectedLabelCount: 1);
+    _compareLabels(labels, content, expectedLabelCount: 2);
+  }
+
+  test_constConstructor() async {
+    String content = """
+void myMethod() {
+  return /*1*/new Wrapper(
+    /*2*/const Class(
+      1,
+      2
+    )/*2:Class*/
+  )/*1:Wrapper*/;
+}
+""";
+
+    var labels = await _computeElements(content);
+    _compareLabels(labels, content, expectedLabelCount: 2);
+  }
+
+  test_constNamedConstructor() async {
+    String content = """
+void myMethod() {
+  return /*1*/new Wrapper(
+    /*2*/const Class.fromThing(
+      1,
+      2
+    )/*2:Class.fromThing*/
+  )/*1:Wrapper*/;
+}
+""";
+
+    var labels = await _computeElements(content);
+    _compareLabels(labels, content, expectedLabelCount: 2);
   }
 
   test_knownBadCode1() async {
@@ -134,15 +180,17 @@
   test_listLiterals() async {
     String content = """
 void myMethod() {
-  return Widget.createWidget(/*1*/<Widget>[
-    1,
-    2
-  ]/*1:<Widget>[]*/);
+  return /*1*/new Wrapper(
+    Widget.createWidget(/*2*/<Widget>[
+      1,
+      2
+    ]/*2:<Widget>[]*/)
+  )/*1:Wrapper*/;
 }
 """;
 
     var labels = await _computeElements(content);
-    _compareLabels(labels, content, expectedLabelCount: 1);
+    _compareLabels(labels, content, expectedLabelCount: 2);
   }
 
   /// When a line contains the end of a label, we need to ensure we also include any
@@ -192,102 +240,116 @@
   test_newConstructor() async {
     String content = """
 void myMethod() {
-  return /*1*/new Class(
-    1,
-    2
-  )/*1:Class*/;
+  return /*1*/new Wrapper(
+    /*2*/new Class(
+      1,
+      2
+    )/*2:Class*/
+  )/*1:Wrapper*/;
 }
 """;
 
     var labels = await _computeElements(content);
-    _compareLabels(labels, content, expectedLabelCount: 1);
+    _compareLabels(labels, content, expectedLabelCount: 2);
   }
 
   test_newNamedConstructor() async {
     String content = """
 void myMethod() {
-  return /*1*/new Class.fromThing(
-    1,
-    2
-  )/*1:Class.fromThing*/;
+  return /*1*/new Wrapper(
+    /*2*/new Class.fromThing(
+      1,
+      2
+    )/*2:Class.fromThing*/
+  )/*1:Wrapper*/;
 }
 """;
 
     var labels = await _computeElements(content);
-    _compareLabels(labels, content, expectedLabelCount: 1);
+    _compareLabels(labels, content, expectedLabelCount: 2);
   }
 
   test_NoLabelsFromInterpolatedStrings() async {
     String content = """
 void main(HighlightRegionType type, int offset, int length) {
-  /*1*/new Fail(
-      'Not expected to find (offset=\$offset; length=\$length; type=\$type) in\\n'
-      '\${regions.join('\\n')}')/*1:Fail*/;
+  /*1*/new Wrapper(
+    /*2*/new Fail(
+        'Not expected to find (offset=\$offset; length=\$length; type=\$type) in\\n'
+        '\${regions.join('\\n')}')/*2:Fail*/
+      )/*1:Wrapper*/;
 }
     """;
 
     var labels = await _computeElements(content);
-    _compareLabels(labels, content, expectedLabelCount: 1);
+    _compareLabels(labels, content, expectedLabelCount: 2);
   }
 
   test_prefixedConstConstructor() async {
     String content = """
 import 'dart:async' as a;
 void myMethod() {
-  return /*1*/const a.Future(
-    1,
-    2
-  )/*1:a.Future*/;
+  return /*1*/new Wrapper(
+    /*2*/const a.Future(
+      1,
+      2
+    )/*2:a.Future*/
+  )/*1:Wrapper*/;
 }
 """;
 
     var labels = await _computeElements(content);
-    _compareLabels(labels, content, expectedLabelCount: 1);
+    _compareLabels(labels, content, expectedLabelCount: 2);
   }
 
   test_prefixedConstNamedConstructor() async {
     String content = """
 import 'dart:async' as a;
 void myMethod() {
-  return /*1*/const a.Future.delayed(
-    1,
-    2
-  )/*1:a.Future.delayed*/;
+  return /*1*/new Wrapper(
+    /*2*/const a.Future.delayed(
+      1,
+      2
+    )/*2:a.Future.delayed*/
+  )/*1:Wrapper*/;
 }
 """;
 
     var labels = await _computeElements(content);
-    _compareLabels(labels, content, expectedLabelCount: 1);
+    _compareLabels(labels, content, expectedLabelCount: 2);
   }
 
   test_prefixedNewConstructor() async {
     String content = """
 import 'dart:async' as a;
 void myMethod() {
-  return /*1*/new a.Future(
-    1,
-    2
-  )/*1:a.Future*/;
+  return /*1*/new Wrapper(
+    /*2*/new a.Future(
+      1,
+      2
+    )/*2:a.Future*/
+  )/*1:Wrapper*/;
 }
 """;
 
     var labels = await _computeElements(content);
-    _compareLabels(labels, content, expectedLabelCount: 1);
+    _compareLabels(labels, content, expectedLabelCount: 2);
   }
 
   test_prefixedNewNamedConstructor() async {
     String content = """
 import 'dart:async' as a;
 void myMethod() {
-  return /*1*/new a.Future.delayed(
-    1,
-    2
-  )/*1:a.Future.delayed*/;
+  return /*1*/new Wrapper(
+    /*2*/new a.Future.delayed(
+      1,
+      2
+    )/*2:a.Future.delayed*/
+  )/*1:Wrapper*/;
 }
 """;
 
     var labels = await _computeElements(content);
-    _compareLabels(labels, content, expectedLabelCount: 1);
+    _compareLabels(labels, content, expectedLabelCount: 2);
   }
 
   test_sameLineExcluded() async {
@@ -303,7 +365,7 @@
 
   /// Compares provided closing labels with expected
   /// labels extracted from the comments in the provided content.
-  _compareLabels(List<ClosingLabel> labels, String content,
+  void _compareLabels(List<ClosingLabel> labels, String content,
       {int expectedLabelCount}) {
     // Require the test pass us the expected count to guard
     // against expected annotations being mistyped and not
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 555f10d..c618f14 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -665,6 +665,10 @@
    */
   bool get isSynthetic;
 
+  /// Return `true` if this element has an annotation of the form
+  /// '@visibleForTesting'.
+  bool get isVisibleForTesting;
+
   /**
    * Return the kind of element that this is.
    */
@@ -873,6 +877,10 @@
    */
   bool get isRequired;
 
+  /// Return `true` if this annotation marks the associated member as being
+  /// visible for testing.
+  bool get isVisibleForTesting;
+
   /**
    * Return a representation of the value of this annotation, forcing the value
    * to be computed if it had not previously been computed, or `null` if the
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index af34a92..34148ff 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -261,6 +261,7 @@
   HintCode.INVALID_METHOD_OVERRIDE_TYPE_PARAMETER_BOUND,
   HintCode.INVALID_REQUIRED_PARAM,
   HintCode.INVALID_USE_OF_PROTECTED_MEMBER,
+  HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER,
   HintCode.IS_DOUBLE,
   HintCode.IS_INT,
   HintCode.IS_NOT_DOUBLE,
@@ -532,6 +533,7 @@
   StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE,
   StaticWarningCode.ASSIGNMENT_TO_CONST,
   StaticWarningCode.ASSIGNMENT_TO_FINAL,
+  StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL,
   StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER,
   StaticWarningCode.ASSIGNMENT_TO_FUNCTION,
   StaticWarningCode.ASSIGNMENT_TO_METHOD,
@@ -608,7 +610,6 @@
   StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER,
   StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE,
   StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS,
-  StaticWarningCode.TYPE_ANNOTATION_GENERIC_FUNCTION_PARAMETER,
   StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC,
   StaticWarningCode.TYPE_TEST_WITH_NON_TYPE,
   StaticWarningCode.TYPE_TEST_WITH_UNDEFINED_NAME,
@@ -666,7 +667,6 @@
   StrongModeCode.TOP_LEVEL_INSTANCE_GETTER,
   StrongModeCode.TOP_LEVEL_TYPE_ARGUMENTS,
   StrongModeCode.TOP_LEVEL_UNSUPPORTED,
-  StrongModeCode.UNSAFE_BLOCK_CLOSURE_INFERENCE,
   TodoCode.TODO,
 ];
 
diff --git a/pkg/analyzer/lib/src/context/builder.dart b/pkg/analyzer/lib/src/context/builder.dart
index 4d06fb1..6bccdb7 100644
--- a/pkg/analyzer/lib/src/context/builder.dart
+++ b/pkg/analyzer/lib/src/context/builder.dart
@@ -32,6 +32,7 @@
 import 'package:analyzer/src/services/lint.dart';
 import 'package:analyzer/src/summary/summary_sdk.dart';
 import 'package:analyzer/src/task/options.dart';
+import 'package:analyzer/src/util/sdk.dart';
 import 'package:args/args.dart';
 import 'package:front_end/src/api_prototype/byte_store.dart';
 import 'package:front_end/src/base/performance_logger.dart';
@@ -171,6 +172,19 @@
         getAnalysisOptions(path, contextRoot: contextRoot);
     //_processAnalysisOptions(context, optionMap);
     final sf = createSourceFactory(path, options);
+
+    // The folder with `vm_platform_strong.dill`, which has required patches.
+    Folder kernelPlatformFolder;
+    if (previewDart2) {
+      DartSdk sdk = sf.dartSdk;
+      if (sdk is FolderBasedDartSdk) {
+        var binariesPath = computePlatformBinariesPath(sdk.directory.path);
+        if (binariesPath != null) {
+          kernelPlatformFolder = resourceProvider.getFolder(binariesPath);
+        }
+      }
+    }
+
     AnalysisDriver driver = new AnalysisDriver(
         analysisDriverScheduler,
         performanceLog,
@@ -180,7 +194,8 @@
         contextRoot,
         sf,
         options,
-        enableKernelDriver: previewDart2);
+        enableKernelDriver: previewDart2,
+        kernelPlatformFolder: kernelPlatformFolder);
     // temporary plugin support:
     if (onCreateAnalysisDriver != null) {
       onCreateAnalysisDriver(driver, analysisDriverScheduler, performanceLog,
diff --git a/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart b/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart
index 47ebc2e..be948b9 100644
--- a/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart
@@ -84,14 +84,16 @@
 
   var uriTranslator = new UriTranslatorImpl(
       new TargetLibrariesSpecification('none', dartLibraries), packages);
+  var errorListener = new KernelErrorListener();
   var options = new ProcessedOptions(new CompilerOptions()
     ..target = new _AnalysisTarget(
         new TargetFlags(strongMode: analysisOptions.strongMode))
     ..reportMessages = false
     ..logger = logger
     ..fileSystem = new _FileSystemAdaptor(fsState, pathContext)
-    ..byteStore = byteStore);
-  return new KernelDriver(options, uriTranslator,
+    ..byteStore = byteStore
+    ..onError = errorListener.onError);
+  return new KernelDriver(options, uriTranslator, errorListener,
       metadataFactory: new AnalyzerMetadataFactory(),
       sdkOutlineBytes: sdkOutlineBytes);
 }
@@ -171,7 +173,7 @@
       }
 
       kernelResult.dependencies.forEach(addLibrary);
-      addLibrary(kernelResult.library);
+      addLibrary(kernelResult.libraryResult.library);
 
       if (DEBUG) {
         print('----------- ${targetLibrary.uriStr}');
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index e7a18bb..5ac8673 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
+import 'dart:collection';
 
 import 'package:analyzer/context/declared_variables.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -23,6 +24,7 @@
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/error/pending_error.dart';
+import 'package:analyzer/src/fasta/error_converter.dart';
 import 'package:analyzer/src/fasta/resolution_applier.dart';
 import 'package:analyzer/src/fasta/resolution_storer.dart' as kernel;
 import 'package:analyzer/src/generated/declaration_resolver.dart';
@@ -196,7 +198,7 @@
 
       // TODO(scheglov) Improve.
       AnalyzerTarget analyzerTarget;
-      await _kernelDriver.compileLibrary(
+      final kernelResult = await _kernelDriver.compileLibrary(
           (fileSystem, bool includeComments, dillTarget, uriTranslator,
                   {metadataCollector}) =>
               analyzerTarget ??= new AnalyzerTarget(fileSystem, dillTarget,
@@ -207,6 +209,18 @@
       units.forEach((file, unit) {
         _resolveFile2(file, unit, resolutions);
         _computePendingMissingRequiredParameters(file, unit);
+
+        // Invalid part URIs can result in an element with a null source
+        if (unit.element.source != null) {
+          final errorListener = new FastaErrorReporter(
+              new ErrorReporter(_getErrorListener(file), unit.element.source));
+          final libraryKernelResult = kernelResult.results
+              .expand((r) => r.libraryResults)
+              .where((r) => r.library.importUri == unit.element.source.uri)
+              .firstWhere((_) => true, orElse: () => null);
+          libraryKernelResult?.errors?.forEach((kernelError) =>
+              errorListener.reportCompilationMessage(kernelError));
+        }
       });
 
       _computeConstants();
@@ -724,24 +738,33 @@
         }
         for (var member in declaration.members) {
           if (member is ConstructorDeclaration) {
-            var context = member.element as ElementImpl;
-            var resolution = resolutions.next();
-            var applier = _createResolutionApplier(context, resolution);
-            member.initializers.accept(applier);
-            member.parameters.accept(applier);
-            member.body.accept(applier);
-            applier.applyToAnnotations(member);
-            applier.checkDone();
+            var context = member.element as ConstructorElementImpl;
+            ConstructorName redirectName = member.redirectedConstructor;
+            if (redirectName != null) {
+              var redirectedConstructor = context.redirectedConstructor;
+              redirectName.staticElement = redirectedConstructor;
+              ResolutionApplier.applyConstructorElement(
+                  redirectedConstructor.returnType,
+                  redirectedConstructor,
+                  redirectName);
+              // TODO(scheglov) Add support for type parameterized redirects.
+            } else {
+              var resolution = resolutions.next();
+              var applier = _createResolutionApplier(context, resolution);
+              member.initializers.accept(applier);
+              member.parameters.accept(applier);
+              member.body.accept(applier);
+              applier.applyToAnnotations(member);
+              applier.checkDone();
+            }
           } else if (member is FieldDeclaration) {
             List<VariableDeclaration> fields = member.fields.variables;
-            if (fields.length != 1) {
-              // TODO(scheglov) Handle this case.
-              throw new UnimplementedError('Multiple field');
-            }
             var context = fields[0].element as ElementImpl;
             var resolution = resolutions.next();
             var applier = _createResolutionApplier(context, resolution);
-            fields[0].initializer?.accept(applier);
+            for (var field in fields.reversed) {
+              field.initializer?.accept(applier);
+            }
             applier.applyToAnnotations(member);
             applier.checkDone();
           } else if (member is MethodDeclaration) {
@@ -772,14 +795,12 @@
         // No bodies to resolve.
       } else if (declaration is TopLevelVariableDeclaration) {
         List<VariableDeclaration> variables = declaration.variables.variables;
-        if (variables.length != 1) {
-          // TODO(scheglov) Handle this case.
-          throw new UnimplementedError('Multiple variables');
-        }
         var context = variables[0].element as ElementImpl;
         var resolution = resolutions.next();
         var applier = _createResolutionApplier(context, resolution);
-        variables[0].initializer?.accept(applier);
+        for (var variable in variables.reversed) {
+          variable.initializer?.accept(applier);
+        }
         applier.applyToAnnotations(declaration);
         applier.checkDone();
       } else {
@@ -999,10 +1020,11 @@
   ElementImpl context;
 
   List<Element> declaredElements = [];
-  Map<kernel.TreeNode, Element> declarationToElement = {};
-  Map<FunctionElementImpl, kernel.TreeNode> functionElementToDeclaration = {};
+  Map<kernel.TreeNode, Element> declarationToElement = new HashMap.identity();
+  Map<FunctionElementImpl, kernel.TreeNode> functionElementToDeclaration =
+      new HashMap.identity();
   Map<ParameterElementImpl, kernel.VariableDeclaration>
-      parameterElementToDeclaration = {};
+      parameterElementToDeclaration = new HashMap.identity();
 
   ResolutionApplier applier;
 
@@ -1050,6 +1072,8 @@
         element = resynthesizer
             .getElementFromCanonicalName(referencedNode.canonicalName);
         assert(element != null);
+      } else if (referencedNode is kernel.DynamicType) {
+        element = DynamicElementImpl.instance;
       } else if (referencedNode is kernel.FunctionType) {
         element = resynthesizer
             .getElementFromCanonicalName(referencedNode.typedef.canonicalName);
@@ -1059,24 +1083,32 @@
             referencedNode.classNode.canonicalName);
         assert(element != null);
       } else if (referencedNode is kernel.MemberGetterNode) {
-        var memberElement = resynthesizer
-            .getElementFromCanonicalName(referencedNode.member.canonicalName);
-        assert(memberElement != null);
-        if (memberElement is PropertyInducingElementImpl) {
-          element = memberElement.getter;
-          assert(element != null);
+        if (referencedNode.member == null) {
+          element = null;
         } else {
-          element = memberElement;
+          var memberElement = resynthesizer
+              .getElementFromCanonicalName(referencedNode.member.canonicalName);
+          assert(memberElement != null);
+          if (memberElement is PropertyInducingElementImpl) {
+            element = memberElement.getter;
+            assert(element != null);
+          } else {
+            element = memberElement;
+          }
         }
       } else if (referencedNode is kernel.MemberSetterNode) {
-        var memberElement = resynthesizer
-            .getElementFromCanonicalName(referencedNode.member.canonicalName);
-        assert(memberElement != null);
-        if (memberElement is PropertyInducingElementImpl) {
-          element = memberElement.setter;
-          assert(element != null);
+        if (referencedNode.member == null) {
+          element = null;
         } else {
-          element = memberElement;
+          var memberElement = resynthesizer
+              .getElementFromCanonicalName(referencedNode.member.canonicalName);
+          assert(memberElement != null);
+          if (memberElement is PropertyInducingElementImpl) {
+            element = memberElement.setter;
+            assert(element != null);
+          } else {
+            element = memberElement;
+          }
         }
       } else if (referencedNode is kernel.NullNode) {
         element = null;
@@ -1091,13 +1123,13 @@
       referencedElements.add(element);
     }
 
-    applier = new ResolutionApplier(
+    applier = new ValidatingResolutionApplier(
         this,
         declaredElements,
-        resolution.declarationOffsets,
         referencedElements,
-        resolution.referenceOffsets,
         resolution.kernelTypes,
+        resolution.declarationOffsets,
+        resolution.referenceOffsets,
         resolution.typeOffsets);
   }
 
@@ -1187,7 +1219,8 @@
       return element.type;
     } else if (kernelType is kernel.MemberInvocationDartType) {
       kernel.Member member = kernelType.member;
-      if (member != null) {
+      if (member is kernel.Procedure &&
+          member.kind == kernel.ProcedureKind.Method) {
         ExecutableElementImpl element =
             resynthesizer.getElementFromCanonicalName(member.canonicalName);
         return resynthesizer.instantiateFunctionType(
@@ -1197,7 +1230,7 @@
             member.function.functionType.withoutTypeParameters,
             kernelType.type);
       }
-      return null;
+      return DynamicTypeImpl.instance;
     } else if (kernelType is kernel.IndexAssignNullFunctionType) {
       return null;
     } else {
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 5c534f9..0f26c2c 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -2874,6 +2874,10 @@
    */
   static String _REQUIRED_VARIABLE_NAME = "required";
 
+  /// The name of the top-level variable used to mark a method as being
+  /// visible for testing.
+  static String _VISIBLE_FOR_TESTING_VARIABLE_NAME = "visibleForTesting";
+
   /**
    * The element representing the field, variable, or constructor being used as
    * an annotation.
@@ -2988,6 +2992,12 @@
           element.name == _REQUIRED_VARIABLE_NAME &&
           element.library?.name == _META_LIB_NAME;
 
+  @override
+  bool get isVisibleForTesting =>
+      element is PropertyAccessorElement &&
+      element.name == _VISIBLE_FOR_TESTING_VARIABLE_NAME &&
+      element.library?.name == _META_LIB_NAME;
+
   /**
    * Get the library containing this annotation.
    */
@@ -3260,6 +3270,10 @@
   }
 
   @override
+  bool get isVisibleForTesting => metadata
+      .any((ElementAnnotation annotation) => annotation.isVisibleForTesting);
+
+  @override
   LibraryElement get library =>
       getAncestor((element) => element is LibraryElement);
 
@@ -7465,6 +7479,9 @@
   bool get isSynthetic => true;
 
   @override
+  bool get isVisibleForTesting => false;
+
+  @override
   ElementKind get kind => ElementKind.ERROR;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/handle.dart b/pkg/analyzer/lib/src/dart/element/handle.dart
index f26e94e..062b10f 100644
--- a/pkg/analyzer/lib/src/dart/element/handle.dart
+++ b/pkg/analyzer/lib/src/dart/element/handle.dart
@@ -378,6 +378,9 @@
   bool get isSynthetic => actualElement.isSynthetic;
 
   @override
+  bool get isVisibleForTesting => actualElement.isVisibleForTesting;
+
+  @override
   LibraryElement get library =>
       getAncestor((element) => element is LibraryElement);
 
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index ef78722..ac66f59 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -424,6 +424,9 @@
   bool get isSynthetic => _baseElement.isSynthetic;
 
   @override
+  bool get isVisibleForTesting => _baseElement.isVisibleForTesting;
+
+  @override
   ElementKind get kind => _baseElement.kind;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/error/hint_codes.dart b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
index 63067a8..eb7771a 100644
--- a/pkg/analyzer/lib/src/dart/error/hint_codes.dart
+++ b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
@@ -303,6 +303,16 @@
       "The member '{0}' can only be used within instance members of subclasses "
       "of '{1}'.");
 
+  /// This hint is generated anywhere where a member annotated with
+  /// `@visibleForTesting` is used outside the defining library, or a test.
+  ///
+  /// Parameters:
+  /// 0: the name of the member
+  /// 1: the name of the defining class
+  static const HintCode INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER =
+      const HintCode('INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER',
+          "The member '{0}' can only be used within '{1}' or a test.");
+
   /**
    * Hint for the `x is double` type checks.
    */
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 346daf9..6241319 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -3325,6 +3325,17 @@
    * a NoSuchMethodError to be thrown, because no setter is defined for it. The
    * assignment will also give rise to a static warning for the same reason.
    */
+  static const StaticWarningCode ASSIGNMENT_TO_FINAL_LOCAL =
+      const StaticWarningCode(
+          'ASSIGNMENT_TO_FINAL_LOCAL',
+          "'{0}', a final variable, can only be set once.",
+          "Try making '{0}' non-final.");
+
+  /**
+   * 5 Variables: Attempting to assign to a final variable elsewhere will cause
+   * a NoSuchMethodError to be thrown, because no setter is defined for it. The
+   * assignment will also give rise to a static warning for the same reason.
+   */
   static const StaticWarningCode ASSIGNMENT_TO_FINAL_NO_SETTER =
       const StaticWarningCode(
           'ASSIGNMENT_TO_FINAL_NO_SETTER',
@@ -4523,19 +4534,6 @@
           "changing the import to not be deferred.");
 
   /**
-   * Not yet spec'd.
-   *
-   * Parameters:
-   * 0: the name of the generic function's type parameter that is being used in
-   *    an `is` expression
-   */
-  static const StaticWarningCode TYPE_ANNOTATION_GENERIC_FUNCTION_PARAMETER =
-      const StaticWarningCode(
-          'TYPE_ANNOTATION_GENERIC_FUNCTION_PARAMETER',
-          "The type parameter '{0}' can't be used in a type test.",
-          "Try using a different type.");
-
-  /**
    * 12.31 Type Test: It is a static warning if <i>T</i> does not denote a type
    * available in the current lexical scope.
    */
@@ -5038,12 +5036,6 @@
       "The type of '{0}' can't be inferred because {1} expressions aren't supported.",
       "Try adding an explicit type for '{0}'.");
 
-  static const StrongModeCode UNSAFE_BLOCK_CLOSURE_INFERENCE = const StrongModeCode(
-      ErrorType.STATIC_WARNING,
-      'UNSAFE_BLOCK_CLOSURE_INFERENCE',
-      "Unsafe use of a block closure in a type-inferred variable outside a function body.",
-      "Try adding a type annotation for '{0}'. See dartbug.com/26947.");
-
   @override
   final ErrorType type;
 
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 463735d..6d25fab 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -171,6 +171,7 @@
         leftParenthesis, expression, leftParenthesis?.endGroup));
   }
 
+  @override
   void handleStringPart(Token literalString) {
     assert(identical(literalString.kind, STRING_TOKEN));
     debugEvent("StringPart");
@@ -178,6 +179,13 @@
     push(literalString);
   }
 
+  @override
+  void handleInterpolationExpression(Token leftBracket, Token rightBracket) {
+    Expression expression = pop();
+    push(ast.interpolationExpression(leftBracket, expression, rightBracket));
+  }
+
+  @override
   void endLiteralString(int interpolationCount, Token endToken) {
     debugEvent("endLiteralString");
 
@@ -197,8 +205,8 @@
         var part = parts[i];
         if (part is Token) {
           elements.add(ast.interpolationString(part, part.lexeme));
-        } else if (part is Expression) {
-          elements.add(ast.interpolationExpression(null, part, null));
+        } else if (part is InterpolationExpression) {
+          elements.add(part);
         } else {
           unhandled("${part.runtimeType}", "string interpolation",
               first.charOffset, uri);
@@ -2027,8 +2035,7 @@
         optional('set', getOrSet));
     debugEvent("Method");
 
-    FunctionBody body = pop();
-    ConstructorName redirectedConstructor = null; // TODO(paulberry)
+    var bodyObject = pop();
     List<ConstructorInitializer> initializers = pop() ?? const [];
     Token separator = pop();
     FormalParameterList parameters = pop();
@@ -2039,6 +2046,19 @@
     List<Annotation> metadata = pop();
     Comment comment = _findComment(metadata, beginToken);
 
+    ConstructorName redirectedConstructor;
+    FunctionBody body;
+    if (bodyObject is FunctionBody) {
+      body = bodyObject;
+    } else if (bodyObject is _RedirectingFactoryBody) {
+      separator = bodyObject.equalToken;
+      redirectedConstructor = bodyObject.constructorName;
+      body = ast.emptyFunctionBody(endToken);
+    } else {
+      unhandled("${bodyObject.runtimeType}", "bodyObject",
+          beginToken.charOffset, uri);
+    }
+
     if (parameters == null && (getOrSet == null || optional('set', getOrSet))) {
       Token previous = typeParameters?.endToken;
       if (previous == null) {
diff --git a/pkg/analyzer/lib/src/fasta/error_converter.dart b/pkg/analyzer/lib/src/fasta/error_converter.dart
index f93c156..a4c0bec 100644
--- a/pkg/analyzer/lib/src/fasta/error_converter.dart
+++ b/pkg/analyzer/lib/src/fasta/error_converter.dart
@@ -5,6 +5,7 @@
 import 'package:analyzer/analyzer.dart';
 import 'package:analyzer/dart/ast/token.dart' show Token;
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
+import 'package:front_end/src/api_prototype/compilation_message.dart';
 import 'package:front_end/src/fasta/messages.dart' show Code, Message;
 
 /// An error reporter that knows how to convert a Fasta error into an analyzer
@@ -17,12 +18,8 @@
   /// [errorReporter].
   FastaErrorReporter(this.errorReporter);
 
-  /// Report an error based on the given [message] whose range is described by
-  /// the given [offset] and [length].
-  void reportMessage(Message message, int offset, int length) {
-    Code code = message.code;
-    Map<String, dynamic> arguments = message.arguments;
-
+  void reportByCode(String analyzerCode, int offset, int length,
+      Map<String, dynamic> arguments) {
     String stringOrTokenLexeme() {
       var text = arguments['string'];
       if (text == null) {
@@ -34,7 +31,7 @@
       return text;
     }
 
-    switch (code.analyzerCode) {
+    switch (analyzerCode) {
       case "ABSTRACT_CLASS_MEMBER":
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.ABSTRACT_CLASS_MEMBER, offset, length);
@@ -408,6 +405,12 @@
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.PREFIX_AFTER_COMBINATOR, offset, length);
         return;
+      case "REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR":
+        errorReporter?.reportErrorForOffset(
+            ParserErrorCode.REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR,
+            offset,
+            length);
+        return;
       case "RETURN_IN_GENERATOR":
         errorReporter?.reportErrorForOffset(
             CompileTimeErrorCode.RETURN_IN_GENERATOR, offset, length);
@@ -502,4 +505,40 @@
       // fall through
     }
   }
+
+  void reportCompilationMessage(CompilationMessage message) {
+    // TODO(mfairhurst) Disable this once the codes are already analyzer
+    // format (#31644)
+    final analyzerCode =
+        message.code.runes.fold<List<String>>(<String>[], (words, charcode) {
+      final char = new String.fromCharCode(charcode);
+      if (char.toUpperCase() == char) {
+        words.add(char);
+      } else {
+        words[words.length - 1] = words.last + char.toUpperCase();
+      }
+      return words;
+    }).join('_');
+
+    final code = errorCodeByUniqueName(analyzerCode);
+    if (code != null) {
+      errorReporter.reportError(new AnalysisError.forValues(
+          errorReporter.source,
+          message.span.start.offset,
+          message.span.length,
+          code,
+          message.message,
+          message.tip));
+    } else {
+      // TODO(mfairhurst) throw here, and fail all tests that trip this.
+    }
+  }
+
+  /// Report an error based on the given [message] whose range is described by
+  /// the given [offset] and [length].
+  void reportMessage(Message message, int offset, int length) {
+    Code code = message.code;
+
+    reportByCode(code.analyzerCode, offset, length, message.arguments);
+  }
 }
diff --git a/pkg/analyzer/lib/src/fasta/resolution_applier.dart b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
index 80281aa..1cf2182 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_applier.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
@@ -19,21 +19,15 @@
 /// Visitor that applies resolution data from the front end (obtained via
 /// [ResolutionStorer]) to an analyzer AST.
 class ResolutionApplier extends GeneralizingAstVisitor {
-  /// Indicates whether debug messages should be printed.
-  static const bool _debug = false;
-
   final TypeContext _typeContext;
 
   final List<Element> _declaredElements;
-  final List<int> _declaredElementOffsets;
   int _declaredElementIndex = 0;
 
   final List<Element> _referencedElements;
-  final List<int> _referencedElementOffsets;
   int _referencedElementIndex = 0;
 
   final List<kernel.DartType> _types;
-  final List<int> _typeOffsets;
   int _typeIndex = 0;
 
   /// Indicates whether we are applying resolution to an annotation.
@@ -42,14 +36,8 @@
   /// with corresponding getters.
   bool _inAnnotation = false;
 
-  ResolutionApplier(
-      this._typeContext,
-      this._declaredElements,
-      this._declaredElementOffsets,
-      this._referencedElements,
-      this._referencedElementOffsets,
-      this._types,
-      this._typeOffsets);
+  ResolutionApplier(this._typeContext, this._declaredElements,
+      this._referencedElements, this._types);
 
   /// Apply resolution to annotations of the given [node].
   void applyToAnnotations(AnnotatedNode node) {
@@ -62,15 +50,15 @@
   void checkDone() {
     if (_declaredElementIndex != _declaredElements.length) {
       throw new StateError('Some declarations were not consumed, starting at '
-          'offset ${_declaredElementOffsets[_declaredElementIndex]}');
+          '${_declaredElements[_declaredElementIndex]}');
     }
     if (_referencedElementIndex != _referencedElements.length) {
       throw new StateError('Some references were not consumed, starting at '
-          'offset ${_referencedElementOffsets[_referencedElementIndex]}');
+          '${_referencedElements[_referencedElementIndex]}');
     }
     if (_typeIndex != _types.length) {
-      throw new StateError('Some types were not consumed, starting at offset '
-          '${_typeOffsets[_typeIndex]}');
+      throw new StateError(
+          'Some types were not consumed, starting at ${_types[_typeIndex]}');
     }
   }
 
@@ -251,7 +239,7 @@
         }
       }
 
-      _applyParameters(element.parameters, parameterList.parameters);
+      applyParameters(element.parameters, parameterList);
     }
 
     functionExpression.body?.accept(this);
@@ -269,7 +257,7 @@
     if (element != null) {
       node.element = element;
       node.staticType = element.type;
-      _applyParameters(element.parameters, parameterList.parameters);
+      applyParameters(element.parameters, parameterList);
     }
 
     // Apply resolution to default values.
@@ -314,33 +302,15 @@
 
     DartType type = _getTypeFor(constructorName);
     ConstructorElement element = _getReferenceFor(constructorName);
-    ClassElement classElement = element?.enclosingElement;
 
     node.staticElement = element;
     node.staticType = type;
 
-    Identifier typeIdentifier = constructorName.type.name;
-    if (typeIdentifier is SimpleIdentifier) {
-      applyToTypeAnnotation(type, constructorName.type);
-      if (constructorName.name != null) {
-        constructorName.name.staticElement = element;
-      }
-    } else if (typeIdentifier is PrefixedIdentifier) {
-      // TODO(scheglov) Rewrite AST using knowledge about prefixes.
-      // TODO(scheglov) Add support for `new prefix.Type()`.
-      // TODO(scheglov) Add support for `new prefix.Type.name()`.
-      assert(constructorName.name == null);
-      constructorName.period = typeIdentifier.period;
-      constructorName.name = typeIdentifier.identifier;
-      SimpleIdentifier classNode = typeIdentifier.prefix;
-      constructorName.type = astFactory.typeName(classNode, null);
-      classNode.staticElement = classElement;
-      classNode.staticType = type;
-      constructorName.name.staticElement = element;
-    }
+    applyConstructorElement(type, element, constructorName);
 
-    node.argumentList?.accept(this);
-    _associateArgumentsWithParameters(element?.parameters, node.argumentList);
+    ArgumentList argumentList = node.argumentList;
+    _associateArgumentsWithParameters(element?.parameters, argumentList);
+    _applyResolutionToArguments(argumentList);
   }
 
   @override
@@ -376,13 +346,18 @@
 
     ArgumentList argumentList = node.argumentList;
 
-    _getReferenceFor(node.methodName); // raw element
+    Element invokeElement = _getReferenceFor(node.methodName);
     DartType invokeType = _getTypeFor(node.methodName);
     DartType resultType = _getTypeFor(argumentList);
 
+    if (invokeElement is PropertyInducingElement) {
+      PropertyInducingElement property = invokeElement;
+      invokeElement = property.getter;
+    }
+
     node.staticInvokeType = invokeType;
     node.staticType = resultType;
-    node.methodName.staticElement = invokeType.element;
+    node.methodName.staticElement = invokeElement;
     node.methodName.staticType = invokeType;
 
     if (invokeType is FunctionType) {
@@ -392,15 +367,7 @@
       _associateArgumentsWithParameters(invokeType.parameters, argumentList);
     }
 
-    // Apply resolution to arguments.
-    // Skip names of named arguments.
-    for (var argument in argumentList.arguments) {
-      if (argument is NamedExpression) {
-        argument.expression.accept(this);
-      } else {
-        argument.accept(this);
-      }
-    }
+    _applyResolutionToArguments(argumentList);
   }
 
   @override
@@ -424,36 +391,8 @@
 
   @override
   void visitPrefixedIdentifier(PrefixedIdentifier node) {
-    Element element =
-        _getReferenceFor(node.identifier, nullIfDifferentOffset: true);
-    if (element != null) {
-      // If the element is for the identifier, then this is a static element.
-      DartType type = _getTypeFor(node.identifier);
-      if (element is PropertyAccessorElement) {
-        assert(element.isStatic);
-        node.identifier.staticElement = element;
-        node.identifier.staticType = type;
-        var enclosingElement = element.enclosingElement;
-        if (enclosingElement is ClassElement) {
-          node.prefix.staticElement = enclosingElement;
-          node.prefix.staticType = enclosingElement.type;
-        } else {
-          // TODO(scheglov) Support for prefixed top-level variables?
-          throw new UnimplementedError('(${element.runtimeType}) $element');
-        }
-      } else {
-        // TODO(scheglov) Support for methods?
-        throw new UnimplementedError('(${element.runtimeType}) $element');
-      }
-    } else {
-      // If the element is not for the identifier, this is actually a property.
-      // The element and type must be for the prefix.
-      node.prefix.staticElement = _getReferenceFor(node.prefix);
-      node.prefix.staticType = _getTypeFor(node.prefix);
-      // The resolution for the identifier follows.
-      node.identifier.staticElement = _getReferenceFor(node.identifier);
-      node.identifier.staticType = _getTypeFor(node.identifier);
-    }
+    node.prefix.accept(this);
+    node.identifier.accept(this);
     node.staticType = node.identifier.staticType;
   }
 
@@ -488,6 +427,20 @@
   }
 
   @override
+  void visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) {
+    SimpleIdentifier constructorName = node.constructorName;
+
+    ConstructorElement element = _getReferenceFor(constructorName ?? node);
+    node.staticElement = element;
+    constructorName?.staticElement = element;
+
+    ArgumentList argumentList = node.argumentList;
+    _associateArgumentsWithParameters(element?.parameters, argumentList);
+    _applyResolutionToArguments(argumentList);
+  }
+
+  @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
     node.staticElement = _getReferenceFor(node);
     super.visitSimpleIdentifier(node);
@@ -564,10 +517,6 @@
     if (node.parent is TopLevelVariableDeclaration) {
       node.variables.accept(this);
     } else {
-      if (node.variables.length != 1) {
-        // TODO(paulberry): handle this case
-        throw new UnimplementedError('Multiple variables in one declaration');
-      }
       if (node.metadata.isNotEmpty) {
         // TODO(paulberry): handle this case
         throw new UnimplementedError('Metadata on a variable declaration list');
@@ -583,6 +532,17 @@
     }
   }
 
+  /// Apply resolution to arguments of the [argumentList].
+  void _applyResolutionToArguments(ArgumentList argumentList) {
+    for (var argument in argumentList.arguments) {
+      if (argument is NamedExpression) {
+        argument.expression.accept(this);
+      } else {
+        argument.accept(this);
+      }
+    }
+  }
+
   /// Associate arguments of the [argumentList] with the [parameters].
   void _associateArgumentsWithParameters(
       List<ParameterElement> parameters, ArgumentList argumentList) {
@@ -630,46 +590,12 @@
   /// Return the element associated with the declaration represented by the
   /// given [node].
   Element _getDeclarationFor(AstNode node) {
-    int nodeOffset = node.offset;
-    if (_debug) {
-      print('Getting declaration element for $node at $nodeOffset');
-    }
-    if (_declaredElementIndex >= _declaredElements.length) {
-      throw new StateError(
-          'No declaration information for $node at $nodeOffset');
-    }
-    int elementOffset = _declaredElementOffsets[_declaredElementIndex];
-    if (nodeOffset != elementOffset) {
-      throw new StateError(
-          'Expected element declaration for analyzer offset $nodeOffset; '
-          'got one for kernel offset $elementOffset');
-    }
-
     return _declaredElements[_declaredElementIndex++];
   }
 
   /// Return the element associated with the reference represented by the
   /// given [entity].
-  Element _getReferenceFor(SyntacticEntity entity,
-      {bool nullIfDifferentOffset: false}) {
-    int entityOffset = entity.offset;
-    if (_debug) {
-      print('Getting reference element for $entity at $entityOffset');
-    }
-    if (_referencedElementIndex >= _referencedElements.length) {
-      throw new StateError(
-          'No reference information for $entity at $entityOffset');
-    }
-    int elementOffset = _referencedElementOffsets[_referencedElementIndex];
-    if (entityOffset != elementOffset) {
-      if (nullIfDifferentOffset) {
-        return null;
-      }
-      throw new StateError(
-          'Expected element reference for analyzer offset $entityOffset; '
-          'got one for kernel offset $elementOffset');
-    }
-
+  Element _getReferenceFor(SyntacticEntity entity) {
     Element element = _referencedElements[_referencedElementIndex++];
     if (_inAnnotation && element is PropertyInducingElement) {
       return element.getter;
@@ -684,23 +610,99 @@
   /// optional parameter (i.e. [Null]).
   DartType _getTypeFor(SyntacticEntity entity, {bool synthetic: false}) {
     assert(!synthetic || entity == null);
-
-    var entityOffset = synthetic ? -1 : entity.offset;
-    if (_debug) {
-      print('Getting type for $entity at $entityOffset');
-    }
-    if (_typeIndex >= _types.length) {
-      throw new StateError('No type information for $entity at $entityOffset');
-    }
-    if (entityOffset != _typeOffsets[_typeIndex]) {
-      throw new StateError('Expected a type for $entity at $entityOffset; '
-          'got one for kernel offset ${_typeOffsets[_typeIndex]}');
-    }
-
     kernel.DartType kernelType = _types[_typeIndex++];
     return _typeContext.translateType(kernelType);
   }
 
+  /// Apply the [type] that is created by the [constructorName] and the
+  /// [constructorElement] it references.
+  static void applyConstructorElement(DartType type,
+      ConstructorElement constructorElement, ConstructorName constructorName) {
+    ClassElement classElement = constructorElement?.enclosingElement;
+
+    Identifier typeIdentifier = constructorName.type.name;
+    if (typeIdentifier is SimpleIdentifier) {
+      applyToTypeAnnotation(type, constructorName.type);
+      if (constructorName.name != null) {
+        constructorName.name.staticElement = constructorElement;
+      }
+    } else if (typeIdentifier is PrefixedIdentifier) {
+      // TODO(scheglov) Rewrite AST using knowledge about prefixes.
+      // TODO(scheglov) Add support for `new prefix.Type()`.
+      // TODO(scheglov) Add support for `new prefix.Type.name()`.
+      assert(constructorName.name == null);
+      constructorName.period = typeIdentifier.period;
+      constructorName.name = typeIdentifier.identifier;
+
+      SimpleIdentifier classNode = typeIdentifier.prefix;
+      classNode.staticElement = classElement;
+      classNode.staticType = type;
+
+      constructorName.type = astFactory.typeName(classNode, null);
+      constructorName.type.type = type;
+      constructorName.name.staticElement = constructorElement;
+    }
+  }
+
+  /// Apply the types of the [parameterElements] to the [parameterList] that
+  /// have an explicit type annotation.
+  static void applyParameters(List<ParameterElement> parameterElements,
+      FormalParameterList parameterList) {
+    List<FormalParameter> parameters = parameterList.parameters;
+
+    int length = parameterElements.length;
+    if (parameters.length != length) {
+      throw new StateError('Parameter counts do not match');
+    }
+    for (int i = 0; i < length; i++) {
+      ParameterElementImpl element = parameterElements[i];
+      FormalParameter parameter = parameters[i];
+
+      NormalFormalParameter normalParameter;
+      if (parameter is NormalFormalParameter) {
+        normalParameter = parameter;
+      } else if (parameter is DefaultFormalParameter) {
+        normalParameter = parameter.parameter;
+      }
+      assert(normalParameter != null);
+
+      if (normalParameter is SimpleFormalParameterImpl) {
+        normalParameter.element = element;
+      }
+
+      if (normalParameter.identifier != null) {
+        element.nameOffset = normalParameter.identifier.offset;
+        normalParameter.identifier.staticElement = element;
+        normalParameter.identifier.staticType = element.type;
+      }
+
+      // Apply the type or the return type, if a function typed parameter.
+      TypeAnnotation functionReturnType;
+      FormalParameterList functionParameterList;
+      if (normalParameter is SimpleFormalParameter) {
+        applyToTypeAnnotation(element.type, normalParameter.type);
+      } else if (normalParameter is FunctionTypedFormalParameter) {
+        functionReturnType = normalParameter.returnType;
+        functionParameterList = normalParameter.parameters;
+      } else if (normalParameter is FieldFormalParameter) {
+        if (normalParameter.parameters == null) {
+          applyToTypeAnnotation(element.type, normalParameter.type);
+        } else {
+          functionReturnType = normalParameter.type;
+          functionParameterList = normalParameter.parameters;
+        }
+      }
+
+      if (functionParameterList != null) {
+        FunctionType elementType = element.type;
+        if (functionReturnType != null) {
+          applyToTypeAnnotation(elementType.returnType, functionReturnType);
+        }
+        applyParameters(elementType.parameters, functionParameterList);
+      }
+    }
+  }
+
   /// Apply the [type] to the [typeAnnotation] by setting the type of the
   /// [typeAnnotation] to the [type] and recursively applying each of the type
   /// arguments of the [type] to the corresponding type arguments of the
@@ -726,8 +728,7 @@
       FunctionType functionType = type;
       typeAnnotation.type = type;
       applyToTypeAnnotation(functionType.returnType, typeAnnotation.returnType);
-      _applyParameters(
-          functionType.parameters, typeAnnotation.parameters.parameters);
+      applyParameters(functionType.parameters, typeAnnotation.parameters);
     } else if (typeAnnotation is TypeNameImpl) {
       typeAnnotation.type = type;
       SimpleIdentifier name = nameForElement(typeAnnotation.name);
@@ -749,42 +750,6 @@
     }
   }
 
-  /// Apply the types of the [parameterElements] to the [parameters] that have
-  /// an explicit type annotation.
-  static void _applyParameters(List<ParameterElement> parameterElements,
-      List<FormalParameter> parameters) {
-    int length = parameterElements.length;
-    if (parameters.length != length) {
-      throw new StateError('Parameter counts do not match');
-    }
-    for (int i = 0; i < length; i++) {
-      ParameterElement element = parameterElements[i];
-      FormalParameter parameter = parameters[i];
-
-      NormalFormalParameter normalParameter;
-      if (parameter is NormalFormalParameter) {
-        normalParameter = parameter;
-      } else if (parameter is DefaultFormalParameter) {
-        normalParameter = parameter.parameter;
-      }
-
-      TypeAnnotation typeAnnotation = null;
-      if (normalParameter is SimpleFormalParameter) {
-        typeAnnotation = normalParameter.type;
-      }
-      if (typeAnnotation != null) {
-        applyToTypeAnnotation(element.type, typeAnnotation);
-      }
-
-      if (normalParameter is SimpleFormalParameterImpl) {
-        normalParameter.element = element;
-      }
-      if (normalParameter.identifier != null) {
-        normalParameter.identifier.staticElement = element;
-      }
-    }
-  }
-
   /// Recursively apply each of the type arguments of the [type] to the
   /// corresponding type arguments of the [typeArguments].
   static void _applyTypeArgumentsToList(
@@ -832,3 +797,95 @@
   /// Return the Analyzer [DartType] for the given [kernelType].
   DartType translateType(kernel.DartType kernelType);
 }
+
+/// Visitor that applies resolution data from the front end (obtained via
+/// [ResolutionStorer]) to an analyzer AST, and also checks file offsets to
+/// verify that the types are applied to the correct subexpressions.
+class ValidatingResolutionApplier extends ResolutionApplier {
+  /// Indicates whether debug messages should be printed.
+  static const bool _debug = false;
+
+  final List<int> _declaredElementOffsets;
+  final List<int> _referencedElementOffsets;
+  final List<int> _typeOffsets;
+
+  ValidatingResolutionApplier(
+      TypeContext typeContext,
+      List<Element> declaredElements,
+      List<Element> referencedElements,
+      List<kernel.DartType> types,
+      this._declaredElementOffsets,
+      this._referencedElementOffsets,
+      this._typeOffsets)
+      : super(typeContext, declaredElements, referencedElements, types);
+
+  @override
+  void checkDone() {
+    if (_declaredElementIndex != _declaredElements.length) {
+      throw new StateError('Some declarations were not consumed, starting at '
+          'offset ${_declaredElementOffsets[_declaredElementIndex]}');
+    }
+    if (_referencedElementIndex != _referencedElements.length) {
+      throw new StateError('Some references were not consumed, starting at '
+          'offset ${_referencedElementOffsets[_referencedElementIndex]}');
+    }
+    if (_typeIndex != _types.length) {
+      throw new StateError('Some types were not consumed, starting at offset '
+          '${_typeOffsets[_typeIndex]}');
+    }
+  }
+
+  @override
+  Element _getDeclarationFor(AstNode node) {
+    int nodeOffset = node.offset;
+    if (_debug) {
+      print('Getting declaration element for $node at $nodeOffset');
+    }
+    if (_declaredElementIndex >= _declaredElements.length) {
+      throw new StateError(
+          'No declaration information for $node at $nodeOffset');
+    }
+    int elementOffset = _declaredElementOffsets[_declaredElementIndex];
+    if (nodeOffset != elementOffset) {
+      throw new StateError(
+          'Expected element declaration for analyzer offset $nodeOffset; '
+          'got one for kernel offset $elementOffset');
+    }
+    return super._getDeclarationFor(node);
+  }
+
+  @override
+  Element _getReferenceFor(SyntacticEntity entity) {
+    int entityOffset = entity.offset;
+    if (_debug) {
+      print('Getting reference element for $entity at $entityOffset');
+    }
+    if (_referencedElementIndex >= _referencedElements.length) {
+      throw new StateError(
+          'No reference information for $entity at $entityOffset');
+    }
+    int elementOffset = _referencedElementOffsets[_referencedElementIndex];
+    if (entityOffset != elementOffset) {
+      throw new StateError(
+          'Expected element reference for analyzer offset $entityOffset; '
+          'got one for kernel offset $elementOffset');
+    }
+    return super._getReferenceFor(entity);
+  }
+
+  @override
+  DartType _getTypeFor(SyntacticEntity entity, {bool synthetic: false}) {
+    var entityOffset = synthetic ? -1 : entity.offset;
+    if (_debug) {
+      print('Getting type for $entity at $entityOffset');
+    }
+    if (_typeIndex >= _types.length) {
+      throw new StateError('No type information for $entity at $entityOffset');
+    }
+    if (entityOffset != _typeOffsets[_typeIndex]) {
+      throw new StateError('Expected a type for $entity at $entityOffset; '
+          'got one for kernel offset ${_typeOffsets[_typeIndex]}');
+    }
+    return super._getTypeFor(entity);
+  }
+}
diff --git a/pkg/analyzer/lib/src/fasta/resolution_storer.dart b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
index 665f407..8a59929 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_storer.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
@@ -132,6 +132,8 @@
 /// A reference to the getter represented by the [member].
 /// The [member] might be either a getter itself, or a field.
 class MemberGetterNode implements TreeNode {
+  /// The member representing the getter, or `null` if the getter could not be
+  /// resolved.
   final Member member;
 
   MemberGetterNode(this.member);
@@ -162,6 +164,8 @@
 /// A reference to the setter represented by the [member].
 /// The [member] might be either a setter itself, or a field.
 class MemberSetterNode implements TreeNode {
+  /// The member representing the setter, or `null` if the setter could not be
+  /// resolved.
   final Member member;
 
   MemberSetterNode(this.member);
@@ -485,11 +489,23 @@
   }
 
   @override
-  bool staticAssignEnter(
-      Expression expression, Expression write, DartType typeContext) {
+  void redirectingInitializerEnter(RedirectingInitializer initializer) {
+    _recordReference(initializer.target, initializer.fileOffset);
+  }
+
+  @override
+  bool staticAssignEnter(Expression expression, int targetOffset,
+      Class targetClass, Expression write, DartType typeContext) {
+    // If the static target is explicit (and is a class), record it.
+    if (targetClass != null) {
+      _recordReference(targetClass, targetOffset);
+      _recordType(targetClass.rawType, targetOffset);
+    }
+
     _deferReference(write.fileOffset);
     _deferType(write.fileOffset);
-    return super.staticAssignEnter(expression, write, typeContext);
+    return super.staticAssignEnter(
+        expression, targetOffset, targetClass, write, typeContext);
   }
 
   @override
@@ -508,6 +524,18 @@
   }
 
   @override
+  bool staticGetEnter(StaticGet expression, int targetOffset, Class targetClass,
+      DartType typeContext) {
+    // If the static target is explicit (and is a class), record it.
+    if (targetClass != null) {
+      _recordReference(targetClass, targetOffset);
+      _recordType(targetClass.rawType, targetOffset);
+    }
+    return super
+        .staticGetEnter(expression, targetOffset, targetClass, typeContext);
+  }
+
+  @override
   void staticGetExit(StaticGet expression, DartType inferredType) {
     _recordReference(
         new MemberGetterNode(expression.target), expression.fileOffset);
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index ae1db7e..dc46ac2 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -291,6 +291,17 @@
   }
 
   @override
+  Object visitFormalParameterList(FormalParameterList node) {
+    if (_applyKernelTypes) {
+      ResolutionApplier.applyParameters(_walker._parameters, node);
+      _walker.consumeParameters();
+      return null;
+    } else {
+      return super.visitFormalParameterList(node);
+    }
+  }
+
+  @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     SimpleIdentifier functionName = node.name;
     Token property = node.propertyKeyword;
@@ -890,6 +901,10 @@
     _functionIndex = _functions.length;
   }
 
+  void consumeParameters() {
+    _parameterIndex = _parameters.length;
+  }
+
   /**
    * Returns the next non-synthetic child of [element] which is an accessor;
    * throws an [IndexError] if there are no more.
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index e5b19aa..a0b598b 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -919,7 +919,6 @@
   @override
   Object visitIsExpression(IsExpression node) {
     _checkForTypeAnnotationDeferredClass(node.type);
-    _checkForTypeAnnotationGenericFunctionParameter(node.type);
     return super.visitIsExpression(node);
   }
 
@@ -2574,17 +2573,24 @@
         _errorReporter.reportErrorForNode(
             StaticWarningCode.ASSIGNMENT_TO_CONST, expression);
       } else if (element.isFinal) {
-        if (element is FieldElementImpl &&
-            element.setter == null &&
-            element.isSynthetic) {
-          _errorReporter.reportErrorForNode(
-              StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER,
-              highlightedNode,
-              [element.name, element.enclosingElement.displayName]);
+        if (element is FieldElementImpl) {
+          if (element.setter == null && element.isSynthetic) {
+            _errorReporter.reportErrorForNode(
+                StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER,
+                highlightedNode,
+                [element.name, element.enclosingElement.displayName]);
+          } else {
+            _errorReporter.reportErrorForNode(
+                StaticWarningCode.ASSIGNMENT_TO_FINAL,
+                highlightedNode,
+                [element.name]);
+          }
           return;
         }
-        _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_FINAL,
-            highlightedNode, [element.name]);
+        _errorReporter.reportErrorForNode(
+            StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL,
+            highlightedNode,
+            [element.name]);
       }
     } else if (element is FunctionElement) {
       _errorReporter.reportErrorForNode(
@@ -5561,7 +5567,8 @@
   void _checkForReferenceBeforeDeclaration(SimpleIdentifier node) {
     if (!node.inDeclarationContext() &&
         _hiddenElements != null &&
-        _hiddenElements.contains(node.staticElement)) {
+        _hiddenElements.contains(node.staticElement) &&
+        node.parent is! CommentReference) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION,
           node,
@@ -5759,28 +5766,6 @@
   }
 
   /**
-   * Verify that the given type [name] is not a type parameter in a generic
-   * method.
-   *
-   * See [StaticWarningCode.TYPE_ANNOTATION_GENERIC_FUNCTION_PARAMETER].
-   */
-  void _checkForTypeAnnotationGenericFunctionParameter(TypeAnnotation type) {
-    if (type is TypeName) {
-      Identifier name = type.name;
-      if (name is SimpleIdentifier) {
-        Element element = name.staticElement;
-        if (element is TypeParameterElement &&
-            element.enclosingElement is ExecutableElement) {
-          _errorReporter.reportErrorForNode(
-              StaticWarningCode.TYPE_ANNOTATION_GENERIC_FUNCTION_PARAMETER,
-              name,
-              [name.name]);
-        }
-      }
-    }
-  }
-
-  /**
    * Verify that the type arguments in the given [typeName] are all within
    * their bounds.
    *
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 820bb38..f4c4590 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -6455,7 +6455,14 @@
     Expression message;
     if (_matches(TokenType.COMMA)) {
       comma = getAndAdvance();
-      message = parseExpression2();
+      if (_matches(TokenType.CLOSE_PAREN)) {
+        comma = null;
+      } else {
+        message = parseExpression2();
+        if (_matches(TokenType.COMMA)) {
+          getAndAdvance();
+        }
+      }
     }
     Token rightParen = _expect(TokenType.CLOSE_PAREN);
     return astFactory.assertInitializer(
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index b524b43..770a02e 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -32,6 +32,7 @@
 import 'package:analyzer/src/generated/testing/element_factory.dart';
 import 'package:analyzer/src/generated/type_system.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:path/path.dart' as path;
 
 export 'package:analyzer/src/dart/resolver/inheritance_manager.dart';
 export 'package:analyzer/src/dart/resolver/scope.dart';
@@ -48,6 +49,8 @@
 
   static String _TO_INT_METHOD_NAME = "toInt";
 
+  static final _testDir = '${path.separator}test${path.separator}';
+
   /**
    * The class containing the AST nodes being visited, or `null` if we are not in the scope of
    * a class.
@@ -353,7 +356,7 @@
   @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     _checkForDeprecatedMemberUseAtIdentifier(node);
-    _checkForInvalidProtectedMemberAccess(node);
+    _checkForInvalidAccess(node);
     return super.visitSimpleIdentifier(node);
   }
 
@@ -902,11 +905,17 @@
         decl.name, [decl.name.toString()]);
   }
 
-  /**
-   * Produces a hint if the given identifier is a protected closure, field or
-   * getter/setter, method closure or invocation accessed outside a subclass.
-   */
-  void _checkForInvalidProtectedMemberAccess(SimpleIdentifier identifier) {
+  /// Produces a hint if [identifier] is accessed from an invalid location. In
+  /// particular:
+  ///
+  /// * if the given identifier is a protected closure, field or
+  ///   getter/setter, method closure or invocation accessed outside a subclass,
+  ///   or accessed outside the library wherein the identifier is declared, or
+  /// * if the given identifier is a closure, field, getter, setter, method
+  ///   closure or invocation which is annotated with `visibleForTesting`, and
+  ///   is accessed outside of the defining library, and the current library
+  ///   does not have the word 'test' in its name.
+  void _checkForInvalidAccess(SimpleIdentifier identifier) {
     if (identifier.inDeclarationContext()) {
       return;
     }
@@ -925,6 +934,21 @@
       return false;
     }
 
+    bool isVisibleForTesting(Element element) {
+      if (element == null) {
+        return false;
+      }
+      if (element.isVisibleForTesting) {
+        return true;
+      }
+      if (element is PropertyAccessorElement &&
+          element.enclosingElement is ClassElement &&
+          element.variable.isVisibleForTesting) {
+        return true;
+      }
+      return false;
+    }
+
     bool inCommentReference(SimpleIdentifier identifier) =>
         identifier.getAncestor((AstNode node) => node is CommentReference) !=
         null;
@@ -932,21 +956,38 @@
     bool inCurrentLibrary(Element element) =>
         element.library == _currentLibrary;
 
+    bool inTestDirectory(LibraryElement library) =>
+        library.definingCompilationUnit.source.fullName.contains(_testDir);
+
     Element element = identifier.bestElement;
-    if (isProtected(element) &&
-        !inCurrentLibrary(element) &&
-        !inCommentReference(identifier)) {
+    if (isProtected(element)) {
+      if (inCurrentLibrary(element) || inCommentReference(identifier)) {
+        // The access is valid; even if [element] is also marked
+        // `visibleForTesting`, the "visibilities" are unioned.
+        return;
+      }
       ClassElement definingClass = element.enclosingElement;
       ClassDeclaration accessingClass =
           identifier.getAncestor((AstNode node) => node is ClassDeclaration);
-      if (accessingClass == null ||
-          !_hasTypeOrSuperType(accessingClass.element, definingClass.type)) {
+      if (_hasTypeOrSuperType(accessingClass?.element, definingClass.type)) {
+        return;
+      } else {
         _errorReporter.reportErrorForNode(
             HintCode.INVALID_USE_OF_PROTECTED_MEMBER,
             identifier,
             [identifier.name.toString(), definingClass.name]);
       }
     }
+    if (isVisibleForTesting(element) &&
+        !inCurrentLibrary(element) &&
+        !inTestDirectory(_currentLibrary) &&
+        !inCommentReference(identifier)) {
+      Element definingClass = element.enclosingElement;
+      _errorReporter.reportErrorForNode(
+          HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER,
+          identifier,
+          [identifier.name.toString(), definingClass.name]);
+    }
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/kernel/resynthesize.dart b/pkg/analyzer/lib/src/kernel/resynthesize.dart
index 0fec400..a3a6ee3 100644
--- a/pkg/analyzer/lib/src/kernel/resynthesize.dart
+++ b/pkg/analyzer/lib/src/kernel/resynthesize.dart
@@ -488,6 +488,7 @@
     if (expr is kernel.StringLiteral) {
       return AstTestFactory.string2(expr.value);
     }
+
     if (expr is kernel.StringConcatenation) {
       List<InterpolationElement> elements = expr.expressions
           .map(_build)
@@ -495,6 +496,7 @@
           .toList(growable: false);
       return AstTestFactory.string(elements);
     }
+
     if (expr is kernel.SymbolLiteral) {
       List<String> components = expr.value.split('.').toList();
       return AstTestFactory.symbolLiteral(components);
@@ -524,6 +526,20 @@
       return AstTestFactory.mapLiteral(keyword, typeArguments, entries);
     }
 
+    // Invalid annotations are represented as Let.
+    if (expr is kernel.Let) {
+      kernel.Let let = expr;
+      if (_isConstantExpressionErrorThrow(let.variable.initializer) ||
+          _isConstantExpressionErrorThrow(let.body)) {
+        throw const _CompilationErrorFound();
+      }
+    }
+
+    // Stop if there is an error.
+    if (_isConstantExpressionErrorThrow(expr)) {
+      throw const _CompilationErrorFound();
+    }
+
     if (expr is kernel.StaticGet) {
       return _buildIdentifier(expr.targetReference, isGet: true);
     }
@@ -572,6 +588,10 @@
       return AstTestFactory.binaryExpression(left, operator, right);
     }
 
+    if (expr is kernel.AsExpression && expr.isTypeError) {
+      return _build(expr.operand);
+    }
+
     if (expr is kernel.Let) {
       var body = expr.body;
       if (body is kernel.ConditionalExpression) {
@@ -595,25 +615,20 @@
     }
 
     if (expr is kernel.MethodInvocation) {
-      kernel.Member member = expr.interfaceTarget;
-      if (member is kernel.Procedure) {
-        if (member.kind == kernel.ProcedureKind.Operator) {
-          var left = _build(expr.receiver);
-          String operatorName = expr.name.name;
-          List<kernel.Expression> args = expr.arguments.positional;
-          if (args.isEmpty) {
-            if (operatorName == 'unary-') {
-              return AstTestFactory.prefixExpression(TokenType.MINUS, left);
-            }
-            if (operatorName == '~') {
-              return AstTestFactory.prefixExpression(TokenType.TILDE, left);
-            }
-          } else if (args.length == 1) {
-            var operator = _toBinaryOperatorTokenType(operatorName);
-            var right = _build(args.single);
-            return AstTestFactory.binaryExpression(left, operator, right);
-          }
+      var left = _build(expr.receiver);
+      String operatorName = expr.name.name;
+      List<kernel.Expression> args = expr.arguments.positional;
+      if (args.isEmpty) {
+        if (operatorName == 'unary-') {
+          return AstTestFactory.prefixExpression(TokenType.MINUS, left);
         }
+        if (operatorName == '~') {
+          return AstTestFactory.prefixExpression(TokenType.TILDE, left);
+        }
+      } else if (args.length == 1) {
+        var operator = _toBinaryOperatorTokenType(operatorName);
+        var right = _build(args.single);
+        return AstTestFactory.binaryExpression(left, operator, right);
       }
     }
 
@@ -660,20 +675,6 @@
       return identifier;
     }
 
-    // Invalid annotations are represented as Let.
-    if (expr is kernel.Let) {
-      kernel.Let let = expr;
-      if (_isConstantExpressionErrorThrow(let.variable.initializer) ||
-          _isConstantExpressionErrorThrow(let.body)) {
-        throw const _CompilationErrorFound();
-      }
-    }
-
-    // Stop if there is an error.
-    if (_isConstantExpressionErrorThrow(expr)) {
-      throw const _CompilationErrorFound();
-    }
-
     // TODO(scheglov): complete getExpression
     throw new UnimplementedError('kernel: (${expr.runtimeType}) $expr');
   }
diff --git a/pkg/analyzer/lib/src/task/options.dart b/pkg/analyzer/lib/src/task/options.dart
index 6d92337..b38c3ad 100644
--- a/pkg/analyzer/lib/src/task/options.dart
+++ b/pkg/analyzer/lib/src/task/options.dart
@@ -281,7 +281,7 @@
       initialIncludeSpan ??= span;
       String includeUri = span.text;
       Source includedSource = sourceFactory.resolveUri(source, includeUri);
-      if (!includedSource.exists()) {
+      if (includedSource == null || !includedSource.exists()) {
         errors.add(new AnalysisError(
             initialSource,
             initialIncludeSpan.start.column + 1,
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 193fcce..4f7a9c2 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
@@ -17,6 +17,232 @@
     extends CheckedModeCompileTimeErrorCodeTest_Driver {
   @override
   bool get enableKernelDriver => true;
+
+  @override
+  bool get previewDart2 => true;
+
+  @failingTest
+  @override
+  test_fieldFormalParameterAssignableToField_fieldType_unresolved_null() async {
+    // Expected 1 errors of type StaticWarningCode.UNDEFINED_CLASS, found 0
+    await super
+        .test_fieldFormalParameterAssignableToField_fieldType_unresolved_null();
+  }
+
+  @failingTest
+  @override
+  test_fieldFormalParameterAssignableToField_typedef() async {
+    // Expected 1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
+    await super.test_fieldFormalParameterAssignableToField_typedef();
+  }
+
+  @failingTest
+  @override
+  test_fieldFormalParameterNotAssignableToField() async {
+    // Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0;
+    //          1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
+    await super.test_fieldFormalParameterNotAssignableToField();
+  }
+
+  @failingTest
+  @override
+  test_fieldFormalParameterNotAssignableToField_extends() async {
+    // Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0
+    await super.test_fieldFormalParameterNotAssignableToField_extends();
+  }
+
+  @failingTest
+  @override
+  test_fieldFormalParameterNotAssignableToField_fieldType() async {
+    // Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0;
+    //          1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
+    await super.test_fieldFormalParameterNotAssignableToField_fieldType();
+  }
+
+  @failingTest
+  @override
+  test_fieldFormalParameterNotAssignableToField_fieldType_unresolved() async {
+    // Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0;
+    //          1 errors of type StaticWarningCode.UNDEFINED_CLASS, found 0
+    await super
+        .test_fieldFormalParameterNotAssignableToField_fieldType_unresolved();
+  }
+
+  @failingTest
+  @override
+  test_fieldFormalParameterNotAssignableToField_implements() async {
+    // Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0
+    await super.test_fieldFormalParameterNotAssignableToField_implements();
+  }
+
+  @failingTest
+  @override
+  test_fieldFormalParameterNotAssignableToField_list() async {
+    // Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0
+    await super.test_fieldFormalParameterNotAssignableToField_list();
+  }
+
+  @failingTest
+  @override
+  test_fieldFormalParameterNotAssignableToField_map_keyMismatch() async {
+    // Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0
+    await super.test_fieldFormalParameterNotAssignableToField_map_keyMismatch();
+  }
+
+  @failingTest
+  @override
+  test_fieldFormalParameterNotAssignableToField_map_valueMismatch() async {
+    // Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0
+    await super
+        .test_fieldFormalParameterNotAssignableToField_map_valueMismatch();
+  }
+
+  @failingTest
+  @override
+  test_fieldFormalParameterNotAssignableToField_optional() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t1 = "foo" in let ...
+    await super.test_fieldFormalParameterNotAssignableToField_optional();
+  }
+
+  @failingTest
+  @override
+  test_fieldFormalParameterNotAssignableToField_typedef() async {
+    // Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0;
+    //          1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
+    await super.test_fieldFormalParameterNotAssignableToField_typedef();
+  }
+
+  @failingTest
+  @override
+  test_fieldInitializerNotAssignable() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t2 = "" in let ...
+    await super.test_fieldInitializerNotAssignable();
+  }
+
+  @failingTest
+  @override
+  test_fieldTypeMismatch() async {
+    // UnimplementedError: kernel: (AsExpression) x as{TypeError} dart.core::int
+    await super.test_fieldTypeMismatch();
+  }
+
+  @failingTest
+  @override
+  test_fieldTypeMismatch_generic() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t3 = #lib1::y in let ...
+    await super.test_fieldTypeMismatch_generic();
+  }
+
+  @failingTest
+  @override
+  test_fieldTypeMismatch_unresolved() async {
+    // UnimplementedError: kernel: (AsExpression) x as{TypeError} invalid-type
+    await super.test_fieldTypeMismatch_unresolved();
+  }
+
+  @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();
+  }
+
+  @failingTest
+  @override
+  test_listElementTypeNotAssignable() async {
+    // Expected 1 errors of type CheckedModeCompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, found 0;
+    //          1 errors of type StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, found 0
+    await super.test_listElementTypeNotAssignable();
+  }
+
+  @failingTest
+  @override
+  test_mapKeyTypeNotAssignable() async {
+    // Expected 1 errors of type CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, found 0;
+    //          1 errors of type StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, found 0
+    await super.test_mapKeyTypeNotAssignable();
+  }
+
+  @failingTest
+  @override
+  test_mapValueTypeNotAssignable() async {
+    // Expected 1 errors of type CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, found 0;
+    //          1 errors of type StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, found 0
+    await super.test_mapValueTypeNotAssignable();
+  }
+
+  @failingTest
+  @override
+  test_parameterAssignable_undefined_null() async {
+    // Expected 1 errors of type StaticWarningCode.UNDEFINED_CLASS, found 0
+    await super.test_parameterAssignable_undefined_null();
+  }
+
+  @failingTest
+  @override
+  test_parameterNotAssignable() async {
+    // Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0;
+    //          1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
+    await super.test_parameterNotAssignable();
+  }
+
+  @failingTest
+  @override
+  test_parameterNotAssignable_typeSubstitution() async {
+    // Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0;
+    //          1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
+    await super.test_parameterNotAssignable_typeSubstitution();
+  }
+
+  @failingTest
+  @override
+  test_parameterNotAssignable_undefined() async {
+    // Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0;
+    //          1 errors of type StaticWarningCode.UNDEFINED_CLASS, found 0
+    await super.test_parameterNotAssignable_undefined();
+  }
+
+  @failingTest
+  @override
+  test_redirectingConstructor_paramTypeMismatch() async {
+    // Bad state: Expected element reference for analyzer offset 33; got one for kernel offset 36
+    await super.test_redirectingConstructor_paramTypeMismatch();
+  }
+
+  @failingTest
+  @override
+  test_superConstructor_paramTypeMismatch() async {
+    // UnimplementedError: kernel: (AsExpression) d as{TypeError} dart.core::double
+    await super.test_superConstructor_paramTypeMismatch();
+  }
+
+  @failingTest
+  @override
+  test_topLevelVarAssignable_undefined_null() async {
+    // Expected 1 errors of type StaticWarningCode.UNDEFINED_CLASS, found 0
+    await super.test_topLevelVarAssignable_undefined_null();
+  }
+
+  @failingTest
+  @override
+  test_topLevelVarNotAssignable() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t5 = "foo" in let ...
+    await super.test_topLevelVarNotAssignable();
+  }
+
+  @failingTest
+  @override
+  test_topLevelVarNotAssignable_undefined() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t6 = "foo" in let ...
+    await super.test_topLevelVarNotAssignable_undefined();
+  }
 }
 
 /// Tests marked with this annotation fail because of a Fasta problem.
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 0b6dc66..dcd7eb6 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
@@ -22,6 +22,86 @@
   bool get enableKernelDriver => true;
 
   @override
+  bool get previewDart2 => true;
+
+  @override
+  @failingTest
+  test_accessPrivateEnumField() async {
+    // 'package:analyzer/src/dart/analysis/library_analyzer.dart': Failed assertion: line 1082 pos 18: 'memberElement != null': is not true.
+    await super.test_accessPrivateEnumField();
+  }
+
+  @override
+  @failingTest
+  test_ambiguousExport() async {
+    // Expected 1 errors of type CompileTimeErrorCode.AMBIGUOUS_EXPORT, found 0
+    await super.test_ambiguousExport();
+  }
+
+  @override
+  @failingTest
+  test_annotationWithNotClass() async {
+    // Bad state: No reference information for property at 117
+    await super.test_annotationWithNotClass();
+  }
+
+  @override
+  @failingTest
+  test_annotationWithNotClass_prefixed() async {
+    // Bad state: No reference information for pref at 36
+    await super.test_annotationWithNotClass_prefixed();
+  }
+
+  @override
+  @failingTest
+  test_async_used_as_identifier_in_annotation() async {
+    // 'package:analyzer/src/dart/constant/utilities.dart': Failed assertion: line 184 pos 14: 'node.parent is PartOfDirective ||
+    await super.test_async_used_as_identifier_in_annotation();
+  }
+
+  @override
+  @failingTest
+  test_async_used_as_identifier_in_break_statement() async {
+    // Bad state: No type information for true at 21
+    await super.test_async_used_as_identifier_in_break_statement();
+  }
+
+  @override
+  @failingTest
+  test_async_used_as_identifier_in_continue_statement() async {
+    // Bad state: No reference information for async at 42
+    await super.test_async_used_as_identifier_in_continue_statement();
+  }
+
+  @override
+  @failingTest
+  test_async_used_as_identifier_in_prefix() async {
+    // 'package:analyzer/src/fasta/resolution_applier.dart': Failed assertion: line 632 pos 14: 'constructorName.name == null': is not true.
+    await super.test_async_used_as_identifier_in_prefix();
+  }
+
+  @override
+  @failingTest
+  test_async_used_as_identifier_in_statement_label() async {
+    // Bad state: Expected element reference for analyzer offset 14; got one for kernel offset 21
+    await super.test_async_used_as_identifier_in_statement_label();
+  }
+
+  @override
+  @failingTest
+  test_async_used_as_identifier_in_suffix() async {
+    // Bad state: Expected element reference for analyzer offset 46; got one for kernel offset 48
+    await super.test_async_used_as_identifier_in_suffix();
+  }
+
+  @override
+  @failingTest
+  test_async_used_as_identifier_in_switch_label() async {
+    // Bad state: No reference information for async at 31
+    await super.test_async_used_as_identifier_in_switch_label();
+  }
+
+  @override
   @failingTest
   // This test fails because the kernel driver element model produces a
   // different element model result than the regular parser produces. Once these
@@ -33,12 +113,588 @@
 
   @override
   @failingTest
+  test_builtInIdentifierAsMixinName_classTypeAlias() async {
+    // Expected 1 errors of type CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME, found 0
+    await super.test_builtInIdentifierAsMixinName_classTypeAlias();
+  }
+
+  @override
+  @failingTest
+  test_builtInIdentifierAsPrefixName() async {
+    // Expected 1 errors of type CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_PREFIX_NAME, found 0
+    await super.test_builtInIdentifierAsPrefixName();
+  }
+
+  @override
+  @failingTest
+  test_builtInIdentifierAsType_formalParameter_field() async {
+    // Expected 1 errors of type CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE, found 0;
+    //          0 errors of type ParserErrorCode.EXTRANEOUS_MODIFIER, found 1 (23)
+    await super.test_builtInIdentifierAsType_formalParameter_field();
+  }
+
+  @override
+  @failingTest
+  test_builtInIdentifierAsType_formalParameter_simple() async {
+    // Expected 1 errors of type CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE, found 0;
+    //          0 errors of type ParserErrorCode.EXTRANEOUS_MODIFIER, found 1 (2)
+    await super.test_builtInIdentifierAsType_formalParameter_simple();
+  }
+
+  @override
+  @failingTest
+  test_builtInIdentifierAsType_variableDeclaration() async {
+    // Bad state: No reference information for typedef at 8
+    await super.test_builtInIdentifierAsType_variableDeclaration();
+  }
+
+  @override
+  @failingTest
+  test_builtInIdentifierAsTypedefName_functionTypeAlias() async {
+    // Expected 1 errors of type CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME, found 0
+    await super.test_builtInIdentifierAsTypedefName_functionTypeAlias();
+  }
+
+  @override
+  @failingTest
+  test_builtInIdentifierAsTypeName() async {
+    // Expected 1 errors of type CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME, found 0
+    await super.test_builtInIdentifierAsTypeName();
+  }
+
+  @override
+  @failingTest
+  test_builtInIdentifierAsTypeParameterName() async {
+    // Expected 1 errors of type CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME, found 0
+    await super.test_builtInIdentifierAsTypeParameterName();
+  }
+
+  @override
+  @failingTest
+  test_caseExpressionTypeImplementsEquals() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, found 0
+    await super.test_caseExpressionTypeImplementsEquals();
+  }
+
+  @override
+  @failingTest
+  test_conflictingConstructorNameAndMember_field() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD, found 0
+    await super.test_conflictingConstructorNameAndMember_field();
+  }
+
+  @override
+  @failingTest
+  test_conflictingConstructorNameAndMember_getter() async {
+    // Bad state: No type information for 42 at 25
+    await super.test_conflictingConstructorNameAndMember_getter();
+  }
+
+  @override
+  @failingTest
+  test_conflictingConstructorNameAndMember_method() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD, found 0
+    await super.test_conflictingConstructorNameAndMember_method();
+  }
+
+  @override
+  @failingTest
+  test_conflictingGetterAndMethod_field_method() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD, found 0
+    await super.test_conflictingGetterAndMethod_field_method();
+  }
+
+  @override
+  @failingTest
+  test_conflictingGetterAndMethod_getter_method() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD, found 0
+    await super.test_conflictingGetterAndMethod_getter_method();
+  }
+
+  @override
+  @failingTest
+  test_conflictingGetterAndMethod_method_field() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER, found 0
+    await super.test_conflictingGetterAndMethod_method_field();
+  }
+
+  @override
+  @failingTest
+  test_conflictingGetterAndMethod_method_getter() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER, found 0
+    await super.test_conflictingGetterAndMethod_method_getter();
+  }
+
+  @override
+  @failingTest
+  test_conflictingTypeVariableAndClass() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS, found 0
+    await super.test_conflictingTypeVariableAndClass();
+  }
+
+  @override
+  @failingTest
+  test_conflictingTypeVariableAndMember_field() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, found 0
+    await super.test_conflictingTypeVariableAndMember_field();
+  }
+
+  @override
+  @failingTest
+  test_conflictingTypeVariableAndMember_getter() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, found 0
+    await super.test_conflictingTypeVariableAndMember_getter();
+  }
+
+  @override
+  @failingTest
+  test_conflictingTypeVariableAndMember_method() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, found 0
+    await super.test_conflictingTypeVariableAndMember_method();
+  }
+
+  @override
+  @failingTest
+  test_conflictingTypeVariableAndMember_method_static() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, found 0
+    await super.test_conflictingTypeVariableAndMember_method_static();
+  }
+
+  @override
+  @failingTest
+  test_conflictingTypeVariableAndMember_setter() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, found 0
+    await super.test_conflictingTypeVariableAndMember_setter();
+  }
+
+  @override
+  @failingTest
   test_const_invalid_constructorFieldInitializer_fromLibrary() {
     return super.test_const_invalid_constructorFieldInitializer_fromLibrary();
   }
 
   @override
   @failingTest
+  test_constConstructorWithFieldInitializedByNonConst() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST, found 0;
+    //          1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
+    await super.test_constConstructorWithFieldInitializedByNonConst();
+  }
+
+  @override
+  @failingTest
+  test_constConstructorWithMixin() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN, found 0
+    await super.test_constConstructorWithMixin();
+  }
+
+  @override
+  @failingTest
+  test_constConstructorWithNonConstSuper_explicit() async {
+    // UnimplementedError: For ShadowInvalidInitializer
+    await super.test_constConstructorWithNonConstSuper_explicit();
+  }
+
+  @override
+  @failingTest
+  test_constConstructorWithNonConstSuper_implicit() async {
+    // UnimplementedError: For ShadowInvalidInitializer
+    await super.test_constConstructorWithNonConstSuper_implicit();
+  }
+
+  @override
+  @failingTest
+  test_constConstructorWithNonFinalField_mixin() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN, found 0;
+    //          1 errors of type CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, found 0
+    await super.test_constConstructorWithNonFinalField_mixin();
+  }
+
+  @override
+  @failingTest
+  test_constConstructorWithNonFinalField_super() async {
+    // UnimplementedError: For ShadowInvalidInitializer
+    await super.test_constConstructorWithNonFinalField_super();
+  }
+
+  @override
+  @failingTest
+  test_constConstructorWithNonFinalField_this() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, found 0
+    await super.test_constConstructorWithNonFinalField_this();
+  }
+
+  @override
+  @failingTest
+  test_constDeferredClass() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_DEFERRED_CLASS, found 0;
+    //          0 errors of type HintCode.UNUSED_IMPORT, found 1 (21)
+    await super.test_constDeferredClass();
+  }
+
+  @override
+  @failingTest
+  test_constDeferredClass_namedConstructor() async {
+    // 'package:analyzer/src/fasta/resolution_applier.dart': Failed assertion: line 632 pos 14: 'constructorName.name == null': is not true.
+    await super.test_constDeferredClass_namedConstructor();
+  }
+
+  @override
+  @failingTest
+  test_constEval_newInstance_constConstructor() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
+    await super.test_constEval_newInstance_constConstructor();
+  }
+
+  @override
+  @failingTest
+  test_constEval_nonStaticField_inGenericClass() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
+    await super.test_constEval_nonStaticField_inGenericClass();
+  }
+
+  @override
+  @failingTest
+  test_constEval_propertyExtraction_targetNotConst() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
+    await super.test_constEval_propertyExtraction_targetNotConst();
+  }
+
+  @override
+  @failingTest
+  test_constEvalThrowsException_binaryMinus_null() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t2 = null in let ...
+    await super.test_constEvalThrowsException_binaryMinus_null();
+  }
+
+  @override
+  @failingTest
+  test_constEvalThrowsException_binaryPlus_null() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t3 = null in let ...
+    await super.test_constEvalThrowsException_binaryPlus_null();
+  }
+
+  @override
+  @failingTest
+  test_constEvalThrowsException_divisionByZero() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE, found 0
+    await super.test_constEvalThrowsException_divisionByZero();
+  }
+
+  @override
+  @failingTest
+  test_constEvalThrowsException_finalAlreadySet_initializer() async {
+    // Bad state: No reference information for = at 41
+    await super.test_constEvalThrowsException_finalAlreadySet_initializer();
+  }
+
+  @override
+  @failingTest
+  test_constEvalThrowsException_finalAlreadySet_initializing_formal() async {
+    // UnimplementedError: For ShadowInvalidInitializer
+    await super
+        .test_constEvalThrowsException_finalAlreadySet_initializing_formal();
+  }
+
+  @override
+  @failingTest
+  test_constEvalThrowsException_unaryBitNot_null() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t4 = null in let ...
+    await super.test_constEvalThrowsException_unaryBitNot_null();
+  }
+
+  @override
+  @failingTest
+  test_constEvalThrowsException_unaryNegated_null() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t5 = null in let ...
+    await super.test_constEvalThrowsException_unaryNegated_null();
+  }
+
+  @override
+  @failingTest
+  test_constEvalThrowsException_unaryNot_null() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, found 0
+    await super.test_constEvalThrowsException_unaryNot_null();
+  }
+
+  @override
+  @failingTest
+  test_constEvalTypeBool_binary() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t6 = "" in let ...
+    await super.test_constEvalTypeBool_binary();
+  }
+
+  @override
+  @failingTest
+  test_constEvalTypeBool_binary_leftTrue() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t7 = 0 in let ...
+    await super.test_constEvalTypeBool_binary_leftTrue();
+  }
+
+  @override
+  @failingTest
+  test_constEvalTypeBoolNumString_equal() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING, found 0
+    await super.test_constEvalTypeBoolNumString_equal();
+  }
+
+  @override
+  @failingTest
+  test_constEvalTypeBoolNumString_notEqual() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING, found 0
+    await super.test_constEvalTypeBoolNumString_notEqual();
+  }
+
+  @override
+  @failingTest
+  test_constEvalTypeInt_binary() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t8 = "" in let ...
+    await super.test_constEvalTypeInt_binary();
+  }
+
+  @override
+  @failingTest
+  test_constEvalTypeNum_binary() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t9 = "" in let ...
+    await super.test_constEvalTypeNum_binary();
+  }
+
+  @override
+  @failingTest
+  test_constFormalParameter_fieldFormalParameter() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_FORMAL_PARAMETER, found 0;
+    //          0 errors of type ParserErrorCode.EXTRANEOUS_MODIFIER, found 1 (23)
+    await super.test_constFormalParameter_fieldFormalParameter();
+  }
+
+  @override
+  @failingTest
+  test_constFormalParameter_simpleFormalParameter() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_FORMAL_PARAMETER, found 0;
+    //          0 errors of type ParserErrorCode.EXTRANEOUS_MODIFIER, found 1 (2)
+    await super.test_constFormalParameter_simpleFormalParameter();
+  }
+
+  @override
+  @failingTest
+  test_constInitializedWithNonConstValue() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
+    await super.test_constInitializedWithNonConstValue();
+  }
+
+  @override
+  @failingTest
+  test_constInitializedWithNonConstValue_finalField() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE, found 0
+    await super.test_constInitializedWithNonConstValue_finalField();
+  }
+
+  @override
+  @failingTest
+  test_constInitializedWithNonConstValue_missingConstInListLiteral() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
+    await super
+        .test_constInitializedWithNonConstValue_missingConstInListLiteral();
+  }
+
+  @override
+  @failingTest
+  test_constInitializedWithNonConstValue_missingConstInMapLiteral() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
+    await super
+        .test_constInitializedWithNonConstValue_missingConstInMapLiteral();
+  }
+
+  @override
+  @failingTest
+  test_constInitializedWithNonConstValueFromDeferredClass() async {
+    // Bad state: Expected element reference for analyzer offset 58; got one for kernel offset 60
+    await super.test_constInitializedWithNonConstValueFromDeferredClass();
+  }
+
+  @override
+  @failingTest
+  test_constInitializedWithNonConstValueFromDeferredClass_nested() async {
+    // Bad state: Expected element reference for analyzer offset 58; got one for kernel offset 60
+    await super
+        .test_constInitializedWithNonConstValueFromDeferredClass_nested();
+  }
+
+  @override
+  @failingTest
+  test_constInstanceField() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_INSTANCE_FIELD, found 0
+    await super.test_constInstanceField();
+  }
+
+  @override
+  @failingTest
+  test_constMapKeyTypeImplementsEquals_direct() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, found 0
+    await super.test_constMapKeyTypeImplementsEquals_direct();
+  }
+
+  @override
+  @failingTest
+  test_constMapKeyTypeImplementsEquals_dynamic() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, found 0
+    await super.test_constMapKeyTypeImplementsEquals_dynamic();
+  }
+
+  @override
+  @failingTest
+  test_constMapKeyTypeImplementsEquals_factory() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, found 0
+    await super.test_constMapKeyTypeImplementsEquals_factory();
+  }
+
+  @override
+  @failingTest
+  test_constMapKeyTypeImplementsEquals_super() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, found 0
+    await super.test_constMapKeyTypeImplementsEquals_super();
+  }
+
+  @override
+  @failingTest
+  test_constWithInvalidTypeParameters() async {
+    // Bad state: Found 0 argument types for 1 type arguments
+    await super.test_constWithInvalidTypeParameters();
+  }
+
+  @override
+  @failingTest
+  test_constWithInvalidTypeParameters_tooFew() async {
+    // Bad state: Found 2 argument types for 1 type arguments
+    await super.test_constWithInvalidTypeParameters_tooFew();
+  }
+
+  @override
+  @failingTest
+  test_constWithInvalidTypeParameters_tooMany() async {
+    // Bad state: Found 1 argument types for 2 type arguments
+    await super.test_constWithInvalidTypeParameters_tooMany();
+  }
+
+  @override
+  @failingTest
+  test_constWithNonConst() async {
+    // Bad state: No type information for T at 52
+    await super.test_constWithNonConst();
+  }
+
+  @override
+  @failingTest
+  test_constWithNonConst_with() async {
+    // Bad state: No type information for C at 72
+    await super.test_constWithNonConst_with();
+  }
+
+  @override
+  @failingTest
+  test_constWithNonConstantArgument_annotation() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT, found 0
+    await super.test_constWithNonConstantArgument_annotation();
+  }
+
+  @override
+  @failingTest
+  test_constWithNonConstantArgument_instanceCreation() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT, found 0;
+    //          1 errors of type CompileTimeErrorCode.INVALID_CONSTANT, found 0
+    await super.test_constWithNonConstantArgument_instanceCreation();
+  }
+
+  @override
+  @failingTest
+  test_constWithNonType() async {
+    // Bad state: No type information for A at 28
+    await super.test_constWithNonType();
+  }
+
+  @override
+  @failingTest
+  test_constWithNonType_fromLibrary() async {
+    // Bad state: No type information for lib.A at 45
+    await super.test_constWithNonType_fromLibrary();
+  }
+
+  @override
+  @failingTest
+  test_constWithUndefinedConstructor() async {
+    // Bad state: No type information for A.noSuchConstructor at 46
+    await super.test_constWithUndefinedConstructor();
+  }
+
+  @override
+  @failingTest
+  test_constWithUndefinedConstructorDefault() async {
+    // Bad state: No type information for A at 51
+    await super.test_constWithUndefinedConstructorDefault();
+  }
+
+  @override
+  @failingTest
+  test_defaultValueInFunctionTypeAlias_new_named() async {
+    // Bad state: (GenericTypeAliasImpl) typedef F = int Function({Map<String, String> m : const {}})
+    await super.test_defaultValueInFunctionTypeAlias_new_named();
+  }
+
+  @override
+  @failingTest
+  test_defaultValueInFunctionTypeAlias_new_positional() async {
+    // Bad state: (GenericTypeAliasImpl) typedef F = int Function([Map<String, String> m = const {}])
+    await super.test_defaultValueInFunctionTypeAlias_new_positional();
+  }
+
+  @override
+  @failingTest
+  test_defaultValueInFunctionTypeAlias_old_named() async {
+    // Expected 1 errors of type CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS, found 0;
+    //          0 errors of type ParserErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE, found 1 (13)
+    await super.test_defaultValueInFunctionTypeAlias_old_named();
+  }
+
+  @override
+  @failingTest
+  test_defaultValueInFunctionTypeAlias_old_positional() async {
+    // Expected 1 errors of type CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS, found 0;
+    //          0 errors of type ParserErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE, found 1 (13)
+    await super.test_defaultValueInFunctionTypeAlias_old_positional();
+  }
+
+  @override
+  @failingTest
+  test_defaultValueInFunctionTypedParameter_named() async {
+    // Expected 1 errors of type CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER, found 0;
+    //          0 errors of type ParserErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE, found 1 (6)
+    await super.test_defaultValueInFunctionTypedParameter_named();
+  }
+
+  @override
+  @failingTest
+  test_defaultValueInFunctionTypedParameter_optional() async {
+    // Expected 1 errors of type CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER, found 0;
+    //          0 errors of type ParserErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE, found 1 (7)
+    await super.test_defaultValueInFunctionTypedParameter_optional();
+  }
+
+  @override
+  @failingTest
+  test_defaultValueInRedirectingFactoryConstructor() async {
+    // Expected 1 errors of type CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR, found 0
+    await super.test_defaultValueInRedirectingFactoryConstructor();
+  }
+
+  @override
+  @failingTest
+  test_deferredImportWithInvalidUri() async {
+    // Bad state: No reference information for p at 49
+    await super.test_deferredImportWithInvalidUri();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30857')
   test_duplicateConstructorName_named() async {
     return super.test_duplicateConstructorName_named();
@@ -60,6 +716,13 @@
 
   @override
   @failingTest
+  test_duplicateDefinition_catch() async {
+    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION, found 0
+    await super.test_duplicateDefinition_catch();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30857')
   test_duplicateDefinition_classMembers_fields() async {
     return super.test_duplicateDefinition_classMembers_fields();
@@ -88,6 +751,138 @@
 
   @override
   @failingTest
+  test_duplicateDefinition_locals_inCase() async {
+    // Bad state: No type information for a at 58
+    await super.test_duplicateDefinition_locals_inCase();
+  }
+
+  @override
+  @failingTest
+  test_duplicateDefinition_locals_inFunctionBlock() async {
+    // Bad state: No declaration information for m(a) {} at 24
+    await super.test_duplicateDefinition_locals_inFunctionBlock();
+  }
+
+  @override
+  @failingTest
+  test_duplicateDefinition_locals_inIf() async {
+    // Bad state: No type information for a at 49
+    await super.test_duplicateDefinition_locals_inIf();
+  }
+
+  @override
+  @failingTest
+  test_duplicateDefinition_locals_inMethodBlock() async {
+    // Bad state: No type information for a at 37
+    await super.test_duplicateDefinition_locals_inMethodBlock();
+  }
+
+  @override
+  @failingTest
+  test_duplicateDefinition_parameters_inConstructor() async {
+    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION, found 0
+    await super.test_duplicateDefinition_parameters_inConstructor();
+  }
+
+  @override
+  @failingTest
+  test_duplicateDefinition_parameters_inFunctionTypeAlias() async {
+    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION, found 0
+    await super.test_duplicateDefinition_parameters_inFunctionTypeAlias();
+  }
+
+  @override
+  @failingTest
+  test_duplicateDefinition_parameters_inLocalFunction() async {
+    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION, found 0
+    await super.test_duplicateDefinition_parameters_inLocalFunction();
+  }
+
+  @override
+  @failingTest
+  test_duplicateDefinition_parameters_inMethod() async {
+    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION, found 0
+    await super.test_duplicateDefinition_parameters_inMethod();
+  }
+
+  @override
+  @failingTest
+  test_duplicateDefinition_parameters_inTopLevelFunction() async {
+    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION, found 0
+    await super.test_duplicateDefinition_parameters_inTopLevelFunction();
+  }
+
+  @override
+  @failingTest
+  test_duplicateDefinition_typeParameters() async {
+    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION, found 0
+    await super.test_duplicateDefinition_typeParameters();
+  }
+
+  @override
+  @failingTest
+  test_duplicateDefinitionInheritance_instanceGetter_staticGetter() async {
+    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, found 0
+    await super
+        .test_duplicateDefinitionInheritance_instanceGetter_staticGetter();
+  }
+
+  @override
+  @failingTest
+  test_duplicateDefinitionInheritance_instanceGetterAbstract_staticGetter() async {
+    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, found 0
+    await super
+        .test_duplicateDefinitionInheritance_instanceGetterAbstract_staticGetter();
+  }
+
+  @override
+  @failingTest
+  test_duplicateDefinitionInheritance_instanceMethod_staticMethod() async {
+    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, found 0
+    await super
+        .test_duplicateDefinitionInheritance_instanceMethod_staticMethod();
+  }
+
+  @override
+  @failingTest
+  test_duplicateDefinitionInheritance_instanceMethodAbstract_staticMethod() async {
+    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, found 0
+    await super
+        .test_duplicateDefinitionInheritance_instanceMethodAbstract_staticMethod();
+  }
+
+  @override
+  @failingTest
+  test_duplicateDefinitionInheritance_instanceSetter_staticSetter() async {
+    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, found 0
+    await super
+        .test_duplicateDefinitionInheritance_instanceSetter_staticSetter();
+  }
+
+  @override
+  @failingTest
+  test_duplicateDefinitionInheritance_instanceSetterAbstract_staticSetter() async {
+    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, found 0
+    await super
+        .test_duplicateDefinitionInheritance_instanceSetterAbstract_staticSetter();
+  }
+
+  @override
+  @failingTest
+  test_duplicateNamedArgument() async {
+    // Bad state: No type information for 1 at 29
+    await super.test_duplicateNamedArgument();
+  }
+
+  @override
+  @failingTest
+  test_exportInternalLibrary() async {
+    // Expected 1 errors of type CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY, found 0
+    await super.test_exportInternalLibrary();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30960')
   test_exportOfNonLibrary() async {
     return super.test_exportOfNonLibrary();
@@ -95,6 +890,224 @@
 
   @override
   @failingTest
+  test_extendsDeferredClass() async {
+    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS, found 0;
+    //          0 errors of type HintCode.UNUSED_IMPORT, found 1 (21)
+    await super.test_extendsDeferredClass();
+  }
+
+  @override
+  @failingTest
+  test_extendsDeferredClass_classTypeAlias() async {
+    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS, found 0;
+    //          0 errors of type HintCode.UNUSED_IMPORT, found 1 (21)
+    await super.test_extendsDeferredClass_classTypeAlias();
+  }
+
+  @override
+  @failingTest
+  test_extendsDisallowedClass_class_bool() async {
+    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0;
+    //          1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, found 0
+    await super.test_extendsDisallowedClass_class_bool();
+  }
+
+  @override
+  @failingTest
+  test_extendsDisallowedClass_class_double() async {
+    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0
+    await super.test_extendsDisallowedClass_class_double();
+  }
+
+  @override
+  @failingTest
+  test_extendsDisallowedClass_class_int() async {
+    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0;
+    //          1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, found 0
+    await super.test_extendsDisallowedClass_class_int();
+  }
+
+  @override
+  @failingTest
+  test_extendsDisallowedClass_class_Null() async {
+    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0;
+    //          1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, found 0
+    await super.test_extendsDisallowedClass_class_Null();
+  }
+
+  @override
+  @failingTest
+  test_extendsDisallowedClass_class_num() async {
+    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0
+    await super.test_extendsDisallowedClass_class_num();
+  }
+
+  @override
+  @failingTest
+  test_extendsDisallowedClass_class_String() async {
+    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0;
+    //          1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, found 0
+    await super.test_extendsDisallowedClass_class_String();
+  }
+
+  @override
+  @failingTest
+  test_extendsDisallowedClass_classTypeAlias_bool() async {
+    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0
+    await super.test_extendsDisallowedClass_classTypeAlias_bool();
+  }
+
+  @override
+  @failingTest
+  test_extendsDisallowedClass_classTypeAlias_double() async {
+    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0
+    await super.test_extendsDisallowedClass_classTypeAlias_double();
+  }
+
+  @override
+  @failingTest
+  test_extendsDisallowedClass_classTypeAlias_int() async {
+    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0
+    await super.test_extendsDisallowedClass_classTypeAlias_int();
+  }
+
+  @override
+  @failingTest
+  test_extendsDisallowedClass_classTypeAlias_Null() async {
+    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0
+    await super.test_extendsDisallowedClass_classTypeAlias_Null();
+  }
+
+  @override
+  @failingTest
+  test_extendsDisallowedClass_classTypeAlias_num() async {
+    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0
+    await super.test_extendsDisallowedClass_classTypeAlias_num();
+  }
+
+  @override
+  @failingTest
+  test_extendsDisallowedClass_classTypeAlias_String() async {
+    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0
+    await super.test_extendsDisallowedClass_classTypeAlias_String();
+  }
+
+  @override
+  @failingTest
+  test_extendsEnum() async {
+    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_ENUM, found 0
+    await super.test_extendsEnum();
+  }
+
+  @override
+  @failingTest
+  test_extendsNonClass_class() async {
+    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_NON_CLASS, found 0
+    await super.test_extendsNonClass_class();
+  }
+
+  @override
+  @failingTest
+  test_extendsNonClass_dynamic() async {
+    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_NON_CLASS, found 0
+    await super.test_extendsNonClass_dynamic();
+  }
+
+  @override
+  @failingTest
+  test_extraPositionalArguments_const() async {
+    // Bad state: No type information for A at 42
+    await super.test_extraPositionalArguments_const();
+  }
+
+  @override
+  @failingTest
+  test_extraPositionalArguments_const_super() async {
+    // Bad state: No type information for 0 at 65
+    await super.test_extraPositionalArguments_const_super();
+  }
+
+  @override
+  @failingTest
+  test_extraPositionalArgumentsCouldBeNamed_const() async {
+    // Bad state: No type information for A at 49
+    await super.test_extraPositionalArgumentsCouldBeNamed_const();
+  }
+
+  @override
+  @failingTest
+  test_extraPositionalArgumentsCouldBeNamed_const_super() async {
+    // Bad state: No type information for 0 at 72
+    await super.test_extraPositionalArgumentsCouldBeNamed_const_super();
+  }
+
+  @override
+  @failingTest
+  test_fieldFormalParameter_assignedInInitializer() async {
+    // Bad state: No reference information for = at 35
+    await super.test_fieldFormalParameter_assignedInInitializer();
+  }
+
+  @override
+  @failingTest
+  test_fieldInitializedByMultipleInitializers() async {
+    // Bad state: No reference information for = at 36
+    await super.test_fieldInitializedByMultipleInitializers();
+  }
+
+  @override
+  @failingTest
+  test_fieldInitializedByMultipleInitializers_multipleInits() async {
+    // Bad state: No reference information for = at 36
+    await super.test_fieldInitializedByMultipleInitializers_multipleInits();
+  }
+
+  @override
+  @failingTest
+  test_fieldInitializedByMultipleInitializers_multipleNames() async {
+    // Bad state: Expected element reference for analyzer offset 45; got one for kernel offset 52
+    await super.test_fieldInitializedByMultipleInitializers_multipleNames();
+  }
+
+  @override
+  @failingTest
+  test_fieldInitializedInParameterAndInitializer() async {
+    // Bad state: No reference information for = at 35
+    await super.test_fieldInitializedInParameterAndInitializer();
+  }
+
+  @override
+  @failingTest
+  test_fieldInitializerFactoryConstructor() async {
+    // Expected 1 errors of type CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY_CONSTRUCTOR, found 0
+    await super.test_fieldInitializerFactoryConstructor();
+  }
+
+  @override
+  @failingTest
+  test_fieldInitializerOutsideConstructor() async {
+    // Expected 1 errors of type ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, found 0;
+    //          1 errors of type CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, found 0
+    await super.test_fieldInitializerOutsideConstructor();
+  }
+
+  @override
+  @failingTest
+  test_fieldInitializerOutsideConstructor_defaultParameter() async {
+    // Expected 1 errors of type CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, found 0
+    await super.test_fieldInitializerOutsideConstructor_defaultParameter();
+  }
+
+  @override
+  @failingTest
+  test_fieldInitializerOutsideConstructor_inFunctionTypeParameter() async {
+    // Expected 1 errors of type CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, found 0
+    await super
+        .test_fieldInitializerOutsideConstructor_inFunctionTypeParameter();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30982')
   test_fieldInitializerRedirectingConstructor_afterRedirection() async {
     return super.test_fieldInitializerRedirectingConstructor_afterRedirection();
@@ -117,6 +1130,73 @@
 
   @override
   @failingTest
+  test_finalInitializedMultipleTimes_initializers() async {
+    // Bad state: No reference information for = at 38
+    await super.test_finalInitializedMultipleTimes_initializers();
+  }
+
+  @override
+  @failingTest
+  test_finalInitializedMultipleTimes_initializingFormal_initializer() async {
+    // Bad state: No reference information for = at 37
+    await super
+        .test_finalInitializedMultipleTimes_initializingFormal_initializer();
+  }
+
+  @override
+  @failingTest
+  test_finalInitializedMultipleTimes_initializingFormals() async {
+    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION, found 0;
+    //          1 errors of type CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES, found 0
+    await super.test_finalInitializedMultipleTimes_initializingFormals();
+  }
+
+  @override
+  @failingTest
+  test_finalNotInitialized_instanceField_const_static() async {
+    // Bad state: Some types were not consumed, starting at offset 26
+    await super.test_finalNotInitialized_instanceField_const_static();
+  }
+
+  @override
+  @failingTest
+  test_finalNotInitialized_library_const() async {
+    // Bad state: Some types were not consumed, starting at offset 7
+    await super.test_finalNotInitialized_library_const();
+  }
+
+  @override
+  @failingTest
+  test_finalNotInitialized_local_const() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_NOT_INITIALIZED, found 0
+    await super.test_finalNotInitialized_local_const();
+  }
+
+  @override
+  @failingTest
+  test_fromEnvironment_bool_badArgs() async {
+    // Expected 2 errors of type CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, found 0;
+    //          2 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
+    await super.test_fromEnvironment_bool_badArgs();
+  }
+
+  @override
+  @failingTest
+  test_fromEnvironment_bool_badDefault_whenDefined() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, found 0;
+    //          1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
+    await super.test_fromEnvironment_bool_badDefault_whenDefined();
+  }
+
+  @override
+  @failingTest
+  test_genericFunctionTypedParameter() async {
+    // Expected 1 errors of type CompileTimeErrorCode.GENERIC_FUNCTION_TYPED_PARAM_UNSUPPORTED, found 0
+    await super.test_genericFunctionTypedParameter();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30857')
   test_getterAndMethodWithSameName() async {
     return super.test_getterAndMethodWithSameName();
@@ -124,6 +1204,241 @@
 
   @override
   @failingTest
+  test_implementsDeferredClass() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS, found 0;
+    //          0 errors of type HintCode.UNUSED_IMPORT, found 1 (21)
+    await super.test_implementsDeferredClass();
+  }
+
+  @override
+  @failingTest
+  test_implementsDeferredClass_classTypeAlias() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS, found 0;
+    //          0 errors of type HintCode.UNUSED_IMPORT, found 1 (21)
+    await super.test_implementsDeferredClass_classTypeAlias();
+  }
+
+  @override
+  @failingTest
+  test_implementsDisallowedClass_class_bool() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
+    await super.test_implementsDisallowedClass_class_bool();
+  }
+
+  @override
+  @failingTest
+  test_implementsDisallowedClass_class_double() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
+    await super.test_implementsDisallowedClass_class_double();
+  }
+
+  @override
+  @failingTest
+  test_implementsDisallowedClass_class_int() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
+    await super.test_implementsDisallowedClass_class_int();
+  }
+
+  @override
+  @failingTest
+  test_implementsDisallowedClass_class_Null() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
+    await super.test_implementsDisallowedClass_class_Null();
+  }
+
+  @override
+  @failingTest
+  test_implementsDisallowedClass_class_num() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
+    await super.test_implementsDisallowedClass_class_num();
+  }
+
+  @override
+  @failingTest
+  test_implementsDisallowedClass_class_String() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
+    await super.test_implementsDisallowedClass_class_String();
+  }
+
+  @override
+  @failingTest
+  test_implementsDisallowedClass_class_String_num() async {
+    // Expected 2 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
+    await super.test_implementsDisallowedClass_class_String_num();
+  }
+
+  @override
+  @failingTest
+  test_implementsDisallowedClass_classTypeAlias_bool() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
+    await super.test_implementsDisallowedClass_classTypeAlias_bool();
+  }
+
+  @override
+  @failingTest
+  test_implementsDisallowedClass_classTypeAlias_double() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
+    await super.test_implementsDisallowedClass_classTypeAlias_double();
+  }
+
+  @override
+  @failingTest
+  test_implementsDisallowedClass_classTypeAlias_int() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
+    await super.test_implementsDisallowedClass_classTypeAlias_int();
+  }
+
+  @override
+  @failingTest
+  test_implementsDisallowedClass_classTypeAlias_Null() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
+    await super.test_implementsDisallowedClass_classTypeAlias_Null();
+  }
+
+  @override
+  @failingTest
+  test_implementsDisallowedClass_classTypeAlias_num() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
+    await super.test_implementsDisallowedClass_classTypeAlias_num();
+  }
+
+  @override
+  @failingTest
+  test_implementsDisallowedClass_classTypeAlias_String() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
+    await super.test_implementsDisallowedClass_classTypeAlias_String();
+  }
+
+  @override
+  @failingTest
+  test_implementsDisallowedClass_classTypeAlias_String_num() async {
+    // Expected 2 errors of type CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, found 0
+    await super.test_implementsDisallowedClass_classTypeAlias_String_num();
+  }
+
+  @override
+  @failingTest
+  test_implementsDynamic() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_implementsDynamic();
+  }
+
+  @override
+  @failingTest
+  test_implementsEnum() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_implementsEnum();
+  }
+
+  @override
+  @failingTest
+  test_implementsNonClass_class() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_implementsNonClass_class();
+  }
+
+  @override
+  @failingTest
+  test_implementsNonClass_typeAlias() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_implementsNonClass_typeAlias();
+  }
+
+  @override
+  @failingTest
+  test_implementsRepeated() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_REPEATED, found 0
+    await super.test_implementsRepeated();
+  }
+
+  @override
+  @failingTest
+  test_implementsRepeated_3times() async {
+    // Expected 3 errors of type CompileTimeErrorCode.IMPLEMENTS_REPEATED, found 0
+    await super.test_implementsRepeated_3times();
+  }
+
+  @override
+  @failingTest
+  test_implementsSuperClass() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS, found 0
+    await super.test_implementsSuperClass();
+  }
+
+  @override
+  @failingTest
+  test_implementsSuperClass_Object() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS, found 0
+    await super.test_implementsSuperClass_Object();
+  }
+
+  @override
+  @failingTest
+  test_implementsSuperClass_Object_typeAlias() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS, found 0
+    await super.test_implementsSuperClass_Object_typeAlias();
+  }
+
+  @override
+  @failingTest
+  test_implementsSuperClass_typeAlias() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS, found 0
+    await super.test_implementsSuperClass_typeAlias();
+  }
+
+  @override
+  @failingTest
+  test_implicitThisReferenceInInitializer_field() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, found 0
+    await super.test_implicitThisReferenceInInitializer_field();
+  }
+
+  @override
+  @failingTest
+  test_implicitThisReferenceInInitializer_field2() async {
+    // Bad state: No reference information for x at 37
+    await super.test_implicitThisReferenceInInitializer_field2();
+  }
+
+  @override
+  @failingTest
+  test_implicitThisReferenceInInitializer_invocation() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, found 0
+    await super.test_implicitThisReferenceInInitializer_invocation();
+  }
+
+  @override
+  @failingTest
+  test_implicitThisReferenceInInitializer_invocationInStatic() async {
+    // Bad state: No reference information for m at 27
+    await super.test_implicitThisReferenceInInitializer_invocationInStatic();
+  }
+
+  @override
+  @failingTest
+  test_implicitThisReferenceInInitializer_redirectingConstructorInvocation() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, found 0
+    await super
+        .test_implicitThisReferenceInInitializer_redirectingConstructorInvocation();
+  }
+
+  @override
+  @failingTest
+  test_implicitThisReferenceInInitializer_superConstructorInvocation() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, found 0
+    await super
+        .test_implicitThisReferenceInInitializer_superConstructorInvocation();
+  }
+
+  @override
+  @failingTest
+  test_importInternalLibrary() async {
+    // Expected 1 errors of type CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY, found 0
+    await super.test_importInternalLibrary();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30959')
   test_importOfNonLibrary() async {
     return super.test_importOfNonLibrary();
@@ -131,6 +1446,154 @@
 
   @override
   @failingTest
+  test_inconsistentCaseExpressionTypes() async {
+    // Expected 1 errors of type CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES, found 0
+    await super.test_inconsistentCaseExpressionTypes();
+  }
+
+  @override
+  @failingTest
+  test_inconsistentCaseExpressionTypes_dynamic() async {
+    // Expected 2 errors of type CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES, found 0
+    await super.test_inconsistentCaseExpressionTypes_dynamic();
+  }
+
+  @override
+  @failingTest
+  test_inconsistentCaseExpressionTypes_repeated() async {
+    // Expected 2 errors of type CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES, found 0
+    await super.test_inconsistentCaseExpressionTypes_repeated();
+  }
+
+  @override
+  @failingTest
+  test_initializerForNonExistent_const() async {
+    // Bad state: No reference information for = at 26
+    await super.test_initializerForNonExistent_const();
+  }
+
+  @override
+  @failingTest
+  test_initializerForNonExistent_initializer() async {
+    // Bad state: No reference information for = at 20
+    await super.test_initializerForNonExistent_initializer();
+  }
+
+  @override
+  @failingTest
+  test_initializerForStaticField() async {
+    // Bad state: No reference information for = at 36
+    await super.test_initializerForStaticField();
+  }
+
+  @override
+  @failingTest
+  test_initializingFormalForNonExistentField() async {
+    // Expected 1 errors of type CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD, found 0
+    await super.test_initializingFormalForNonExistentField();
+  }
+
+  @override
+  @failingTest
+  test_initializingFormalForNonExistentField_notInEnclosingClass() async {
+    // Expected 1 errors of type CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD, found 0
+    await super
+        .test_initializingFormalForNonExistentField_notInEnclosingClass();
+  }
+
+  @override
+  @failingTest
+  test_initializingFormalForNonExistentField_optional() async {
+    // Expected 1 errors of type CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD, found 0
+    await super.test_initializingFormalForNonExistentField_optional();
+  }
+
+  @override
+  @failingTest
+  test_initializingFormalForNonExistentField_synthetic() async {
+    // Expected 1 errors of type CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD, found 0
+    await super.test_initializingFormalForNonExistentField_synthetic();
+  }
+
+  @override
+  @failingTest
+  test_initializingFormalForStaticField() async {
+    // Expected 1 errors of type CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, found 0
+    await super.test_initializingFormalForStaticField();
+  }
+
+  @override
+  @failingTest
+  test_instanceMemberAccessFromFactory_named() async {
+    // Bad state: Expected element reference for analyzer offset 51; got one for kernel offset 71
+    await super.test_instanceMemberAccessFromFactory_named();
+  }
+
+  @override
+  @failingTest
+  test_instanceMemberAccessFromFactory_unnamed() async {
+    // Bad state: Expected element reference for analyzer offset 48; got one for kernel offset 68
+    await super.test_instanceMemberAccessFromFactory_unnamed();
+  }
+
+  @override
+  @failingTest
+  test_instanceMemberAccessFromStatic_field() async {
+    // Bad state: No reference information for f at 40
+    await super.test_instanceMemberAccessFromStatic_field();
+  }
+
+  @override
+  @failingTest
+  test_instanceMemberAccessFromStatic_getter() async {
+    // Bad state: No reference information for g at 48
+    await super.test_instanceMemberAccessFromStatic_getter();
+  }
+
+  @override
+  @failingTest
+  test_instanceMemberAccessFromStatic_method() async {
+    // Bad state: No reference information for m at 40
+    await super.test_instanceMemberAccessFromStatic_method();
+  }
+
+  @override
+  @failingTest
+  test_instantiateEnum_const() async {
+    // Bad state: No type information for E at 49
+    await super.test_instantiateEnum_const();
+  }
+
+  @override
+  @failingTest
+  test_instantiateEnum_new() async {
+    // Bad state: No type information for E at 47
+    await super.test_instantiateEnum_new();
+  }
+
+  @override
+  @failingTest
+  test_invalidAnnotation_getter() async {
+    // Expected 1 errors of type CompileTimeErrorCode.INVALID_ANNOTATION, found 0
+    await super.test_invalidAnnotation_getter();
+  }
+
+  @override
+  @failingTest
+  test_invalidAnnotation_importWithPrefix_getter() async {
+    // Bad state: No reference information for V at 27
+    await super.test_invalidAnnotation_importWithPrefix_getter();
+  }
+
+  @override
+  @failingTest
+  test_invalidAnnotation_importWithPrefix_notConstantVariable() async {
+    // Bad state: No reference information for V at 27
+    await super.test_invalidAnnotation_importWithPrefix_notConstantVariable();
+  }
+
+  @override
+  @failingTest
   test_invalidAnnotation_importWithPrefix_notVariableOrConstructorInvocation() {
     return super
         .test_invalidAnnotation_importWithPrefix_notVariableOrConstructorInvocation();
@@ -138,18 +1601,39 @@
 
   @override
   @failingTest
+  test_invalidAnnotation_notConstantVariable() async {
+    // Expected 1 errors of type CompileTimeErrorCode.INVALID_ANNOTATION, found 0
+    await super.test_invalidAnnotation_notConstantVariable();
+  }
+
+  @override
+  @failingTest
   test_invalidAnnotation_notVariableOrConstructorInvocation() {
     return super.test_invalidAnnotation_notVariableOrConstructorInvocation();
   }
 
   @override
   @failingTest
+  test_invalidAnnotation_staticMethodReference() async {
+    // Bad state: Expected element reference for analyzer offset 31; got one for kernel offset 30
+    await super.test_invalidAnnotation_staticMethodReference();
+  }
+
+  @override
+  @failingTest
   test_invalidAnnotation_unresolved_identifier() {
     return super.test_invalidAnnotation_unresolved_identifier();
   }
 
   @override
   @failingTest
+  test_invalidAnnotation_unresolved_invocation() async {
+    // Bad state: No reference information for Unresolved at 1
+    await super.test_invalidAnnotation_unresolved_invocation();
+  }
+
+  @override
+  @failingTest
   test_invalidAnnotation_unresolved_prefixedIdentifier() {
     return super.test_invalidAnnotation_unresolved_prefixedIdentifier();
   }
@@ -162,6 +1646,27 @@
 
   @override
   @failingTest
+  test_invalidAnnotationFromDeferredLibrary() async {
+    // Bad state: No reference information for v at 51
+    await super.test_invalidAnnotationFromDeferredLibrary();
+  }
+
+  @override
+  @failingTest
+  test_invalidAnnotationFromDeferredLibrary_constructor() async {
+    // Bad state: No reference information for C at 51
+    await super.test_invalidAnnotationFromDeferredLibrary_constructor();
+  }
+
+  @override
+  @failingTest
+  test_invalidAnnotationFromDeferredLibrary_namedConstructor() async {
+    // Bad state: No reference information for C at 51
+    await super.test_invalidAnnotationFromDeferredLibrary_namedConstructor();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31001')
   test_invalidConstructorName_notEnclosingClassName_defined() async {
     return super.test_invalidConstructorName_notEnclosingClassName_defined();
@@ -190,6 +1695,183 @@
 
   @override
   @failingTest
+  test_invalidModifierOnConstructor_async() async {
+    // Expected 1 errors of type CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR, found 0
+    await super.test_invalidModifierOnConstructor_async();
+  }
+
+  @override
+  @failingTest
+  test_invalidModifierOnConstructor_asyncStar() async {
+    // Expected 1 errors of type CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR, found 0
+    await super.test_invalidModifierOnConstructor_asyncStar();
+  }
+
+  @override
+  @failingTest
+  test_invalidModifierOnConstructor_syncStar() async {
+    // Expected 1 errors of type CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR, found 0
+    await super.test_invalidModifierOnConstructor_syncStar();
+  }
+
+  @override
+  @failingTest
+  test_invalidModifierOnSetter_member_async() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_invalidModifierOnSetter_member_async();
+  }
+
+  @override
+  @failingTest
+  test_invalidModifierOnSetter_member_asyncStar() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_invalidModifierOnSetter_member_asyncStar();
+  }
+
+  @override
+  @failingTest
+  test_invalidModifierOnSetter_member_syncStar() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_invalidModifierOnSetter_member_syncStar();
+  }
+
+  @override
+  @failingTest
+  test_invalidModifierOnSetter_topLevel_async() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_invalidModifierOnSetter_topLevel_async();
+  }
+
+  @override
+  @failingTest
+  test_invalidModifierOnSetter_topLevel_asyncStar() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_invalidModifierOnSetter_topLevel_asyncStar();
+  }
+
+  @override
+  @failingTest
+  test_invalidModifierOnSetter_topLevel_syncStar() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_invalidModifierOnSetter_topLevel_syncStar();
+  }
+
+  @override
+  @failingTest
+  test_invalidReferenceToThis_factoryConstructor() async {
+    // Expected 1 errors of type CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, found 0
+    await super.test_invalidReferenceToThis_factoryConstructor();
+  }
+
+  @override
+  @failingTest
+  test_invalidReferenceToThis_instanceVariableInitializer_inConstructor() async {
+    // Expected 1 errors of type CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, found 0
+    await super
+        .test_invalidReferenceToThis_instanceVariableInitializer_inConstructor();
+  }
+
+  @override
+  @failingTest
+  test_invalidReferenceToThis_instanceVariableInitializer_inDeclaration() async {
+    // Expected 1 errors of type CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, found 0
+    await super
+        .test_invalidReferenceToThis_instanceVariableInitializer_inDeclaration();
+  }
+
+  @override
+  @failingTest
+  test_invalidReferenceToThis_staticMethod() async {
+    // Expected 1 errors of type CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, found 0
+    await super.test_invalidReferenceToThis_staticMethod();
+  }
+
+  @override
+  @failingTest
+  test_invalidReferenceToThis_staticVariableInitializer() async {
+    // Expected 1 errors of type CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, found 0
+    await super.test_invalidReferenceToThis_staticVariableInitializer();
+  }
+
+  @override
+  @failingTest
+  test_invalidReferenceToThis_superInitializer() async {
+    // Expected 1 errors of type CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, found 0
+    await super.test_invalidReferenceToThis_superInitializer();
+  }
+
+  @override
+  @failingTest
+  test_invalidReferenceToThis_topLevelFunction() async {
+    // Expected 1 errors of type CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, found 0
+    await super.test_invalidReferenceToThis_topLevelFunction();
+  }
+
+  @override
+  @failingTest
+  test_invalidReferenceToThis_variableInitializer() async {
+    // Expected 1 errors of type CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, found 0
+    await super.test_invalidReferenceToThis_variableInitializer();
+  }
+
+  @override
+  @failingTest
+  test_isInConstInstanceCreation_restored() async {
+    // Expected 1 errors of type CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
+    await super.test_isInConstInstanceCreation_restored();
+  }
+
+  @override
+  @failingTest
+  test_isInInstanceVariableInitializer_restored() async {
+    // Bad state: No reference information for _foo at 89
+    await super.test_isInInstanceVariableInitializer_restored();
+  }
+
+  @override
+  @failingTest
+  test_labelInOuterScope() async {
+    // Bad state: No reference information for l at 32
+    await super.test_labelInOuterScope();
+  }
+
+  @override
+  @failingTest
+  test_labelUndefined_break() async {
+    // Bad state: No reference information for x at 8
+    await super.test_labelUndefined_break();
+  }
+
+  @override
+  @failingTest
+  test_labelUndefined_continue() async {
+    // Bad state: No reference information for x at 8
+    await super.test_labelUndefined_continue();
+  }
+
+  @override
+  @failingTest
+  test_length_of_erroneous_constant() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t15 = 1 in let ...
+    await super.test_length_of_erroneous_constant();
+  }
+
+  @override
+  @failingTest
+  test_memberWithClassName_field() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME, found 0
+    await super.test_memberWithClassName_field();
+  }
+
+  @override
+  @failingTest
+  test_memberWithClassName_field2() async {
+    // UnimplementedError: Multiple field
+    await super.test_memberWithClassName_field2();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30981')
   test_memberWithClassName_getter() async {
     return super.test_memberWithClassName_getter();
@@ -204,6 +1886,197 @@
 
   @override
   @failingTest
+  test_mixinDeclaresConstructor_classDeclaration() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR, found 0
+    await super.test_mixinDeclaresConstructor_classDeclaration();
+  }
+
+  @override
+  @failingTest
+  test_mixinDeclaresConstructor_typeAlias() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR, found 0
+    await super.test_mixinDeclaresConstructor_typeAlias();
+  }
+
+  @override
+  @failingTest
+  test_mixinDeferredClass() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_DEFERRED_CLASS, found 0;
+    //          0 errors of type HintCode.UNUSED_IMPORT, found 1 (21)
+    await super.test_mixinDeferredClass();
+  }
+
+  @override
+  @failingTest
+  test_mixinDeferredClass_classTypeAlias() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_DEFERRED_CLASS, found 0;
+    //          0 errors of type HintCode.UNUSED_IMPORT, found 1 (21)
+    await super.test_mixinDeferredClass_classTypeAlias();
+  }
+
+  @override
+  @failingTest
+  test_mixinHasNoConstructors_mixinApp() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS, found 0
+    await super.test_mixinHasNoConstructors_mixinApp();
+  }
+
+  @override
+  @failingTest
+  test_mixinHasNoConstructors_mixinClass() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS, found 0
+    await super.test_mixinHasNoConstructors_mixinClass();
+  }
+
+  @override
+  @failingTest
+  test_mixinHasNoConstructors_mixinClass_explicitSuperCall() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS, found 0
+    await super.test_mixinHasNoConstructors_mixinClass_explicitSuperCall();
+  }
+
+  @override
+  @failingTest
+  test_mixinHasNoConstructors_mixinClass_implicitSuperCall() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS, found 0
+    await super.test_mixinHasNoConstructors_mixinClass_implicitSuperCall();
+  }
+
+  @override
+  @failingTest
+  test_mixinHasNoConstructors_mixinClass_namedSuperCall() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS, found 0
+    await super.test_mixinHasNoConstructors_mixinClass_namedSuperCall();
+  }
+
+  @override
+  @failingTest
+  test_mixinInheritsFromNotObject_classDeclaration_extends() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, found 0
+    await super.test_mixinInheritsFromNotObject_classDeclaration_extends();
+  }
+
+  @override
+  @failingTest
+  test_mixinInheritsFromNotObject_classDeclaration_with() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, found 0
+    await super.test_mixinInheritsFromNotObject_classDeclaration_with();
+  }
+
+  @override
+  @failingTest
+  test_mixinInheritsFromNotObject_typeAlias_extends() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, found 0
+    await super.test_mixinInheritsFromNotObject_typeAlias_extends();
+  }
+
+  @override
+  @failingTest
+  test_mixinInheritsFromNotObject_typeAlias_with() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, found 0
+    await super.test_mixinInheritsFromNotObject_typeAlias_with();
+  }
+
+  @override
+  @failingTest
+  test_mixinOfDisallowedClass_class_bool() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
+    await super.test_mixinOfDisallowedClass_class_bool();
+  }
+
+  @override
+  @failingTest
+  test_mixinOfDisallowedClass_class_double() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
+    await super.test_mixinOfDisallowedClass_class_double();
+  }
+
+  @override
+  @failingTest
+  test_mixinOfDisallowedClass_class_int() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
+    await super.test_mixinOfDisallowedClass_class_int();
+  }
+
+  @override
+  @failingTest
+  test_mixinOfDisallowedClass_class_Null() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
+    await super.test_mixinOfDisallowedClass_class_Null();
+  }
+
+  @override
+  @failingTest
+  test_mixinOfDisallowedClass_class_num() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
+    await super.test_mixinOfDisallowedClass_class_num();
+  }
+
+  @override
+  @failingTest
+  test_mixinOfDisallowedClass_class_String() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
+    await super.test_mixinOfDisallowedClass_class_String();
+  }
+
+  @override
+  @failingTest
+  test_mixinOfDisallowedClass_classTypeAlias_bool() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
+    await super.test_mixinOfDisallowedClass_classTypeAlias_bool();
+  }
+
+  @override
+  @failingTest
+  test_mixinOfDisallowedClass_classTypeAlias_double() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
+    await super.test_mixinOfDisallowedClass_classTypeAlias_double();
+  }
+
+  @override
+  @failingTest
+  test_mixinOfDisallowedClass_classTypeAlias_int() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
+    await super.test_mixinOfDisallowedClass_classTypeAlias_int();
+  }
+
+  @override
+  @failingTest
+  test_mixinOfDisallowedClass_classTypeAlias_Null() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
+    await super.test_mixinOfDisallowedClass_classTypeAlias_Null();
+  }
+
+  @override
+  @failingTest
+  test_mixinOfDisallowedClass_classTypeAlias_num() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
+    await super.test_mixinOfDisallowedClass_classTypeAlias_num();
+  }
+
+  @override
+  @failingTest
+  test_mixinOfDisallowedClass_classTypeAlias_String() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS, found 0
+    await super.test_mixinOfDisallowedClass_classTypeAlias_String();
+  }
+
+  @override
+  @failingTest
+  test_mixinOfEnum() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_mixinOfEnum();
+  }
+
+  @override
+  @failingTest
+  test_mixinOfNonClass_class() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_mixinOfNonClass_class();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31005')
   test_mixinOfNonClass_typeAlias() async {
     return super.test_mixinOfNonClass_typeAlias();
@@ -211,6 +2084,27 @@
 
   @override
   @failingTest
+  test_mixinReferencesSuper() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_REFERENCES_SUPER, found 0
+    await super.test_mixinReferencesSuper();
+  }
+
+  @override
+  @failingTest
+  test_mixinWithNonClassSuperclass_class() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS, found 0
+    await super.test_mixinWithNonClassSuperclass_class();
+  }
+
+  @override
+  @failingTest
+  test_mixinWithNonClassSuperclass_typeAlias() async {
+    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS, found 0
+    await super.test_mixinWithNonClassSuperclass_typeAlias();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30982')
   test_multipleRedirectingConstructorInvocations() async {
     return super.test_multipleRedirectingConstructorInvocations();
@@ -225,12 +2119,369 @@
 
   @override
   @failingTest
+  test_nativeClauseInNonSDKCode() async {
+    // Expected 1 errors of type ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE, found 0
+    await super.test_nativeClauseInNonSDKCode();
+  }
+
+  @override
+  @failingTest
+  test_nativeFunctionBodyInNonSDKCode_function() async {
+    // Expected 1 errors of type ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE, found 0
+    await super.test_nativeFunctionBodyInNonSDKCode_function();
+  }
+
+  @override
+  @failingTest
+  test_nativeFunctionBodyInNonSDKCode_method() async {
+    // Expected 1 errors of type ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE, found 0
+    await super.test_nativeFunctionBodyInNonSDKCode_method();
+  }
+
+  @override
+  @failingTest
   test_noAnnotationConstructorArguments() {
     return super.test_noAnnotationConstructorArguments();
   }
 
   @override
   @failingTest
+  test_noDefaultSuperConstructorExplicit() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, found 0
+    await super.test_noDefaultSuperConstructorExplicit();
+  }
+
+  @override
+  @failingTest
+  test_noDefaultSuperConstructorExplicit_MixinAppWithDirectSuperCall() async {
+    // Expected 1 errors of type CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, found 0
+    await super
+        .test_noDefaultSuperConstructorExplicit_MixinAppWithDirectSuperCall();
+  }
+
+  @override
+  @failingTest
+  test_noDefaultSuperConstructorExplicit_mixinAppWithNamedParam() async {
+    // Expected 1 errors of type CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, found 0
+    await super.test_noDefaultSuperConstructorExplicit_mixinAppWithNamedParam();
+  }
+
+  @override
+  @failingTest
+  test_noDefaultSuperConstructorExplicit_MixinAppWithNamedSuperCall() async {
+    // Expected 1 errors of type CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, found 0
+    await super
+        .test_noDefaultSuperConstructorExplicit_MixinAppWithNamedSuperCall();
+  }
+
+  @override
+  @failingTest
+  test_noDefaultSuperConstructorExplicit_mixinAppWithOptionalParam() async {
+    // Expected 1 errors of type CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, found 0
+    await super
+        .test_noDefaultSuperConstructorExplicit_mixinAppWithOptionalParam();
+  }
+
+  @override
+  @failingTest
+  test_noDefaultSuperConstructorExplicit_MixinWithDirectSuperCall() async {
+    // Expected 1 errors of type CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, found 0
+    await super
+        .test_noDefaultSuperConstructorExplicit_MixinWithDirectSuperCall();
+  }
+
+  @override
+  @failingTest
+  test_noDefaultSuperConstructorExplicit_mixinWithNamedParam() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, found 0
+    await super.test_noDefaultSuperConstructorExplicit_mixinWithNamedParam();
+  }
+
+  @override
+  @failingTest
+  test_noDefaultSuperConstructorExplicit_MixinWithNamedSuperCall() async {
+    // Expected 1 errors of type CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, found 0
+    await super
+        .test_noDefaultSuperConstructorExplicit_MixinWithNamedSuperCall();
+  }
+
+  @override
+  @failingTest
+  test_noDefaultSuperConstructorExplicit_mixinWithOptionalParam() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, found 0
+    await super.test_noDefaultSuperConstructorExplicit_mixinWithOptionalParam();
+  }
+
+  @override
+  @failingTest
+  test_noDefaultSuperConstructorImplicit_mixinAppWithNamedParam() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, found 0
+    await super.test_noDefaultSuperConstructorImplicit_mixinAppWithNamedParam();
+  }
+
+  @override
+  @failingTest
+  test_noDefaultSuperConstructorImplicit_mixinAppWithOptionalParam() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, found 0
+    await super
+        .test_noDefaultSuperConstructorImplicit_mixinAppWithOptionalParam();
+  }
+
+  @override
+  @failingTest
+  test_noDefaultSuperConstructorImplicit_mixinWithNamedParam() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, found 0
+    await super.test_noDefaultSuperConstructorImplicit_mixinWithNamedParam();
+  }
+
+  @override
+  @failingTest
+  test_noDefaultSuperConstructorImplicit_mixinWithOptionalParam() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, found 0
+    await super.test_noDefaultSuperConstructorImplicit_mixinWithOptionalParam();
+  }
+
+  @override
+  @failingTest
+  test_noDefaultSuperConstructorImplicit_superHasParameters() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, found 0
+    await super.test_noDefaultSuperConstructorImplicit_superHasParameters();
+  }
+
+  @override
+  @failingTest
+  test_noDefaultSuperConstructorImplicit_superOnlyNamed() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, found 0
+    await super.test_noDefaultSuperConstructorImplicit_superOnlyNamed();
+  }
+
+  @override
+  @failingTest
+  test_nonConstantAnnotationConstructor_named() async {
+    // Bad state: No reference information for A at 30
+    await super.test_nonConstantAnnotationConstructor_named();
+  }
+
+  @override
+  @failingTest
+  test_nonConstantAnnotationConstructor_unnamed() async {
+    // Bad state: No reference information for A at 22
+    await super.test_nonConstantAnnotationConstructor_unnamed();
+  }
+
+  @override
+  @failingTest
+  test_nonConstantDefaultValue_function_named() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE, found 0
+    await super.test_nonConstantDefaultValue_function_named();
+  }
+
+  @override
+  @failingTest
+  test_nonConstantDefaultValue_function_positional() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE, found 0
+    await super.test_nonConstantDefaultValue_function_positional();
+  }
+
+  @override
+  @failingTest
+  test_nonConstantDefaultValue_inConstructor_named() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE, found 0
+    await super.test_nonConstantDefaultValue_inConstructor_named();
+  }
+
+  @override
+  @failingTest
+  test_nonConstantDefaultValue_inConstructor_positional() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE, found 0
+    await super.test_nonConstantDefaultValue_inConstructor_positional();
+  }
+
+  @override
+  @failingTest
+  test_nonConstantDefaultValue_method_named() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE, found 0
+    await super.test_nonConstantDefaultValue_method_named();
+  }
+
+  @override
+  @failingTest
+  test_nonConstantDefaultValue_method_positional() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE, found 0
+    await super.test_nonConstantDefaultValue_method_positional();
+  }
+
+  @override
+  @failingTest
+  test_nonConstantDefaultValueFromDeferredLibrary() async {
+    // Bad state: Expected element reference for analyzer offset 55; got one for kernel offset 57
+    await super.test_nonConstantDefaultValueFromDeferredLibrary();
+  }
+
+  @override
+  @failingTest
+  test_nonConstantDefaultValueFromDeferredLibrary_nested() async {
+    // Bad state: Expected element reference for analyzer offset 55; got one for kernel offset 57
+    await super.test_nonConstantDefaultValueFromDeferredLibrary_nested();
+  }
+
+  @override
+  @failingTest
+  test_nonConstCaseExpression() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION, found 0
+    await super.test_nonConstCaseExpression();
+  }
+
+  @override
+  @failingTest
+  test_nonConstCaseExpressionFromDeferredLibrary() async {
+    // Bad state: Expected element reference for analyzer offset 87; got one for kernel offset 89
+    await super.test_nonConstCaseExpressionFromDeferredLibrary();
+  }
+
+  @override
+  @failingTest
+  test_nonConstCaseExpressionFromDeferredLibrary_nested() async {
+    // Bad state: Expected element reference for analyzer offset 87; got one for kernel offset 89
+    await super.test_nonConstCaseExpressionFromDeferredLibrary_nested();
+  }
+
+  @override
+  @failingTest
+  test_nonConstListElement() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, found 0
+    await super.test_nonConstListElement();
+  }
+
+  @override
+  @failingTest
+  test_nonConstListElementFromDeferredLibrary() async {
+    // Bad state: Expected element reference for analyzer offset 70; got one for kernel offset 72
+    await super.test_nonConstListElementFromDeferredLibrary();
+  }
+
+  @override
+  @failingTest
+  test_nonConstListElementFromDeferredLibrary_nested() async {
+    // Bad state: Expected element reference for analyzer offset 70; got one for kernel offset 72
+    await super.test_nonConstListElementFromDeferredLibrary_nested();
+  }
+
+  @override
+  @failingTest
+  test_nonConstMapAsExpressionStatement_begin() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_nonConstMapAsExpressionStatement_begin();
+  }
+
+  @override
+  @failingTest
+  test_nonConstMapAsExpressionStatement_only() async {
+    // Bad state: No reference information for  at 13
+    await super.test_nonConstMapAsExpressionStatement_only();
+  }
+
+  @override
+  @failingTest
+  test_nonConstMapKey() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, found 0
+    await super.test_nonConstMapKey();
+  }
+
+  @override
+  @failingTest
+  test_nonConstMapKeyFromDeferredLibrary() async {
+    // Bad state: Expected element reference for analyzer offset 70; got one for kernel offset 72
+    await super.test_nonConstMapKeyFromDeferredLibrary();
+  }
+
+  @override
+  @failingTest
+  test_nonConstMapKeyFromDeferredLibrary_nested() async {
+    // Bad state: Expected element reference for analyzer offset 70; got one for kernel offset 72
+    await super.test_nonConstMapKeyFromDeferredLibrary_nested();
+  }
+
+  @override
+  @failingTest
+  test_nonConstMapValue() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, found 0
+    await super.test_nonConstMapValue();
+  }
+
+  @override
+  @failingTest
+  test_nonConstMapValueFromDeferredLibrary() async {
+    // Bad state: Expected element reference for analyzer offset 76; got one for kernel offset 78
+    await super.test_nonConstMapValueFromDeferredLibrary();
+  }
+
+  @override
+  @failingTest
+  test_nonConstMapValueFromDeferredLibrary_nested() async {
+    // Bad state: Expected element reference for analyzer offset 76; got one for kernel offset 78
+    await super.test_nonConstMapValueFromDeferredLibrary_nested();
+  }
+
+  @override
+  @failingTest
+  test_nonConstValueInInitializer_assert_condition() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER, found 0
+    await super.test_nonConstValueInInitializer_assert_condition();
+  }
+
+  @override
+  @failingTest
+  test_nonConstValueInInitializer_assert_message() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER, found 0
+    await super.test_nonConstValueInInitializer_assert_message();
+  }
+
+  @override
+  @failingTest
+  test_nonConstValueInInitializer_binary_notBool_left() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t17 = p in let ...
+    await super.test_nonConstValueInInitializer_binary_notBool_left();
+  }
+
+  @override
+  @failingTest
+  test_nonConstValueInInitializer_binary_notBool_right() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t18 = p in let ...
+    await super.test_nonConstValueInInitializer_binary_notBool_right();
+  }
+
+  @override
+  @failingTest
+  test_nonConstValueInInitializer_binary_notInt() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t19 = p in let ...
+    await super.test_nonConstValueInInitializer_binary_notInt();
+  }
+
+  @override
+  @failingTest
+  test_nonConstValueInInitializer_binary_notNum() async {
+    // UnimplementedError: kernel: (AsExpression) 5.{dart.core::num::+}(let ...
+    await super.test_nonConstValueInInitializer_binary_notNum();
+  }
+
+  @override
+  @failingTest
+  test_nonConstValueInInitializer_field() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER, found 0
+    await super.test_nonConstValueInInitializer_field();
+  }
+
+  @override
+  @failingTest
+  test_nonConstValueInInitializer_instanceCreation() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER, found 0;
+    //          1 errors of type CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, found 0
+    await super.test_nonConstValueInInitializer_instanceCreation();
+  }
+
+  @override
+  @failingTest
   test_nonConstValueInInitializer_instanceCreation_inDifferentFile() {
     return super
         .test_nonConstValueInInitializer_instanceCreation_inDifferentFile();
@@ -238,6 +2489,148 @@
 
   @override
   @failingTest
+  test_nonConstValueInInitializer_redirecting() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER, found 0
+    await super.test_nonConstValueInInitializer_redirecting();
+  }
+
+  @override
+  @failingTest
+  test_nonConstValueInInitializer_super() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER, found 0
+    await super.test_nonConstValueInInitializer_super();
+  }
+
+  @override
+  @failingTest
+  test_nonConstValueInInitializerFromDeferredLibrary_field() async {
+    // Bad state: Expected element reference for analyzer offset 91; got one for kernel offset 93
+    await super.test_nonConstValueInInitializerFromDeferredLibrary_field();
+  }
+
+  @override
+  @failingTest
+  test_nonConstValueInInitializerFromDeferredLibrary_field_nested() async {
+    // Bad state: Expected element reference for analyzer offset 91; got one for kernel offset 93
+    await super
+        .test_nonConstValueInInitializerFromDeferredLibrary_field_nested();
+  }
+
+  @override
+  @failingTest
+  test_nonConstValueInInitializerFromDeferredLibrary_redirecting() async {
+    // Bad state: Expected element reference for analyzer offset 103; got one for kernel offset 105
+    await super
+        .test_nonConstValueInInitializerFromDeferredLibrary_redirecting();
+  }
+
+  @override
+  @failingTest
+  test_nonConstValueInInitializerFromDeferredLibrary_super() async {
+    // Bad state: Expected element reference for analyzer offset 114; got one for kernel offset 116
+    await super.test_nonConstValueInInitializerFromDeferredLibrary_super();
+  }
+
+  @override
+  @failingTest
+  test_nonGenerativeConstructor_explicit() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, found 0
+    await super.test_nonGenerativeConstructor_explicit();
+  }
+
+  @override
+  @failingTest
+  test_nonGenerativeConstructor_implicit() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, found 0
+    await super.test_nonGenerativeConstructor_implicit();
+  }
+
+  @override
+  @failingTest
+  test_nonGenerativeConstructor_implicit2() async {
+    // Expected 1 errors of type CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, found 0
+    await super.test_nonGenerativeConstructor_implicit2();
+  }
+
+  @override
+  @failingTest
+  test_notEnoughRequiredArguments_const() async {
+    // Bad state: No type information for A at 47
+    await super.test_notEnoughRequiredArguments_const();
+  }
+
+  @override
+  @failingTest
+  test_notEnoughRequiredArguments_const_super() async {
+    // UnimplementedError: For ShadowInvalidInitializer
+    await super.test_notEnoughRequiredArguments_const_super();
+  }
+
+  @override
+  @failingTest
+  test_optionalParameterInOperator_named() async {
+    // Expected 1 errors of type CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR, found 0
+    await super.test_optionalParameterInOperator_named();
+  }
+
+  @override
+  @failingTest
+  test_optionalParameterInOperator_positional() async {
+    // Expected 1 errors of type CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR, found 0
+    await super.test_optionalParameterInOperator_positional();
+  }
+
+  @override
+  @failingTest
+  test_prefix_assignment_compound_in_method() async {
+    // Bad state: No reference information for p at 46
+    await super.test_prefix_assignment_compound_in_method();
+  }
+
+  @override
+  @failingTest
+  test_prefix_assignment_compound_not_in_method() async {
+    // Bad state: No reference information for p at 32
+    await super.test_prefix_assignment_compound_not_in_method();
+  }
+
+  @override
+  @failingTest
+  test_prefix_assignment_in_method() async {
+    // Bad state: No reference information for p at 46
+    await super.test_prefix_assignment_in_method();
+  }
+
+  @override
+  @failingTest
+  test_prefix_assignment_not_in_method() async {
+    // Bad state: No reference information for p at 32
+    await super.test_prefix_assignment_not_in_method();
+  }
+
+  @override
+  @failingTest
+  test_prefix_conditionalPropertyAccess_call() async {
+    // Bad state: Expected element reference for analyzer offset 32; got one for kernel offset 35
+    await super.test_prefix_conditionalPropertyAccess_call();
+  }
+
+  @override
+  @failingTest
+  test_prefix_conditionalPropertyAccess_call_loadLibrary() async {
+    // Bad state: No reference information for p at 41
+    await super.test_prefix_conditionalPropertyAccess_call_loadLibrary();
+  }
+
+  @override
+  @failingTest
+  test_prefix_conditionalPropertyAccess_get() async {
+    // Bad state: Expected element reference for analyzer offset 39; got one for kernel offset 42
+    await super.test_prefix_conditionalPropertyAccess_get();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_prefix_conditionalPropertyAccess_get_loadLibrary() async {
     return super.test_prefix_conditionalPropertyAccess_get_loadLibrary();
@@ -245,6 +2638,34 @@
 
   @override
   @failingTest
+  test_prefix_conditionalPropertyAccess_set() async {
+    // Bad state: Expected element reference for analyzer offset 32; got one for kernel offset 35
+    await super.test_prefix_conditionalPropertyAccess_set();
+  }
+
+  @override
+  @failingTest
+  test_prefix_conditionalPropertyAccess_set_loadLibrary() async {
+    // Bad state: No reference information for p at 41
+    await super.test_prefix_conditionalPropertyAccess_set_loadLibrary();
+  }
+
+  @override
+  @failingTest
+  test_prefix_unqualified_invocation_in_method() async {
+    // Bad state: No reference information for p at 46
+    await super.test_prefix_unqualified_invocation_in_method();
+  }
+
+  @override
+  @failingTest
+  test_prefix_unqualified_invocation_not_in_method() async {
+    // Bad state: No reference information for p at 32
+    await super.test_prefix_unqualified_invocation_not_in_method();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30857')
   test_prefixCollidesWithTopLevelMembers_functionTypeAlias() async {
     return super.test_prefixCollidesWithTopLevelMembers_functionTypeAlias();
@@ -273,6 +2694,212 @@
 
   @override
   @failingTest
+  test_prefixNotFollowedByDot() async {
+    // Bad state: No reference information for p at 39
+    await super.test_prefixNotFollowedByDot();
+  }
+
+  @override
+  @failingTest
+  test_prefixNotFollowedByDot_compoundAssignment() async {
+    // Bad state: No reference information for p at 32
+    await super.test_prefixNotFollowedByDot_compoundAssignment();
+  }
+
+  @override
+  @failingTest
+  test_prefixNotFollowedByDot_conditionalMethodInvocation() async {
+    // Bad state: Expected element reference for analyzer offset 32; got one for kernel offset 35
+    await super.test_prefixNotFollowedByDot_conditionalMethodInvocation();
+  }
+
+  @override
+  @failingTest
+  test_privateCollisionInClassTypeAlias_mixinAndMixin() async {
+    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, found 0
+    await super.test_privateCollisionInClassTypeAlias_mixinAndMixin();
+  }
+
+  @override
+  @failingTest
+  test_privateCollisionInClassTypeAlias_mixinAndMixin_indirect() async {
+    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, found 0
+    await super.test_privateCollisionInClassTypeAlias_mixinAndMixin_indirect();
+  }
+
+  @override
+  @failingTest
+  test_privateCollisionInClassTypeAlias_superclassAndMixin() async {
+    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, found 0
+    await super.test_privateCollisionInClassTypeAlias_superclassAndMixin();
+  }
+
+  @override
+  @failingTest
+  test_privateCollisionInClassTypeAlias_superclassAndMixin_same() async {
+    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, found 0
+    await super.test_privateCollisionInClassTypeAlias_superclassAndMixin_same();
+  }
+
+  @override
+  @failingTest
+  test_privateCollisionInMixinApplication_mixinAndMixin() async {
+    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, found 0
+    await super.test_privateCollisionInMixinApplication_mixinAndMixin();
+  }
+
+  @override
+  @failingTest
+  test_privateCollisionInMixinApplication_mixinAndMixin_indirect() async {
+    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, found 0
+    await super
+        .test_privateCollisionInMixinApplication_mixinAndMixin_indirect();
+  }
+
+  @override
+  @failingTest
+  test_privateCollisionInMixinApplication_superclassAndMixin() async {
+    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, found 0
+    await super.test_privateCollisionInMixinApplication_superclassAndMixin();
+  }
+
+  @override
+  @failingTest
+  test_privateCollisionInMixinApplication_superclassAndMixin_same() async {
+    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, found 0
+    await super
+        .test_privateCollisionInMixinApplication_superclassAndMixin_same();
+  }
+
+  @override
+  @failingTest
+  test_privateOptionalParameter() async {
+    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, found 0
+    await super.test_privateOptionalParameter();
+  }
+
+  @override
+  @failingTest
+  test_privateOptionalParameter_fieldFormal() async {
+    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, found 0
+    await super.test_privateOptionalParameter_fieldFormal();
+  }
+
+  @override
+  @failingTest
+  test_privateOptionalParameter_withDefaultValue() async {
+    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, found 0
+    await super.test_privateOptionalParameter_withDefaultValue();
+  }
+
+  @override
+  @failingTest
+  test_recursiveCompileTimeConstant() async {
+    // Expected 1 errors of type CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT, found 0
+    await super.test_recursiveCompileTimeConstant();
+  }
+
+  @override
+  @failingTest
+  test_recursiveCompileTimeConstant_cycle() async {
+    // UnimplementedError: kernel: (ShadowMethodInvocation) #lib4::y.+(1)
+    await super.test_recursiveCompileTimeConstant_cycle();
+  }
+
+  @override
+  @failingTest
+  test_recursiveCompileTimeConstant_initializer_after_toplevel_var() async {
+    // Expected 1 errors of type CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT, found 0
+    await super
+        .test_recursiveCompileTimeConstant_initializer_after_toplevel_var();
+  }
+
+  @override
+  @failingTest
+  test_recursiveCompileTimeConstant_singleVariable() async {
+    // Expected 1 errors of type CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT, found 0
+    await super.test_recursiveCompileTimeConstant_singleVariable();
+  }
+
+  @override
+  @failingTest
+  test_recursiveConstructorRedirect() async {
+    // Expected 2 errors of type CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT, found 0
+    await super.test_recursiveConstructorRedirect();
+  }
+
+  @override
+  @failingTest
+  test_recursiveConstructorRedirect_directSelfReference() async {
+    // Expected 1 errors of type CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT, found 0
+    await super.test_recursiveConstructorRedirect_directSelfReference();
+  }
+
+  @override
+  @failingTest
+  test_recursiveFactoryRedirect() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_recursiveFactoryRedirect();
+  }
+
+  @override
+  @failingTest
+  test_recursiveFactoryRedirect_directSelfReference() async {
+    // Expected 1 errors of type CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, found 0
+    await super.test_recursiveFactoryRedirect_directSelfReference();
+  }
+
+  @override
+  @failingTest
+  test_recursiveFactoryRedirect_diverging() async {
+    // Bad state: Attempting to apply a non-parameterized type (TypeParameterTypeImpl) to type arguments
+    await super.test_recursiveFactoryRedirect_diverging();
+  }
+
+  @override
+  @failingTest
+  test_recursiveFactoryRedirect_generic() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_recursiveFactoryRedirect_generic();
+  }
+
+  @override
+  @failingTest
+  test_recursiveFactoryRedirect_named() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_recursiveFactoryRedirect_named();
+  }
+
+  @override
+  @failingTest
+  test_recursiveFactoryRedirect_outsideCycle() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_recursiveFactoryRedirect_outsideCycle();
+  }
+
+  @override
+  @failingTest
+  test_recursiveInterfaceInheritance_extends() async {
+    // Expected 2 errors of type CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, found 0
+    await super.test_recursiveInterfaceInheritance_extends();
+  }
+
+  @override
+  @failingTest
+  test_recursiveInterfaceInheritance_extends_implements() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_recursiveInterfaceInheritance_extends_implements();
+  }
+
+  @override
+  @failingTest
+  test_recursiveInterfaceInheritance_implements() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_recursiveInterfaceInheritance_implements();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31007')
   test_recursiveInterfaceInheritance_mixin() async {
     return super.test_recursiveInterfaceInheritance_mixin();
@@ -280,6 +2907,65 @@
 
   @override
   @failingTest
+  test_recursiveInterfaceInheritance_mixin_superclass() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_recursiveInterfaceInheritance_mixin_superclass();
+  }
+
+  @override
+  @failingTest
+  test_recursiveInterfaceInheritance_tail() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_recursiveInterfaceInheritance_tail();
+  }
+
+  @override
+  @failingTest
+  test_recursiveInterfaceInheritance_tail2() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_recursiveInterfaceInheritance_tail2();
+  }
+
+  @override
+  @failingTest
+  test_recursiveInterfaceInheritance_tail3() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_recursiveInterfaceInheritance_tail3();
+  }
+
+  @override
+  @failingTest
+  test_recursiveInterfaceInheritanceBaseCaseExtends() async {
+    // Expected 1 errors of type CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS, found 0
+    await super.test_recursiveInterfaceInheritanceBaseCaseExtends();
+  }
+
+  @override
+  @failingTest
+  test_recursiveInterfaceInheritanceBaseCaseExtends_abstract() async {
+    // Expected 1 errors of type CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS, found 0;
+    //          1 errors of type StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, found 0;
+    //          1 errors of type StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE, found 0
+    await super.test_recursiveInterfaceInheritanceBaseCaseExtends_abstract();
+  }
+
+  @override
+  @failingTest
+  test_recursiveInterfaceInheritanceBaseCaseImplements() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_recursiveInterfaceInheritanceBaseCaseImplements();
+  }
+
+  @override
+  @failingTest
+  test_recursiveInterfaceInheritanceBaseCaseImplements_typeAlias() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super
+        .test_recursiveInterfaceInheritanceBaseCaseImplements_typeAlias();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31007')
   test_recursiveInterfaceInheritanceBaseCaseWith() async {
     return super.test_recursiveInterfaceInheritanceBaseCaseWith();
@@ -287,6 +2973,202 @@
 
   @override
   @failingTest
+  test_redirectGenerativeToMissingConstructor() async {
+    // Bad state: No reference information for noSuchConstructor at 23
+    await super.test_redirectGenerativeToMissingConstructor();
+  }
+
+  @override
+  @failingTest
+  test_redirectGenerativeToNonGenerativeConstructor() async {
+    // Bad state: No reference information for x at 23
+    await super.test_redirectGenerativeToNonGenerativeConstructor();
+  }
+
+  @override
+  @failingTest
+  test_redirectToMissingConstructor_named() async {
+    // NoSuchMethodError: The getter 'returnType' was called on null.
+    await super.test_redirectToMissingConstructor_named();
+  }
+
+  @override
+  @failingTest
+  test_redirectToMissingConstructor_unnamed() async {
+    // NoSuchMethodError: The getter 'returnType' was called on null.
+    await super.test_redirectToMissingConstructor_unnamed();
+  }
+
+  @override
+  @failingTest
+  test_redirectToNonClass_notAType() async {
+    // NoSuchMethodError: The getter 'returnType' was called on null.
+    await super.test_redirectToNonClass_notAType();
+  }
+
+  @override
+  @failingTest
+  test_redirectToNonClass_undefinedIdentifier() async {
+    // NoSuchMethodError: The getter 'returnType' was called on null.
+    await super.test_redirectToNonClass_undefinedIdentifier();
+  }
+
+  @override
+  @failingTest
+  test_redirectToNonConstConstructor() async {
+    // Expected 1 errors of type CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR, found 0
+    await super.test_redirectToNonConstConstructor();
+  }
+
+  @override
+  @failingTest
+  test_referencedBeforeDeclaration_hideInBlock_function() async {
+    // Bad state: No declaration information for v() {} at 34
+    await super.test_referencedBeforeDeclaration_hideInBlock_function();
+  }
+
+  @override
+  @failingTest
+  test_referencedBeforeDeclaration_hideInBlock_local() async {
+    // Bad state: No type information for v at 38
+    await super.test_referencedBeforeDeclaration_hideInBlock_local();
+  }
+
+  @override
+  @failingTest
+  test_referencedBeforeDeclaration_hideInBlock_subBlock() async {
+    // Bad state: No type information for v at 48
+    await super.test_referencedBeforeDeclaration_hideInBlock_subBlock();
+  }
+
+  @override
+  @failingTest
+  test_referencedBeforeDeclaration_inInitializer_closure() async {
+    // Bad state: No type information for v at 15
+    await super.test_referencedBeforeDeclaration_inInitializer_closure();
+  }
+
+  @override
+  @failingTest
+  test_referencedBeforeDeclaration_inInitializer_directly() async {
+    // Bad state: No type information for v at 15
+    await super.test_referencedBeforeDeclaration_inInitializer_directly();
+  }
+
+  @override
+  @failingTest
+  test_referencedBeforeDeclaration_type_localFunction() async {
+    // Bad state: No declaration information for int String(int x) => x + 1; at 40
+    await super.test_referencedBeforeDeclaration_type_localFunction();
+  }
+
+  @override
+  @failingTest
+  test_referencedBeforeDeclaration_type_localVariable() async {
+    // Bad state: No type information for String at 44
+    await super.test_referencedBeforeDeclaration_type_localVariable();
+  }
+
+  @override
+  @failingTest
+  test_rethrowOutsideCatch() async {
+    // Bad state: No type information for rethrow at 8
+    await super.test_rethrowOutsideCatch();
+  }
+
+  @override
+  @failingTest
+  test_returnInGenerativeConstructor() async {
+    // Bad state: No type information for 0 at 25
+    await super.test_returnInGenerativeConstructor();
+  }
+
+  @override
+  @failingTest
+  test_returnInGenerativeConstructor_expressionFunctionBody() async {
+    // Bad state: No type information for null at 19
+    await super.test_returnInGenerativeConstructor_expressionFunctionBody();
+  }
+
+  @override
+  @failingTest
+  test_returnInGenerator_asyncStar() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_returnInGenerator_asyncStar();
+  }
+
+  @override
+  @failingTest
+  test_returnInGenerator_syncStar() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_returnInGenerator_syncStar();
+  }
+
+  @override
+  @failingTest
+  test_sharedDeferredPrefix() async {
+    // Bad state: Expected element reference for analyzer offset 86; got one for kernel offset 90
+    await super.test_sharedDeferredPrefix();
+  }
+
+  @override
+  @failingTest
+  test_superInInvalidContext_binaryExpression() async {
+    // Expected 1 errors of type CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, found 0
+    await super.test_superInInvalidContext_binaryExpression();
+  }
+
+  @override
+  @failingTest
+  test_superInInvalidContext_constructorFieldInitializer() async {
+    // Expected 1 errors of type CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, found 0
+    await super.test_superInInvalidContext_constructorFieldInitializer();
+  }
+
+  @override
+  @failingTest
+  test_superInInvalidContext_factoryConstructor() async {
+    // Bad state: No reference information for m at 67
+    await super.test_superInInvalidContext_factoryConstructor();
+  }
+
+  @override
+  @failingTest
+  test_superInInvalidContext_instanceVariableInitializer() async {
+    // Expected 1 errors of type CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, found 0
+    await super.test_superInInvalidContext_instanceVariableInitializer();
+  }
+
+  @override
+  @failingTest
+  test_superInInvalidContext_staticMethod() async {
+    // Bad state: No reference information for m at 76
+    await super.test_superInInvalidContext_staticMethod();
+  }
+
+  @override
+  @failingTest
+  test_superInInvalidContext_staticVariableInitializer() async {
+    // Bad state: No reference information for a at 75
+    await super.test_superInInvalidContext_staticVariableInitializer();
+  }
+
+  @override
+  @failingTest
+  test_superInInvalidContext_topLevelFunction() async {
+    // Bad state: No reference information for f at 14
+    await super.test_superInInvalidContext_topLevelFunction();
+  }
+
+  @override
+  @failingTest
+  test_superInInvalidContext_topLevelVariableInitializer() async {
+    // Bad state: No reference information for y at 14
+    await super.test_superInInvalidContext_topLevelVariableInitializer();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30982')
   test_superInRedirectingConstructor_redirectionSuper() async {
     return super.test_superInRedirectingConstructor_redirectionSuper();
@@ -301,6 +3183,21 @@
 
   @override
   @failingTest
+  test_symbol_constructor_badArgs() async {
+    // Bad state: No type information for Symbol at 69
+    await super.test_symbol_constructor_badArgs();
+  }
+
+  @override
+  @failingTest
+  test_test_fieldInitializerOutsideConstructor_topLevelFunction() async {
+    // Expected 1 errors of type ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, found 0;
+    //          1 errors of type CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, found 0
+    await super.test_test_fieldInitializerOutsideConstructor_topLevelFunction();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31007')
   test_typeAliasCannotReferenceItself_11987() async {
     return super.test_typeAliasCannotReferenceItself_11987();
@@ -308,6 +3205,14 @@
 
   @override
   @failingTest
+  test_typeAliasCannotReferenceItself_functionTypedParameter_returnType() async {
+    // Expected 1 errors of type CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, found 0
+    await super
+        .test_typeAliasCannotReferenceItself_functionTypedParameter_returnType();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31007')
   test_typeAliasCannotReferenceItself_generic() async {
     return super.test_typeAliasCannotReferenceItself_generic();
@@ -344,6 +3249,20 @@
 
   @override
   @failingTest
+  test_typeAliasCannotReferenceItself_returnType() async {
+    // Expected 1 errors of type CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, found 0
+    await super.test_typeAliasCannotReferenceItself_returnType();
+  }
+
+  @override
+  @failingTest
+  test_typeAliasCannotReferenceItself_returnType_indirect() async {
+    // Expected 2 errors of type CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, found 0
+    await super.test_typeAliasCannotReferenceItself_returnType_indirect();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31007')
   test_typeAliasCannotReferenceItself_typeVariableBounds() async {
     return super.test_typeAliasCannotReferenceItself_typeVariableBounds();
@@ -351,6 +3270,90 @@
 
   @override
   @failingTest
+  test_typeArgumentNotMatchingBounds_const() async {
+    // Expected 1 errors of type CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
+    await super.test_typeArgumentNotMatchingBounds_const();
+  }
+
+  @override
+  @failingTest
+  test_undefinedClass_const() async {
+    // Bad state: No type information for A at 21
+    await super.test_undefinedClass_const();
+  }
+
+  @override
+  @failingTest
+  test_undefinedConstructorInInitializer_explicit_named() async {
+    // Expected 1 errors of type CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, found 0
+    await super.test_undefinedConstructorInInitializer_explicit_named();
+  }
+
+  @override
+  @failingTest
+  test_undefinedConstructorInInitializer_explicit_unnamed() async {
+    // Expected 1 errors of type CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, found 0
+    await super.test_undefinedConstructorInInitializer_explicit_unnamed();
+  }
+
+  @override
+  @failingTest
+  test_undefinedConstructorInInitializer_implicit() async {
+    // Expected 1 errors of type CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, found 0
+    await super.test_undefinedConstructorInInitializer_implicit();
+  }
+
+  @override
+  @failingTest
+  test_undefinedNamedParameter() async {
+    // Bad state: No type information for A at 42
+    await super.test_undefinedNamedParameter();
+  }
+
+  @override
+  @failingTest
+  test_uriDoesNotExist_export() async {
+    // Expected 1 errors of type CompileTimeErrorCode.URI_DOES_NOT_EXIST, found 0
+    await super.test_uriDoesNotExist_export();
+  }
+
+  @override
+  @failingTest
+  test_uriDoesNotExist_import() async {
+    // Expected 1 errors of type CompileTimeErrorCode.URI_DOES_NOT_EXIST, found 0
+    await super.test_uriDoesNotExist_import();
+  }
+
+  @override
+  @failingTest
+  test_uriDoesNotExist_import_appears_after_deleting_target() async {
+    // Expected 1 errors of type CompileTimeErrorCode.URI_DOES_NOT_EXIST, found 0
+    await super.test_uriDoesNotExist_import_appears_after_deleting_target();
+  }
+
+  @override
+  @failingTest
+  test_uriDoesNotExist_import_disappears_when_fixed() async {
+    // Expected 1 errors of type CompileTimeErrorCode.URI_DOES_NOT_EXIST, found 0
+    await super.test_uriDoesNotExist_import_disappears_when_fixed();
+  }
+
+  @override
+  @failingTest
+  test_uriDoesNotExist_part() async {
+    // Expected 1 errors of type CompileTimeErrorCode.URI_DOES_NOT_EXIST, found 0
+    await super.test_uriDoesNotExist_part();
+  }
+
+  @override
+  @failingTest
+  test_uriWithInterpolation_constant() async {
+    // Expected 1 errors of type StaticWarningCode.UNDEFINED_IDENTIFIER, found 0
+    await super.test_uriWithInterpolation_constant();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30984')
   test_uriWithInterpolation_nonConstant() async {
     return super.test_uriWithInterpolation_nonConstant();
@@ -358,6 +3361,27 @@
 
   @override
   @failingTest
+  test_wrongNumberOfParametersForOperator1() async {
+    // Expected 1 errors of type CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR, found 0
+    await super.test_wrongNumberOfParametersForOperator1();
+  }
+
+  @override
+  @failingTest
+  test_wrongNumberOfParametersForOperator_minus() async {
+    // Expected 1 errors of type CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS, found 0
+    await super.test_wrongNumberOfParametersForOperator_minus();
+  }
+
+  @override
+  @failingTest
+  test_wrongNumberOfParametersForOperator_tilde() async {
+    // Expected 1 errors of type CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR, found 0
+    await super.test_wrongNumberOfParametersForOperator_tilde();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31096')
   test_wrongNumberOfParametersForSetter_function_named() async {
     return super.test_wrongNumberOfParametersForSetter_function_named();
@@ -411,6 +3435,12 @@
   test_wrongNumberOfParametersForSetter_method_tooMany() async {
     return super.test_wrongNumberOfParametersForSetter_method_tooMany();
   }
+
+  @override
+  test_yieldInNonGenerator_async() async {
+    // Test passes, even though if fails in the superclass
+    await super.test_yieldInNonGenerator_async();
+  }
 }
 
 /// Tests marked with this annotation fail because of a Fasta problem.
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 fea5b07..7dc9b41 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -98,169 +98,6 @@
   AnalysisOptions get defaultAnalysisOptions =>
       new AnalysisOptionsImpl()..strongMode = true;
 
-  fail_awaitInWrongContext_sync() async {
-    // This test requires better error recovery than we currently have. In
-    // particular, we need to be able to distinguish between an await expression
-    // in the wrong context, and the use of 'await' as an identifier.
-    Source source = addSource(r'''
-f(x) {
-  return await x;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT]);
-    verify([source]);
-  }
-
-  fail_awaitInWrongContext_syncStar() async {
-    // This test requires better error recovery than we currently have. In
-    // particular, we need to be able to distinguish between an await expression
-    // in the wrong context, and the use of 'await' as an identifier.
-    Source source = addSource(r'''
-f(x) sync* {
-  yield await x;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT]);
-    verify([source]);
-  }
-
-  fail_constEvalThrowsException() async {
-    Source source = addSource(r'''
-class C {
-  const C();
-}
-f() { return const C(); }''');
-    await computeAnalysisResult(source);
-    assertErrors(
-        source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION]);
-    verify([source]);
-  }
-
-  fail_invalidIdentifierInAsync_async() async {
-    // TODO(brianwilkerson) Report this error.
-    Source source = addSource(r'''
-class A {
-  m() async {
-    int async;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_IDENTIFIER_IN_ASYNC]);
-    verify([source]);
-  }
-
-  fail_invalidIdentifierInAsync_await() async {
-    // TODO(brianwilkerson) Report this error.
-    Source source = addSource(r'''
-class A {
-  m() async {
-    int await;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_IDENTIFIER_IN_ASYNC]);
-    verify([source]);
-  }
-
-  fail_invalidIdentifierInAsync_yield() async {
-    // TODO(brianwilkerson) Report this error.
-    Source source = addSource(r'''
-class A {
-  m() async {
-    int yield;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_IDENTIFIER_IN_ASYNC]);
-    verify([source]);
-  }
-
-  fail_mixinDeclaresConstructor() async {
-    Source source = addSource(r'''
-class A {
-  A() {}
-}
-class B extends Object mixin A {}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  fail_mixinOfNonClass() async {
-    // TODO(brianwilkerson) Compare with MIXIN_WITH_NON_CLASS_SUPERCLASS.
-    Source source = addSource(r'''
-var A;
-class B extends Object mixin A {}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_NON_CLASS]);
-    verify([source]);
-  }
-
-  fail_objectCannotExtendAnotherClass() async {
-    Source source = addSource(r'''
-''');
-    await computeAnalysisResult(source);
-    assertErrors(
-        source, [CompileTimeErrorCode.OBJECT_CANNOT_EXTEND_ANOTHER_CLASS]);
-    verify([source]);
-  }
-
-  fail_superInitializerInObject() async {
-    Source source = addSource(r'''
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.SUPER_INITIALIZER_IN_OBJECT]);
-    verify([source]);
-  }
-
-  fail_yieldEachInNonGenerator_async() async {
-    // TODO(brianwilkerson) We are currently parsing the yield statement as a
-    // binary expression.
-    Source source = addSource(r'''
-f() async {
-  yield* 0;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.YIELD_EACH_IN_NON_GENERATOR]);
-    verify([source]);
-  }
-
-  fail_yieldEachInNonGenerator_sync() async {
-    // TODO(brianwilkerson) We are currently parsing the yield statement as a
-    // binary expression.
-    Source source = addSource(r'''
-f() {
-  yield* 0;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.YIELD_IN_NON_GENERATOR]);
-    verify([source]);
-  }
-
-  fail_yieldInNonGenerator_async() async {
-    // TODO(brianwilkerson) We are currently trying to parse the yield statement
-    // as a binary expression.
-    Source source = addSource(r'''
-f() async {
-  yield 0;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.YIELD_IN_NON_GENERATOR]);
-    verify([source]);
-  }
-
-  fail_yieldInNonGenerator_sync() async {
-    // TODO(brianwilkerson) We are currently trying to parse the yield statement
-    // as a binary expression.
-    Source source = addSource(r'''
-f() {
-  yield 0;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.YIELD_EACH_IN_NON_GENERATOR]);
-    verify([source]);
-  }
-
   test_accessPrivateEnumField() async {
     Source source = addSource(r'''
 enum E { ONE }
@@ -659,6 +496,34 @@
     verify([source]);
   }
 
+  @failingTest
+  test_awaitInWrongContext_sync() async {
+    // This test requires better error recovery than we currently have. In
+    // particular, we need to be able to distinguish between an await expression
+    // in the wrong context, and the use of 'await' as an identifier.
+    Source source = addSource(r'''
+f(x) {
+  return await x;
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT]);
+    verify([source]);
+  }
+
+  @failingTest
+  test_awaitInWrongContext_syncStar() async {
+    // This test requires better error recovery than we currently have. In
+    // particular, we need to be able to distinguish between an await expression
+    // in the wrong context, and the use of 'await' as an identifier.
+    Source source = addSource(r'''
+f(x) sync* {
+  yield await x;
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT]);
+    verify([source]);
+  }
+
   test_bug_23176() async {
     Source source = addSource('''
 class A {
@@ -1191,6 +1056,19 @@
     verify([source]);
   }
 
+  @failingTest
+  test_constEvalThrowsException() async {
+    Source source = addSource(r'''
+class C {
+  const C();
+}
+f() { return const C(); }''');
+    await computeAnalysisResult(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION]);
+    verify([source]);
+  }
+
   test_constEvalThrowsException_binaryMinus_null() async {
     await _check_constEvalThrowsException_binary_null("null - 5", false);
     await _check_constEvalThrowsException_binary_null("5 - null", true);
@@ -3440,6 +3318,48 @@
     // no verify() call, "B" is not resolved
   }
 
+  @failingTest
+  test_invalidIdentifierInAsync_async() async {
+    // TODO(brianwilkerson) Report this error.
+    Source source = addSource(r'''
+class A {
+  m() async {
+    int async;
+  }
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_IDENTIFIER_IN_ASYNC]);
+    verify([source]);
+  }
+
+  @failingTest
+  test_invalidIdentifierInAsync_await() async {
+    // TODO(brianwilkerson) Report this error.
+    Source source = addSource(r'''
+class A {
+  m() async {
+    int await;
+  }
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_IDENTIFIER_IN_ASYNC]);
+    verify([source]);
+  }
+
+  @failingTest
+  test_invalidIdentifierInAsync_yield() async {
+    // TODO(brianwilkerson) Report this error.
+    Source source = addSource(r'''
+class A {
+  m() async {
+    int yield;
+  }
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_IDENTIFIER_IN_ASYNC]);
+    verify([source]);
+  }
+
   test_invalidModifierOnConstructor_async() async {
     Source source = addSource(r'''
 class A {
@@ -3760,6 +3680,18 @@
     verify([source]);
   }
 
+  @failingTest
+  test_mixinDeclaresConstructor() async {
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+class B extends Object mixin A {}''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
+    verify([source]);
+  }
+
   test_mixinDeclaresConstructor_classDeclaration() async {
     Source source = addSource(r'''
 class A {
@@ -4043,6 +3975,17 @@
     verify([source]);
   }
 
+  @failingTest
+  test_mixinOfNonClass() async {
+    // TODO(brianwilkerson) Compare with MIXIN_WITH_NON_CLASS_SUPERCLASS.
+    Source source = addSource(r'''
+var A;
+class B extends Object mixin A {}''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_NON_CLASS]);
+    verify([source]);
+  }
+
   test_mixinOfNonClass_class() async {
     Source source = addSource(r'''
 int A;
@@ -5019,6 +4962,16 @@
     verify([source]);
   }
 
+  @failingTest
+  test_objectCannotExtendAnotherClass() async {
+    Source source = addSource(r'''
+''');
+    await computeAnalysisResult(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.OBJECT_CANNOT_EXTEND_ANOTHER_CLASS]);
+    verify([source]);
+  }
+
   test_optionalParameterInOperator_named() async {
     Source source = addSource(r'''
 class A {
@@ -5958,6 +5911,17 @@
     assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
   }
 
+  test_referencedBeforeDeclaration_hideInBlock_comment() async {
+    Source source = addSource(r'''
+main() {
+  /// [v] is a variable.
+  var v = 2;
+}
+print(x) {}''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+  }
+
   test_rethrowOutsideCatch() async {
     Source source = addSource(r'''
 f() {
@@ -6121,6 +6085,15 @@
     // no verify(), 'super.y' is not resolved
   }
 
+  @failingTest
+  test_superInitializerInObject() async {
+    Source source = addSource(r'''
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [CompileTimeErrorCode.SUPER_INITIALIZER_IN_OBJECT]);
+    verify([source]);
+  }
+
   test_superInRedirectingConstructor_redirectionSuper() async {
     Source source = addSource(r'''
 class A {}
@@ -6615,6 +6588,58 @@
     verify([source]);
   }
 
+  @failingTest
+  test_yieldEachInNonGenerator_async() async {
+    // TODO(brianwilkerson) We are currently parsing the yield statement as a
+    // binary expression.
+    Source source = addSource(r'''
+f() async {
+  yield* 0;
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [CompileTimeErrorCode.YIELD_EACH_IN_NON_GENERATOR]);
+    verify([source]);
+  }
+
+  @failingTest
+  test_yieldEachInNonGenerator_sync() async {
+    // TODO(brianwilkerson) We are currently parsing the yield statement as a
+    // binary expression.
+    Source source = addSource(r'''
+f() {
+  yield* 0;
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [CompileTimeErrorCode.YIELD_IN_NON_GENERATOR]);
+    verify([source]);
+  }
+
+  @failingTest
+  test_yieldInNonGenerator_async() async {
+    // TODO(brianwilkerson) We are currently trying to parse the yield statement
+    // as a binary expression.
+    Source source = addSource(r'''
+f() async {
+  yield 0;
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [CompileTimeErrorCode.YIELD_IN_NON_GENERATOR]);
+    verify([source]);
+  }
+
+  @failingTest
+  test_yieldInNonGenerator_sync() async {
+    // TODO(brianwilkerson) We are currently trying to parse the yield statement
+    // as a binary expression.
+    Source source = addSource(r'''
+f() {
+  yield 0;
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [CompileTimeErrorCode.YIELD_EACH_IN_NON_GENERATOR]);
+    verify([source]);
+  }
+
   Future<Null> _check_constEvalThrowsException_binary_null(
       String expr, bool resolved) async {
     Source source = addSource("const C = $expr;");
diff --git a/pkg/analyzer/test/generated/error_suppression_kernel_test.dart b/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
index 7babab5..87134ae 100644
--- a/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
+++ b/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
@@ -16,4 +16,122 @@
 class ErrorSuppressionTest_Kernel extends ErrorSuppressionTest_Driver {
   @override
   bool get enableKernelDriver => true;
+
+  @override
+  bool get previewDart2 => true;
+
+  @override
+  @failingTest
+  test_error_code_mismatch() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0;
+    //          1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
+    await super.test_error_code_mismatch();
+  }
+
+  @override
+  @failingTest
+  test_ignore_first() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
+    await super.test_ignore_first();
+  }
+
+  @override
+  @failingTest
+  test_ignore_first_trailing() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
+    await super.test_ignore_first_trailing();
+  }
+
+  @override
+  @failingTest
+  test_ignore_for_file() async {
+    // Expected 1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
+    await super.test_ignore_for_file();
+  }
+
+  @override
+  @failingTest
+  test_ignore_second() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
+    await super.test_ignore_second();
+  }
+
+  @override
+  @failingTest
+  test_ignore_second_trailing() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
+    await super.test_ignore_second_trailing();
+  }
+
+  @override
+  @failingTest
+  test_invalid_error_code() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0;
+    //          1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
+    await super.test_invalid_error_code();
+  }
+
+  @override
+  @failingTest
+  test_missing_error_codes() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t1 = #lib1::x in let ...
+    await super.test_missing_error_codes();
+  }
+
+  @override
+  @failingTest
+  test_missing_metadata_suffix() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
+    await super.test_missing_metadata_suffix();
+  }
+
+  @override
+  @failingTest
+  test_multiple_comments() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
+    await super.test_multiple_comments();
+  }
+
+  @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
+    await super.test_no_ignores();
+  }
 }
diff --git a/pkg/analyzer/test/generated/hint_code_kernel_test.dart b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
index aaf7f2e..7bbdb16 100644
--- a/pkg/analyzer/test/generated/hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
@@ -18,17 +18,185 @@
   bool get enableKernelDriver => true;
 
   @override
+  bool get previewDart2 => true;
+
+  @failingTest
+  @override
+  test_abstractSuperMemberReference_getter() async {
+    // Expected 1 errors of type HintCode.ABSTRACT_SUPER_MEMBER_REFERENCE, found 0
+    return super.test_abstractSuperMemberReference_getter();
+  }
+
+  @failingTest
+  @override
+  test_abstractSuperMemberReference_method_invocation() async {
+    // Expected 1 errors of type HintCode.ABSTRACT_SUPER_MEMBER_REFERENCE, found 0
+    return super.test_abstractSuperMemberReference_method_invocation();
+  }
+
+  @failingTest
+  @override
+  test_abstractSuperMemberReference_method_reference() async {
+    // Expected 1 errors of type HintCode.ABSTRACT_SUPER_MEMBER_REFERENCE, found 0
+    return super.test_abstractSuperMemberReference_method_reference();
+  }
+
+  @failingTest
+  @override
+  test_argumentTypeNotAssignable_functionType() async {
+    // Expected 1 errors of type HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
+    return super.test_argumentTypeNotAssignable_functionType();
+  }
+
+  @failingTest
+  @override
+  test_argumentTypeNotAssignable_type() async {
+    // Expected 1 errors of type HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
+    return super.test_argumentTypeNotAssignable_type();
+  }
+
+  @failingTest
+  @override
+  test_deadCode_deadBlock_else() async {
+    // Expected 1 errors of type HintCode.DEAD_CODE, found 0
+    return super.test_deadCode_deadBlock_else();
+  }
+
+  @failingTest
+  @override
+  test_deadCode_deadBlock_else_nested() async {
+    // Expected 1 errors of type HintCode.DEAD_CODE, found 0
+    return super.test_deadCode_deadBlock_else_nested();
+  }
+
+  @failingTest
+  @override
+  test_deadCode_deadBlock_if() async {
+    // Expected 1 errors of type HintCode.DEAD_CODE, found 0
+    return super.test_deadCode_deadBlock_if();
+  }
+
+  @failingTest
+  @override
+  test_deadCode_deadBlock_if_nested() async {
+    // Expected 1 errors of type HintCode.DEAD_CODE, found 0
+    return super.test_deadCode_deadBlock_if_nested();
+  }
+
+  @failingTest
+  @override
+  test_deadCode_deadFinalStatementInCase() async {
+    // Expected 1 errors of type StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, found 0
+    return super.test_deadCode_deadFinalStatementInCase();
+  }
+
+  @failingTest
+  @override
+  test_deprecatedAnnotationUse_Deprecated() async {
+    // Expected 1 errors of type HintCode.DEPRECATED_MEMBER_USE, found 0
+    return super.test_deprecatedAnnotationUse_Deprecated();
+  }
+
+  @override
   @failingTest
   test_deprecatedAnnotationUse_named() async {
     return super.test_deprecatedAnnotationUse_named();
   }
 
-  @override
   @failingTest
+  @override
   test_deprecatedAnnotationUse_positional() async {
     return super.test_deprecatedAnnotationUse_positional();
   }
 
+  @failingTest
+  @override
+  test_deprecatedFunction_class() async {
+    // Expected 1 errors of type HintCode.DEPRECATED_FUNCTION_CLASS_DECLARATION, found 0
+    return super.test_deprecatedFunction_class();
+  }
+
+  @failingTest
+  @override
+  test_deprecatedFunction_extends() async {
+    // Expected 1 errors of type HintCode.DEPRECATED_EXTENDS_FUNCTION, found 0;
+    //          1 errors of type StaticWarningCode.FUNCTION_WITHOUT_CALL, found 0
+    return super.test_deprecatedFunction_extends();
+  }
+
+  @failingTest
+  @override
+  test_deprecatedFunction_extends2() async {
+    // Expected 1 errors of type HintCode.DEPRECATED_FUNCTION_CLASS_DECLARATION, found 0;
+    //          1 errors of type HintCode.DEPRECATED_EXTENDS_FUNCTION, found 0
+    return super.test_deprecatedFunction_extends2();
+  }
+
+  @failingTest
+  @override
+  test_deprecatedFunction_mixin() async {
+    // Expected 1 errors of type HintCode.DEPRECATED_MIXIN_FUNCTION, found 0;
+    //          1 errors of type StaticWarningCode.FUNCTION_WITHOUT_CALL, found 0
+    return super.test_deprecatedFunction_mixin();
+  }
+
+  @failingTest
+  @override
+  test_deprecatedFunction_mixin2() async {
+    // Expected 1 errors of type HintCode.DEPRECATED_FUNCTION_CLASS_DECLARATION, found 0;
+    //          1 errors of type HintCode.DEPRECATED_MIXIN_FUNCTION, found 0
+    return super.test_deprecatedFunction_mixin2();
+  }
+
+  @failingTest
+  @override
+  test_divisionOptimization_propagatedType() async {
+    // Expected 1 errors of type HintCode.DIVISION_OPTIMIZATION, found 0
+    return super.test_divisionOptimization_propagatedType();
+  }
+
+  @failingTest
+  @override
+  test_duplicateImport3() async {
+    // Expected 0 errors of type HintCode.UNUSED_IMPORT, found 2 (18, 57)
+    return super.test_duplicateImport3();
+  }
+
+  @failingTest
+  @override
+  test_importDeferredLibraryWithLoadFunction() async {
+    // ad state: Expected element reference for analyzer offset 60; got one for kernel offset 65
+    return super.test_importDeferredLibraryWithLoadFunction();
+  }
+
+  @failingTest
+  @override
+  test_invalidAssignment_instanceVariable() async {
+    // Expected 1 errors of type HintCode.INVALID_ASSIGNMENT, found 0
+    return super.test_invalidAssignment_instanceVariable();
+  }
+
+  @failingTest
+  @override
+  test_invalidAssignment_localVariable() async {
+    // Expected 1 errors of type HintCode.INVALID_ASSIGNMENT, found 0
+    return super.test_invalidAssignment_localVariable();
+  }
+
+  @failingTest
+  @override
+  test_invalidAssignment_staticVariable() async {
+    // Expected 1 errors of type HintCode.INVALID_ASSIGNMENT, found 0
+    return super.test_invalidAssignment_staticVariable();
+  }
+
+  @failingTest
+  @override
+  test_invalidAssignment_variableDeclaration() async {
+    // UnimplementedError: Multiple field
+    return super.test_invalidAssignment_variableDeclaration();
+  }
+
   @override
   @failingTest
   test_invalidRequiredParam_on_named_parameter_with_default() async {
@@ -60,6 +228,69 @@
     return super.test_invalidRequiredParam_valid();
   }
 
+  @failingTest
+  @override
+  test_js_lib_OK() async {
+    // Bad state: Expected element reference for analyzer offset 51; got one for kernel offset 1
+    return super.test_js_lib_OK();
+  }
+
+  @failingTest
+  @override
+  test_missingJsLibAnnotation_class() async {
+    // Expected 1 errors of type HintCode.MISSING_JS_LIB_ANNOTATION, found 0;
+    //          0 errors of type HintCode.UNUSED_IMPORT, found 1 (21)
+    return super.test_missingJsLibAnnotation_class();
+  }
+
+  @failingTest
+  @override
+  test_missingJsLibAnnotation_externalField() async {
+    // Expected 1 errors of type ParserErrorCode.EXTERNAL_FIELD, found 0;
+    //          1 errors of type HintCode.MISSING_JS_LIB_ANNOTATION, found 0;
+    //          0 errors of type ParserErrorCode.EXTRANEOUS_MODIFIER, found 1 (36);
+    //          0 errors of type HintCode.UNUSED_IMPORT, found 1 (7)
+    return super.test_missingJsLibAnnotation_externalField();
+  }
+
+  @failingTest
+  @override
+  test_missingJsLibAnnotation_function() async {
+    // Expected 1 errors of type HintCode.MISSING_JS_LIB_ANNOTATION, found 0;
+    //          0 errors of type HintCode.UNUSED_IMPORT, found 1 (21)
+    return super.test_missingJsLibAnnotation_function();
+  }
+
+  @failingTest
+  @override
+  test_missingJsLibAnnotation_method() async {
+    // Expected 1 errors of type HintCode.MISSING_JS_LIB_ANNOTATION, found 0;
+    //          0 errors of type HintCode.UNUSED_IMPORT, found 1 (21)
+    return super.test_missingJsLibAnnotation_method();
+  }
+
+  @failingTest
+  @override
+  test_missingJsLibAnnotation_variable() async {
+    // Expected 1 errors of type HintCode.MISSING_JS_LIB_ANNOTATION, found 0;
+    //          0 errors of type HintCode.UNUSED_IMPORT, found 1 (7)
+    return super.test_missingJsLibAnnotation_variable();
+  }
+
+  @failingTest
+  @override
+  test_mustCallSuper() async {
+    // Expected 1 errors of type HintCode.MUST_CALL_SUPER, found 0
+    return super.test_mustCallSuper();
+  }
+
+  @failingTest
+  @override
+  test_mustCallSuper_indirect() async {
+    // Expected 1 errors of type HintCode.MUST_CALL_SUPER, found 0
+    return super.test_mustCallSuper_indirect();
+  }
+
   @override
   @failingTest
   test_required_constructor_param() async {
@@ -119,4 +350,133 @@
   test_required_typedef_function_param() async {
     return super.test_required_typedef_function_param();
   }
+
+  @failingTest
+  @override
+  test_strongMode_downCastCompositeHint() async {
+    // Expected 1 errors of type StrongModeCode.STRONG_MODE_DOWN_CAST_COMPOSITE, found 0
+    return super.test_strongMode_downCastCompositeHint();
+  }
+
+  @failingTest
+  @override
+  test_strongMode_downCastCompositeWarn() async {
+    // Expected 1 errors of type StrongModeCode.STRONG_MODE_DOWN_CAST_COMPOSITE, found 0
+    return super.test_strongMode_downCastCompositeWarn();
+  }
+
+  @failingTest
+  @override
+  test_undefinedGetter() async {
+    // Expected 1 errors of type HintCode.UNDEFINED_GETTER, found 0
+    return super.test_undefinedGetter();
+  }
+
+  @failingTest
+  @override
+  test_undefinedMethod() async {
+    // Expected 1 errors of type HintCode.UNDEFINED_METHOD, found 0
+    return super.test_undefinedMethod();
+  }
+
+  @failingTest
+  @override
+  test_undefinedMethod_assignmentExpression() async {
+    // Expected 1 errors of type HintCode.UNDEFINED_METHOD, found 0
+    return super.test_undefinedMethod_assignmentExpression();
+  }
+
+  @failingTest
+  @override
+  test_undefinedOperator_binaryExpression() async {
+    // Expected 1 errors of type HintCode.UNDEFINED_OPERATOR, found 0
+    return super.test_undefinedOperator_binaryExpression();
+  }
+
+  @failingTest
+  @override
+  test_undefinedOperator_indexBoth() async {
+    // Expected 1 errors of type HintCode.UNDEFINED_OPERATOR, found 0
+    return super.test_undefinedOperator_indexBoth();
+  }
+
+  @failingTest
+  @override
+  test_undefinedOperator_indexGetter() async {
+    // Expected 1 errors of type HintCode.UNDEFINED_OPERATOR, found 0
+    return super.test_undefinedOperator_indexGetter();
+  }
+
+  @failingTest
+  @override
+  test_undefinedOperator_indexSetter() async {
+    // Expected 1 errors of type HintCode.UNDEFINED_OPERATOR, found 0
+    return super.test_undefinedOperator_indexSetter();
+  }
+
+  @failingTest
+  @override
+  test_undefinedOperator_postfixExpression() async {
+    // Expected 1 errors of type HintCode.UNDEFINED_OPERATOR, found 0
+    return super.test_undefinedOperator_postfixExpression();
+  }
+
+  @failingTest
+  @override
+  test_undefinedOperator_prefixExpression() async {
+    // Expected 1 errors of type HintCode.UNDEFINED_OPERATOR, found 0
+    return super.test_undefinedOperator_prefixExpression();
+  }
+
+  @failingTest
+  @override
+  test_undefinedSetter() async {
+    // Expected 1 errors of type HintCode.UNDEFINED_SETTER, found 0
+    return super.test_undefinedSetter();
+  }
+
+  @failingTest
+  @override
+  test_unusedImport_as() async {
+    // Failed to resolve 2 nodes:
+    //   one (/test.dart : 53)
+    //   one (/test.dart : 58)
+    return super.test_unusedImport_as();
+  }
+
+  @failingTest
+  @override
+  test_unusedImport_inComment_libraryDirective() async {
+    // Expected 0 errors of type HintCode.UNUSED_IMPORT, found 1 (42)
+    return super.test_unusedImport_inComment_libraryDirective();
+  }
+
+  @failingTest
+  @override
+  test_unusedShownName() async {
+    // Expected 1 errors of type HintCode.UNUSED_SHOWN_NAME, found 0
+    return super.test_unusedShownName();
+  }
+
+  @failingTest
+  @override
+  test_unusedShownName_as() async {
+    // Expected 1 errors of type HintCode.UNUSED_SHOWN_NAME, found 0;
+    //          0 errors of type HintCode.UNUSED_IMPORT, found 1 (18)
+    return super.test_unusedShownName_as();
+  }
+
+  @failingTest
+  @override
+  test_unusedShownName_duplicates() async {
+    // Expected 2 errors of type HintCode.UNUSED_SHOWN_NAME, found 0
+    return super.test_unusedShownName_duplicates();
+  }
+
+  @failingTest
+  @override
+  test_unusedShownName_topLevelVariable() async {
+    // Expected 1 errors of type HintCode.UNUSED_SHOWN_NAME, found 0
+    return super.test_unusedShownName_topLevelVariable();
+  }
 }
diff --git a/pkg/analyzer/test/generated/hint_code_test.dart b/pkg/analyzer/test/generated/hint_code_test.dart
index 5f063e9..9a12693 100644
--- a/pkg/analyzer/test/generated/hint_code_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_test.dart
@@ -38,10 +38,7 @@
 const _MustCallSuper mustCallSuper = const _MustCallSuper();
 const _Protected protected = const _Protected();
 const Required required = const Required();
-class Required {
-  final String reason;
-  const Required([this.reason]);
-}
+const _VisibleForTesting visibleForTesting = const _VisibleForTesting();
 
 class Immutable {
   final String reason;
@@ -62,9 +59,12 @@
 class _Protected {
   const _Protected();
 }
-class _Required {
+class Required {
   final String reason;
-  const _Required([this.reason]);
+  const Required([this.reason]);
+}
+class _VisibleForTesting {
+  const _VisibleForTesting();
 }
 '''
       ],
@@ -1923,6 +1923,141 @@
     verify([source]);
   }
 
+  test_invalidUseOfVisibleForTestingMember_method() async {
+    Source source = addNamedSource('/lib1.dart', r'''
+import 'package:meta/meta.dart';
+class A {
+  @visibleForTesting
+  void a(){ }
+}
+''');
+    Source source2 = addNamedSource('/lib2.dart', r'''
+import 'lib1.dart';
+
+class B {
+  void b() => new A().a();
+}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertErrors(source2, [HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
+    verify([source, source2]);
+  }
+
+  test_invalidUseOfVisibleForTestingMember_method_OK() async {
+    Source source = addNamedSource('/lib1.dart', r'''
+import 'package:meta/meta.dart';
+class A {
+  @visibleForTesting
+  void a(){ }
+}
+''');
+    Source source2 = addNamedSource('/test/test1.dart', r'''
+import '../lib1.dart';
+
+class B {
+  void b() => new A().a();
+}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
+  test_invalidUseProtectedAndForTesting_method_OK() async {
+    Source source = addNamedSource('/lib1.dart', r'''
+import 'package:meta/meta.dart';
+class A {
+  @protected
+  @visibleForTesting
+  void a(){ }
+}
+''');
+    Source source2 = addNamedSource('/lib2.dart', r'''
+import 'lib1.dart';
+
+class B extends A {
+  void b() => new A().a();
+}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
+  test_invalidUseOfVisibleForTestingMember_propertyAccess() async {
+    Source source = addNamedSource('/lib1.dart', r'''
+import 'package:meta/meta.dart';
+class A {
+  @visibleForTesting
+  int get a => 7;
+
+  @visibleForTesting
+  set b(_) => 7;
+}
+''');
+    Source source2 = addNamedSource('/lib2.dart', r'''
+import 'lib1.dart';
+
+void main() {
+  new A().a;
+  new A().b = 6;
+}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertErrors(source2, [
+      HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER,
+      HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER
+    ]);
+    verify([source, source2]);
+  }
+
+  test_invalidUseOfVisibleForTestingMember_constructor() async {
+    Source source = addNamedSource('/lib1.dart', r'''
+import 'package:meta/meta.dart';
+class A {
+  int _x;
+
+  @visibleForTesting
+  A.forTesting(this._x);
+}
+''');
+    Source source2 = addNamedSource('/lib2.dart', r'''
+import 'lib1.dart';
+
+void main() {
+  new A.forTesting(0);
+}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertErrors(source2, [HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
+    verify([source, source2]);
+  }
+
+  test_invalidUseOfVisibleForTestingMember_topLevelFunction() async {
+    Source source = addNamedSource('/lib1.dart', r'''
+import 'package:meta/meta.dart';
+
+@visibleForTesting
+int fn0() => 1;
+''');
+    Source source2 = addNamedSource('/lib2.dart', r'''
+import 'lib1.dart';
+
+void main() {
+  fn0();
+}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertErrors(source2, [HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
+    verify([source, source2]);
+  }
+
   test_isDouble() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.dart2jsHint = true;
diff --git a/pkg/analyzer/test/generated/invalid_code_kernel_test.dart b/pkg/analyzer/test/generated/invalid_code_kernel_test.dart
index 750740e..cacac44 100644
--- a/pkg/analyzer/test/generated/invalid_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/invalid_code_kernel_test.dart
@@ -20,6 +20,9 @@
   @override
   bool get enableNewAnalysisDriver => true;
 
+  @override
+  bool get previewDart2 => true;
+
   @failingTest
   @override
   test_constructorAndMethodNameCollision() async {
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 c10d1c1..6b1c577 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.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.
 
-import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'non_error_resolver_driver_test.dart';
@@ -32,14 +31,7 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_abstractSuperMemberReference_superHasNoSuchMethod() async {
-    return super.test_abstractSuperMemberReference_superHasNoSuchMethod();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31625')
   test_ambiguousImport_showCombinator() async {
     return super.test_ambiguousImport_showCombinator();
   }
@@ -53,77 +45,70 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_async_flattened() async {
-    return super.test_async_flattened();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31604')
   test_commentReference_beforeConstructor() async {
     return super.test_commentReference_beforeConstructor();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31604')
   test_commentReference_beforeEnum() async {
     return super.test_commentReference_beforeEnum();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31604')
   test_commentReference_beforeFunction_blockBody() async {
     return super.test_commentReference_beforeFunction_blockBody();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31604')
   test_commentReference_beforeFunction_expressionBody() async {
     return super.test_commentReference_beforeFunction_expressionBody();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31604')
   test_commentReference_beforeFunctionTypeAlias() async {
     return super.test_commentReference_beforeFunctionTypeAlias();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31604')
   test_commentReference_beforeGenericTypeAlias() async {
     return super.test_commentReference_beforeGenericTypeAlias();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31604')
   test_commentReference_beforeGetter() async {
     return super.test_commentReference_beforeGetter();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31604')
   test_commentReference_beforeMethod() async {
     return super.test_commentReference_beforeMethod();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31604')
   test_commentReference_class() async {
     return super.test_commentReference_class();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31604')
   test_commentReference_setter() async {
     return super.test_commentReference_setter();
   }
@@ -131,27 +116,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_const_constructor_with_named_generic_parameter() async {
-    return super.test_const_constructor_with_named_generic_parameter();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_const_dynamic() async {
-    return super.test_const_dynamic();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_constConstructorWithNonConstSuper_redirectingFactory() async {
-    return super.test_constConstructorWithNonConstSuper_redirectingFactory();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_constConstructorWithNonConstSuper_unresolved() async {
     return super.test_constConstructorWithNonConstSuper_unresolved();
   }
@@ -179,20 +143,6 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_constEval_propertyExtraction_methodStatic_targetType() async {
-    return super.test_constEval_propertyExtraction_methodStatic_targetType();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_constRedirectSkipsSupertype() async {
-    return super.test_constRedirectSkipsSupertype();
-  }
-
-  @override
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
   test_constructorDeclaration_scope_signature() async {
     return super.test_constructorDeclaration_scope_signature();
@@ -201,41 +151,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_dynamicIdentifier() async {
-    return super.test_dynamicIdentifier();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_fieldFormalParameter_functionTyped_named() async {
-    return super.test_fieldFormalParameter_functionTyped_named();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_fieldFormalParameter_genericFunctionTyped() async {
-    return super.test_fieldFormalParameter_genericFunctionTyped();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_fieldFormalParameter_genericFunctionTyped_named() async {
-    return super.test_fieldFormalParameter_genericFunctionTyped_named();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_finalNotInitialized_functionTypedFieldFormal() async {
-    return super.test_finalNotInitialized_functionTypedFieldFormal();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_finalNotInitialized_hasNativeClause_hasConstructor() async {
     return super.test_finalNotInitialized_hasNativeClause_hasConstructor();
   }
@@ -328,7 +243,7 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31641')
   test_invalidAnnotation_constantVariable_field() async {
     return super.test_invalidAnnotation_constantVariable_field();
   }
@@ -367,31 +282,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_invocationOfNonFunction_dynamic() async {
-    // TODO(scheglov) This test fails only in checked mode.
-    fail('This test fails only in checked mode');
-    return super.test_invocationOfNonFunction_dynamic();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_invocationOfNonFunction_functionTypeTypeParameter() async {
-    return super.test_invocationOfNonFunction_functionTypeTypeParameter();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_invocationOfNonFunction_getter() async {
-    // TODO(scheglov) This test fails only in checked mode.
-    fail('This test fails only in checked mode');
-    return super.test_invocationOfNonFunction_getter();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_loadLibraryDefined() async {
     return super.test_loadLibraryDefined();
   }
@@ -419,14 +309,14 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31628')
   test_nonConstCaseExpression_constField() async {
     return super.test_nonConstCaseExpression_constField();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31627')
   test_nonConstMapKey_constField() async {
     return super.test_nonConstMapKey_constField();
   }
@@ -434,27 +324,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_nonConstValueInInitializer_binary_dynamic() async {
-    return super.test_nonConstValueInInitializer_binary_dynamic();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_nonConstValueInInitializer_redirecting() async {
-    return super.test_nonConstValueInInitializer_redirecting();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_null_callMethod() async {
-    return super.test_null_callMethod();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_prefixCollidesWithTopLevelMembers() async {
     return super.test_prefixCollidesWithTopLevelMembers();
   }
@@ -462,41 +331,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_recursiveConstructorRedirect() async {
-    return super.test_recursiveConstructorRedirect();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_recursiveFactoryRedirect() async {
-    return super.test_recursiveFactoryRedirect();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_redirectToInvalidFunctionType() async {
-    return super.test_redirectToInvalidFunctionType();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_redirectToNonConstConstructor() async {
-    return super.test_redirectToNonConstConstructor();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_referencedBeforeDeclaration_cascade() async {
-    return super.test_referencedBeforeDeclaration_cascade();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_returnOfInvalidType_typeParameter_18468() async {
     return super.test_returnOfInvalidType_typeParameter_18468();
   }
@@ -518,13 +352,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_staticAccessToInstanceMember_method() async {
-    return super.test_staticAccessToInstanceMember_method();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_typeType_class_prefixed() async {
     return super.test_typeType_class_prefixed();
   }
@@ -539,20 +366,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_undefinedConstructorInInitializer_redirecting() async {
-    return super.test_undefinedConstructorInInitializer_redirecting();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_undefinedGetter_static_conditionalAccess() async {
-    return super.test_undefinedGetter_static_conditionalAccess();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_undefinedIdentifier_synthetic_whenExpression() async {
     return super.test_undefinedIdentifier_synthetic_whenExpression();
   }
@@ -584,11 +397,4 @@
   test_undefinedSetter_importWithPrefix() async {
     return super.test_undefinedSetter_importWithPrefix();
   }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_undefinedSetter_static_conditionalAccess() async {
-    return super.test_undefinedSetter_static_conditionalAccess();
-  }
 }
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 31f2266..9f45d2e 100644
--- a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'non_hint_code_driver_test.dart';
@@ -20,4 +22,87 @@
 class NonHintCodeTest_Kernel extends NonHintCodeTest_Driver {
   @override
   bool get enableKernelDriver => true;
+
+  @override
+  bool get previewDart2 => true;
+
+  @failingTest
+  @override
+  @potentialAnalyzerProblem
+  test_deadCode_deadBlock_if_debugConst_propertyAccessor() async {
+    // Appears to be an issue with resolution of import prefixes.
+    await super.test_deadCode_deadBlock_if_debugConst_propertyAccessor();
+  }
+
+  @failingTest
+  @override
+  @potentialAnalyzerProblem
+  test_deprecatedMemberUse_inDeprecatedLibrary() async {
+    // LibraryAnalyzer is not applying resolution data to annotations on
+    // directives.
+    await super.test_deprecatedMemberUse_inDeprecatedLibrary();
+  }
+
+  @failingTest
+  @override
+  @potentialAnalyzerProblem
+  test_duplicateImport_as() async {
+    // Expected 0 errors of type HintCode.UNUSED_IMPORT, found 1 (38)
+    // Appears to be an issue with resolution of import prefixes.
+    await super.test_duplicateImport_as();
+  }
+
+  @failingTest
+  @override
+  @potentialAnalyzerProblem
+  test_importDeferredLibraryWithLoadFunction() async {
+    // Appears to be an issue with resolution of import prefixes.
+    await super.test_importDeferredLibraryWithLoadFunction();
+  }
+
+  @override
+  test_unnecessaryCast_generics() async {
+    // dartbug.com/18953
+    // Overridden because type inference now produces more information and there
+    // should now be a hint, where there wasn't one before.
+    Source source = addSource(r'''
+import 'dart:async';
+Future<int> f() => new Future.value(0);
+void g(bool c) {
+  (c ? f(): new Future.value(0) as Future<int>).then((int value) {});
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [HintCode.UNNECESSARY_CAST]);
+    verify([source]);
+  }
+
+  @failingTest
+  @override
+  @potentialAnalyzerProblem
+  test_unusedImport_as_equalPrefixes() async {
+    await super.test_unusedImport_as_equalPrefixes();
+  }
+
+  @failingTest
+  @override
+  @potentialAnalyzerProblem
+  test_unusedImport_metadata() async {
+    await super.test_unusedImport_metadata();
+  }
+
+  @failingTest
+  @override
+  @potentialAnalyzerProblem
+  test_unusedImport_prefix_topLevelFunction() async {
+    // Appears to be an issue with resolution of import prefixes.
+    await super.test_unusedImport_prefix_topLevelFunction();
+  }
+
+  @failingTest
+  @override
+  @potentialAnalyzerProblem
+  test_unusedImport_prefix_topLevelFunction2() async {
+    // Appears to be an issue with resolution of import prefixes.
+    await super.test_unusedImport_prefix_topLevelFunction2();
+  }
 }
diff --git a/pkg/analyzer/test/generated/non_hint_code_test.dart b/pkg/analyzer/test/generated/non_hint_code_test.dart
index 40cc6b2..677da10 100644
--- a/pkg/analyzer/test/generated/non_hint_code_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_test.dart
@@ -461,6 +461,23 @@
     verify([source]);
   }
 
+  test_missingReturn_alwaysThrows() async {
+    Source source = addSource(r'''
+import 'package:meta/meta.dart';
+
+@alwaysThrows
+void a() {
+  throw 'msg';
+}
+
+int f() {
+  a();
+}''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_missingReturn_emptyFunctionBody() async {
     Source source = addSource(r'''
 abstract class A {
@@ -492,23 +509,6 @@
     verify([source]);
   }
 
-  test_missingReturn_alwaysThrows() async {
-    Source source = addSource(r'''
-import 'package:meta/meta.dart';
-
-@alwaysThrows
-void a() {
-  throw 'msg';
-}
-
-int f() {
-  a();
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   test_nullAwareInCondition_for_noCondition() async {
     Source source = addSource(r'''
 m(x) {
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index 929c31b..1bc90f2 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -1447,14 +1447,6 @@
 
   @override
   @failingTest
-  void test_positionalParameterOutsideGroup() {
-    // TODO(brianwilkerson) Wrong errors:
-    // Expected 1 errors of type ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP, found 0
-    super.test_positionalParameterOutsideGroup();
-  }
-
-  @override
-  @failingTest
   void test_redirectingConstructorWithBody_named() {
     // TODO(brianwilkerson) Wrong errors:
     // Expected 1 errors of type ParserErrorCode.REDIRECTING_CONSTRUCTOR_WITH_BODY, found 0
@@ -1471,22 +1463,6 @@
 
   @override
   @failingTest
-  void test_redirectionInNonFactoryConstructor() {
-    // TODO(brianwilkerson) Does not recover.
-    //   type '_RedirectingFactoryBody' is not a subtype of type 'FunctionBody' of 'body' where
-    //   _RedirectingFactoryBody is from package:analyzer/src/fasta/ast_builder.dart
-    //   FunctionBody is from package:analyzer/dart/ast/ast.dart
-    //
-    //   package:analyzer/src/fasta/ast_builder.dart 1613:25                AstBuilder.endMethod
-    //   test/generated/parser_fasta_listener.dart 926:14                   ForwardingTestListener.endMethod
-    //   package:front_end/src/fasta/parser/parser.dart 2433:14             Parser.parseMethod
-    //   package:front_end/src/fasta/parser/parser.dart 2323:11             Parser.parseMember
-    //   test/generated/parser_fasta_test.dart 3766:39                      ParserProxy._run
-    super.test_redirectionInNonFactoryConstructor();
-  }
-
-  @override
-  @failingTest
   void test_setterInFunction_block() {
     // TODO(brianwilkerson) Wrong errors:
     // Expected 1 errors of type ParserErrorCode.SETTER_IN_FUNCTION, found 0
@@ -2707,13 +2683,6 @@
 
   @override
   @failingTest
-  void test_incompleteField_var() {
-    // TODO(brianwilkerson) reportUnrecoverableErrorWithToken
-    super.test_incompleteField_var();
-  }
-
-  @override
-  @failingTest
   void test_incompleteForEach() {
     // TODO(brianwilkerson) reportUnrecoverableErrorWithToken
     super.test_incompleteForEach();
@@ -2742,13 +2711,6 @@
 
   @override
   @failingTest
-  void test_incompleteTypeParameters() {
-    // TODO(brianwilkerson) reportUnrecoverableErrorWithToken
-    super.test_incompleteTypeParameters();
-  }
-
-  @override
-  @failingTest
   void test_isExpression_noType() {
     // TODO(brianwilkerson) reportUnrecoverableErrorWithToken
     super.test_isExpression_noType();
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index aec9b4c..62153fb 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -4461,11 +4461,15 @@
     createParser('(a, b = 0)');
     FormalParameterList list = parser.parseFormalParameterList();
     expectNotNullIfNoErrors(list);
-    listener.assertErrors([
-      expectedError(ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP, 4, 1)
-    ]);
+    listener.assertErrors(usingFastaParser
+        ? [expectedError(ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP, 6, 1)]
+        : [
+            expectedError(
+                ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP, 4, 1)
+          ]);
     expect(list.parameters[0].kind, ParameterKind.REQUIRED);
-    expect(list.parameters[1].kind, ParameterKind.POSITIONAL);
+    expect(list.parameters[1].kind,
+        usingFastaParser ? ParameterKind.NAMED : ParameterKind.POSITIONAL);
   }
 
   void test_redirectingConstructorWithBody_named() {
@@ -7233,7 +7237,9 @@
     expect(
         interpolation.elements[1], new isInstanceOf<InterpolationExpression>());
     InterpolationExpression element1 = interpolation.elements[1];
+    expect(element1.leftBracket.lexeme, '\$');
     expect(element1.expression, new isInstanceOf<SimpleIdentifier>());
+    expect(element1.rightBracket, isNull);
     expect(interpolation.elements[2], new isInstanceOf<InterpolationString>());
     InterpolationString element2 = interpolation.elements[2];
     expect(element2.value, '');
@@ -7252,6 +7258,10 @@
     expect(elements[2] is InterpolationString, isTrue);
     expect(elements[3] is InterpolationExpression, isTrue);
     expect(elements[4] is InterpolationString, isTrue);
+    expect((elements[1] as InterpolationExpression).leftBracket.lexeme, '\${');
+    expect((elements[1] as InterpolationExpression).rightBracket.lexeme, '}');
+    expect((elements[3] as InterpolationExpression).leftBracket.lexeme, '\$');
+    expect((elements[3] as InterpolationExpression).rightBracket, isNull);
   }
 
   void test_parseStringLiteral_multiline_encodedSpace() {
@@ -10308,6 +10318,34 @@
     expect(field.name.isSynthetic, isTrue);
   }
 
+  void test_incompleteField_type() {
+    CompilationUnit unit = parseCompilationUnit(r'''
+class C {
+  A
+}''', codes: [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.EXPECTED_TOKEN
+    ]);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    expect(declarations, hasLength(1));
+    CompilationUnitMember unitMember = declarations[0];
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
+    NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
+    expect(members, hasLength(1));
+    ClassMember classMember = members[0];
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
+    VariableDeclarationList fieldList =
+        (classMember as FieldDeclaration).fields;
+    TypeName type = fieldList.type;
+    expect(type.name.name, 'A');
+    NodeList<VariableDeclaration> fields = fieldList.variables;
+    expect(fields, hasLength(1));
+    VariableDeclaration field = fields[0];
+    expect(field.name.isSynthetic, isTrue);
+  }
+
   void test_incompleteField_var() {
     CompilationUnit unit = parseCompilationUnit(r'''
 class C {
@@ -10433,7 +10471,24 @@
   void test_incompleteTypeParameters() {
     CompilationUnit unit = parseCompilationUnit(r'''
 class C<K {
-}''', codes: [ParserErrorCode.EXPECTED_TOKEN]);
+}''', errors: [expectedError(ParserErrorCode.EXPECTED_TOKEN, 10, 1)]);
+    // one class
+    List<CompilationUnitMember> declarations = unit.declarations;
+    expect(declarations, hasLength(1));
+    ClassDeclaration classDecl = declarations[0] as ClassDeclaration;
+    // validate the type parameters
+    TypeParameterList typeParameters = classDecl.typeParameters;
+    expect(typeParameters.typeParameters, hasLength(1));
+    // synthetic '>'
+    Token token = typeParameters.endToken;
+    expect(token.type, TokenType.GT);
+    expect(token.isSynthetic, isTrue);
+  }
+
+  void test_incompleteTypeParameters2() {
+    CompilationUnit unit = parseCompilationUnit(r'''
+class C<K extends L<T> {
+}''', errors: [expectedError(ParserErrorCode.EXPECTED_TOKEN, 23, 1)]);
     // one class
     List<CompilationUnitMember> declarations = unit.declarations;
     expect(declarations, hasLength(1));
@@ -10452,6 +10507,38 @@
         codes: [ParserErrorCode.MISSING_STAR_AFTER_SYNC]);
   }
 
+  void test_invalidTypeParameters() {
+    CompilationUnit unit = parseCompilationUnit(r'''
+class C {
+  G<int double> g;
+}''',
+        errors: usingFastaParser
+            ? [
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 18, 6),
+                expectedError(ParserErrorCode.EXTRANEOUS_MODIFIER, 18, 6)
+              ]
+            : [
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 18, 6),
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 18, 6),
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 24, 1),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 24, 1),
+                expectedError(
+                    ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 26, 1)
+              ]);
+    // one class
+    List<CompilationUnitMember> declarations = unit.declarations;
+    expect(declarations, hasLength(1));
+    ClassDeclaration classDecl = declarations[0] as ClassDeclaration;
+    // validate members
+    if (usingFastaParser) {
+      expect(classDecl.members, hasLength(1));
+      FieldDeclaration fields = classDecl.members.first;
+      expect(fields.fields.variables, hasLength(1));
+      VariableDeclaration field = fields.fields.variables.first;
+      expect(field.name.name, 'g');
+    }
+  }
+
   void test_isExpression_noType() {
     CompilationUnit unit = parseCompilationUnit(
         "class Bar<T extends Foo> {m(x){if (x is ) return;if (x is !)}}",
@@ -10781,6 +10868,25 @@
     expect(expression, new isInstanceOf<SimpleIdentifier>());
   }
 
+  void test_propertyAccess_missing_LHS_RHS() {
+    Expression result = parseExpression(".", codes: [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    if (usingFastaParser) {
+      PrefixedIdentifier expression = result;
+      expect(expression.prefix.isSynthetic, isTrue);
+      expect(expression.period.lexeme, '.');
+      expect(expression.identifier.isSynthetic, isTrue);
+    } else {
+      PropertyAccess expression = result;
+      SimpleIdentifier target = expression.target;
+      expect(target.isSynthetic, isTrue);
+      expect(expression.operator.lexeme, '.');
+      expect(expression.propertyName.isSynthetic, isTrue);
+    }
+  }
+
   void test_relationalExpression_missing_LHS() {
     IsExpression expression =
         parseExpression("is y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
diff --git a/pkg/analyzer/test/generated/resolver_kernel_test.dart b/pkg/analyzer/test/generated/resolver_kernel_test.dart
index 1a87a9c..9d1b053 100644
--- a/pkg/analyzer/test/generated/resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/resolver_kernel_test.dart
@@ -17,10 +17,398 @@
 class StrictModeTest_Kernel extends StrictModeTest_Driver {
   @override
   bool get enableKernelDriver => true;
+
+  @override
+  bool get previewDart2 => true;
+
+  @override
+  @failingTest
+  test_assert_is() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_OPERATOR, found 0
+    await super.test_assert_is();
+  }
+
+  @override
+  @failingTest
+  test_conditional_isNot() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_OPERATOR, found 0
+    await super.test_conditional_isNot();
+  }
+
+  @override
+  @failingTest
+  test_conditional_or_is() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_OPERATOR, found 0
+    await super.test_conditional_or_is();
+  }
+
+  @override
+  @failingTest
+  test_forEach() async {
+    // 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart': Failed assertion: line 441 pos 16: 'identical(combiner.arguments.positional[0], rhs)': is not true.
+    await super.test_forEach();
+  }
+
+  @override
+  @failingTest
+  test_if_isNot() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_OPERATOR, found 0
+    await super.test_if_isNot();
+  }
+
+  @override
+  @failingTest
+  test_if_isNot_abrupt() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_OPERATOR, found 0
+    await super.test_if_isNot_abrupt();
+  }
+
+  @override
+  @failingTest
+  test_if_or_is() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_OPERATOR, found 0
+    await super.test_if_or_is();
+  }
+
+  @override
+  @failingTest
+  test_localVar() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_OPERATOR, found 0
+    await super.test_localVar();
+  }
 }
 
 @reflectiveTest
 class TypePropagationTest_Kernel extends TypePropagationTest_Driver {
   @override
   bool get enableKernelDriver => true;
+
+  @override
+  bool get previewDart2 => true;
+
+  @override
+  @failingTest
+  test_as() async {
+    // Expected: same instance as InterfaceTypeImpl:<A>
+    await super.test_as();
+  }
+
+  @override
+  @failingTest
+  test_assert() async {
+    // Expected: same instance as InterfaceTypeImpl:<A>
+    await super.test_assert();
+  }
+
+  @override
+  @failingTest
+  test_assignment() async {
+    // Expected: InterfaceTypeImpl:<int>
+    await super.test_assignment();
+  }
+
+  @override
+  @failingTest
+  test_assignment_afterInitializer() async {
+    // Expected: InterfaceTypeImpl:<double>
+    await super.test_assignment_afterInitializer();
+  }
+
+  @override
+  @failingTest
+  test_assignment_throwExpression() async {
+    // Bad state: Expected element reference for analyzer offset 25; got one for kernel offset 21
+    await super.test_assignment_throwExpression();
+  }
+
+  @override
+  @failingTest
+  test_CanvasElement_getContext() async {
+    // NoSuchMethodError: The getter 'name' was called on null.
+    await super.test_CanvasElement_getContext();
+  }
+
+  @override
+  @failingTest
+  test_forEach() async {
+    // Expected: InterfaceTypeImpl:<String>
+    await super.test_forEach();
+  }
+
+  @override
+  @failingTest
+  test_forEach_async() async {
+    // Expected: InterfaceTypeImpl:<String>
+    await super.test_forEach_async();
+  }
+
+  @override
+  @failingTest
+  test_forEach_async_inheritedStream() async {
+    // Expected: InterfaceTypeImpl:<List<String>>
+    await super.test_forEach_async_inheritedStream();
+  }
+
+  @override
+  @failingTest
+  test_functionExpression_asInvocationArgument() async {
+    // Expected: InterfaceTypeImpl:<int>
+    await super.test_functionExpression_asInvocationArgument();
+  }
+
+  @override
+  @failingTest
+  test_functionExpression_asInvocationArgument_fromInferredInvocation() async {
+    // Expected: InterfaceTypeImpl:<int>
+    await super
+        .test_functionExpression_asInvocationArgument_fromInferredInvocation();
+  }
+
+  @override
+  @failingTest
+  test_functionExpression_asInvocationArgument_functionExpressionInvocation() async {
+    // Bad state: Expected a type for v at 43; got one for kernel offset 32
+    await super
+        .test_functionExpression_asInvocationArgument_functionExpressionInvocation();
+  }
+
+  @override
+  @failingTest
+  test_functionExpression_asInvocationArgument_notSubtypeOfStaticType() async {
+    // Expected 1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
+    await super
+        .test_functionExpression_asInvocationArgument_notSubtypeOfStaticType();
+  }
+
+  @override
+  @failingTest
+  test_functionExpression_asInvocationArgument_replaceIfMoreSpecific() async {
+    // Expected: InterfaceTypeImpl:<String>
+    await super
+        .test_functionExpression_asInvocationArgument_replaceIfMoreSpecific();
+  }
+
+  @override
+  @failingTest
+  test_Future_then() async {
+    // Expected: InterfaceTypeImpl:<int>
+    await super.test_Future_then();
+  }
+
+  @override
+  @failingTest
+  test_initializer() async {
+    // Expected: DynamicTypeImpl:<dynamic>
+    await super.test_initializer();
+  }
+
+  @override
+  @failingTest
+  test_initializer_dereference() async {
+    // Expected: InterfaceTypeImpl:<String>
+    await super.test_initializer_dereference();
+  }
+
+  @override
+  @failingTest
+  test_invocation_target_prefixed() async {
+    // Bad state: Expected element reference for analyzer offset 43; got one for kernel offset 50
+    await super.test_invocation_target_prefixed();
+  }
+
+  @override
+  @failingTest
+  test_is_conditional() async {
+    // Expected: same instance as InterfaceTypeImpl:<A>
+    await super.test_is_conditional();
+  }
+
+  @override
+  @failingTest
+  test_is_if() async {
+    // type 'ParenthesizedExpressionImpl' is not a subtype of type 'IsExpression' of 'isExpression' where
+    await super.test_is_if();
+  }
+
+  @override
+  @failingTest
+  test_is_if_logicalAnd() async {
+    // Expected: same instance as InterfaceTypeImpl:<A>
+    await super.test_is_if_logicalAnd();
+  }
+
+  @override
+  @failingTest
+  test_is_postConditional() async {
+    // Expected: same instance as InterfaceTypeImpl:<A>
+    await super.test_is_postConditional();
+  }
+
+  @override
+  @failingTest
+  test_is_postIf() async {
+    // Expected: same instance as InterfaceTypeImpl:<A>
+    await super.test_is_postIf();
+  }
+
+  @override
+  @failingTest
+  test_is_while() async {
+    // Expected: same instance as InterfaceTypeImpl:<A>
+    await super.test_is_while();
+  }
+
+  @override
+  @failingTest
+  test_isNot_conditional() async {
+    // Expected: same instance as InterfaceTypeImpl:<A>
+    await super.test_isNot_conditional();
+  }
+
+  @override
+  @failingTest
+  test_isNot_if() async {
+    // Expected: same instance as InterfaceTypeImpl:<A>
+    await super.test_isNot_if();
+  }
+
+  @override
+  @failingTest
+  test_isNot_if_logicalOr() async {
+    // Expected: same instance as InterfaceTypeImpl:<A>
+    await super.test_isNot_if_logicalOr();
+  }
+
+  @override
+  @failingTest
+  test_isNot_postConditional() async {
+    // Expected: same instance as InterfaceTypeImpl:<A>
+    await super.test_isNot_postConditional();
+  }
+
+  @override
+  @failingTest
+  test_isNot_postIf() async {
+    // Expected: same instance as InterfaceTypeImpl:<A>
+    await super.test_isNot_postIf();
+  }
+
+  @override
+  @failingTest
+  test_listLiteral_same() async {
+    // NoSuchMethodError: The getter 'element' was called on null.
+    await super.test_listLiteral_same();
+  }
+
+  @override
+  @failingTest
+  test_mapLiteral_different() async {
+    // NoSuchMethodError: The getter 'element' was called on null.
+    await super.test_mapLiteral_different();
+  }
+
+  @override
+  @failingTest
+  test_mapLiteral_same() async {
+    // NoSuchMethodError: The getter 'element' was called on null.
+    await super.test_mapLiteral_same();
+  }
+
+  @override
+  @failingTest
+  test_mergePropagatedTypes_afterIfThen_different() async {
+    // Expected: InterfaceTypeImpl:<String>
+    await super.test_mergePropagatedTypes_afterIfThen_different();
+  }
+
+  @override
+  @failingTest
+  test_mergePropagatedTypes_afterIfThen_same() async {
+    // Expected: InterfaceTypeImpl:<int>
+    await super.test_mergePropagatedTypes_afterIfThen_same();
+  }
+
+  @override
+  @failingTest
+  test_mergePropagatedTypes_afterIfThenElse_same() async {
+    // Expected: InterfaceTypeImpl:<int>
+    await super.test_mergePropagatedTypes_afterIfThenElse_same();
+  }
+
+  @override
+  @failingTest
+  test_mergePropagatedTypesAtJoinPoint_4() async {
+    // Expected: InterfaceTypeImpl:<int>
+    await super.test_mergePropagatedTypesAtJoinPoint_4();
+  }
+
+  @override
+  @failingTest
+  test_objectAccessInference_disabled_for_library_prefix() async {
+    // Bad state: Expected element reference for analyzer offset 43; got one for kernel offset 50
+    await super.test_objectAccessInference_disabled_for_library_prefix();
+  }
+
+  @override
+  @failingTest
+  test_objectAccessInference_enabled_for_cascades() async {
+    // Expected: DynamicTypeImpl:<dynamic>
+    await super.test_objectAccessInference_enabled_for_cascades();
+  }
+
+  @override
+  @failingTest
+  test_objectMethodInference_disabled_for_library_prefix() async {
+    // Bad state: Expected element reference for analyzer offset 43; got one for kernel offset 50
+    await super.test_objectMethodInference_disabled_for_library_prefix();
+  }
+
+  @override
+  @failingTest
+  test_objectMethodInference_enabled_for_cascades() async {
+    // Expected: DynamicTypeImpl:<dynamic>
+    await super.test_objectMethodInference_enabled_for_cascades();
+  }
+
+  @override
+  @failingTest
+  test_objectMethodOnDynamicExpression_doubleEquals() async {
+    // Expected: InterfaceTypeImpl:<bool>
+    await super.test_objectMethodOnDynamicExpression_doubleEquals();
+  }
+
+  @override
+  @failingTest
+  test_objectMethodOnDynamicExpression_hashCode() async {
+    // Expected: InterfaceTypeImpl:<int>
+    await super.test_objectMethodOnDynamicExpression_hashCode();
+  }
+
+  @override
+  @failingTest
+  test_objectMethodOnDynamicExpression_runtimeType() async {
+    // Expected: InterfaceTypeImpl:<Type>
+    await super.test_objectMethodOnDynamicExpression_runtimeType();
+  }
+
+  @override
+  @failingTest
+  test_objectMethodOnDynamicExpression_toString() async {
+    // Expected: InterfaceTypeImpl:<String>
+    await super.test_objectMethodOnDynamicExpression_toString();
+  }
+
+  @override
+  @failingTest
+  test_propagatedReturnType_localFunction() async {
+    // Expected: DynamicTypeImpl:<dynamic>
+    await super.test_propagatedReturnType_localFunction();
+  }
+
+  @override
+  @failingTest
+  test_query() async {
+    // NoSuchMethodError: The getter 'name' was called on null.
+    await super.test_query();
+  }
 }
diff --git a/pkg/analyzer/test/generated/resolver_test_case.dart b/pkg/analyzer/test/generated/resolver_test_case.dart
index 139df0c..49548e5 100644
--- a/pkg/analyzer/test/generated/resolver_test_case.dart
+++ b/pkg/analyzer/test/generated/resolver_test_case.dart
@@ -667,7 +667,9 @@
     options ??= defaultAnalysisOptions;
     if (enableNewAnalysisDriver) {
       if (previewDart2) {
-        (options as AnalysisOptionsImpl).useFastaParser = true;
+        (options as AnalysisOptionsImpl)
+          ..strongMode = true
+          ..useFastaParser = true;
       }
       DartSdk sdk = new MockSdk(resourceProvider: resourceProvider)
         ..context.analysisOptions = options;
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart
index 08a3bc0..5d997c0 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart
@@ -16,4 +16,42 @@
 class StaticTypeAnalyzer2Test_Kernel extends StaticTypeAnalyzer2Test_Driver {
   @override
   bool get enableKernelDriver => true;
+
+  @override
+  bool get previewDart2 => true;
+
+  @override
+  @failingTest
+  test_FunctionExpressionInvocation_block() async {
+    // Bad state: No reference information for (() {return 1;})() at 21
+    await super.test_FunctionExpressionInvocation_block();
+  }
+
+  @override
+  @failingTest
+  test_FunctionExpressionInvocation_curried() async {
+    // Bad state: No reference information for f()() at 53
+    await super.test_FunctionExpressionInvocation_curried();
+  }
+
+  @override
+  @failingTest
+  test_FunctionExpressionInvocation_expression() async {
+    // Bad state: No reference information for (() => 1)() at 21
+    await super.test_FunctionExpressionInvocation_expression();
+  }
+
+  @override
+  @failingTest
+  test_MethodInvocation_nameType_parameter_propagatedType() async {
+    // Expected: DynamicTypeImpl:<dynamic>
+    await super.test_MethodInvocation_nameType_parameter_propagatedType();
+  }
+
+  @override
+  @failingTest
+  test_staticMethods_classTypeParameters_genericMethod() async {
+    // Expected: '(dynamic) → void'
+    await super.test_staticMethods_classTypeParameters_genericMethod();
+  }
 }
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
index 61cafa2..7260957 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
@@ -23,6 +23,1308 @@
     extends StaticTypeWarningCodeTest_Driver {
   @override
   bool get enableKernelDriver => true;
+
+  @override
+  bool get previewDart2 => true;
+
+  @override
+  @failingTest
+  test_ambiguousImport_function() async {
+    // Bad state: No reference information for f at 53
+    await super.test_ambiguousImport_function();
+  }
+
+  @override
+  @failingTest
+  test_assert_message_suppresses_type_promotion() async {
+    // Bad state: No reference information for () {x = new C(); return 'msg';}() at 89
+    await super.test_assert_message_suppresses_type_promotion();
+  }
+
+  @override
+  @failingTest
+  test_await_flattened() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
+    await super.test_await_flattened();
+  }
+
+  @override
+  @failingTest
+  test_await_simple() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
+    await super.test_await_simple();
+  }
+
+  @override
+  @failingTest
+  test_awaitForIn_declaredVariableWrongType() async {
+    // Expected 1 errors of type StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, found 0
+    await super.test_awaitForIn_declaredVariableWrongType();
+  }
+
+  @override
+  @failingTest
+  test_awaitForIn_existingVariableWrongType() async {
+    // Expected 1 errors of type StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, found 0
+    await super.test_awaitForIn_existingVariableWrongType();
+  }
+
+  @override
+  @failingTest
+  test_awaitForIn_notStream() async {
+    // Expected 1 errors of type StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE, found 0
+    await super.test_awaitForIn_notStream();
+  }
+
+  @override
+  @failingTest
+  test_bug21912() async {
+    // Expected 2 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
+    await super.test_bug21912();
+  }
+
+  @override
+  @failingTest
+  test_expectedOneListTypeArgument() async {
+    // Bad state: Found 1 argument types for 2 type arguments
+    await super.test_expectedOneListTypeArgument();
+  }
+
+  @override
+  @failingTest
+  test_expectedTwoMapTypeArguments_one() async {
+    // Bad state: Found 2 argument types for 1 type arguments
+    await super.test_expectedTwoMapTypeArguments_one();
+  }
+
+  @override
+  @failingTest
+  test_expectedTwoMapTypeArguments_three() async {
+    // Bad state: Found 2 argument types for 3 type arguments
+    await super.test_expectedTwoMapTypeArguments_three();
+  }
+
+  @override
+  @failingTest
+  test_forIn_declaredVariableWrongType() async {
+    // Expected 1 errors of type StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, found 0
+    await super.test_forIn_declaredVariableWrongType();
+  }
+
+  @override
+  @failingTest
+  test_forIn_existingVariableWrongType() async {
+    // Expected 1 errors of type StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, found 0
+    await super.test_forIn_existingVariableWrongType();
+  }
+
+  @override
+  @failingTest
+  test_forIn_notIterable() async {
+    // Expected 1 errors of type StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE, found 0
+    await super.test_forIn_notIterable();
+  }
+
+  @override
+  @failingTest
+  test_forIn_typeBoundBad() async {
+    // Expected 1 errors of type StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, found 0
+    await super.test_forIn_typeBoundBad();
+  }
+
+  @override
+  @failingTest
+  test_illegalAsyncGeneratorReturnType_function_nonStream() async {
+    // Expected 1 errors of type StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE, found 0
+    await super.test_illegalAsyncGeneratorReturnType_function_nonStream();
+  }
+
+  @override
+  @failingTest
+  test_illegalAsyncGeneratorReturnType_function_subtypeOfStream() async {
+    // Expected 1 errors of type StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE, found 0
+    await super.test_illegalAsyncGeneratorReturnType_function_subtypeOfStream();
+  }
+
+  @override
+  @failingTest
+  test_illegalAsyncGeneratorReturnType_method_nonStream() async {
+    // Expected 1 errors of type StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE, found 0
+    await super.test_illegalAsyncGeneratorReturnType_method_nonStream();
+  }
+
+  @override
+  @failingTest
+  test_illegalAsyncGeneratorReturnType_method_subtypeOfStream() async {
+    // Expected 1 errors of type StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE, found 0
+    await super.test_illegalAsyncGeneratorReturnType_method_subtypeOfStream();
+  }
+
+  @override
+  @failingTest
+  test_illegalAsyncReturnType_function_nonFuture() async {
+    // Expected 1 errors of type StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE, found 0
+    await super.test_illegalAsyncReturnType_function_nonFuture();
+  }
+
+  @override
+  @failingTest
+  test_illegalAsyncReturnType_function_subtypeOfFuture() async {
+    // Expected 1 errors of type StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE, found 0
+    await super.test_illegalAsyncReturnType_function_subtypeOfFuture();
+  }
+
+  @override
+  @failingTest
+  test_illegalAsyncReturnType_method_nonFuture() async {
+    // Expected 1 errors of type StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE, found 0
+    await super.test_illegalAsyncReturnType_method_nonFuture();
+  }
+
+  @override
+  @failingTest
+  test_illegalAsyncReturnType_method_subtypeOfFuture() async {
+    // Expected 1 errors of type StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE, found 0
+    await super.test_illegalAsyncReturnType_method_subtypeOfFuture();
+  }
+
+  @override
+  @failingTest
+  test_illegalSyncGeneratorReturnType_function_nonIterator() async {
+    // Expected 1 errors of type StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE, found 0
+    await super.test_illegalSyncGeneratorReturnType_function_nonIterator();
+  }
+
+  @override
+  @failingTest
+  test_illegalSyncGeneratorReturnType_function_subclassOfIterator() async {
+    // Expected 1 errors of type StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE, found 0
+    await super
+        .test_illegalSyncGeneratorReturnType_function_subclassOfIterator();
+  }
+
+  @override
+  @failingTest
+  test_illegalSyncGeneratorReturnType_method_nonIterator() async {
+    // Expected 1 errors of type StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE, found 0
+    await super.test_illegalSyncGeneratorReturnType_method_nonIterator();
+  }
+
+  @override
+  @failingTest
+  test_illegalSyncGeneratorReturnType_method_subclassOfIterator() async {
+    // Expected 1 errors of type StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE, found 0
+    await super.test_illegalSyncGeneratorReturnType_method_subclassOfIterator();
+  }
+
+  @override
+  @failingTest
+  test_inconsistentMethodInheritance_paramCount() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE, found 0
+    await super.test_inconsistentMethodInheritance_paramCount();
+  }
+
+  @override
+  @failingTest
+  test_inconsistentMethodInheritance_paramType() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE, found 0
+    await super.test_inconsistentMethodInheritance_paramType();
+  }
+
+  @override
+  @failingTest
+  test_inconsistentMethodInheritance_returnType() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE, found 0
+    await super.test_inconsistentMethodInheritance_returnType();
+  }
+
+  @override
+  @failingTest
+  test_instanceAccessToStaticMember_method_invocation() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, found 0
+    await super.test_instanceAccessToStaticMember_method_invocation();
+  }
+
+  @override
+  @failingTest
+  test_instanceAccessToStaticMember_method_reference() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, found 0
+    await super.test_instanceAccessToStaticMember_method_reference();
+  }
+
+  @override
+  @failingTest
+  test_instanceAccessToStaticMember_propertyAccess_field() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, found 0
+    await super.test_instanceAccessToStaticMember_propertyAccess_field();
+  }
+
+  @override
+  @failingTest
+  test_instanceAccessToStaticMember_propertyAccess_getter() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, found 0
+    await super.test_instanceAccessToStaticMember_propertyAccess_getter();
+  }
+
+  @override
+  @failingTest
+  test_instanceAccessToStaticMember_propertyAccess_setter() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, found 0
+    await super.test_instanceAccessToStaticMember_propertyAccess_setter();
+  }
+
+  @override
+  @failingTest
+  test_invalidAssignment_compoundAssignment() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
+    await super.test_invalidAssignment_compoundAssignment();
+  }
+
+  @override
+  @failingTest
+  test_invalidAssignment_defaultValue_named() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t1 = 0 in let ...
+    await super.test_invalidAssignment_defaultValue_named();
+  }
+
+  @override
+  @failingTest
+  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
+  @failingTest
+  test_invalidAssignment_functionExpressionInvocation() async {
+    // Bad state: No reference information for (() => 5)() at 22
+    await super.test_invalidAssignment_functionExpressionInvocation();
+  }
+
+  @override
+  @failingTest
+  test_invalidAssignment_ifNullAssignment() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
+    await super.test_invalidAssignment_ifNullAssignment();
+  }
+
+  @override
+  @failingTest
+  test_invalidAssignment_instanceVariable() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
+    await super.test_invalidAssignment_instanceVariable();
+  }
+
+  @override
+  @failingTest
+  test_invalidAssignment_localVariable() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
+    await super.test_invalidAssignment_localVariable();
+  }
+
+  @override
+  @failingTest
+  test_invalidAssignment_regressionInIssue18468Fix() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
+    await super.test_invalidAssignment_regressionInIssue18468Fix();
+  }
+
+  @override
+  @failingTest
+  test_invalidAssignment_staticVariable() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
+    await super.test_invalidAssignment_staticVariable();
+  }
+
+  @override
+  @failingTest
+  test_invalidAssignment_topLevelVariableDeclaration() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
+    await super.test_invalidAssignment_topLevelVariableDeclaration();
+  }
+
+  @override
+  @failingTest
+  test_invalidAssignment_typeParameter() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
+    await super.test_invalidAssignment_typeParameter();
+  }
+
+  @override
+  @failingTest
+  test_invalidAssignment_variableDeclaration() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0
+    await super.test_invalidAssignment_variableDeclaration();
+  }
+
+  @override
+  @failingTest
+  test_invocationOfNonFunction_class() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, found 0
+    await super.test_invocationOfNonFunction_class();
+  }
+
+  @override
+  @failingTest
+  test_invocationOfNonFunction_localGenericFunction() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, found 0
+    await super.test_invocationOfNonFunction_localGenericFunction();
+  }
+
+  @override
+  @failingTest
+  test_invocationOfNonFunction_localObject() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, found 0
+    await super.test_invocationOfNonFunction_localObject();
+  }
+
+  @override
+  @failingTest
+  test_invocationOfNonFunction_localVariable() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, found 0
+    await super.test_invocationOfNonFunction_localVariable();
+  }
+
+  @override
+  @failingTest
+  test_invocationOfNonFunction_ordinaryInvocation() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, found 0
+    await super.test_invocationOfNonFunction_ordinaryInvocation();
+  }
+
+  @override
+  @failingTest
+  test_invocationOfNonFunction_staticInvocation() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, found 0
+    await super.test_invocationOfNonFunction_staticInvocation();
+  }
+
+  @override
+  @failingTest
+  test_invocationOfNonFunction_superExpression() async {
+    // Expected 1 errors of type StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, found 0
+    await super.test_invocationOfNonFunction_superExpression();
+  }
+
+  @override
+  @failingTest
+  test_invocationOfNonFunctionExpression_literal() async {
+    // Bad state: Expected a type for 5 at 10; got one for kernel offset 9
+    await super.test_invocationOfNonFunctionExpression_literal();
+  }
+
+  @override
+  @failingTest
+  test_nonBoolCondition_conditional() async {
+    // Expected 1 errors of type StaticTypeWarningCode.NON_BOOL_CONDITION, found 0
+    await super.test_nonBoolCondition_conditional();
+  }
+
+  @override
+  @failingTest
+  test_nonBoolCondition_do() async {
+    // Expected 1 errors of type StaticTypeWarningCode.NON_BOOL_CONDITION, found 0
+    await super.test_nonBoolCondition_do();
+  }
+
+  @override
+  @failingTest
+  test_nonBoolCondition_for() async {
+    // Expected 1 errors of type StaticTypeWarningCode.NON_BOOL_CONDITION, found 0
+    await super.test_nonBoolCondition_for();
+  }
+
+  @override
+  @failingTest
+  test_nonBoolCondition_if() async {
+    // Expected 1 errors of type StaticTypeWarningCode.NON_BOOL_CONDITION, found 0
+    await super.test_nonBoolCondition_if();
+  }
+
+  @override
+  @failingTest
+  test_nonBoolCondition_while() async {
+    // Expected 1 errors of type StaticTypeWarningCode.NON_BOOL_CONDITION, found 0
+    await super.test_nonBoolCondition_while();
+  }
+
+  @override
+  @failingTest
+  test_nonBoolExpression_functionType() async {
+    // Expected 1 errors of type StaticTypeWarningCode.NON_BOOL_EXPRESSION, found 0
+    await super.test_nonBoolExpression_functionType();
+  }
+
+  @override
+  @failingTest
+  test_nonBoolExpression_interfaceType() async {
+    // Expected 1 errors of type StaticTypeWarningCode.NON_BOOL_EXPRESSION, found 0
+    await super.test_nonBoolExpression_interfaceType();
+  }
+
+  @override
+  @failingTest
+  test_nonBoolNegationExpression() async {
+    // Expected 1 errors of type StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION, found 0
+    await super.test_nonBoolNegationExpression();
+  }
+
+  @override
+  @failingTest
+  test_nonBoolOperand_and_left() async {
+    // Expected 1 errors of type StaticTypeWarningCode.NON_BOOL_OPERAND, found 0
+    await super.test_nonBoolOperand_and_left();
+  }
+
+  @override
+  @failingTest
+  test_nonBoolOperand_and_right() async {
+    // Expected 1 errors of type StaticTypeWarningCode.NON_BOOL_OPERAND, found 0
+    await super.test_nonBoolOperand_and_right();
+  }
+
+  @override
+  @failingTest
+  test_nonBoolOperand_or_left() async {
+    // Expected 1 errors of type StaticTypeWarningCode.NON_BOOL_OPERAND, found 0
+    await super.test_nonBoolOperand_or_left();
+  }
+
+  @override
+  @failingTest
+  test_nonBoolOperand_or_right() async {
+    // Expected 1 errors of type StaticTypeWarningCode.NON_BOOL_OPERAND, found 0
+    await super.test_nonBoolOperand_or_right();
+  }
+
+  @override
+  @failingTest
+  test_nonTypeAsTypeArgument_notAType() async {
+    // Expected 1 errors of type StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, found 0
+    await super.test_nonTypeAsTypeArgument_notAType();
+  }
+
+  @override
+  @failingTest
+  test_nonTypeAsTypeArgument_undefinedIdentifier() async {
+    // Expected 1 errors of type StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, found 0
+    await super.test_nonTypeAsTypeArgument_undefinedIdentifier();
+  }
+
+  @override
+  @failingTest
+  test_returnOfInvalidType_async_future_int_mismatches_future_string() async {
+    // Expected 1 errors of type StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, found 0
+    await super
+        .test_returnOfInvalidType_async_future_int_mismatches_future_string();
+  }
+
+  @override
+  @failingTest
+  test_returnOfInvalidType_async_future_int_mismatches_int() async {
+    // Expected 1 errors of type StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, found 0;
+    //          1 errors of type StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE, found 0
+    await super.test_returnOfInvalidType_async_future_int_mismatches_int();
+  }
+
+  @override
+  @failingTest
+  test_returnOfInvalidType_expressionFunctionBody_function() async {
+    // Expected 1 errors of type StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, found 0
+    await super.test_returnOfInvalidType_expressionFunctionBody_function();
+  }
+
+  @override
+  @failingTest
+  test_returnOfInvalidType_expressionFunctionBody_getter() async {
+    // Expected 1 errors of type StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, found 0
+    await super.test_returnOfInvalidType_expressionFunctionBody_getter();
+  }
+
+  @override
+  @failingTest
+  test_returnOfInvalidType_expressionFunctionBody_localFunction() async {
+    // Expected 1 errors of type StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, found 0
+    await super.test_returnOfInvalidType_expressionFunctionBody_localFunction();
+  }
+
+  @override
+  @failingTest
+  test_returnOfInvalidType_expressionFunctionBody_method() async {
+    // Expected 1 errors of type StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, found 0
+    await super.test_returnOfInvalidType_expressionFunctionBody_method();
+  }
+
+  @override
+  @failingTest
+  test_returnOfInvalidType_function() async {
+    // Expected 1 errors of type StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, found 0
+    await super.test_returnOfInvalidType_function();
+  }
+
+  @override
+  @failingTest
+  test_returnOfInvalidType_getter() async {
+    // Expected 1 errors of type StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, found 0
+    await super.test_returnOfInvalidType_getter();
+  }
+
+  @override
+  @failingTest
+  test_returnOfInvalidType_localFunction() async {
+    // Expected 1 errors of type StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, found 0
+    await super.test_returnOfInvalidType_localFunction();
+  }
+
+  @override
+  @failingTest
+  test_returnOfInvalidType_method() async {
+    // Expected 1 errors of type StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, found 0
+    await super.test_returnOfInvalidType_method();
+  }
+
+  @override
+  @failingTest
+  test_returnOfInvalidType_void() async {
+    // Expected 1 errors of type StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, found 0
+    await super.test_returnOfInvalidType_void();
+  }
+
+  @override
+  @failingTest
+  test_typeArgumentNotMatchingBounds_classTypeAlias() async {
+    // Expected 1 errors of type StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
+    await super.test_typeArgumentNotMatchingBounds_classTypeAlias();
+  }
+
+  @override
+  @failingTest
+  test_typeArgumentNotMatchingBounds_extends() async {
+    // Expected 1 errors of type StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
+    await super.test_typeArgumentNotMatchingBounds_extends();
+  }
+
+  @override
+  @failingTest
+  test_typeArgumentNotMatchingBounds_extends_regressionInIssue18468Fix() async {
+    // Expected 1 errors of type StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
+    await super
+        .test_typeArgumentNotMatchingBounds_extends_regressionInIssue18468Fix();
+  }
+
+  @override
+  @failingTest
+  test_typeArgumentNotMatchingBounds_fieldFormalParameter() async {
+    // Expected 1 errors of type StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
+    await super.test_typeArgumentNotMatchingBounds_fieldFormalParameter();
+  }
+
+  @override
+  @failingTest
+  test_typeArgumentNotMatchingBounds_functionReturnType() async {
+    // Expected 1 errors of type StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
+    await super.test_typeArgumentNotMatchingBounds_functionReturnType();
+  }
+
+  @override
+  @failingTest
+  test_typeArgumentNotMatchingBounds_functionTypeAlias() async {
+    // Expected 1 errors of type StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
+    await super.test_typeArgumentNotMatchingBounds_functionTypeAlias();
+  }
+
+  @override
+  @failingTest
+  test_typeArgumentNotMatchingBounds_functionTypedFormalParameter() async {
+    // Expected 1 errors of type StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
+    await super
+        .test_typeArgumentNotMatchingBounds_functionTypedFormalParameter();
+  }
+
+  @override
+  @failingTest
+  test_typeArgumentNotMatchingBounds_implements() async {
+    // Expected 1 errors of type StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
+    await super.test_typeArgumentNotMatchingBounds_implements();
+  }
+
+  @override
+  @failingTest
+  test_typeArgumentNotMatchingBounds_is() async {
+    // Expected 1 errors of type StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
+    await super.test_typeArgumentNotMatchingBounds_is();
+  }
+
+  @override
+  @failingTest
+  test_typeArgumentNotMatchingBounds_methodInvocation_localFunction() async {
+    // 'package:analyzer/src/fasta/resolution_applier.dart': Failed assertion: line 236 pos 18: 'typeParameter.bound == null': is not true.
+    await super
+        .test_typeArgumentNotMatchingBounds_methodInvocation_localFunction();
+  }
+
+  @override
+  @failingTest
+  test_typeArgumentNotMatchingBounds_methodInvocation_method() async {
+    // Expected 1 errors of type StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
+    await super.test_typeArgumentNotMatchingBounds_methodInvocation_method();
+  }
+
+  @override
+  @failingTest
+  test_typeArgumentNotMatchingBounds_methodInvocation_topLevelFunction() async {
+    // Expected 1 errors of type StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
+    await super
+        .test_typeArgumentNotMatchingBounds_methodInvocation_topLevelFunction();
+  }
+
+  @override
+  @failingTest
+  test_typeArgumentNotMatchingBounds_methodReturnType() async {
+    // Expected 1 errors of type StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
+    await super.test_typeArgumentNotMatchingBounds_methodReturnType();
+  }
+
+  @override
+  @failingTest
+  test_typeArgumentNotMatchingBounds_new() async {
+    // Expected 1 errors of type StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
+    await super.test_typeArgumentNotMatchingBounds_new();
+  }
+
+  @override
+  @failingTest
+  test_typeArgumentNotMatchingBounds_new_superTypeOfUpperBound() async {
+    // Expected 1 errors of type StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
+    await super.test_typeArgumentNotMatchingBounds_new_superTypeOfUpperBound();
+  }
+
+  @override
+  @failingTest
+  test_typeArgumentNotMatchingBounds_parameter() async {
+    // Expected 1 errors of type StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
+    await super.test_typeArgumentNotMatchingBounds_parameter();
+  }
+
+  @override
+  @failingTest
+  test_typeArgumentNotMatchingBounds_redirectingConstructor() async {
+    // Expected 1 errors of type StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0;
+    //          1 errors of type StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE, found 0
+    await super.test_typeArgumentNotMatchingBounds_redirectingConstructor();
+  }
+
+  @override
+  @failingTest
+  test_typeArgumentNotMatchingBounds_typeArgumentList() async {
+    // Expected 1 errors of type StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
+    await super.test_typeArgumentNotMatchingBounds_typeArgumentList();
+  }
+
+  @override
+  @failingTest
+  test_typeArgumentNotMatchingBounds_typeParameter() async {
+    // Expected 1 errors of type StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
+    await super.test_typeArgumentNotMatchingBounds_typeParameter();
+  }
+
+  @override
+  @failingTest
+  test_typeArgumentNotMatchingBounds_variableDeclaration() async {
+    // Expected 1 errors of type StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
+    await super.test_typeArgumentNotMatchingBounds_variableDeclaration();
+  }
+
+  @override
+  @failingTest
+  test_typeArgumentNotMatchingBounds_with() async {
+    // Expected 1 errors of type StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
+    await super.test_typeArgumentNotMatchingBounds_with();
+  }
+
+  @override
+  @failingTest
+  test_typeParameterSupertypeOfItsBound() async {
+    // Expected 1 errors of type StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, found 0
+    await super.test_typeParameterSupertypeOfItsBound();
+  }
+
+  @override
+  @failingTest
+  test_typePromotion_booleanAnd_useInRight_accessedInClosureRight_mutated() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super
+        .test_typePromotion_booleanAnd_useInRight_accessedInClosureRight_mutated();
+  }
+
+  @override
+  @failingTest
+  test_typePromotion_booleanAnd_useInRight_mutatedInLeft() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super.test_typePromotion_booleanAnd_useInRight_mutatedInLeft();
+  }
+
+  @override
+  @failingTest
+  test_typePromotion_booleanAnd_useInRight_mutatedInRight() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super.test_typePromotion_booleanAnd_useInRight_mutatedInRight();
+  }
+
+  @override
+  @failingTest
+  test_typePromotion_conditional_useInThen_accessedInClosure_hasAssignment_after() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super
+        .test_typePromotion_conditional_useInThen_accessedInClosure_hasAssignment_after();
+  }
+
+  @override
+  @failingTest
+  test_typePromotion_conditional_useInThen_accessedInClosure_hasAssignment_before() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super
+        .test_typePromotion_conditional_useInThen_accessedInClosure_hasAssignment_before();
+  }
+
+  @override
+  @failingTest
+  test_typePromotion_conditional_useInThen_hasAssignment() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super.test_typePromotion_conditional_useInThen_hasAssignment();
+  }
+
+  @override
+  @failingTest
+  test_typePromotion_if_accessedInClosure_hasAssignment() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super.test_typePromotion_if_accessedInClosure_hasAssignment();
+  }
+
+  @override
+  @failingTest
+  test_typePromotion_if_and_right_hasAssignment() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super.test_typePromotion_if_and_right_hasAssignment();
+  }
+
+  @override
+  @failingTest
+  test_typePromotion_if_extends_notMoreSpecific_dynamic() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super.test_typePromotion_if_extends_notMoreSpecific_dynamic();
+  }
+
+  @override
+  @failingTest
+  test_typePromotion_if_extends_notMoreSpecific_notMoreSpecificTypeArg() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super
+        .test_typePromotion_if_extends_notMoreSpecific_notMoreSpecificTypeArg();
+  }
+
+  @override
+  @failingTest
+  test_typePromotion_if_hasAssignment_after() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super.test_typePromotion_if_hasAssignment_after();
+  }
+
+  @override
+  @failingTest
+  test_typePromotion_if_hasAssignment_before() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super.test_typePromotion_if_hasAssignment_before();
+  }
+
+  @override
+  @failingTest
+  test_typePromotion_if_hasAssignment_inClosure_anonymous_after() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super.test_typePromotion_if_hasAssignment_inClosure_anonymous_after();
+  }
+
+  @override
+  @failingTest
+  test_typePromotion_if_hasAssignment_inClosure_anonymous_before() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super
+        .test_typePromotion_if_hasAssignment_inClosure_anonymous_before();
+  }
+
+  @override
+  @failingTest
+  test_typePromotion_if_hasAssignment_inClosure_function_after() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super.test_typePromotion_if_hasAssignment_inClosure_function_after();
+  }
+
+  @override
+  @failingTest
+  test_typePromotion_if_hasAssignment_inClosure_function_before() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super.test_typePromotion_if_hasAssignment_inClosure_function_before();
+  }
+
+  @override
+  @failingTest
+  test_typePromotion_if_implements_notMoreSpecific_dynamic() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super.test_typePromotion_if_implements_notMoreSpecific_dynamic();
+  }
+
+  @override
+  @failingTest
+  test_typePromotion_if_with_notMoreSpecific_dynamic() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super.test_typePromotion_if_with_notMoreSpecific_dynamic();
+  }
+
+  @override
+  @failingTest
+  test_undefinedFunction() async {
+    // Bad state: No reference information for g at 13
+    await super.test_undefinedFunction();
+  }
+
+  @override
+  @failingTest
+  test_undefinedFunction_inCatch() async {
+    // Bad state: No reference information for g at 39
+    await super.test_undefinedFunction_inCatch();
+  }
+
+  @override
+  @failingTest
+  test_undefinedFunction_inImportedLib() async {
+    // Bad state: No reference information for f at 40
+    await super.test_undefinedFunction_inImportedLib();
+  }
+
+  @override
+  @failingTest
+  test_undefinedGetter() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super.test_undefinedGetter();
+  }
+
+  @override
+  @failingTest
+  test_undefinedGetter_generic_function_call() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super.test_undefinedGetter_generic_function_call();
+  }
+
+  @override
+  @failingTest
+  test_undefinedGetter_object_call() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super.test_undefinedGetter_object_call();
+  }
+
+  @override
+  @failingTest
+  test_undefinedGetter_proxy_annotation_fakeProxy() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    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();
+  }
+
+  @override
+  @failingTest
+  test_undefinedGetter_typeLiteral_cascadeTarget() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super.test_undefinedGetter_typeLiteral_cascadeTarget();
+  }
+
+  @override
+  @failingTest
+  test_undefinedGetter_typeLiteral_conditionalAccess() async {
+    // Bad state: No reference information for A at 18
+    await super.test_undefinedGetter_typeLiteral_conditionalAccess();
+  }
+
+  @override
+  @failingTest
+  test_undefinedGetter_void() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_GETTER, found 0
+    await super.test_undefinedGetter_void();
+  }
+
+  @override
+  @failingTest
+  test_undefinedGetter_wrongNumberOfTypeArguments_tooLittle() async {
+    // AnalysisException: Element mismatch in /test.dart at main(A<dynamic, dynamic> a) → dynamic
+    await super.test_undefinedGetter_wrongNumberOfTypeArguments_tooLittle();
+  }
+
+  @override
+  @failingTest
+  test_undefinedGetter_wrongNumberOfTypeArguments_tooMany() async {
+    // AnalysisException: Element mismatch in /test.dart at main(A<dynamic> a) → dynamic
+    await super.test_undefinedGetter_wrongNumberOfTypeArguments_tooMany();
+  }
+
+  @override
+  @failingTest
+  test_undefinedGetter_wrongOfTypeArgument() async {
+    // Expected 1 errors of type StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, found 0
+    await super.test_undefinedGetter_wrongOfTypeArgument();
+  }
+
+  @override
+  @failingTest
+  test_undefinedMethod() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_METHOD, found 0
+    await super.test_undefinedMethod();
+  }
+
+  @override
+  @failingTest
+  test_undefinedMethod_assignmentExpression() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_METHOD, found 0
+    await super.test_undefinedMethod_assignmentExpression();
+  }
+
+  @override
+  @failingTest
+  test_undefinedMethod_generic_function_call() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_METHOD, found 0
+    await super.test_undefinedMethod_generic_function_call();
+  }
+
+  @override
+  @failingTest
+  test_undefinedMethod_ignoreTypePropagation() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_METHOD, found 0
+    await super.test_undefinedMethod_ignoreTypePropagation();
+  }
+
+  @override
+  @failingTest
+  test_undefinedMethod_leastUpperBoundWithNull() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_METHOD, found 0
+    await super.test_undefinedMethod_leastUpperBoundWithNull();
+  }
+
+  @override
+  @failingTest
+  test_undefinedMethod_object_call() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_METHOD, found 0
+    await super.test_undefinedMethod_object_call();
+  }
+
+  @override
+  @failingTest
+  test_undefinedMethod_ofNull() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_METHOD, found 0
+    await super.test_undefinedMethod_ofNull();
+  }
+
+  @override
+  @failingTest
+  test_undefinedMethod_private() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_METHOD, found 0
+    await super.test_undefinedMethod_private();
+  }
+
+  @override
+  @failingTest
+  test_undefinedMethod_proxy_annotation_fakeProxy() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_METHOD, found 0
+    await super.test_undefinedMethod_proxy_annotation_fakeProxy();
+  }
+
+  @override
+  @failingTest
+  test_undefinedMethod_typeLiteral_cascadeTarget() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_METHOD, found 0
+    await super.test_undefinedMethod_typeLiteral_cascadeTarget();
+  }
+
+  @override
+  @failingTest
+  test_undefinedMethod_typeLiteral_conditionalAccess() async {
+    // Bad state: No reference information for A at 18
+    await super.test_undefinedMethod_typeLiteral_conditionalAccess();
+  }
+
+  @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();
+  }
+
+  @override
+  @failingTest
+  test_undefinedOperator_indexGetter() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_OPERATOR, found 0
+    await super.test_undefinedOperator_indexGetter();
+  }
+
+  @override
+  @failingTest
+  test_undefinedOperator_indexSetter() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_OPERATOR, found 0
+    await super.test_undefinedOperator_indexSetter();
+  }
+
+  @override
+  @failingTest
+  test_undefinedOperator_plus() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_OPERATOR, found 0
+    await super.test_undefinedOperator_plus();
+  }
+
+  @override
+  @failingTest
+  test_undefinedOperator_postfixExpression() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_OPERATOR, found 0
+    await super.test_undefinedOperator_postfixExpression();
+  }
+
+  @override
+  @failingTest
+  test_undefinedOperator_prefixExpression() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_OPERATOR, found 0
+    await super.test_undefinedOperator_prefixExpression();
+  }
+
+  @override
+  @failingTest
+  test_undefinedSetter() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_SETTER, found 0
+    await super.test_undefinedSetter();
+  }
+
+  @override
+  @failingTest
+  test_undefinedSetter_static() async {
+    // Bad state: No reference information for A at 17
+    await super.test_undefinedSetter_static();
+  }
+
+  @override
+  @failingTest
+  test_undefinedSetter_typeLiteral_cascadeTarget() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_SETTER, found 0
+    await super.test_undefinedSetter_typeLiteral_cascadeTarget();
+  }
+
+  @override
+  @failingTest
+  test_undefinedSetter_void() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_SETTER, found 0
+    await super.test_undefinedSetter_void();
+  }
+
+  @override
+  @failingTest
+  test_undefinedSuperGetter() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_SUPER_GETTER, found 0
+    await super.test_undefinedSuperGetter();
+  }
+
+  @override
+  @failingTest
+  test_undefinedSuperMethod() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_SUPER_METHOD, found 0
+    await super.test_undefinedSuperMethod();
+  }
+
+  @override
+  @failingTest
+  test_undefinedSuperOperator_binaryExpression() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, found 0
+    await super.test_undefinedSuperOperator_binaryExpression();
+  }
+
+  @override
+  @failingTest
+  test_undefinedSuperOperator_indexBoth() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, found 0
+    await super.test_undefinedSuperOperator_indexBoth();
+  }
+
+  @override
+  @failingTest
+  test_undefinedSuperOperator_indexGetter() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, found 0
+    await super.test_undefinedSuperOperator_indexGetter();
+  }
+
+  @override
+  @failingTest
+  test_undefinedSuperOperator_indexSetter() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, found 0
+    await super.test_undefinedSuperOperator_indexSetter();
+  }
+
+  @override
+  @failingTest
+  test_undefinedSuperSetter() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_SUPER_SETTER, found 0
+    await super.test_undefinedSuperSetter();
+  }
+
+  @override
+  @failingTest
+  test_unqualifiedReferenceToNonLocalStaticMember_getter() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER, found 0
+    await super.test_unqualifiedReferenceToNonLocalStaticMember_getter();
+  }
+
+  @override
+  @failingTest
+  test_unqualifiedReferenceToNonLocalStaticMember_getter_invokeTarget() async {
+    // Bad state: No reference information for foo at 72
+    await super
+        .test_unqualifiedReferenceToNonLocalStaticMember_getter_invokeTarget();
+  }
+
+  @override
+  @failingTest
+  test_unqualifiedReferenceToNonLocalStaticMember_method() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER, found 0
+    await super.test_unqualifiedReferenceToNonLocalStaticMember_method();
+  }
+
+  @override
+  @failingTest
+  test_unqualifiedReferenceToNonLocalStaticMember_setter() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER, found 0
+    await super.test_unqualifiedReferenceToNonLocalStaticMember_setter();
+  }
+
+  @override
+  @failingTest
+  test_wrongNumberOfTypeArguments_classAlias() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_wrongNumberOfTypeArguments_classAlias();
+  }
+
+  @override
+  @failingTest
+  test_wrongNumberOfTypeArguments_tooFew() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_wrongNumberOfTypeArguments_tooFew();
+  }
+
+  @override
+  @failingTest
+  test_wrongNumberOfTypeArguments_tooMany() async {
+    // AnalysisException: Element mismatch in /test.dart at /test.dart
+    await super.test_wrongNumberOfTypeArguments_tooMany();
+  }
+
+  @override
+  @failingTest
+  test_wrongNumberOfTypeArguments_typeTest_tooFew() async {
+    // Bad state: Found 2 argument types for 1 type arguments
+    await super.test_wrongNumberOfTypeArguments_typeTest_tooFew();
+  }
+
+  @override
+  @failingTest
+  test_wrongNumberOfTypeArguments_typeTest_tooMany() async {
+    // Bad state: Found 1 argument types for 2 type arguments
+    await super.test_wrongNumberOfTypeArguments_typeTest_tooMany();
+  }
+
+  @override
+  @failingTest
+  test_yield_async_to_basic_type() async {
+    // Expected 1 errors of type StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, found 0;
+    //          1 errors of type StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE, found 0
+    await super.test_yield_async_to_basic_type();
+  }
+
+  @override
+  @failingTest
+  test_yield_async_to_iterable() async {
+    // Expected 1 errors of type StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, found 0;
+    //          1 errors of type StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE, found 0
+    await super.test_yield_async_to_iterable();
+  }
+
+  @override
+  @failingTest
+  test_yield_async_to_mistyped_stream() async {
+    // Expected 1 errors of type StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, found 0
+    await super.test_yield_async_to_mistyped_stream();
+  }
+
+  @override
+  @failingTest
+  test_yield_each_async_non_stream() async {
+    // Expected 1 errors of type StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, found 0
+    await super.test_yield_each_async_non_stream();
+  }
+
+  @override
+  @failingTest
+  test_yield_each_async_to_mistyped_stream() async {
+    // Expected 1 errors of type StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, found 0
+    await super.test_yield_each_async_to_mistyped_stream();
+  }
+
+  @override
+  @failingTest
+  test_yield_each_sync_non_iterable() async {
+    // Expected 1 errors of type StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, found 0
+    await super.test_yield_each_sync_non_iterable();
+  }
+
+  @override
+  @failingTest
+  test_yield_each_sync_to_mistyped_iterable() async {
+    // Expected 1 errors of type StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, found 0
+    await super.test_yield_each_sync_to_mistyped_iterable();
+  }
+
+  @override
+  @failingTest
+  test_yield_sync_to_basic_type() async {
+    // Expected 1 errors of type StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, found 0;
+    //          1 errors of type StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE, found 0
+    await super.test_yield_sync_to_basic_type();
+  }
+
+  @override
+  @failingTest
+  test_yield_sync_to_mistyped_iterable() async {
+    // Expected 1 errors of type StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, found 0
+    await super.test_yield_sync_to_mistyped_iterable();
+  }
+
+  @override
+  @failingTest
+  test_yield_sync_to_stream() async {
+    // Expected 1 errors of type StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, found 0;
+    //          1 errors of type StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE, found 0
+    await super.test_yield_sync_to_stream();
+  }
 }
 
 @reflectiveTest
@@ -30,4 +1332,14 @@
     extends StrongModeStaticTypeWarningCodeTest_Driver {
   @override
   bool get enableKernelDriver => true;
+
+  @override
+  bool get previewDart2 => true;
+
+  @override
+  @failingTest
+  test_genericMethodWrongNumberOfTypeArguments() async {
+    // Bad state: Found 0 argument types for 1 type arguments
+    await super.test_genericMethodWrongNumberOfTypeArguments();
+  }
 }
diff --git a/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart b/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
index 0875808..aa9081d 100644
--- a/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
@@ -376,71 +376,71 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_assignmentToFinal_localVariable() async {
-    return super.test_assignmentToFinal_localVariable();
+  test_assignmentToFinalLocal_localVariable() async {
+    return super.test_assignmentToFinalLocal_localVariable();
   }
 
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_assignmentToFinal_localVariable_plusEq() async {
-    return super.test_assignmentToFinal_localVariable_plusEq();
+  test_assignmentToFinalLocal_localVariable_plusEq() async {
+    return super.test_assignmentToFinalLocal_localVariable_plusEq();
   }
 
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_assignmentToFinal_parameter() async {
-    return super.test_assignmentToFinal_parameter();
+  test_assignmentToFinalLocal_parameter() async {
+    return super.test_assignmentToFinalLocal_parameter();
   }
 
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_assignmentToFinal_postfixMinusMinus() async {
-    return super.test_assignmentToFinal_postfixMinusMinus();
+  test_assignmentToFinalLocal_postfixMinusMinus() async {
+    return super.test_assignmentToFinalLocal_postfixMinusMinus();
   }
 
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_assignmentToFinal_postfixPlusPlus() async {
-    return super.test_assignmentToFinal_postfixPlusPlus();
+  test_assignmentToFinalLocal_postfixPlusPlus() async {
+    return super.test_assignmentToFinalLocal_postfixPlusPlus();
   }
 
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_assignmentToFinal_prefixMinusMinus() async {
-    return super.test_assignmentToFinal_prefixMinusMinus();
+  test_assignmentToFinalLocal_prefixMinusMinus() async {
+    return super.test_assignmentToFinalLocal_prefixMinusMinus();
   }
 
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_assignmentToFinal_prefixPlusPlus() async {
-    return super.test_assignmentToFinal_prefixPlusPlus();
+  test_assignmentToFinalLocal_prefixPlusPlus() async {
+    return super.test_assignmentToFinalLocal_prefixPlusPlus();
   }
 
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_assignmentToFinal_suffixMinusMinus() async {
-    return super.test_assignmentToFinal_suffixMinusMinus();
+  test_assignmentToFinalLocal_suffixMinusMinus() async {
+    return super.test_assignmentToFinalLocal_suffixMinusMinus();
   }
 
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_assignmentToFinal_suffixPlusPlus() async {
-    return super.test_assignmentToFinal_suffixPlusPlus();
+  test_assignmentToFinalLocal_suffixPlusPlus() async {
+    return super.test_assignmentToFinalLocal_suffixPlusPlus();
   }
 
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_assignmentToFinal_topLevelVariable() async {
-    return super.test_assignmentToFinal_topLevelVariable();
+  test_assignmentToFinalLocal_topLevelVariable() async {
+    return super.test_assignmentToFinalLocal_topLevelVariable();
   }
 
   @override
@@ -1740,27 +1740,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_typeAnnotationGenericFunctionParameter_localFunction() async {
-    return super.test_typeAnnotationGenericFunctionParameter_localFunction();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_typeAnnotationGenericFunctionParameter_method() async {
-    return super.test_typeAnnotationGenericFunctionParameter_method();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_typeAnnotationGenericFunctionParameter_topLevelFunction() async {
-    return super.test_typeAnnotationGenericFunctionParameter_topLevelFunction();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_typeParameterReferencedByStatic_field() async {
     return super.test_typeParameterReferencedByStatic_field();
   }
diff --git a/pkg/analyzer/test/generated/static_warning_code_test.dart b/pkg/analyzer/test/generated/static_warning_code_test.dart
index ae7719f..5454994 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -716,110 +716,110 @@
     verify([source]);
   }
 
-  test_assignmentToFinal_localVariable() async {
+  test_assignmentToFinalLocal_localVariable() async {
     Source source = addSource(r'''
 f() {
   final x = 0;
   x = 1;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL]);
     verify([source]);
   }
 
-  test_assignmentToFinal_localVariable_plusEq() async {
+  test_assignmentToFinalLocal_localVariable_plusEq() async {
     Source source = addSource(r'''
 f() {
   final x = 0;
   x += 1;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL]);
     verify([source]);
   }
 
-  test_assignmentToFinal_parameter() async {
+  test_assignmentToFinalLocal_parameter() async {
     Source source = addSource(r'''
 f(final x) {
   x = 1;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL]);
     verify([source]);
   }
 
-  test_assignmentToFinal_postfixMinusMinus() async {
+  test_assignmentToFinalLocal_postfixMinusMinus() async {
     Source source = addSource(r'''
 f() {
   final x = 0;
   x--;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL]);
     verify([source]);
   }
 
-  test_assignmentToFinal_postfixPlusPlus() async {
+  test_assignmentToFinalLocal_postfixPlusPlus() async {
     Source source = addSource(r'''
 f() {
   final x = 0;
   x++;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL]);
     verify([source]);
   }
 
-  test_assignmentToFinal_prefixMinusMinus() async {
+  test_assignmentToFinalLocal_prefixMinusMinus() async {
     Source source = addSource(r'''
 f() {
   final x = 0;
   --x;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL]);
     verify([source]);
   }
 
-  test_assignmentToFinal_prefixPlusPlus() async {
+  test_assignmentToFinalLocal_prefixPlusPlus() async {
     Source source = addSource(r'''
 f() {
   final x = 0;
   ++x;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL]);
     verify([source]);
   }
 
-  test_assignmentToFinal_suffixMinusMinus() async {
+  test_assignmentToFinalLocal_suffixMinusMinus() async {
     Source source = addSource(r'''
 f() {
   final x = 0;
   x--;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL]);
     verify([source]);
   }
 
-  test_assignmentToFinal_suffixPlusPlus() async {
+  test_assignmentToFinalLocal_suffixPlusPlus() async {
     Source source = addSource(r'''
 f() {
   final x = 0;
   x++;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL]);
     verify([source]);
   }
 
-  test_assignmentToFinal_topLevelVariable() async {
+  test_assignmentToFinalLocal_topLevelVariable() async {
     Source source = addSource(r'''
 final x = 0;
 f() { x = 1; }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL]);
     verify([source]);
   }
 
@@ -3389,45 +3389,6 @@
     ]);
   }
 
-  test_typeAnnotationGenericFunctionParameter_localFunction() async {
-    Source source = addSource(r'''
-class A {
-  void method() {
-    T local<T>(Object t) {
-      return (t is T) ? t : null;
-    }
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(
-        source, [StaticWarningCode.TYPE_ANNOTATION_GENERIC_FUNCTION_PARAMETER]);
-    verify([source]);
-  }
-
-  test_typeAnnotationGenericFunctionParameter_method() async {
-    Source source = addSource(r'''
-class A {
-  T method<T>(Object t) {
-    return (t is T) ? t : null;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(
-        source, [StaticWarningCode.TYPE_ANNOTATION_GENERIC_FUNCTION_PARAMETER]);
-    verify([source]);
-  }
-
-  test_typeAnnotationGenericFunctionParameter_topLevelFunction() async {
-    Source source = addSource(r'''
-T function<T>(Object t) {
-  return (t is T) ? t : null;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(
-        source, [StaticWarningCode.TYPE_ANNOTATION_GENERIC_FUNCTION_PARAMETER]);
-    verify([source]);
-  }
-
   test_typeParameterReferencedByStatic_field() async {
     Source source = addSource(r'''
 class A<K> {
diff --git a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
index a0a5a93..8112f42 100644
--- a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'strong_mode_test.dart';
@@ -30,6 +31,334 @@
 
   @override
   bool get enableNewAnalysisDriver => true;
+
+  @override
+  bool get previewDart2 => true;
+
+  @override
+  @failingTest
+  test_async_star_method_propagation() async {
+    // Bad state: No type information for Stream at 124
+    await super.test_async_star_method_propagation();
+  }
+
+  @override
+  @failingTest
+  test_async_star_propagation() async {
+    // Bad state: No type information for Stream at 105
+    await super.test_async_star_propagation();
+  }
+
+  @override
+  @failingTest
+  test_constrainedByBounds2() async {
+    // Expected: InterfaceTypeImpl:<int>
+    await super.test_constrainedByBounds2();
+  }
+
+  @override
+  @failingTest
+  test_constrainedByBounds3() async {
+    // Expected: InterfaceTypeImpl:<int>
+    await super.test_constrainedByBounds3();
+  }
+
+  @override
+  @failingTest
+  test_constrainedByBounds4() async {
+    // Bad state: Expected a type for 4 at 119; got one for kernel offset 118
+    await 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();
+  }
+
+  @override
+  @failingTest
+  test_covarianceChecks() async {
+    // NoSuchMethodError: The method 'toList' was called on null.
+    await super.test_covarianceChecks();
+  }
+
+  @override
+  @failingTest
+  test_covarianceChecks_genericMethods() async {
+    // NoSuchMethodError: The method 'toList' was called on null.
+    await super.test_covarianceChecks_genericMethods();
+  }
+
+  @override
+  @failingTest
+  test_covarianceChecks_returnFunction() async {
+    // AnalysisException: Element mismatch in /test.dart at class C<T>
+    await super.test_covarianceChecks_returnFunction();
+  }
+
+  @override
+  @failingTest
+  test_covarianceChecks_superclass() async {
+    // NoSuchMethodError: The method 'toList' was called on null.
+    await super.test_covarianceChecks_superclass();
+  }
+
+  @override
+  @failingTest
+  test_functionLiteral_assignment_typedArguments() async {
+    // Expected: InterfaceTypeImpl:<String>
+    await super.test_functionLiteral_assignment_typedArguments();
+  }
+
+  @override
+  @failingTest
+  test_functionLiteral_assignment_unTypedArguments() async {
+    // Expected: InterfaceTypeImpl:<String>
+    await super.test_functionLiteral_assignment_unTypedArguments();
+  }
+
+  @override
+  @failingTest
+  test_functionLiteral_functionExpressionInvocation_typedArguments() async {
+    // Bad state: Expected a type for null at 154; got one for kernel offset 142
+    await super
+        .test_functionLiteral_functionExpressionInvocation_typedArguments();
+  }
+
+  @override
+  @failingTest
+  test_functionLiteral_functionExpressionInvocation_unTypedArguments() async {
+    // Bad state: Expected a type for null at 150; got one for kernel offset 142
+    await super
+        .test_functionLiteral_functionExpressionInvocation_unTypedArguments();
+  }
+
+  @override
+  @failingTest
+  test_functionLiteral_functionInvocation_typedArguments() async {
+    // Expected: InterfaceTypeImpl:<String>
+    await super.test_functionLiteral_functionInvocation_typedArguments();
+  }
+
+  @override
+  @failingTest
+  test_functionLiteral_functionInvocation_unTypedArguments() async {
+    // Expected: InterfaceTypeImpl:<String>
+    await super.test_functionLiteral_functionInvocation_unTypedArguments();
+  }
+
+  @override
+  @failingTest
+  test_functionLiteral_methodInvocation_typedArguments() async {
+    // Expected: InterfaceTypeImpl:<String>
+    await super.test_functionLiteral_methodInvocation_typedArguments();
+  }
+
+  @override
+  @failingTest
+  test_functionLiteral_methodInvocation_unTypedArguments() async {
+    // Expected: InterfaceTypeImpl:<String>
+    await super.test_functionLiteral_methodInvocation_unTypedArguments();
+  }
+
+  @override
+  @failingTest
+  test_futureOr_downwards8() async {
+    // type 'BottomTypeImpl' is not a subtype of type 'InterfaceType' in type cast where
+    await super.test_futureOr_downwards8();
+  }
+
+  @override
+  @failingTest
+  test_futureOr_methods2() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_METHOD, found 0
+    await super.test_futureOr_methods2();
+  }
+
+  @override
+  @failingTest
+  test_futureOr_methods3() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_METHOD, found 0
+    await super.test_futureOr_methods3();
+  }
+
+  @override
+  @failingTest
+  test_futureOr_methods4() async {
+    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_METHOD, found 0
+    await super.test_futureOr_methods4();
+  }
+
+  @override
+  @failingTest
+  test_futureOr_no_return() async {
+    // Expected: InterfaceTypeImpl:<Null>
+    await super.test_futureOr_no_return();
+  }
+
+  @override
+  @failingTest
+  test_futureOr_no_return_value() async {
+    // Expected: InterfaceTypeImpl:<Null>
+    await super.test_futureOr_no_return_value();
+  }
+
+  @override
+  @failingTest
+  test_futureOr_return_null() async {
+    // Expected: InterfaceTypeImpl:<Null>
+    await super.test_futureOr_return_null();
+  }
+
+  @override
+  @failingTest
+  test_futureOr_upwards2() async {
+    // Expected 1 errors of type StrongModeCode.STRONG_MODE_COULD_NOT_INFER, found 0
+    await super.test_futureOr_upwards2();
+  }
+
+  @override
+  @failingTest
+  test_futureOrNull_no_return() async {
+    // Bad state: Found 2 argument types for 1 type arguments
+    await super.test_futureOrNull_no_return();
+  }
+
+  @override
+  @failingTest
+  test_futureOrNull_no_return_value() async {
+    // Bad state: Found 2 argument types for 1 type arguments
+    await super.test_futureOrNull_no_return_value();
+  }
+
+  @override
+  @failingTest
+  test_futureOrNull_return_null() async {
+    // Bad state: Found 2 argument types for 1 type arguments
+    await super.test_futureOrNull_return_null();
+  }
+
+  @override
+  @failingTest
+  test_generic_partial() async {
+    // AnalysisException: Element mismatch in /test.dart at class A<T>
+    await super.test_generic_partial();
+  }
+
+  @override
+  @failingTest
+  test_inference_error_arguments() async {
+    // Expected 1 errors of type StrongModeCode.STRONG_MODE_COULD_NOT_INFER, found 0;
+    //          1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
+    await super.test_inference_error_arguments();
+  }
+
+  @override
+  @failingTest
+  test_inference_error_arguments2() async {
+    // Expected 1 errors of type StrongModeCode.STRONG_MODE_COULD_NOT_INFER, found 0;
+    //          2 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
+    await super.test_inference_error_arguments2();
+  }
+
+  @override
+  @failingTest
+  test_inference_error_extendsFromReturn() async {
+    // Expected 2 errors of type StrongModeCode.STRONG_MODE_INVALID_CAST_LITERAL, found 0
+    await super.test_inference_error_extendsFromReturn();
+  }
+
+  @override
+  @failingTest
+  test_inference_error_extendsFromReturn2() async {
+    // Expected 1 errors of type StrongModeCode.STRONG_MODE_COULD_NOT_INFER, found 0
+    await super.test_inference_error_extendsFromReturn2();
+  }
+
+  @override
+  @failingTest
+  test_inference_error_genericFunction() async {
+    // Expected 1 errors of type StrongModeCode.STRONG_MODE_COULD_NOT_INFER, found 0;
+    //          1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
+    await super.test_inference_error_genericFunction();
+  }
+
+  @override
+  @failingTest
+  test_inference_error_returnContext() async {
+    // Expected 1 errors of type StrongModeCode.STRONG_MODE_COULD_NOT_INFER, found 0
+    await super.test_inference_error_returnContext();
+  }
+
+  @override
+  @failingTest
+  test_inference_simplePolymorphicRecursion_function() async {
+    // Expected: 'T'
+    await super.test_inference_simplePolymorphicRecursion_function();
+  }
+
+  @override
+  @failingTest
+  test_inference_simplePolymorphicRecursion_interface() async {
+    // Expected: 'T'
+    await super.test_inference_simplePolymorphicRecursion_interface();
+  }
+
+  @override
+  @failingTest
+  test_inference_simplePolymorphicRecursion_simple() async {
+    // RangeError (index): Invalid value: Valid value range is empty: 0
+    await super.test_inference_simplePolymorphicRecursion_simple();
+  }
+
+  @override
+  @failingTest
+  test_inferGenericInstantiation2() async {
+    // Expected 1 errors of type StrongModeCode.STRONG_MODE_COULD_NOT_INFER, found 0;
+    //          1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
+    await super.test_inferGenericInstantiation2();
+  }
+
+  @override
+  @failingTest
+  test_inferredFieldDeclaration_propagation() async {
+    // Expected: InterfaceTypeImpl:<int>
+    await super.test_inferredFieldDeclaration_propagation();
+  }
+
+  @override
+  @failingTest
+  test_instanceCreation() async {
+    // AnalysisException: Element mismatch in /test.dart at class A<S, T>
+    await super.test_instanceCreation();
+    // TODO(brianwilkerson) This test fails as expected when run as part of a
+    // larger group of tests, but does not fail when run individually (such as
+    // on the bots).
+    fail('Flaky test');
+  }
+
+  @override
+  @failingTest
+  test_pinning_multipleConstraints1() async {
+    // Expected 1 errors of type StrongModeCode.STRONG_MODE_INVALID_CAST_LITERAL, found 0
+    await super.test_pinning_multipleConstraints1();
+  }
+
+  @override
+  @failingTest
+  test_pinning_multipleConstraints3() async {
+    // Expected 1 errors of type StrongModeCode.STRONG_MODE_INVALID_CAST_LITERAL, found 0
+    await super.test_pinning_multipleConstraints3();
+  }
+
+  @override
+  @failingTest
+  test_redirectingConstructor_propagation() async {
+    // AnalysisException: Element mismatch in /test.dart at class A
+    await super.test_redirectingConstructor_propagation();
+  }
 }
 
 @reflectiveTest
@@ -42,6 +371,127 @@
   bool get enableNewAnalysisDriver => true;
 
   @override
+  bool get previewDart2 => true;
+
+  @override
+  test_futureOr_promotion3() async {
+    // Test passes even though the overridden method fails.
+    await super.test_futureOr_promotion3();
+  }
+
+  @override
+  @failingTest
+  test_genericFunction_parameter() async {
+    // Failed to resolve 1 nodes:
+    await super.test_genericFunction_parameter();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_explicitTypeParams() async {
+    // Bad state: Found 2 argument types for 1 type arguments
+    await super.test_genericMethod_explicitTypeParams();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_functionExpressionInvocation_explicit() async {
+    // Bad state: Expected element declaration for analyzer offset 230; got one for kernel offset 233
+    await super.test_genericMethod_functionExpressionInvocation_explicit();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_functionExpressionInvocation_inferred() async {
+    // Bad state: Expected element declaration for analyzer offset 230; got one for kernel offset 233
+    await super.test_genericMethod_functionExpressionInvocation_inferred();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_functionInvocation_explicit() async {
+    // Failed to resolve 1 nodes:
+    await super.test_genericMethod_functionInvocation_explicit();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_functionInvocation_inferred() async {
+    // Failed to resolve 1 nodes:
+    await super.test_genericMethod_functionInvocation_inferred();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_implicitDynamic() async {
+    // Expected: '<T>((dynamic) → T) → T'
+    await super.test_genericMethod_implicitDynamic();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_max_doubleDouble_prefixed() async {
+    // Bad state: Expected element reference for analyzer offset 49; got one for kernel offset 54
+    await super.test_genericMethod_max_doubleDouble_prefixed();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_nestedCapture() async {
+    // Bad state: Found 2 argument types for 1 type arguments
+    await super.test_genericMethod_nestedCapture();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_override_invalidReturnType() async {
+    // Expected 1 errors of type StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
+    await super.test_genericMethod_override_invalidReturnType();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_override_invalidTypeParamBounds() async {
+    // Expected 1 errors of type StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
+    await super.test_genericMethod_override_invalidTypeParamBounds();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_override_invalidTypeParamCount() async {
+    // Expected 1 errors of type StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
+    await super.test_genericMethod_override_invalidTypeParamCount();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_partiallyAppliedErrorWithBound() async {
+    // Bad state: Found 0 argument types for 1 type arguments
+    await super.test_genericMethod_partiallyAppliedErrorWithBound();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_tearoff() async {
+    // Failed to resolve 1 nodes:
+    await super.test_genericMethod_tearoff();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_then_prefixed() async {
+    // Expected 0 errors of type HintCode.UNUSED_IMPORT, found 1 (7)
+    await super.test_genericMethod_then_prefixed();
+  }
+
+  @override
+  @failingTest
+  test_implicitBounds() async {
+    // Expected: 'B<num>'
+    await super.test_implicitBounds();
+  }
+
+  @override
   @failingTest
   @potentialAnalyzerProblem
   test_instantiateToBounds_class_error_recursion() async {
@@ -103,6 +553,76 @@
   test_instantiateToBounds_class_ok_referenceOther_multi() async {
     return super.test_instantiateToBounds_class_ok_referenceOther_multi();
   }
+
+  @override
+  @failingTest
+  test_instantiateToBounds_class_ok_simpleBounds() async {
+    // Expected: 'B<num>'
+    await super.test_instantiateToBounds_class_ok_simpleBounds();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_direct_class_class() async {
+    // Expected 1 errors of type StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    await super.test_notInstantiatedBound_direct_class_class();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_direct_class_typedef() async {
+    // Expected 1 errors of type StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    await super.test_notInstantiatedBound_direct_class_typedef();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_direct_typedef_class() async {
+    // Expected 1 errors of type StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    await super.test_notInstantiatedBound_direct_typedef_class();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_functionType() async {
+    // Expected 2 errors of type StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    await super.test_notInstantiatedBound_functionType();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_indirect_class_class() async {
+    // Expected 1 errors of type StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    await super.test_notInstantiatedBound_indirect_class_class();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_indirect_class_class2() async {
+    // Expected 2 errors of type StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    await super.test_notInstantiatedBound_indirect_class_class2();
+  }
+
+  @override
+  @failingTest
+  test_setterWithDynamicTypeIsError() async {
+    // Expected 2 errors of type StaticWarningCode.NON_VOID_RETURN_FOR_SETTER, found 0
+    await super.test_setterWithDynamicTypeIsError();
+  }
+
+  @override
+  @failingTest
+  test_setterWithNoVoidType() async {
+    // Expected 1 errors of type StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, found 0
+    await super.test_setterWithNoVoidType();
+  }
+
+  @override
+  @failingTest
+  test_setterWithOtherTypeIsError() async {
+    // Expected 2 errors of type StaticWarningCode.NON_VOID_RETURN_FOR_SETTER, found 0
+    await super.test_setterWithOtherTypeIsError();
+  }
 }
 
 @reflectiveTest
@@ -113,4 +633,7 @@
 
   @override
   bool get enableNewAnalysisDriver => true;
+
+  @override
+  bool get previewDart2 => true;
 }
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index 80f5c2b..d508efa 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -2747,50 +2747,6 @@
     expect(invocation.staticInvokeType.toString(), type);
   }
 
-  fail_futureOr_promotion4() async {
-    // Test that promotion from FutureOr<T> to T works for type
-    // parameters T
-    // TODO(leafp): When the restriction on is checks for generic methods
-    // goes away this should pass.
-    String code = r'''
-    import "dart:async";
-    dynamic test<T extends num>(FutureOr<T> x) => (x is T) &&
-                                                  (x.abs() == 0);
-   ''';
-    await resolveTestUnit(code);
-  }
-
-  fail_genericMethod_tearoff_instantiated() async {
-    await resolveTestUnit(r'''
-class C<E> {
-  T f<T>(E e) => null;
-  static T g<T>(T e) => null;
-  static final h = g;
-}
-
-T topF<T>(T e) => null;
-var topG = topF;
-void test<S>(T pf<T>(T e)) {
-  var c = new C<int>();
-  T lf<T>(T e) => null;
-  var methodTearOffInst = c.f<int>;
-  var staticTearOffInst = C.g<int>;
-  var staticFieldTearOffInst = C.h<int>;
-  var topFunTearOffInst = topF<int>;
-  var topFieldTearOffInst = topG<int>;
-  var localTearOffInst = lf<int>;
-  var paramTearOffInst = pf<int>;
-}
-''');
-    expectIdentifierType('methodTearOffInst', "(int) → int");
-    expectIdentifierType('staticTearOffInst', "(int) → int");
-    expectIdentifierType('staticFieldTearOffInst', "(int) → int");
-    expectIdentifierType('topFunTearOffInst', "(int) → int");
-    expectIdentifierType('topFieldTearOffInst', "(int) → int");
-    expectIdentifierType('localTearOffInst', "(int) → int");
-    expectIdentifierType('paramTearOffInst', "(int) → int");
-  }
-
   void setUp() {
     super.setUp();
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
@@ -2840,6 +2796,17 @@
     await resolveTestUnit(code);
   }
 
+  test_futureOr_promotion3() async {
+    // Test that promotion from FutureOr<T> to T works for type
+    // parameters T
+    String code = r'''
+    import "dart:async";
+    dynamic test<T extends num>(FutureOr<T> x) => (x is T) &&
+                                                  (x.abs() == 0);
+   ''';
+    await resolveTestUnit(code);
+  }
+
   test_futureOr_promotion4() async {
     // Test that promotion from FutureOr<T> to Future<T> works for type
     // parameters T
@@ -3387,6 +3354,22 @@
     verify([source]);
   }
 
+  test_genericMethod_partiallyAppliedErrorWithBound() async {
+    await resolveTestUnit(r'''
+void f<X extends List, Y>() => null;
+
+void test() {
+  f<int>();
+}
+''', noErrors: false);
+    assertErrors(testSource, [
+      // Make sure to catch both the missing parameter:
+      StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
+      // And the incorrect parameter:
+      StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
+    ]);
+  }
+
   test_genericMethod_propagatedType_promotion() async {
     // Regression test for:
     // https://github.com/dart-lang/sdk/issues/25340
@@ -3441,20 +3424,36 @@
     expectIdentifierType('paramTearOff', "<T>(T) → T");
   }
 
-  test_genericMethod_partiallyAppliedErrorWithBound() async {
+  @failingTest
+  test_genericMethod_tearoff_instantiated() async {
     await resolveTestUnit(r'''
-void f<X extends List, Y>() => null;
-
-void test() {
-  f<int>();
+class C<E> {
+  T f<T>(E e) => null;
+  static T g<T>(T e) => null;
+  static final h = g;
 }
-''', noErrors: false);
-    assertErrors(testSource, [
-      // Make sure to catch both the missing parameter:
-      StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
-      // And the incorrect parameter:
-      StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-    ]);
+
+T topF<T>(T e) => null;
+var topG = topF;
+void test<S>(T pf<T>(T e)) {
+  var c = new C<int>();
+  T lf<T>(T e) => null;
+  var methodTearOffInst = c.f<int>;
+  var staticTearOffInst = C.g<int>;
+  var staticFieldTearOffInst = C.h<int>;
+  var topFunTearOffInst = topF<int>;
+  var topFieldTearOffInst = topG<int>;
+  var localTearOffInst = lf<int>;
+  var paramTearOffInst = pf<int>;
+}
+''');
+    expectIdentifierType('methodTearOffInst', "(int) → int");
+    expectIdentifierType('staticTearOffInst', "(int) → int");
+    expectIdentifierType('staticFieldTearOffInst', "(int) → int");
+    expectIdentifierType('topFunTearOffInst', "(int) → int");
+    expectIdentifierType('topFieldTearOffInst', "(int) → int");
+    expectIdentifierType('localTearOffInst', "(int) → int");
+    expectIdentifierType('paramTearOffInst', "(int) → int");
   }
 
   test_genericMethod_then() async {
diff --git a/pkg/analyzer/test/src/context/mock_sdk.dart b/pkg/analyzer/test/src/context/mock_sdk.dart
index 9599777..f95bd63 100644
--- a/pkg/analyzer/test/src/context/mock_sdk.dart
+++ b/pkg/analyzer/test/src/context/mock_sdk.dart
@@ -81,6 +81,8 @@
   factory Stream.fromIterable(Iterable<T> data) => null;
 }
 
+abstract class StreamIterator<T> {}
+
 abstract class StreamSubscription<T> {
   Future cancel();
   void onData(void handleData(T data));
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 17ccb8b..7dd81a7 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
@@ -23,9 +23,9 @@
   @override
   bool get previewDart2 => true;
 
+  @override
   @failingTest
   @potentialAnalyzerProblem
-  @override
   test_annotation_constructor_withNestedConstructorInvocation() async {
     // This test is failing because analyzer and kernel disagree about how to
     // resolve annotations and constructors. Kernel is consistent between
@@ -34,6 +34,13 @@
     // resolution of the constructor name's element.
     await super.test_annotation_constructor_withNestedConstructorInvocation();
   }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31605')
+  test_constructor_redirected_generic() async {
+    await super.test_constructor_redirected_generic();
+  }
 }
 
 @reflectiveTest
@@ -81,13 +88,6 @@
   @failingTest
   @potentialAnalyzerProblem
   @override
-  test_const_circular_reference() async {
-    await super.test_const_circular_reference();
-  }
-
-  @failingTest
-  @potentialAnalyzerProblem
-  @override
   test_const_externalConstFactory() async {
     await super.test_const_externalConstFactory();
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index c2c3313..ac4e176 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -102,7 +102,7 @@
 @myAnnotation
 class C {
   @myAnnotation
-  int field = 2;
+  int field1 = 2, field2 = 3;
 
   @myAnnotation
   C() {}
@@ -112,7 +112,7 @@
 }
 
 @myAnnotation
-int topLevelVariable = 3;
+int topLevelVariable1 = 4, topLevelVariable2 = 5;
 
 @myAnnotation
 void topLevelFunction() {}
@@ -1122,49 +1122,104 @@
   items.forEach((item) {
     item;
   });
+  items.forEach((item) {
+    item;
+  });
 }
 ''');
     AnalysisResult result = await driver.getResult(testFile);
     var typeProvider = result.unit.element.context.typeProvider;
 
-    List<Statement> mainStatements = _getMainStatements(result);
+    FunctionDeclaration mainDeclaration = result.unit.declarations[0];
+    FunctionElement mainElement = mainDeclaration.element;
+    BlockFunctionBody mainBody = mainDeclaration.functionExpression.body;
+    List<Statement> mainStatements = mainBody.block.statements;
 
     VariableDeclarationStatement itemsStatement = mainStatements[0];
     var itemsElement = itemsStatement.variables.variables[0].element;
 
-    ExpressionStatement forStatement = mainStatements[1];
-    MethodInvocation forInvocation = forStatement.expression;
+    // First closure.
+    ParameterElement itemElement1;
+    {
+      ExpressionStatement forStatement = mainStatements[1];
+      MethodInvocation forInvocation = forStatement.expression;
 
-    SimpleIdentifier forTarget = forInvocation.target;
-    expect(forTarget.staticElement, itemsElement);
+      SimpleIdentifier forTarget = forInvocation.target;
+      expect(forTarget.staticElement, itemsElement);
 
-    var closureTypeStr = '(int) → Null';
-    FunctionExpression closure = forInvocation.argumentList.arguments[0];
-    FunctionElement closureElement = closure.element;
-    ParameterElement itemElement = closureElement.parameters[0];
+      var closureTypeStr = '(int) → Null';
+      FunctionExpression closure = forInvocation.argumentList.arguments[0];
 
-    expect(closureElement.returnType, typeProvider.nullType);
-    expect(closureElement.type.element, same(closureElement));
-    expect(closureElement.type.toString(), closureTypeStr);
-    expect(closure.staticType, same(closureElement.type));
+      FunctionElementImpl closureElement = closure.element;
+      expect(closureElement.enclosingElement, same(mainElement));
 
-    List<FormalParameter> closureParameters = closure.parameters.parameters;
-    expect(closureParameters, hasLength(1));
+      ParameterElement itemElement = closureElement.parameters[0];
+      itemElement1 = itemElement;
 
-    SimpleFormalParameter itemNode = closureParameters[0];
-    _assertSimpleParameter(itemNode, itemElement,
-        name: 'item',
-        offset: 56,
-        kind: ParameterKind.REQUIRED,
-        type: typeProvider.intType);
+      expect(closureElement.returnType, typeProvider.nullType);
+      expect(closureElement.type.element, same(closureElement));
+      expect(closureElement.type.toString(), closureTypeStr);
+      expect(closure.staticType, same(closureElement.type));
 
-    BlockFunctionBody closureBody = closure.body;
-    List<Statement> closureStatements = closureBody.block.statements;
+      List<FormalParameter> closureParameters = closure.parameters.parameters;
+      expect(closureParameters, hasLength(1));
 
-    ExpressionStatement itemStatement = closureStatements[0];
-    SimpleIdentifier itemIdentifier = itemStatement.expression;
-    expect(itemIdentifier.staticElement, itemElement);
-    expect(itemIdentifier.staticType, typeProvider.intType);
+      SimpleFormalParameter itemNode = closureParameters[0];
+      _assertSimpleParameter(itemNode, itemElement,
+          name: 'item',
+          offset: 56,
+          kind: ParameterKind.REQUIRED,
+          type: typeProvider.intType);
+
+      BlockFunctionBody closureBody = closure.body;
+      List<Statement> closureStatements = closureBody.block.statements;
+
+      ExpressionStatement itemStatement = closureStatements[0];
+      SimpleIdentifier itemIdentifier = itemStatement.expression;
+      expect(itemIdentifier.staticElement, itemElement);
+      expect(itemIdentifier.staticType, typeProvider.intType);
+    }
+
+    // Second closure, same names, different elements.
+    {
+      ExpressionStatement forStatement = mainStatements[2];
+      MethodInvocation forInvocation = forStatement.expression;
+
+      SimpleIdentifier forTarget = forInvocation.target;
+      expect(forTarget.staticElement, itemsElement);
+
+      var closureTypeStr = '(int) → Null';
+      FunctionExpression closure = forInvocation.argumentList.arguments[0];
+
+      FunctionElementImpl closureElement = closure.element;
+      expect(closureElement.enclosingElement, same(mainElement));
+
+      ParameterElement itemElement = closureElement.parameters[0];
+      expect(itemElement, isNot(same(itemElement1)));
+
+      expect(closureElement.returnType, typeProvider.nullType);
+      expect(closureElement.type.element, same(closureElement));
+      expect(closureElement.type.toString(), closureTypeStr);
+      expect(closure.staticType, same(closureElement.type));
+
+      List<FormalParameter> closureParameters = closure.parameters.parameters;
+      expect(closureParameters, hasLength(1));
+
+      SimpleFormalParameter itemNode = closureParameters[0];
+      _assertSimpleParameter(itemNode, itemElement,
+          name: 'item',
+          offset: 97,
+          kind: ParameterKind.REQUIRED,
+          type: typeProvider.intType);
+
+      BlockFunctionBody closureBody = closure.body;
+      List<Statement> closureStatements = closureBody.block.statements;
+
+      ExpressionStatement itemStatement = closureStatements[0];
+      SimpleIdentifier itemIdentifier = itemStatement.expression;
+      expect(itemIdentifier.staticElement, itemElement);
+      expect(itemIdentifier.staticType, typeProvider.intType);
+    }
   }
 
   test_conditionalExpression() async {
@@ -1276,6 +1331,195 @@
     }
   }
 
+  test_constructor_initializer_this() async {
+    addTestFile(r'''
+class C {
+  C(int a, [int b]);
+  C.named(int a, {int b});
+  C.one(int p) : this(1, 2);
+  C.two(int p) : this.named(3, b: 4);
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+
+    ClassDeclaration cNode = result.unit.declarations[0];
+    ClassElement cElement = cNode.element;
+
+    {
+      var unnamedConstructor = cElement.constructors[0];
+
+      ConstructorDeclaration constructor = cNode.members[2];
+      RedirectingConstructorInvocation initializer =
+          constructor.initializers[0];
+      expect(initializer.staticElement, same(unnamedConstructor));
+      expect(initializer.constructorName, isNull);
+
+      List<Expression> arguments = initializer.argumentList.arguments;
+
+      Expression aArgument = arguments[0];
+      ParameterElement aElement = unnamedConstructor.parameters[0];
+      expect(aArgument.staticParameterElement, same(aElement));
+
+      Expression bArgument = arguments[1];
+      ParameterElement bElement = unnamedConstructor.parameters[1];
+      expect(bArgument.staticParameterElement, same(bElement));
+    }
+
+    {
+      var namedConstructor = cElement.constructors[1];
+
+      ConstructorDeclaration constructor = cNode.members[3];
+      RedirectingConstructorInvocation initializer =
+          constructor.initializers[0];
+      expect(initializer.staticElement, same(namedConstructor));
+
+      var constructorName = initializer.constructorName;
+      expect(constructorName.staticElement, same(namedConstructor));
+      expect(constructorName.staticType, isNull);
+
+      List<Expression> arguments = initializer.argumentList.arguments;
+
+      Expression aArgument = arguments[0];
+      ParameterElement aElement = namedConstructor.parameters[0];
+      expect(aArgument.staticParameterElement, same(aElement));
+
+      NamedExpression bArgument = arguments[1];
+      ParameterElement bElement = namedConstructor.parameters[1];
+      expect(bArgument.name.label.staticElement, same(bElement));
+      expect(bArgument.staticParameterElement, same(bElement));
+    }
+  }
+
+  test_constructor_redirected() async {
+    addTestFile(r'''
+class A implements B {
+  A(int a);
+  A.named(double a);
+}
+class B {
+  factory B.one(int b) = A;
+  factory B.two(double b) = A.named;
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    expect(result.errors, isEmpty);
+
+    ClassDeclaration aNode = result.unit.declarations[0];
+    ClassElement aElement = aNode.element;
+
+    ClassDeclaration bNode = result.unit.declarations[1];
+
+    {
+      ConstructorElement aUnnamed = aElement.constructors[0];
+
+      ConstructorDeclaration constructor = bNode.members[0];
+      ConstructorElement element = constructor.element;
+      expect(element.redirectedConstructor, same(aUnnamed));
+
+      var constructorName = constructor.redirectedConstructor;
+      expect(constructorName.staticElement, same(aUnnamed));
+
+      TypeName typeName = constructorName.type;
+      expect(typeName.type, aElement.type);
+
+      SimpleIdentifier identifier = typeName.name;
+      expect(identifier.staticElement, same(aElement));
+      expect(identifier.staticType, aElement.type);
+
+      expect(constructorName.name, isNull);
+    }
+
+    {
+      ConstructorElement aNamed = aElement.constructors[1];
+
+      ConstructorDeclaration constructor = bNode.members[1];
+      ConstructorElement element = constructor.element;
+      expect(element.redirectedConstructor, same(aNamed));
+
+      var constructorName = constructor.redirectedConstructor;
+      expect(constructorName.staticElement, same(aNamed));
+
+      TypeName typeName = constructorName.type;
+      expect(typeName.type, aElement.type);
+
+      SimpleIdentifier identifier = typeName.name;
+      expect(identifier.staticElement, same(aElement));
+      expect(identifier.staticType, aElement.type);
+
+      expect(constructorName.name.staticElement, aNamed);
+      expect(constructorName.name.staticType, isNull);
+    }
+  }
+
+  test_constructor_redirected_generic() async {
+    addTestFile(r'''
+class A<T> implements B<T> {
+  A(int a);
+  A.named(double a);
+}
+class B<U> {
+  factory B.one(int b) = A<U>;
+  factory B.two(double b) = A<U>.named;
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    expect(result.errors, isEmpty);
+
+    ClassDeclaration aNode = result.unit.declarations[0];
+    ClassElement aElement = aNode.element;
+
+    ClassDeclaration bNode = result.unit.declarations[1];
+    TypeParameterType uType = bNode.element.typeParameters[0].type;
+    InterfaceType auType = aElement.type.instantiate([uType]);
+
+    {
+      ConstructorElement expectedElement = aElement.constructors[0];
+
+      ConstructorDeclaration constructor = bNode.members[0];
+      ConstructorElement element = constructor.element;
+
+      ConstructorMember actualMember = element.redirectedConstructor;
+      expect(actualMember.baseElement, same(expectedElement));
+      expect(actualMember.definingType, auType);
+
+      var constructorName = constructor.redirectedConstructor;
+      expect(constructorName.staticElement, same(actualMember));
+
+      TypeName typeName = constructorName.type;
+      expect(typeName.type, auType);
+
+      SimpleIdentifier identifier = typeName.name;
+      expect(identifier.staticElement, same(aElement));
+      expect(identifier.staticType, auType);
+
+      expect(constructorName.name, isNull);
+    }
+
+    {
+      ConstructorElement expectedElement = aElement.constructors[1];
+
+      ConstructorDeclaration constructor = bNode.members[1];
+      ConstructorElement element = constructor.element;
+
+      ConstructorMember actualMember = element.redirectedConstructor;
+      expect(actualMember.baseElement, same(expectedElement));
+      expect(actualMember.definingType, auType);
+
+      var constructorName = constructor.redirectedConstructor;
+      expect(constructorName.staticElement, same(actualMember));
+
+      TypeName typeName = constructorName.type;
+      expect(typeName.type, auType);
+
+      SimpleIdentifier identifier = typeName.name;
+      expect(identifier.staticElement, same(aElement));
+      expect(identifier.staticType, auType);
+
+      expect(constructorName.name.staticElement, same(actualMember));
+      expect(constructorName.name.staticType, isNull);
+    }
+  }
+
   test_error_unresolvedTypeAnnotation() async {
     String content = r'''
 main() {
@@ -1321,6 +1565,147 @@
     expect(fElement.type, typeProvider.listType.instantiate([tElement.type]));
   }
 
+  test_formalParameter_functionTyped() async {
+    addTestFile(r'''
+class A {
+  A(String p(int a));
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    var typeProvider = result.unit.element.context.typeProvider;
+
+    ClassDeclaration clazz = result.unit.declarations[0];
+    ConstructorDeclaration constructor = clazz.members[0];
+    List<FormalParameter> parameters = constructor.parameters.parameters;
+
+    FunctionTypedFormalParameter p = parameters[0];
+    expect(p.element, same(constructor.element.parameters[0]));
+
+    {
+      FunctionType type = p.identifier.staticType;
+      expect(type.returnType, typeProvider.stringType);
+
+      expect(type.parameters, hasLength(1));
+      expect(type.parameters[0].type, typeProvider.intType);
+    }
+
+    _assertTypeNameSimple(p.returnType, typeProvider.stringType);
+
+    {
+      SimpleFormalParameter a = p.parameters.parameters[0];
+      _assertTypeNameSimple(a.type, typeProvider.intType);
+      expect(a.identifier.staticType, typeProvider.intType);
+    }
+  }
+
+  test_formalParameter_functionTyped_fieldFormal_typed() async {
+    // TODO(scheglov) Add "untyped" version with precise type in field.
+    addTestFile(r'''
+class A {
+  Function f;
+  A(String this.f(int a));
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    var typeProvider = result.unit.element.context.typeProvider;
+
+    ClassDeclaration clazz = result.unit.declarations[0];
+
+    FieldDeclaration fDeclaration = clazz.members[0];
+    VariableDeclaration fNode = fDeclaration.fields.variables[0];
+    FieldElement fElement = fNode.element;
+
+    ConstructorDeclaration constructor = clazz.members[1];
+
+    FieldFormalParameterElement pElement = constructor.element.parameters[0];
+    expect(pElement.field, same(fElement));
+
+    List<FormalParameter> parameters = constructor.parameters.parameters;
+    FieldFormalParameter p = parameters[0];
+    expect(p.element, same(pElement));
+
+    expect(p.identifier.staticElement, same(pElement));
+    expect(p.identifier.staticType.toString(), '(int) → String');
+
+    {
+      FunctionType type = p.identifier.staticType;
+      expect(type.returnType, typeProvider.stringType);
+
+      expect(type.parameters, hasLength(1));
+      expect(type.parameters[0].type, typeProvider.intType);
+    }
+
+    _assertTypeNameSimple(p.type, typeProvider.stringType);
+
+    {
+      SimpleFormalParameter a = p.parameters.parameters[0];
+      _assertTypeNameSimple(a.type, typeProvider.intType);
+      expect(a.identifier.staticType, typeProvider.intType);
+    }
+  }
+
+  test_formalParameter_simple_fieldFormal() async {
+    addTestFile(r'''
+class A {
+  int f;
+  A(this.f);
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    var typeProvider = result.unit.element.context.typeProvider;
+
+    ClassDeclaration clazz = result.unit.declarations[0];
+
+    FieldDeclaration fDeclaration = clazz.members[0];
+    VariableDeclaration fNode = fDeclaration.fields.variables[0];
+    FieldElement fElement = fNode.element;
+
+    ConstructorDeclaration constructor = clazz.members[1];
+    List<FormalParameter> parameters = constructor.parameters.parameters;
+
+    FieldFormalParameterElement parameterElement =
+        constructor.element.parameters[0];
+    expect(parameterElement.field, same(fElement));
+
+    FieldFormalParameter parameterNode = parameters[0];
+    expect(parameterNode.type, isNull);
+    expect(parameterNode.element, same(parameterElement));
+
+    expect(parameterNode.identifier.staticElement, same(parameterElement));
+    expect(parameterNode.identifier.staticType, typeProvider.intType);
+  }
+
+  test_formalParameter_simple_fieldFormal_typed() async {
+    addTestFile(r'''
+class A {
+  int f;
+  A(int this.f);
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    var typeProvider = result.unit.element.context.typeProvider;
+
+    ClassDeclaration clazz = result.unit.declarations[0];
+
+    FieldDeclaration fDeclaration = clazz.members[0];
+    VariableDeclaration fNode = fDeclaration.fields.variables[0];
+    FieldElement fElement = fNode.element;
+
+    ConstructorDeclaration constructor = clazz.members[1];
+    List<FormalParameter> parameters = constructor.parameters.parameters;
+
+    FieldFormalParameterElement parameterElement =
+        constructor.element.parameters[0];
+    expect(parameterElement.field, same(fElement));
+
+    FieldFormalParameter parameterNode = parameters[0];
+    _assertTypeNameSimple(parameterNode.type, typeProvider.intType);
+    expect(parameterNode.element, same(parameterElement));
+
+    expect(parameterNode.identifier.staticElement, same(parameterElement));
+    expect(parameterNode.identifier.staticType, typeProvider.intType);
+  }
+
   test_indexExpression() async {
     String content = r'''
 main() {
@@ -1416,6 +1801,53 @@
     }
   }
 
+  test_instanceCreation_namedArgument() async {
+    addTestFile(r'''
+class X {
+  X(int a, {bool b, double c});
+}
+var v = new X(1, b: true, c: 3.0);
+''');
+
+    AnalysisResult result = await driver.getResult(testFile);
+    CompilationUnit unit = result.unit;
+
+    ClassDeclaration xNode = unit.declarations[0];
+    ClassElement xElement = xNode.element;
+    ConstructorElement constructorElement = xElement.constructors[0];
+
+    TopLevelVariableDeclaration vDeclaration = unit.declarations[1];
+    VariableDeclaration vNode = vDeclaration.variables.variables[0];
+
+    InstanceCreationExpression creation = vNode.initializer;
+    List<Expression> arguments = creation.argumentList.arguments;
+    expect(creation.staticElement, constructorElement);
+    expect(creation.staticType, xElement.type);
+
+    TypeName typeName = creation.constructorName.type;
+    expect(typeName.typeArguments, isNull);
+
+    Identifier typeIdentifier = typeName.name;
+    expect(typeIdentifier.staticElement, xElement);
+    expect(typeIdentifier.staticType, xElement.type);
+
+    expect(creation.constructorName.name, isNull);
+
+    Expression aArgument = arguments[0];
+    ParameterElement aElement = constructorElement.parameters[0];
+    expect(aArgument.staticParameterElement, same(aElement));
+
+    NamedExpression bArgument = arguments[1];
+    ParameterElement bElement = constructorElement.parameters[1];
+    expect(bArgument.name.label.staticElement, same(bElement));
+    expect(bArgument.staticParameterElement, same(bElement));
+
+    NamedExpression cArgument = arguments[2];
+    ParameterElement cElement = constructorElement.parameters[2];
+    expect(cArgument.name.label.staticElement, same(cElement));
+    expect(cArgument.staticParameterElement, same(cElement));
+  }
+
   test_instanceCreation_noTypeArguments() async {
     String content = r'''
 class C {
@@ -2069,14 +2501,12 @@
   }
 
   test_local_variable() async {
-    String content = r'''
+    addTestFile(r'''
 void main() {
   var v = 42;
   v;
 }
-''';
-    addTestFile(content);
-
+''');
     AnalysisResult result = await driver.getResult(testFile);
     expect(result.path, testFile);
     expect(result.errors, isEmpty);
@@ -2293,6 +2723,28 @@
     expect(identifier.staticType, typeProvider.numType);
   }
 
+  test_local_variable_multiple() async {
+    addTestFile(r'''
+void main() {
+  var a = 1, b = 2.3;
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    var typeProvider = result.unit.element.context.typeProvider;
+
+    List<Statement> statements = _getMainStatements(result);
+
+    VariableDeclarationStatement declarationStatement = statements[0];
+
+    VariableDeclaration aNode = declarationStatement.variables.variables[0];
+    LocalVariableElement aElement = aNode.element;
+    expect(aElement.type, typeProvider.intType);
+
+    VariableDeclaration bNode = declarationStatement.variables.variables[1];
+    LocalVariableElement bElement = bNode.element;
+    expect(bElement.type, typeProvider.doubleType);
+  }
+
   test_local_variable_ofLocalFunction() async {
     addTestFile(r'''
 void main() {
@@ -2578,6 +3030,185 @@
     }
   }
 
+  test_methodInvocation_namedArgument() async {
+    addTestFile(r'''
+void main() {
+  foo(1, b: true, c: 3.0);
+}
+void foo(int a, {bool b, double c}) {}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    List<Statement> mainStatements = _getMainStatements(result);
+
+    FunctionDeclaration foo = result.unit.declarations[1];
+    ExecutableElement fooElement = foo.element;
+
+    ExpressionStatement statement = mainStatements[0];
+    MethodInvocation invocation = statement.expression;
+    List<Expression> arguments = invocation.argumentList.arguments;
+
+    Expression aArgument = arguments[0];
+    ParameterElement aElement = fooElement.parameters[0];
+    expect(aArgument.staticParameterElement, same(aElement));
+
+    NamedExpression bArgument = arguments[1];
+    ParameterElement bElement = fooElement.parameters[1];
+    expect(bArgument.name.label.staticElement, same(bElement));
+    expect(bArgument.staticParameterElement, same(bElement));
+
+    NamedExpression cArgument = arguments[2];
+    ParameterElement cElement = fooElement.parameters[2];
+    expect(cArgument.name.label.staticElement, same(cElement));
+    expect(cArgument.staticParameterElement, same(cElement));
+  }
+
+  test_methodInvocation_notFunction_field_dynamic() async {
+    addTestFile(r'''
+class C {
+  dynamic f;
+  foo() {
+    f(1);
+  }
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+
+    ClassDeclaration cDeclaration = result.unit.declarations[0];
+
+    FieldDeclaration fDeclaration = cDeclaration.members[0];
+    VariableDeclaration fNode = fDeclaration.fields.variables[0];
+    FieldElement fElement = fNode.element;
+
+    MethodDeclaration fooDeclaration = cDeclaration.members[1];
+    BlockFunctionBody fooBody = fooDeclaration.body;
+    List<Statement> fooStatements = fooBody.block.statements;
+
+    ExpressionStatement statement = fooStatements[0];
+    MethodInvocation invocation = statement.expression;
+    expect(invocation.methodName.staticElement, same(fElement.getter));
+    expect(invocation.staticInvokeType, DynamicTypeImpl.instance);
+    expect(invocation.staticType, DynamicTypeImpl.instance);
+
+    List<Expression> arguments = invocation.argumentList.arguments;
+
+    Expression argument = arguments[0];
+    expect(argument.staticParameterElement, isNull);
+  }
+
+  test_methodInvocation_notFunction_getter_dynamic() async {
+    addTestFile(r'''
+class C {
+  get f => null;
+  foo() {
+    f(1);
+  }
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+
+    ClassDeclaration cDeclaration = result.unit.declarations[0];
+
+    MethodDeclaration fDeclaration = cDeclaration.members[0];
+    PropertyAccessorElement fElement = fDeclaration.element;
+
+    MethodDeclaration fooDeclaration = cDeclaration.members[1];
+    BlockFunctionBody fooBody = fooDeclaration.body;
+    List<Statement> fooStatements = fooBody.block.statements;
+
+    ExpressionStatement statement = fooStatements[0];
+    MethodInvocation invocation = statement.expression;
+    expect(invocation.methodName.staticElement, same(fElement));
+    expect(invocation.staticInvokeType, DynamicTypeImpl.instance);
+    expect(invocation.staticType, DynamicTypeImpl.instance);
+
+    List<Expression> arguments = invocation.argumentList.arguments;
+
+    Expression argument = arguments[0];
+    expect(argument.staticParameterElement, isNull);
+  }
+
+  test_methodInvocation_notFunction_local_dynamic() async {
+    addTestFile(r'''
+main(f) {
+  f(1);
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+
+    FunctionDeclaration mainDeclaration = result.unit.declarations[0];
+    FunctionExpression mainFunction = mainDeclaration.functionExpression;
+    ParameterElement fElement = mainFunction.parameters.parameters[0].element;
+
+    BlockFunctionBody mainBody = mainFunction.body;
+    List<Statement> mainStatements = mainBody.block.statements;
+
+    ExpressionStatement statement = mainStatements[0];
+    MethodInvocation invocation = statement.expression;
+    expect(invocation.methodName.staticElement, same(fElement));
+    expect(invocation.staticInvokeType, DynamicTypeImpl.instance);
+    expect(invocation.staticType, DynamicTypeImpl.instance);
+
+    List<Expression> arguments = invocation.argumentList.arguments;
+
+    Expression argument = arguments[0];
+    expect(argument.staticParameterElement, isNull);
+  }
+
+  test_methodInvocation_notFunction_local_functionTyped() async {
+    addTestFile(r'''
+main(String f(int a)) {
+  f(1);
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    var typeProvider = result.unit.element.context.typeProvider;
+
+    FunctionDeclaration mainDeclaration = result.unit.declarations[0];
+    FunctionExpression mainFunction = mainDeclaration.functionExpression;
+    ParameterElement fElement = mainFunction.parameters.parameters[0].element;
+
+    BlockFunctionBody mainBody = mainFunction.body;
+    List<Statement> mainStatements = mainBody.block.statements;
+
+    ExpressionStatement statement = mainStatements[0];
+    MethodInvocation invocation = statement.expression;
+    expect(invocation.methodName.staticElement, same(fElement));
+    expect(invocation.staticInvokeType.toString(), '(int) → String');
+    expect(invocation.staticType, typeProvider.stringType);
+
+    List<Expression> arguments = invocation.argumentList.arguments;
+
+    Expression argument = arguments[0];
+    expect(argument.staticParameterElement, isNotNull);
+  }
+
+  test_methodInvocation_notFunction_topLevelVariable_dynamic() async {
+    addTestFile(r'''
+dynamic f;
+main() {
+  f(1);
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+
+    TopLevelVariableDeclaration fDeclaration = result.unit.declarations[0];
+    VariableDeclaration fNode = fDeclaration.variables.variables[0];
+    TopLevelVariableElement fElement = fNode.element;
+
+    List<Statement> mainStatements = _getMainStatements(result);
+
+    ExpressionStatement statement = mainStatements[0];
+    MethodInvocation invocation = statement.expression;
+    expect(invocation.methodName.staticElement, same(fElement.getter));
+    expect(invocation.staticInvokeType, DynamicTypeImpl.instance);
+    expect(invocation.staticType, DynamicTypeImpl.instance);
+
+    List<Expression> arguments = invocation.argumentList.arguments;
+
+    Expression argument = arguments[0];
+    expect(argument.staticParameterElement, isNull);
+  }
+
   test_methodInvocation_staticMethod() async {
     addTestFile(r'''
 main() {
@@ -2796,38 +3427,6 @@
     }
   }
 
-  test_namedArgument() async {
-    addTestFile(r'''
-void main() {
-  foo(1, b: true, c: 3.0);
-}
-void foo(int a, {bool b, double c}) {}
-''');
-    AnalysisResult result = await driver.getResult(testFile);
-    List<Statement> mainStatements = _getMainStatements(result);
-
-    FunctionDeclaration foo = result.unit.declarations[1];
-    ExecutableElement fooElement = foo.element;
-
-    ExpressionStatement statement = mainStatements[0];
-    MethodInvocation invocation = statement.expression;
-    List<Expression> arguments = invocation.argumentList.arguments;
-
-    Expression aArgument = arguments[0];
-    ParameterElement aElement = fooElement.parameters[0];
-    expect(aArgument.staticParameterElement, same(aElement));
-
-    NamedExpression bArgument = arguments[1];
-    ParameterElement bElement = fooElement.parameters[1];
-    expect(bArgument.name.label.staticElement, same(bElement));
-    expect(bArgument.staticParameterElement, same(bElement));
-
-    NamedExpression cArgument = arguments[2];
-    ParameterElement cElement = fooElement.parameters[2];
-    expect(cArgument.name.label.staticElement, same(cElement));
-    expect(cArgument.staticParameterElement, same(cElement));
-  }
-
   test_postfixExpression_local() async {
     String content = r'''
 main() {
@@ -3956,6 +4555,53 @@
     }
   }
 
+  test_top_field_class_multiple() async {
+    String content = r'''
+class C {
+  var a = 1, b = 2.3;
+}
+''';
+    addTestFile(content);
+
+    AnalysisResult result = await driver.getResult(testFile);
+    CompilationUnit unit = result.unit;
+    CompilationUnitElement unitElement = unit.element;
+    var typeProvider = unitElement.context.typeProvider;
+
+    ClassDeclaration cNode = unit.declarations[0];
+    ClassElement cElement = cNode.element;
+
+    FieldDeclaration fieldDeclaration = cNode.members[0];
+
+    {
+      FieldElement aElement = cElement.getField('a');
+
+      VariableDeclaration aNode = fieldDeclaration.fields.variables[0];
+      expect(aNode.element, same(aElement));
+      expect(aElement.type, typeProvider.intType);
+
+      expect(aNode.name.staticElement, same(aElement));
+      expect(aNode.name.staticType, same(aElement.type));
+
+      Expression aValue = aNode.initializer;
+      expect(aValue.staticType, typeProvider.intType);
+    }
+
+    {
+      FieldElement bElement = cElement.getField('b');
+
+      VariableDeclaration bNode = fieldDeclaration.fields.variables[1];
+      expect(bNode.element, same(bElement));
+      expect(bElement.type, typeProvider.doubleType);
+
+      expect(bNode.name.staticElement, same(bElement));
+      expect(bNode.name.staticType, same(bElement.type));
+
+      Expression aValue = bNode.initializer;
+      expect(aValue.staticType, typeProvider.doubleType);
+    }
+  }
+
   test_top_field_top() async {
     String content = r'''
 var a = 1;
@@ -4000,6 +4646,47 @@
     }
   }
 
+  test_top_field_top_multiple() async {
+    String content = r'''
+var a = 1, b = 2.3;
+''';
+    addTestFile(content);
+
+    AnalysisResult result = await driver.getResult(testFile);
+    CompilationUnit unit = result.unit;
+    CompilationUnitElement unitElement = unit.element;
+    var typeProvider = unitElement.context.typeProvider;
+
+    TopLevelVariableDeclaration variableDeclaration = unit.declarations[0];
+    expect(variableDeclaration.variables.type, isNull);
+
+    {
+      VariableDeclaration aNode = variableDeclaration.variables.variables[0];
+      TopLevelVariableElement aElement = aNode.element;
+      expect(aElement, same(unitElement.topLevelVariables[0]));
+      expect(aElement.type, typeProvider.intType);
+
+      expect(aNode.name.staticElement, same(aElement));
+      expect(aNode.name.staticType, aElement.type);
+
+      Expression aValue = aNode.initializer;
+      expect(aValue.staticType, typeProvider.intType);
+    }
+
+    {
+      VariableDeclaration bNode = variableDeclaration.variables.variables[1];
+      TopLevelVariableElement bElement = bNode.element;
+      expect(bElement, same(unitElement.topLevelVariables[1]));
+      expect(bElement.type, typeProvider.doubleType);
+
+      expect(bNode.name.staticElement, same(bElement));
+      expect(bNode.name.staticType, bElement.type);
+
+      Expression aValue = bNode.initializer;
+      expect(aValue.staticType, typeProvider.doubleType);
+    }
+  }
+
   test_top_function_namedParameters() async {
     addTestFile(r'''
 double f(int a, {String b, bool c: 1 == 2}) {}
diff --git a/pkg/analyzer/test/src/fasta/message_coverage_test.dart b/pkg/analyzer/test/src/fasta/message_coverage_test.dart
index 2911531..f40c351 100644
--- a/pkg/analyzer/test/src/fasta/message_coverage_test.dart
+++ b/pkg/analyzer/test/src/fasta/message_coverage_test.dart
@@ -135,6 +135,7 @@
     fail(buffer.toString());
   }
 
+  @failingTest
   test_translatedMessageCoverage() {
     String analyzerPath = path.join(package_root.packageRoot, 'analyzer');
     String astBuilderPath =
diff --git a/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart b/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart
index 81ccbf4..3bf15d4 100644
--- a/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart
@@ -9,12 +9,95 @@
 
 main() {
   defineReflectiveSuite(() {
+    defineReflectiveTests(ListLiteralTest);
+    defineReflectiveTests(MapLiteralTest);
     defineReflectiveTests(MissingCodeTest);
     defineReflectiveTests(ParameterListTest);
   });
 }
 
 /**
+ * Test how well the parser recovers when tokens are missing in a list literal.
+ */
+@reflectiveTest
+class ListLiteralTest extends AbstractRecoveryTest {
+  void test_extraComma() {
+    testRecovery('''
+f() => [a, , b];
+''', [ParserErrorCode.MISSING_IDENTIFIER], '''
+f() => [a, _s_, b];
+''');
+  }
+
+  @failingTest
+  void test_missingComma() {
+    testRecovery('''
+f() => [a, b c];
+''', [ParserErrorCode.EXPECTED_TOKEN], '''
+f() => [a, b, c];
+''');
+  }
+}
+
+/**
+ * Test how well the parser recovers when tokens are missing in a map literal.
+ */
+@reflectiveTest
+class MapLiteralTest extends AbstractRecoveryTest {
+  void test_missingColonAndValue_last() {
+    testRecovery('''
+f() => {a };
+''', [ParserErrorCode.UNEXPECTED_TOKEN, ParserErrorCode.MISSING_IDENTIFIER], '''
+f() => {a: _s_};
+''');
+  }
+
+  void test_extraComma() {
+    testRecovery('''
+f() => {a: b, , c: d};
+''', [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.UNEXPECTED_TOKEN,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ], '''
+f() => {a: b, _s_: _s_, c: d};
+''');
+  }
+
+  void test_missingComma() {
+    testRecovery('''
+f() => {a: b, c: d e: f};
+''', [ParserErrorCode.UNEXPECTED_TOKEN], '''
+f() => {a: b, c: d, e: f};
+''');
+  }
+
+  void test_missingKey() {
+    testRecovery('''
+f() => {: b};
+''', [ParserErrorCode.MISSING_IDENTIFIER], '''
+f() => {_s_: b};
+''');
+  }
+
+  void test_missingValue_last() {
+    testRecovery('''
+f() => {a: };
+''', [ParserErrorCode.MISSING_IDENTIFIER], '''
+f() => {a: _s_};
+''');
+  }
+
+  void test_missingValue_notLast() {
+    testRecovery('''
+f() => {a: , b: c};
+''', [ParserErrorCode.MISSING_IDENTIFIER], '''
+f() => {a: _s_, b: c};
+''');
+  }
+}
+
+/**
  * Test how well the parser recovers when non-paired tokens are missing.
  */
 @reflectiveTest
@@ -76,6 +159,18 @@
     testUserDefinableOperatorWithSuper('|');
   }
 
+  void test_cascade_missingRight() {
+    testRecovery('''
+f(x) {
+  x..
+}
+''', [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN], '''
+f(x) {
+  x.. _s_;
+}
+''');
+  }
+
   void test_classDeclaration_missingName() {
     testRecovery('''
 class {}
diff --git a/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart b/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart
index 7c56e59..cf2c3b8 100644
--- a/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart
@@ -20,12 +20,20 @@
       {CompilationUnit adjustValidUnitBeforeComparison(CompilationUnit unit)}) {
     CompilationUnit invalidUnit =
         parseCompilationUnit(invalidCode, codes: errorCodes);
+    validateTokenStream(invalidUnit.beginToken);
     CompilationUnit validUnit = parseCompilationUnit(validCode);
     if (adjustValidUnitBeforeComparison != null) {
       validUnit = adjustValidUnitBeforeComparison(validUnit);
     }
     ResultComparator.compare(invalidUnit, validUnit);
   }
+
+  void validateTokenStream(Token token) {
+    while (!token.isEof) {
+      expect(token.end, lessThanOrEqualTo(token.next.offset));
+      token = token.next;
+    }
+  }
 }
 
 /**
diff --git a/pkg/analyzer/test/src/fasta/resolution_applier_test.dart b/pkg/analyzer/test/src/fasta/resolution_applier_test.dart
index a327082..6c720dd 100644
--- a/pkg/analyzer/test/src/fasta/resolution_applier_test.dart
+++ b/pkg/analyzer/test/src/fasta/resolution_applier_test.dart
@@ -35,14 +35,8 @@
   ///    [referencedElements], and [types] to the body of the function.
   /// 3. Verify that everything in the function body that should be resolved
   ///    _is_ resolved.
-  void applyTypes(
-      String content,
-      List<Element> declaredElements,
-      List<int> declareElementOffsets,
-      List<Element> referencedElements,
-      List<int> referencedElementOffsets,
-      List<DartType> types,
-      List<int> typeOffsets) {
+  void applyTypes(String content, List<Element> declaredElements,
+      List<Element> referencedElements, List<DartType> types) {
     CompilationUnit unit = parseCompilationUnit(content);
     expect(unit, isNotNull);
     expect(unit.declarations, hasLength(1));
@@ -51,11 +45,8 @@
     ResolutionApplier applier = new ResolutionApplier(
         new _TestTypeContext(),
         declaredElements,
-        declareElementOffsets,
         referencedElements,
-        referencedElementOffsets,
-        types.map((type) => new _KernelWrapperOfType(type)).toList(),
-        typeOffsets);
+        types.map((type) => new _KernelWrapperOfType(type)).toList());
 
     body.accept(applier);
     applier.checkDone();
@@ -76,24 +67,15 @@
 f(String s, int i) {
   return s + i;
 }
-''', [], [], [
+''', [], [
       _createFunctionParameter('s', 9),
       new MethodElementImpl('+', -1),
       _createFunctionParameter('i', 16),
-    ], [
-      30,
-      32,
-      34
     ], <DartType>[
       typeProvider.stringType,
       new FunctionTypeImpl(new FunctionElementImpl('+', -1)),
       typeProvider.intType,
       typeProvider.stringType,
-    ], [
-      30,
-      32,
-      32,
-      34
     ]);
   }
 
@@ -102,26 +84,16 @@
 f(Object a) {
   return a.b().c();
 }
-''', [], [], [
+''', [], [
       _createFunctionParameter('a', 9),
       new MethodElementImpl('b', -1),
       new MethodElementImpl('c', -1)
-    ], [
-      23,
-      25,
-      29
     ], <DartType>[
       typeProvider.objectType,
       typeProvider.objectType,
       typeProvider.objectType,
       typeProvider.objectType,
       typeProvider.objectType
-    ], [
-      23,
-      25,
-      26,
-      29,
-      30
     ]);
   }
 
@@ -141,71 +113,50 @@
 f() {
   int Function(String, bool x) foo;
 }
-''', [new LocalVariableElementImpl('foo', 37)], [37], [], [],
-        <DartType>[functionType], [37]);
+''', [new LocalVariableElementImpl('foo', 37)], [], <DartType>[functionType]);
   }
 
   void test_listLiteral_const_noAnnotation() {
     applyTypes(r'''
 get f => const ['a', 'b', 'c'];
-''', [], [], [], [], <DartType>[
+''', [], [], <DartType>[
       typeProvider.stringType,
       typeProvider.stringType,
       typeProvider.stringType,
       typeProvider.listType.instantiate([typeProvider.stringType])
-    ], [
-      16,
-      21,
-      26,
-      9
     ]);
   }
 
   void test_listLiteral_const_typeAnnotation() {
     applyTypes(r'''
 get f => const <String>['a', 'b', 'c'];
-''', [], [], [], [], <DartType>[
+''', [], [], <DartType>[
       typeProvider.stringType,
       typeProvider.stringType,
       typeProvider.stringType,
       typeProvider.listType.instantiate([typeProvider.stringType])
-    ], [
-      24,
-      29,
-      34,
-      9
     ]);
   }
 
   void test_listLiteral_noAnnotation() {
     applyTypes(r'''
 get f => ['a', 'b', 'c'];
-''', [], [], [], [], <DartType>[
+''', [], [], <DartType>[
       typeProvider.stringType,
       typeProvider.stringType,
       typeProvider.stringType,
       typeProvider.listType.instantiate([typeProvider.stringType])
-    ], [
-      10,
-      15,
-      20,
-      9
     ]);
   }
 
   void test_listLiteral_typeAnnotation() {
     applyTypes(r'''
 get f => <String>['a', 'b', 'c'];
-''', [], [], [], [], <DartType>[
+''', [], [], <DartType>[
       typeProvider.stringType,
       typeProvider.stringType,
       typeProvider.stringType,
       typeProvider.listType.instantiate([typeProvider.stringType])
-    ], [
-      18,
-      23,
-      28,
-      17
     ]);
   }
 
@@ -218,14 +169,13 @@
 f() {
   Map<String, List<String>> m = {};
 }
-''', [new LocalVariableElementImpl('m', 34)], [34], [], [],
-        <DartType>[mapType, mapType], [34, 38]);
+''', [new LocalVariableElementImpl('m', 34)], [], <DartType>[mapType, mapType]);
   }
 
   void test_mapLiteral_const_noAnnotation() {
     applyTypes(r'''
 get f => const {'a' : 1, 'b' : 2, 'c' : 3};
-''', [], [], [], [], <DartType>[
+''', [], [], <DartType>[
       typeProvider.stringType,
       typeProvider.intType,
       typeProvider.stringType,
@@ -234,21 +184,13 @@
       typeProvider.intType,
       typeProvider.mapType
           .instantiate([typeProvider.stringType, typeProvider.intType])
-    ], [
-      16,
-      22,
-      25,
-      31,
-      34,
-      40,
-      9
     ]);
   }
 
   void test_mapLiteral_const_typeAnnotation() {
     applyTypes(r'''
 get f => const <String, int>{'a' : 1, 'b' : 2, 'c' : 3};
-''', [], [], [], [], <DartType>[
+''', [], [], <DartType>[
       typeProvider.stringType,
       typeProvider.intType,
       typeProvider.stringType,
@@ -257,21 +199,13 @@
       typeProvider.intType,
       typeProvider.mapType
           .instantiate([typeProvider.stringType, typeProvider.intType])
-    ], [
-      29,
-      35,
-      38,
-      44,
-      47,
-      53,
-      9
     ]);
   }
 
   void test_mapLiteral_noAnnotation() {
     applyTypes(r'''
 get f => {'a' : 1, 'b' : 2, 'c' : 3};
-''', [], [], [], [], <DartType>[
+''', [], [], <DartType>[
       typeProvider.stringType,
       typeProvider.intType,
       typeProvider.stringType,
@@ -280,21 +214,13 @@
       typeProvider.intType,
       typeProvider.mapType
           .instantiate([typeProvider.stringType, typeProvider.intType])
-    ], [
-      10,
-      16,
-      19,
-      25,
-      28,
-      34,
-      9
     ]);
   }
 
   void test_mapLiteral_typeAnnotation() {
     applyTypes(r'''
 get f => <String, int>{'a' : 1, 'b' : 2, 'c' : 3};
-''', [], [], [], [], <DartType>[
+''', [], [], <DartType>[
       typeProvider.stringType,
       typeProvider.intType,
       typeProvider.stringType,
@@ -303,14 +229,6 @@
       typeProvider.intType,
       typeProvider.mapType
           .instantiate([typeProvider.stringType, typeProvider.intType])
-    ], [
-      23,
-      29,
-      32,
-      38,
-      41,
-      47,
-      22
     ]);
   }
 
@@ -319,18 +237,12 @@
 f(String s) {
   return s.length;
 }
-''', [], [], [
+''', [], [
       _createFunctionParameter('s', 9),
       new MethodElementImpl('length', -1)
-    ], [
-      23,
-      25
     ], <DartType>[
       typeProvider.stringType,
       typeProvider.intType,
-    ], [
-      23,
-      25
     ]);
   }
 
@@ -339,24 +251,15 @@
 f(String s) {
   return s.substring(3, 7);
 }
-''', [], [], [
+''', [], [
       _createFunctionParameter('s', 9),
       new MethodElementImpl('length', -1)
-    ], [
-      23,
-      25
     ], <DartType>[
       typeProvider.stringType,
       typeProvider.intType,
       typeProvider.intType,
       typeProvider.stringType,
       typeProvider.stringType
-    ], [
-      23,
-      25,
-      34,
-      35,
-      38
     ]);
   }
 
@@ -380,8 +283,7 @@
   A<int, String> foo;
 }
 //typedef B A<B, C>(C x);
-''', [new LocalVariableElementImpl('foo', 23)], [], [], [],
-        <DartType>[functionType], []);
+''', [new LocalVariableElementImpl('foo', 23)], [], <DartType>[functionType]);
   }
 
   /// Return a newly created parameter element with the given [name] and
diff --git a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
index 840e620..9e05d71 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
@@ -436,7 +436,8 @@
       ..logger = new PerformanceLog(null)
       ..fileSystem = new _FileSystemAdaptor(resourceProvider)
       ..byteStore = new MemoryByteStore());
-    var driver = new KernelDriver(options, uriTranslator,
+    var driver = new KernelDriver(
+        options, uriTranslator, new KernelErrorListener(),
         metadataFactory: new AnalyzerMetadataFactory());
 
     KernelResult kernelResult = await driver.getKernel(testUri);
@@ -451,7 +452,7 @@
     }
 
     kernelResult.dependencies.forEach(addLibrary);
-    addLibrary(kernelResult.library);
+    addLibrary(kernelResult.libraryResult.library);
 
     if (DEBUG) {
       String testUriStr = testUri.toString();
diff --git a/pkg/analyzer/test/src/task/options_test.dart b/pkg/analyzer/test/src/task/options_test.dart
index c2366a2..9479152 100644
--- a/pkg/analyzer/test/src/task/options_test.dart
+++ b/pkg/analyzer/test/src/task/options_test.dart
@@ -270,7 +270,6 @@
         removeCode(StrongModeCode.TOP_LEVEL_INSTANCE_GETTER);
         removeCode(StrongModeCode.TOP_LEVEL_TYPE_ARGUMENTS);
         removeCode(StrongModeCode.TOP_LEVEL_UNSUPPORTED);
-        removeCode(StrongModeCode.UNSAFE_BLOCK_CLOSURE_INFERENCE);
       } else if (errorType == TodoCode) {
         declaredNames.remove('TODO_REGEX');
       }
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 0f54ab7..103d93f 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -252,7 +252,7 @@
 
     // Create a context, or re-use the previous one.
     try {
-      _createAnalysisContext(options);
+      _createContextAndAnalyze(options);
     } on _DriverError catch (error) {
       outSink.writeln(error.msg);
       return ErrorSeverity.ERROR;
@@ -567,7 +567,7 @@
 
   /// Create an analysis context that is prepared to analyze sources according
   /// to the given [options], and store it in [_context].
-  void _createAnalysisContext(CommandLineOptions options) {
+  void _createContextAndAnalyze(CommandLineOptions options) {
     // If not the same command-line options, clear cached information.
     if (!_equalCommandLineOptions(_previousOptions, options)) {
       _previousOptions = options;
@@ -699,7 +699,8 @@
         a.lint == b.lint &&
         AnalysisOptionsImpl.compareLints(a.lintRules, b.lintRules) &&
         a.preserveComments == b.preserveComments &&
-        a.strongMode == b.strongMode;
+        a.strongMode == b.strongMode &&
+        a.useFastaParser == b.useFastaParser;
   }
 
   _PackageInfo _findPackages(CommandLineOptions options) {
@@ -977,12 +978,14 @@
 
 class _DriverError implements Exception {
   String msg;
+
   _DriverError(this.msg);
 }
 
 class _PackageInfo {
   Packages packages;
   Map<String, List<file_system.Folder>> packageMap;
+
   _PackageInfo(this.packages, this.packageMap);
 }
 
diff --git a/pkg/analyzer_cli/test/all.dart b/pkg/analyzer_cli/test/all.dart
index 567870e..82706ab 100644
--- a/pkg/analyzer_cli/test/all.dart
+++ b/pkg/analyzer_cli/test/all.dart
@@ -15,7 +15,7 @@
 import 'reporter_test.dart' as reporter_test;
 import 'sdk_ext_test.dart' as sdk_ext_test;
 import 'super_mixin_test.dart' as super_mixin_test;
-//import 'strong_mode_test.dart' as strong_mode_test;
+import 'strong_mode_test.dart' as strong_mode_test;
 
 main() {
   analysis_options_test.main();
@@ -31,7 +31,5 @@
   reporter_test.main();
   sdk_ext_test.main();
   super_mixin_test.main();
-  // TODO(pq): fix tests to run safely on the bots
-  // https://github.com/dart-lang/sdk/issues/25001
-  //strong_mode_test.main();
+  strong_mode_test.main();
 }
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index ea9d072..42230ab 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -30,8 +30,11 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(BuildModeTest);
     defineReflectiveTests(ExitCodesTest);
+    defineReflectiveTests(ExitCodesTest_PreviewDart2);
     defineReflectiveTests(LinterTest);
+    defineReflectiveTests(LinterTest_PreviewDart2);
     defineReflectiveTests(OptionsTest);
+    defineReflectiveTests(OptionsTest_PreviewDart2);
   }, name: 'Driver');
 }
 
@@ -47,19 +50,26 @@
   /// Normalize text with bullets.
   String bulletToDash(item) => '$item'.replaceAll('•', '-');
 
+  bool get usePreviewDart2 => false;
+
   /// Start a driver for the given [source], optionally providing additional
-  /// [args] and an [options] file path.  The value of [options] defaults to
-  /// an empty options file to avoid unwanted configuration from an otherwise
+  /// [args] and an [options] file path. The value of [options] defaults to an
+  /// empty options file to avoid unwanted configuration from an otherwise
   /// discovered options file.
-  Future<Null> drive(String source,
-      {String options: emptyOptionsFile,
-      List<String> args: const <String>[]}) async {
+  Future<Null> drive(
+    String source, {
+    String options: emptyOptionsFile,
+    List<String> args: const <String>[],
+  }) async {
     driver = new Driver(isTesting: true);
-    var cmd = [
+    var cmd = <String>[
       '--options',
       path.join(testDirectory, options),
       _adjustFileSpec(source)
     ]..addAll(args);
+    if (usePreviewDart2) {
+      cmd.insert(0, '--preview-dart-2');
+    }
     await driver.start(cmd);
   }
 
@@ -591,6 +601,27 @@
 }
 
 @reflectiveTest
+class ExitCodesTest_PreviewDart2 extends ExitCodesTest {
+  @override
+  bool get usePreviewDart2 => true;
+
+  @override
+  @failingTest
+  test_fatalErrors() {
+    // TODO(devoncarew): This test times out when used with @failingTest.
+    return new Future.error('failing test');
+  }
+
+  @override
+  @failingTest
+  test_fatalWarnings() => super.test_fatalWarnings();
+
+  @override
+  @failingTest
+  test_notFatalWarnings() => super.test_notFatalWarnings();
+}
+
+@reflectiveTest
 class LinterTest extends BaseTest {
   String get optionsFileName => AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;
 
@@ -688,6 +719,12 @@
 }
 
 @reflectiveTest
+class LinterTest_PreviewDart2 extends LinterTest {
+  @override
+  bool get usePreviewDart2 => true;
+}
+
+@reflectiveTest
 class OptionsTest extends BaseTest {
   String get optionsFileName => AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;
 
@@ -794,6 +831,33 @@
   }
 }
 
+@reflectiveTest
+class OptionsTest_PreviewDart2 extends OptionsTest {
+  @override
+  bool get usePreviewDart2 => true;
+
+  @override
+  @failingTest
+  test_basic_filters() => super.test_basic_filters();
+
+  @override
+  @failingTest
+  test_basic_language() => super.test_basic_language();
+
+  @override
+  @failingTest
+  test_basic_strongMode() => super.test_basic_strongMode();
+
+  @override
+  @failingTest
+  test_includeDirective() => super.test_includeDirective();
+
+  @override
+  @failingTest
+  test_withFlags_overrideFatalWarning() =>
+      super.test_withFlags_overrideFatalWarning();
+}
+
 class TestSource implements Source {
   TestSource();
 
diff --git a/pkg/analyzer_cli/test/strong_mode_test.dart b/pkg/analyzer_cli/test/strong_mode_test.dart
index a122e98..51c647c 100644
--- a/pkg/analyzer_cli/test/strong_mode_test.dart
+++ b/pkg/analyzer_cli/test/strong_mode_test.dart
@@ -13,9 +13,7 @@
 import 'driver_test.dart';
 
 main() {
-  // TODO(pq): fix tests to run safely on the bots
-  // https://github.com/dart-lang/sdk/issues/25001
-//  defineReflectiveTests(StrongModeTest);
+  defineReflectiveTests(StrongModeTest);
 }
 
 /// End-to-end test for --strong checking.
diff --git a/pkg/compiler/lib/src/compile_time_constants.dart b/pkg/compiler/lib/src/compile_time_constants.dart
index 3462968..817f22f 100644
--- a/pkg/compiler/lib/src/compile_time_constants.dart
+++ b/pkg/compiler/lib/src/compile_time_constants.dart
@@ -270,8 +270,8 @@
                   node, element.messageKind, element.messageArguments);
             } else {
               assert(elementType is MethodTypeVariableType);
-              reporter.reportErrorMessage(
-                  node, MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED);
+              // Used to `reportErrorMessage` here, but with Dart 2 upcoming
+              // very soon we do not emit this message any more.
             }
           } else {
             // We need to throw an exception at runtime.
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 9d89aca..2fa6522 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -289,8 +289,6 @@
 
   void setUseKernel(String argument) {
     useKernel = true;
-    // TODO(sigmund): remove once we support inlining with `useKernel`.
-    options.add(Flags.disableInlining);
     passThrough(argument);
   }
 
diff --git a/pkg/compiler/lib/src/diagnostics/messages.dart b/pkg/compiler/lib/src/diagnostics/messages.dart
index 97252ba5c..c803871 100644
--- a/pkg/compiler/lib/src/diagnostics/messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/messages.dart
@@ -404,8 +404,6 @@
   TYPE_ARGUMENT_COUNT_MISMATCH,
   TYPE_VARIABLE_IN_CONSTANT,
   TYPE_VARIABLE_WITHIN_STATIC_MEMBER,
-  TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED,
-  TYPE_VARIABLE_FROM_METHOD_CONSIDERED_DYNAMIC,
   TYPEDEF_FORMAL_WITH_DEFAULT,
   UNARY_OPERATOR_BAD_ARITY,
   UNBOUND_LABEL,
@@ -1200,43 +1198,6 @@
 """
           ]),
 
-      MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED: const MessageTemplate(
-          MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED,
-          "Method type variables do not have a runtime value.",
-          howToFix: "Try using the upper bound of the type variable, "
-              "or refactor the code to avoid needing this runtime value.",
-          examples: const [
-            """
-// Method type variables are not reified, so they cannot be returned.
-Type f<T>() => T;
-
-main() => f<int>();
-""",
-            """
-// Method type variables are not reified, so they cannot be tested dynamically.
-bool f<T>(Object o) => o is T;
-
-main() => f<int>(42);
-"""
-          ]),
-
-      MessageKind.TYPE_VARIABLE_FROM_METHOD_CONSIDERED_DYNAMIC:
-          const MessageTemplate(
-              MessageKind.TYPE_VARIABLE_FROM_METHOD_CONSIDERED_DYNAMIC,
-              "Method type variables are treated as `dynamic` in `as` "
-              "expressions.",
-              howToFix:
-                  "Try using the upper bound of the type variable, or check "
-                  "that the blind success of the test does not introduce bugs.",
-              examples: const [
-            """
-// Method type variables are not reified, so they cannot be tested dynamically.
-bool f<T>(Object o) => o as T;
-
-main() => f<int>(42);
-"""
-          ]),
-
       MessageKind.INVALID_TYPE_VARIABLE_BOUND: const MessageTemplate(
           MessageKind.INVALID_TYPE_VARIABLE_BOUND,
           "'#{typeArgument}' is not a subtype of bound '#{bound}' for "
@@ -2707,8 +2668,7 @@
       MessageKind.EXPECTED_IDENTIFIER_NOT_RESERVED_WORD: const MessageTemplate(
           MessageKind.EXPECTED_IDENTIFIER_NOT_RESERVED_WORD,
           "'#{keyword}' is a reserved word and can't be used here.",
-          howToFix: "Try using a different name.",
-          examples: const ["do() {} main() {}"]),
+          howToFix: "Try using a different name."),
 
       MessageKind.NAMED_FUNCTION_EXPRESSION: const MessageTemplate(
           MessageKind.NAMED_FUNCTION_EXPRESSION,
diff --git a/pkg/compiler/lib/src/elements/types.dart b/pkg/compiler/lib/src/elements/types.dart
index d0d7896..0bb9763 100644
--- a/pkg/compiler/lib/src/elements/types.dart
+++ b/pkg/compiler/lib/src/elements/types.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import '../common/names.dart';
 import '../common_elements.dart';
 import '../util/util.dart' show equalElements;
 import 'entities.dart';
@@ -70,6 +71,9 @@
   /// Whether this type contains a type variable.
   bool get containsTypeVariables => false;
 
+  /// Is `true` if this type is the 'Object' type defined in 'dart:core'.
+  bool get isObject => false;
+
   /// Applies [f] to each occurence of a [ResolutionTypeVariableType] within
   /// this type.
   void forEachTypeVariable(f(TypeVariableType variable)) {}
@@ -118,7 +122,7 @@
 
   /// Returns `true` if [a] and [b] are assumed to be equivalent.
   bool isAssumed(FunctionTypeVariable a, FunctionTypeVariable b) {
-    return _assumptionMap[a].contains(b);
+    return _assumptionMap[a]?.contains(b) ?? false;
   }
 }
 
@@ -130,6 +134,11 @@
 
   bool get isInterfaceType => true;
 
+  bool get isObject {
+    return element.name == 'Object' &&
+        element.library.canonicalUri == Uris.dart_core;
+  }
+
   bool get containsTypeVariables =>
       typeArguments.any((type) => type.containsTypeVariables);
 
@@ -379,7 +388,7 @@
   /// type.
   final int index;
 
-  /// The bound of this existential type.
+  /// The bound of this function type variable.
   final DartType bound;
 
   FunctionTypeVariable(this.index, this.bound);
@@ -397,7 +406,7 @@
     if (index != -1) {
       return arguments[index];
     }
-    // The existential type was not substituted.
+    // The function type variable was not substituted.
     return this;
   }
 
@@ -613,6 +622,13 @@
       for (int index = 0; index < typeVariables.length; index++) {
         assumptions.assume(typeVariables[index], other.typeVariables[index]);
       }
+      for (int index = 0; index < typeVariables.length; index++) {
+        if (!typeVariables[index]
+            .bound
+            ._equals(other.typeVariables[index].bound, assumptions)) {
+          return false;
+        }
+      }
     }
     bool result = returnType == other.returnType &&
         _equalTypes(parameterTypes, other.parameterTypes, assumptions) &&
@@ -636,12 +652,16 @@
     if (typeVariables.isNotEmpty) {
       sb.write('<');
       bool needsComma = false;
-      // TODO(johnniwinther): Include bounds.
       for (FunctionTypeVariable typeVariable in typeVariables) {
         if (needsComma) {
           sb.write(',');
         }
         sb.write(typeVariable);
+        DartType bound = typeVariable.bound;
+        if (!bound.isObject) {
+          sb.write(' extends ');
+          sb.write(typeVariable.bound);
+        }
         needsComma = true;
       }
       sb.write('>');
@@ -781,6 +801,8 @@
     extends BaseDartTypeVisitor<bool, T> {
   CommonElements get commonElements;
 
+  final _Assumptions assumptions = new _Assumptions();
+
   /// Ensures that the super hierarchy of [type] is computed.
   void ensureResolved(InterfaceType type) {}
 
@@ -860,6 +882,26 @@
       return false;
     }
 
+    if (tf.typeVariables.length != sf.typeVariables.length) {
+      return false;
+    }
+    for (int i = 0; i < tf.typeVariables.length; i++) {
+      assumptions.assume(tf.typeVariables[i], sf.typeVariables[i]);
+    }
+    for (int i = 0; i < tf.typeVariables.length; i++) {
+      if (!tf.typeVariables[i].bound
+          ._equals(sf.typeVariables[i].bound, assumptions)) {
+        return false;
+      }
+    }
+    bool result = visitFunctionTypeInternal(tf, sf);
+    for (int i = 0; i < tf.typeVariables.length; i++) {
+      assumptions.forget(tf.typeVariables[i], sf.typeVariables[i]);
+    }
+    return result;
+  }
+
+  bool visitFunctionTypeInternal(FunctionType tf, FunctionType sf) {
     // TODO(johnniwinther): Rewrite the function subtyping to be more readable
     // but still as efficient.
 
@@ -973,6 +1015,11 @@
     if (invalidTypeVariableBounds(bound, s)) return false;
     return true;
   }
+
+  bool visitFunctionTypeVariable(FunctionTypeVariable t, DartType s) {
+    if (!s.isFunctionTypeVariable) return false;
+    return assumptions.isAssumed(t, s);
+  }
 }
 
 abstract class MoreSpecificVisitor<T extends DartType>
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index 5f1be34..89ee3d0 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -79,7 +79,7 @@
   /// in the return type or the argument types.
   Set<ClassEntity> getReferencedClasses(FunctionType type);
 
-  /// Return all classes that are uses a type arguments.
+  /// Return all classes that use type arguments.
   Set<ClassEntity> getRequiredArgumentClasses();
 }
 
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart b/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
index 384d30a..8b04d86 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
@@ -235,7 +235,7 @@
     // It is important that this is the penultimate step, at this point,
     // neededClasses must only contain classes that have been resolved and
     // codegen'd. The rtiNeededClasses may contain additional classes, but
-    // these are thought to not have been instantiated, so we neeed to be able
+    // these are thought to not have been instantiated, so we need to be able
     // to identify them later and make sure we only emit "empty shells" without
     // fields, etc.
     classesOnlyNeededForRti = new Set<ClassEntity>();
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
index 9e7e03b..c77ab3b 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
@@ -1109,7 +1109,7 @@
 
     bool isIntercepted = false;
     if (method is InstanceMethod) {
-      MethodElement element = method.element;
+      FunctionEntity element = method.element;
       isIntercepted = _interceptorData.isInterceptedMethod(element);
     }
     int requiredParameterCount = 0;
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
index 68206e7..9f50a9b 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
@@ -36,7 +36,7 @@
 import '../../compiler.dart' show Compiler;
 import '../../constants/values.dart' show ConstantValue, FunctionConstantValue;
 import '../../common_elements.dart' show CommonElements;
-import '../../elements/elements.dart' show ClassElement, MethodElement;
+import '../../elements/elements.dart' show ClassElement;
 import '../../elements/entities.dart';
 import '../../hash/sha1.dart' show Hasher;
 import '../../io/code_output.dart';
diff --git a/pkg/compiler/lib/src/js_model/locals.dart b/pkg/compiler/lib/src/js_model/locals.dart
index f0bd765..4e09ba2 100644
--- a/pkg/compiler/lib/src/js_model/locals.dart
+++ b/pkg/compiler/lib/src/js_model/locals.dart
@@ -440,7 +440,10 @@
     for (ir.VariableDeclaration variable in node.positionalParameters) {
       f(localsMap.getLocalVariable(variable));
     }
-    for (ir.VariableDeclaration variable in node.namedParameters) {
+    List<ir.VariableDeclaration> namedParameters =
+        new List<ir.VariableDeclaration>.from(node.namedParameters);
+    namedParameters.sort(namedOrdering);
+    for (ir.VariableDeclaration variable in namedParameters) {
       f(localsMap.getLocalVariable(variable));
     }
   }
diff --git a/pkg/compiler/lib/src/kernel/deferred_load.dart b/pkg/compiler/lib/src/kernel/deferred_load.dart
index 5fc4f97..ea96d26 100644
--- a/pkg/compiler/lib/src/kernel/deferred_load.dart
+++ b/pkg/compiler/lib/src/kernel/deferred_load.dart
@@ -15,8 +15,8 @@
 
 class KernelDeferredLoadTask extends DeferredLoadTask {
   KernelToElementMapForImpact _elementMap;
-  Map<ir.Library, Set<ir.Member>> _additionalExportsSets =
-      <ir.Library, Set<ir.Member>>{};
+  Map<ir.Library, Set<ir.NamedNode>> _additionalExportsSets =
+      <ir.Library, Set<ir.NamedNode>>{};
 
   KernelDeferredLoadTask(Compiler compiler, this._elementMap) : super(compiler);
 
@@ -85,8 +85,8 @@
         "KernelDeferredLoadTask.addMirrorElementsForLibrary");
   }
 
-  Set<ir.Member> additionalExports(ir.Library library) {
-    return _additionalExportsSets[library] ??= new Set<ir.Member>.from(
+  Set<ir.NamedNode> additionalExports(ir.Library library) {
+    return _additionalExportsSets[library] ??= new Set<ir.NamedNode>.from(
         library.additionalExports.map((ir.Reference ref) => ref.node));
   }
 
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 951c0da..2d6dc79 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -445,10 +445,10 @@
         typeParameters
             .add(getDartType(new ir.TypeParameterType(typeParameter)));
       }
-      // TODO(johnniwinther): Support bounds.
       typeVariables = new List<FunctionTypeVariable>.generate(
           node.typeParameters.length,
-          (int index) => new FunctionTypeVariable(index, const DynamicType()));
+          (int index) => new FunctionTypeVariable(
+              index, getDartType(node.typeParameters[index].bound)));
 
       DartType subst(DartType type) {
         return type.subst(typeVariables, typeParameters);
@@ -1589,9 +1589,11 @@
     List<FunctionTypeVariable> typeVariables;
     for (ir.TypeParameter typeParameter in node.typeParameters) {
       if (enableFunctionTypeVariables) {
-        // TODO(johnniwinther): Support bounds.
+        // TODO(johnniwinther): Support recursive type variable bounds, like
+        // `void Function<T extends Foo<T>>(T t)` when #31531 is fixed.
+        DartType bound = typeParameter.bound.accept(this);
         FunctionTypeVariable typeVariable =
-            new FunctionTypeVariable(index, const DynamicType());
+            new FunctionTypeVariable(index, bound);
         currentFunctionTypeParameters[typeParameter] = typeVariable;
         typeVariables ??= <FunctionTypeVariable>[];
         typeVariables.add(typeVariable);
diff --git a/pkg/compiler/lib/src/resolution/members.dart b/pkg/compiler/lib/src/resolution/members.dart
index 0cc75e9..d939a65 100644
--- a/pkg/compiler/lib/src/resolution/members.dart
+++ b/pkg/compiler/lib/src/resolution/members.dart
@@ -1131,13 +1131,6 @@
       sendStructure = new IsStructure(type);
     }
 
-    // GENERIC_METHODS: Method type variables are not reified so we must warn
-    // about the error which will occur at runtime.
-    if (type is MethodTypeVariableType) {
-      reporter.reportWarningMessage(
-          node, MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED);
-    }
-
     registry.registerTypeUse(new TypeUse.isCheck(type));
     registry.registerSendStructure(node, sendStructure);
     return const NoneResult();
@@ -1152,13 +1145,6 @@
     ResolutionDartType type =
         resolveTypeAnnotation(typeNode, registerCheckedModeCheck: false);
 
-    // GENERIC_METHODS: Method type variables are not reified, so we must inform
-    // the developer about the potentially bug-inducing semantics.
-    if (type is MethodTypeVariableType) {
-      reporter.reportHintMessage(
-          node, MessageKind.TYPE_VARIABLE_FROM_METHOD_CONSIDERED_DYNAMIC);
-    }
-
     registry.registerTypeUse(new TypeUse.asCast(type));
     registry.registerSendStructure(node, new AsStructure(type));
     return const NoneResult();
@@ -1927,12 +1913,6 @@
       // TODO(johnniwinther): Clean up registration of elements and selectors
       // for this case.
     } else {
-      // GENERIC_METHODS: Method type variables are not reified so we must warn
-      // about the error which will occur at runtime.
-      if (element.type is MethodTypeVariableType) {
-        reporter.reportWarningMessage(
-            node, MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED);
-      }
       semantics = new StaticAccess.typeParameterTypeLiteral(element);
     }
 
diff --git a/pkg/compiler/lib/src/resolved_uri_translator.dart b/pkg/compiler/lib/src/resolved_uri_translator.dart
index 4363775..f40aeb3 100644
--- a/pkg/compiler/lib/src/resolved_uri_translator.dart
+++ b/pkg/compiler/lib/src/resolved_uri_translator.dart
@@ -122,7 +122,10 @@
               importingLibrary.canonicalUri.path
                   .contains('tests/compiler/dart2js_native') ||
               importingLibrary.canonicalUri.path
-                  .contains('tests/compiler/dart2js_extra'));
+                  .contains('tests/compiler/dart2js_extra') ||
+              (importingLibrary.canonicalUri.scheme == 'package' &&
+                  importingLibrary.canonicalUri.path
+                      .startsWith('dart_internal/')));
 
       if (!allowInternalLibraryAccess) {
         if (importingLibrary != null) {
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 8d4c2d4..803a408 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -190,9 +190,10 @@
           if (target is ir.Procedure) {
             if (target.isExternal) {
               buildExternalFunctionNode(
-                  _ensureDefaultArgumentValues(target.function));
+                  targetElement, _ensureDefaultArgumentValues(target.function));
             } else {
-              buildFunctionNode(_ensureDefaultArgumentValues(target.function));
+              buildFunctionNode(
+                  targetElement, _ensureDefaultArgumentValues(target.function));
             }
           } else if (target is ir.Field) {
             if (handleConstantField(targetElement, registry, closedWorld)) {
@@ -204,9 +205,11 @@
             }
             buildField(target);
           } else if (target is ir.FunctionExpression) {
-            buildFunctionNode(_ensureDefaultArgumentValues(target.function));
+            buildFunctionNode(
+                targetElement, _ensureDefaultArgumentValues(target.function));
           } else if (target is ir.FunctionDeclaration) {
-            buildFunctionNode(_ensureDefaultArgumentValues(target.function));
+            buildFunctionNode(
+                targetElement, _ensureDefaultArgumentValues(target.function));
           } else {
             throw 'No case implemented to handle target: '
                 '$target for $targetElement';
@@ -215,7 +218,7 @@
         case MemberKind.constructor:
           ir.Constructor constructor = definition.node;
           _ensureDefaultArgumentValues(constructor.function);
-          buildConstructor(constructor);
+          buildConstructor(targetElement, constructor);
           break;
         case MemberKind.constructorBody:
           ir.Constructor constructor = definition.node;
@@ -284,37 +287,37 @@
     return _elementMap.getFieldConstantValue(field);
   }
 
-  void buildField(ir.Field field) {
-    _inLazyInitializerExpression = field.isStatic;
-    openFunction();
-    if (field.isInstanceMember && options.enableTypeAssertions) {
+  void buildField(ir.Field node) {
+    _inLazyInitializerExpression = node.isStatic;
+    FieldEntity field = _elementMap.getMember(node);
+    openFunction(field);
+    if (node.isInstanceMember && options.enableTypeAssertions) {
       HInstruction thisInstruction = localsHandler.readThis(
-          sourceInformation: _sourceInformationBuilder.buildGet(field));
+          sourceInformation: _sourceInformationBuilder.buildGet(node));
       // Use dynamic type because the type computed by the inferrer is
       // narrowed to the type annotation.
-      FieldEntity fieldEntity = _elementMap.getMember(field);
       HInstruction parameter =
-          new HParameterValue(fieldEntity, commonMasks.dynamicType);
+          new HParameterValue(field, commonMasks.dynamicType);
       // Add the parameter as the last instruction of the entry block.
       // If the method is intercepted, we want the actual receiver
       // to be the first parameter.
       graph.entry.addBefore(graph.entry.last, parameter);
       HInstruction value = typeBuilder.potentiallyCheckOrTrustType(
-          parameter, _getDartTypeIfValid(field.type));
-      add(new HFieldSet(fieldEntity, thisInstruction, value));
+          parameter, _getDartTypeIfValid(node.type));
+      add(new HFieldSet(field, thisInstruction, value));
     } else {
-      if (field.initializer != null) {
-        field.initializer.accept(this);
+      if (node.initializer != null) {
+        node.initializer.accept(this);
         HInstruction fieldValue = pop();
         HInstruction checkInstruction = typeBuilder.potentiallyCheckOrTrustType(
-            fieldValue, _getDartTypeIfValid(field.type));
+            fieldValue, _getDartTypeIfValid(node.type));
         stack.add(checkInstruction);
       } else {
         stack.add(graph.addConstantNull(closedWorld));
       }
       HInstruction value = pop();
       closeAndGotoExit(
-          new HReturn(value, _sourceInformationBuilder.buildReturn(field)));
+          new HReturn(value, _sourceInformationBuilder.buildReturn(node)));
     }
     closeFunction();
   }
@@ -344,16 +347,20 @@
   /// parameters.  If the class has type parameters but does not need them, bind
   /// to `dynamic` (represented as `null`) so the bindings are available for
   /// building types up the inheritance chain of generative constructors.
-  void _addClassTypeVariablesIfNeeded(ir.Member constructor) {
-    ir.Class enclosing = constructor.enclosingClass;
-    ClassEntity cls = _elementMap.getClass(enclosing);
-    bool needParameters;
-    enclosing.typeParameters.forEach((ir.TypeParameter typeParameter) {
-      TypeVariableType typeVariableType =
-          _elementMap.getDartType(new ir.TypeParameterType(typeParameter));
+  void _addClassTypeVariablesIfNeeded(MemberEntity member) {
+    if (!member.isConstructor && member is! ConstructorBodyEntity) {
+      return;
+    }
+    ClassEntity cls = member.enclosingClass;
+    InterfaceType thisType = _elementMap.elementEnvironment.getThisType(cls);
+    if (thisType.typeArguments.isEmpty) {
+      return;
+    }
+    bool needsRti = rtiNeed.classNeedsRti(cls);
+    thisType.typeArguments.forEach((DartType _typeVariable) {
+      TypeVariableType typeVariableType = _typeVariable;
       HInstruction param;
-      needParameters ??= rtiNeed.classNeedsRti(cls);
-      if (needParameters) {
+      if (needsRti) {
         param = addParameter(typeVariableType.element, commonMasks.nonNullType);
       } else {
         // Unused, so bind to `dynamic`.
@@ -391,34 +398,30 @@
   /// implication is that a class cannot be extended or mixed-in twice. If we in
   /// future support repeated uses of a mixin class, we should do so by cloning
   /// the mixin class in the Kernel input.
-  void buildConstructor(ir.Constructor constructor) {
+  void buildConstructor(ConstructorEntity constructor, ir.Constructor node) {
     SourceInformation sourceInformation =
-        _sourceInformationBuilder.buildCreate(constructor);
-    ir.Class constructedClass = constructor.enclosingClass;
+        _sourceInformationBuilder.buildCreate(node);
+    ClassEntity cls = constructor.enclosingClass;
 
     if (_inliningStack.isEmpty) {
-      openFunction(constructor.function);
+      openFunction(constructor, node.function);
     }
-    _addClassTypeVariablesIfNeeded(constructor);
-    _potentiallyAddFunctionParameterTypeChecks(constructor.function);
 
     // [fieldValues] accumulates the field initializer values, which may be
     // overwritten by initializer-list initializers.
-    Map<FieldEntity, HInstruction> fieldValues = <FieldEntity, HInstruction>{};
-    List<ir.Constructor> constructorChain = <ir.Constructor>[];
-    _buildInitializers(constructor, constructorChain, fieldValues);
+    ConstructorData constructorData = new ConstructorData();
+    _buildInitializers(node, constructorData);
 
     List<HInstruction> constructorArguments = <HInstruction>[];
     // Doing this instead of fieldValues.forEach because we haven't defined the
     // order of the arguments here. We can define that with JElements.
-    ClassEntity cls = _elementMap.getClass(constructedClass);
     bool isCustomElement = nativeData.isNativeOrExtendsNative(cls) &&
         !nativeData.isJsInteropClass(cls);
     InterfaceType thisType = _elementMap.elementEnvironment.getThisType(cls);
     List<FieldEntity> fields = <FieldEntity>[];
     _worldBuilder.forEachInstanceField(cls,
         (ClassEntity enclosingClass, FieldEntity member) {
-      var value = fieldValues[member];
+      HInstruction value = constructorData.fieldValues[member];
       if (value == null) {
         assert(isCustomElement || reporter.hasReportedError,
             'No initializer value for field ${member}');
@@ -431,6 +434,10 @@
       }
     });
 
+    addImplicitInstantiation(thisType);
+    List<DartType> instantiatedTypes =
+        new List<InterfaceType>.from(currentImplicitInstantiations);
+
     HInstruction newObject;
     if (isCustomElement) {
       // Bulk assign to the initialized fields.
@@ -450,10 +457,11 @@
         // Read the values of the type arguments and create a HTypeInfoExpression
         // to set on the newly create object.
         List<HInstruction> typeArguments = <HInstruction>[];
-        for (ir.DartType typeParameter
-            in constructedClass.thisType.typeArguments) {
-          HInstruction argument = localsHandler.readLocal(localsHandler
-              .getTypeVariableAsLocal(_elementMap.getDartType(typeParameter)));
+        InterfaceType thisType =
+            _elementMap.elementEnvironment.getThisType(cls);
+        for (DartType typeVariable in thisType.typeArguments) {
+          HInstruction argument = localsHandler
+              .readLocal(localsHandler.getTypeVariableAsLocal(typeVariable));
           typeArguments.add(argument);
         }
 
@@ -468,15 +476,15 @@
 
       newObject = new HCreate(cls, constructorArguments,
           new TypeMask.nonNullExact(cls, closedWorld), sourceInformation,
-          instantiatedTypes: <InterfaceType>[thisType],
-          hasRtiInput: hasRtiInput);
+          instantiatedTypes: instantiatedTypes, hasRtiInput: hasRtiInput);
 
       add(newObject);
     }
+    removeImplicitInstantiation(thisType);
 
     HInstruction interceptor;
     // Generate calls to the constructor bodies.
-    for (ir.Constructor body in constructorChain.reversed) {
+    for (ir.Constructor body in constructorData.constructorChain.reversed) {
       if (_isEmptyStatement(body.function.body)) continue;
 
       List<HInstruction> bodyCallInputs = <HInstruction>[];
@@ -492,9 +500,9 @@
       // Pass uncaptured arguments first, captured arguments in a box, then type
       // arguments.
 
-      ConstructorEntity constructorElement = _elementMap.getConstructor(body);
+      ConstructorEntity inlinedConstructor = _elementMap.getConstructor(body);
 
-      inlinedFrom(constructorElement, () {
+      inlinedFrom(inlinedConstructor, () {
         void handleParameter(ir.VariableDeclaration node) {
           Local parameter = localsMap.getLocalVariable(node);
           // If [parameter] is boxed, it will be a field in the box passed as
@@ -513,20 +521,20 @@
         // If there are locals that escape (i.e. mutated in closures), we pass the
         // box to the constructor.
         CapturedScope scopeData =
-            closureDataLookup.getCapturedScope(constructorElement);
+            closureDataLookup.getCapturedScope(inlinedConstructor);
         if (scopeData.requiresContextBox) {
           bodyCallInputs.add(localsHandler.readLocal(scopeData.context));
         }
 
         // Pass type arguments.
-        ir.Class currentClass = body.enclosingClass;
-        if (closedWorld.rtiNeed
-            .classNeedsRti(_elementMap.getClass(currentClass))) {
-          for (ir.DartType typeParameter
-              in currentClass.thisType.typeArguments) {
-            HInstruction argument = localsHandler.readLocal(
-                localsHandler.getTypeVariableAsLocal(
-                    _elementMap.getDartType(typeParameter)));
+        ClassEntity inlinedConstructorClass = inlinedConstructor.enclosingClass;
+        if (closedWorld.rtiNeed.classNeedsRti(inlinedConstructorClass)) {
+          InterfaceType thisType = _elementMap.elementEnvironment
+              .getThisType(inlinedConstructorClass);
+          for (DartType typeVariable in thisType.typeArguments) {
+            DartType result = localsHandler.substInContext(typeVariable);
+            HInstruction argument =
+                typeBuilder.analyzeTypeArgument(result, sourceElement);
             bodyCallInputs.add(argument);
           }
         }
@@ -534,15 +542,12 @@
         ConstructorBodyEntity constructorBody =
             _elementMap.getConstructorBody(body);
         if (!isCustomElement && // TODO(13836): Fix inlining.
-            _tryInlineMethod(constructorBody, null, null, bodyCallInputs,
-                constructor, sourceInformation)) {
+            _tryInlineMethod(constructorBody, null, null, bodyCallInputs, node,
+                sourceInformation)) {
           pop();
         } else {
-          _invokeConstructorBody(
-              body,
-              bodyCallInputs,
-              _sourceInformationBuilder
-                  .buildDeclaration(_elementMap.getMember(constructor)));
+          _invokeConstructorBody(body, bodyCallInputs,
+              _sourceInformationBuilder.buildDeclaration(constructor));
         }
       });
     }
@@ -584,10 +589,35 @@
 
   /// Collects the values for field initializers for the direct fields of
   /// [clazz].
-  void _collectFieldValues(
-      ir.Class clazz, Map<FieldEntity, HInstruction> fieldValues) {
+  void _collectFieldValues(ir.Class clazz, ConstructorData constructorData) {
+    void ensureTypeVariablesForInitializers(ClassEntity enclosingClass) {
+      if (!constructorData.includedClasses.add(enclosingClass)) return;
+      if (rtiNeed.classNeedsRti(enclosingClass)) {
+        // If [enclosingClass] needs RTI, we have to give a value to its type
+        // parameters. For a super constructor call, the type is the supertype
+        // of current class. For a redirecting constructor, the type is the
+        // current type. [LocalsHandler.substInContext] takes care of both.
+        InterfaceType thisType =
+            _elementMap.elementEnvironment.getThisType(enclosingClass);
+        InterfaceType type = localsHandler.substInContext(thisType);
+        List<DartType> arguments = type.typeArguments;
+        List<DartType> typeVariables = thisType.typeArguments;
+        assert(arguments.length == typeVariables.length);
+        Iterator<DartType> variables = typeVariables.iterator;
+        type.typeArguments.forEach((DartType argument) {
+          variables.moveNext();
+          TypeVariableType typeVariable = variables.current;
+          localsHandler.updateLocal(
+              localsHandler.getTypeVariableAsLocal(typeVariable),
+              typeBuilder.analyzeTypeArgument(argument, sourceElement));
+        });
+      }
+    }
+
     ClassEntity cls = _elementMap.getClass(clazz);
     _worldBuilder.forEachDirectInstanceField(cls, (FieldEntity field) {
+      ensureTypeVariablesForInitializers(field.enclosingClass);
+
       MemberDefinition definition = _elementMap.getMemberDefinition(field);
       ir.Field node;
       switch (definition.kind) {
@@ -601,7 +631,8 @@
         // Unassigned fields of native classes are not initialized to
         // prevent overwriting pre-initialized native properties.
         if (!nativeData.isNativeOrExtendsNative(cls)) {
-          fieldValues[field] = graph.addConstantNull(closedWorld);
+          constructorData.fieldValues[field] =
+              graph.addConstantNull(closedWorld);
         }
       } else if (node.initializer is! ir.NullLiteral ||
           !nativeData.isNativeClass(cls)) {
@@ -611,7 +642,7 @@
         // initializer.
         inlinedFrom(field, () {
           node.initializer.accept(this);
-          fieldValues[field] = pop();
+          constructorData.fieldValues[field] = pop();
         });
       }
     });
@@ -623,37 +654,35 @@
 
   /// Collects field initializers all the way up the inheritance chain.
   void _buildInitializers(
-      ir.Constructor constructor,
-      List<ir.Constructor> constructorChain,
-      Map<FieldEntity, HInstruction> fieldValues) {
+      ir.Constructor constructor, ConstructorData constructorData) {
     assert(
         _elementMap.getConstructor(constructor) == localsMap.currentMember,
         failedAt(
             localsMap.currentMember,
             'Expected ${localsMap.currentMember} '
             'but found ${_elementMap.getConstructor(constructor)}.'));
-    constructorChain.add(constructor);
+    constructorData.constructorChain.add(constructor);
 
     if (!isRedirectingConstructor(constructor)) {
       // Compute values for field initializers, but only if this is not a
       // redirecting constructor, since the target will compute the fields.
-      _collectFieldValues(constructor.enclosingClass, fieldValues);
+      _collectFieldValues(constructor.enclosingClass, constructorData);
     }
     var foundSuperOrRedirectCall = false;
     for (var initializer in constructor.initializers) {
       if (initializer is ir.FieldInitializer) {
         initializer.value.accept(this);
-        fieldValues[_elementMap.getField(initializer.field)] = pop();
+        constructorData.fieldValues[_elementMap.getField(initializer.field)] =
+            pop();
       } else if (initializer is ir.SuperInitializer) {
         assert(!foundSuperOrRedirectCall);
         foundSuperOrRedirectCall = true;
-        _inlineSuperInitializer(
-            initializer, constructorChain, fieldValues, constructor);
+        _inlineSuperInitializer(initializer, constructorData, constructor);
       } else if (initializer is ir.RedirectingInitializer) {
         assert(!foundSuperOrRedirectCall);
         foundSuperOrRedirectCall = true;
         _inlineRedirectingInitializer(
-            initializer, constructorChain, fieldValues, constructor);
+            initializer, constructorData, constructor);
       } else if (initializer is ir.LocalInitializer) {
         // LocalInitializer is like a let-expression that is in scope for the
         // rest of the initializers.
@@ -724,33 +753,11 @@
     return builtArguments;
   }
 
-  /// Creates localsHandler bindings for type parameters of a Supertype.
-  void _bindSupertypeTypeParameters(ir.Supertype supertype) {
-    ir.Class cls = supertype.classNode;
-    var parameters = cls.typeParameters;
-    var arguments = supertype.typeArguments;
-    assert(arguments.length == parameters.length);
-
-    for (int i = 0; i < parameters.length; i++) {
-      ir.DartType argument = arguments[i];
-      ir.TypeParameter parameter = parameters[i];
-
-      localsHandler.updateLocal(
-          localsHandler.getTypeVariableAsLocal(
-              _elementMap.getDartType(new ir.TypeParameterType(parameter))),
-          typeBuilder.analyzeTypeArgument(
-              _elementMap.getDartType(argument), sourceElement));
-    }
-  }
-
   /// Inlines the given redirecting [constructor]'s initializers by collecting
   /// its field values and building its constructor initializers. We visit super
   /// constructors all the way up to the [Object] constructor.
-  void _inlineRedirectingInitializer(
-      ir.RedirectingInitializer initializer,
-      List<ir.Constructor> constructorChain,
-      Map<FieldEntity, HInstruction> fieldValues,
-      ir.Constructor caller) {
+  void _inlineRedirectingInitializer(ir.RedirectingInitializer initializer,
+      ConstructorData constructorData, ir.Constructor caller) {
     var superOrRedirectConstructor = initializer.target;
     var arguments = _normalizeAndBuildArguments(
         superOrRedirectConstructor.function, initializer.arguments);
@@ -762,17 +769,14 @@
     // effective target, so we don't do it here.
 
     _inlineSuperOrRedirectCommon(initializer, superOrRedirectConstructor,
-        arguments, constructorChain, fieldValues, caller);
+        arguments, constructorData, caller);
   }
 
   /// Inlines the given super [constructor]'s initializers by collecting its
   /// field values and building its constructor initializers. We visit super
   /// constructors all the way up to the [Object] constructor.
-  void _inlineSuperInitializer(
-      ir.SuperInitializer initializer,
-      List<ir.Constructor> constructorChain,
-      Map<FieldEntity, HInstruction> fieldValues,
-      ir.Constructor caller) {
+  void _inlineSuperInitializer(ir.SuperInitializer initializer,
+      ConstructorData constructorData, ir.Constructor caller) {
     var target = initializer.target;
     var arguments =
         _normalizeAndBuildArguments(target.function, initializer.arguments);
@@ -781,40 +785,31 @@
     ir.Supertype supertype = callerClass.supertype;
 
     if (callerClass.mixedInType != null) {
-      _bindSupertypeTypeParameters(callerClass.mixedInType);
-      _collectFieldValues(callerClass.mixedInType.classNode, fieldValues);
+      _collectFieldValues(callerClass.mixedInType.classNode, constructorData);
     }
 
     // The class of the super-constructor may not be the supertype class. In
     // this case, we must go up the class hierarchy until we reach the class
     // containing the super-constructor.
     while (supertype.classNode != target.enclosingClass) {
-      _bindSupertypeTypeParameters(supertype);
-
-      if (supertype.classNode.mixedInType != null) {
-        _bindSupertypeTypeParameters(supertype.classNode.mixedInType);
-      }
-
       // Fields from unnamed mixin application classes (ie Object&Foo) get
       // "collected" with the regular supertype fields, so we must bind type
       // parameters from both the supertype and the supertype's mixin classes
       // before collecting the field values.
-      _collectFieldValues(supertype.classNode, fieldValues);
+      _collectFieldValues(supertype.classNode, constructorData);
       supertype = supertype.classNode.supertype;
     }
-    _bindSupertypeTypeParameters(supertype);
     supertype = supertype.classNode.supertype;
 
     _inlineSuperOrRedirectCommon(
-        initializer, target, arguments, constructorChain, fieldValues, caller);
+        initializer, target, arguments, constructorData, caller);
   }
 
   void _inlineSuperOrRedirectCommon(
       ir.Initializer initializer,
       ir.Constructor constructor,
       List<HInstruction> arguments,
-      List<ir.Constructor> constructorChain,
-      Map<FieldEntity, HInstruction> fieldValues,
+      ConstructorData constructorData,
       ir.Constructor caller) {
     var index = 0;
 
@@ -841,38 +836,30 @@
       localsHandler.scopeInfo = newScopeInfo;
       localsHandler.enterScope(closureDataLookup.getCapturedScope(element),
           _sourceInformationBuilder.buildDeclaration(element));
-      _buildInitializers(constructor, constructorChain, fieldValues);
+      _buildInitializers(constructor, constructorData);
     });
     localsHandler.scopeInfo = oldScopeInfo;
   }
 
   /// Builds generative constructor body.
   void buildConstructorBody(ir.Constructor constructor) {
-    openFunction(constructor.function);
-    _addClassTypeVariablesIfNeeded(constructor);
-    _potentiallyAddFunctionParameterTypeChecks(constructor.function);
+    openFunction(
+        _elementMap.getConstructorBody(constructor), constructor.function);
     constructor.function.body.accept(this);
     closeFunction();
   }
 
   /// Builds a SSA graph for FunctionNodes, found in FunctionExpressions and
   /// Procedures.
-  void buildFunctionNode(ir.FunctionNode functionNode) {
-    openFunction(functionNode);
-    ir.TreeNode parent = functionNode.parent;
-    if (parent is ir.Procedure && parent.kind == ir.ProcedureKind.Factory) {
-      _addClassTypeVariablesIfNeeded(parent);
-    }
-    _potentiallyAddFunctionParameterTypeChecks(functionNode);
+  void buildFunctionNode(
+      FunctionEntity function, ir.FunctionNode functionNode) {
+    openFunction(function, functionNode);
 
     // If [functionNode] is `operator==` we explicitly add a null check at the
     // beginning of the method. This is to avoid having call sites do the null
     // check.
-    if (parent is ir.Procedure &&
-        parent.kind == ir.ProcedureKind.Operator &&
-        parent.name.name == '==') {
-      FunctionEntity method = _elementMap.getMethod(parent);
-      if (!_commonElements.operatorEqHandlesNullArgument(method)) {
+    if (function.name == '==') {
+      if (!_commonElements.operatorEqHandlesNullArgument(function)) {
         handleIf(
             visitCondition: () {
               HParameterValue parameter = parameters.values.first;
@@ -921,14 +908,12 @@
   }
 
   /// Builds a SSA graph for FunctionNodes of external methods.
-  void buildExternalFunctionNode(ir.FunctionNode functionNode) {
+  void buildExternalFunctionNode(
+      FunctionEntity function, ir.FunctionNode functionNode) {
+    // TODO(johnniwinther): Non-js-interop external functions should
+    // throw a runtime error.
     assert(functionNode.body == null);
-    openFunction(functionNode);
-    ir.TreeNode parent = functionNode.parent;
-    if (parent is ir.Procedure && parent.kind == ir.ProcedureKind.Factory) {
-      _addClassTypeVariablesIfNeeded(parent);
-    }
-    _potentiallyAddFunctionParameterTypeChecks(functionNode);
+    openFunction(function, functionNode);
 
     if (closedWorld.nativeData.isNativeMember(targetElement)) {
       nativeEmitter.nativeMethods.add(targetElement);
@@ -1007,7 +992,7 @@
     }
   }
 
-  void openFunction([ir.FunctionNode function]) {
+  void openFunction(MemberEntity member, [ir.FunctionNode function]) {
     Map<Local, TypeMask> parameterMap = <Local, TypeMask>{};
     if (function != null) {
       void handleParameter(ir.VariableDeclaration node) {
@@ -1036,6 +1021,13 @@
     close(new HGoto()).addSuccessor(block);
 
     open(block);
+
+    _addClassTypeVariablesIfNeeded(member);
+    if (function != null) {
+      _potentiallyAddFunctionParameterTypeChecks(function);
+    }
+    _insertTraceCall(member);
+    _insertCoverageCall(member);
   }
 
   void closeFunction() {
@@ -1101,6 +1093,7 @@
   @override
   void visitBlock(ir.Block block) {
     assert(!isAborted());
+    if (!isReachable) return; // This can only happen when inlining.
     for (ir.Statement statement in block.statements) {
       statement.accept(this);
       if (!isReachable) {
@@ -2195,7 +2188,10 @@
       localsHandler = new LocalsHandler.from(savedLocals);
       buildSwitchCase(switchCase);
       if (!isAborted() &&
-          switchCase == switchCases.last &&
+          // TODO(johnniwinther): Reinsert this if `isReachable` is no longer
+          // set to `false` when `_tryInlineMethod` sees an always throwing
+          // method.
+          //switchCase == switchCases.last &&
           !isDefaultCase(switchCase)) {
         // If there is no default, we will add one later to avoid
         // the critical edge. So we generate a break statement to make
@@ -4016,6 +4012,7 @@
     TypeMask typeMask = new TypeMask.nonNullExact(cls, closedWorld);
     InterfaceType instanceType = _elementMap.createInterfaceType(
         target.enclosingClass, node.arguments.types);
+    instanceType = localsHandler.substInContext(instanceType);
 
     if (_checkAllTypeVariableBounds(
         constructor, instanceType, sourceInformation)) {
@@ -4038,7 +4035,6 @@
     if (closedWorld.rtiNeed.classNeedsRti(cls)) {
       _addTypeArguments(arguments, node.arguments, sourceInformation);
     }
-    instanceType = localsHandler.substInContext(instanceType);
     addImplicitInstantiation(instanceType);
     _pushStaticInvocation(constructor, arguments, typeMask,
         sourceInformation: sourceInformation, instanceType: instanceType);
@@ -4266,7 +4262,6 @@
    * Try to inline [element] within the correct context of the builder. The
    * insertion point is the state of the builder.
    */
-  // TODO(redemption): Use this.
   bool _tryInlineMethod(
       FunctionEntity function,
       Selector selector,
@@ -4275,9 +4270,8 @@
       ir.Node currentNode,
       SourceInformation sourceInformation,
       {InterfaceType instanceType}) {
-    // TODO(johnniwinther,sra): Remove this when inlining is more mature.
-    if (function.library.canonicalUri.scheme == 'dart') {
-      // Temporarily disable inlining of platform libraries.
+    if (function.isExternal) {
+      // Don't inline external methods; these should just fail at runtime.
       return false;
     }
 
@@ -4336,6 +4330,10 @@
       // so we should not query for its type.
       if (function is! ConstructorBodyEntity) {
         if (globalInferenceResults.resultOfMember(function).throwsAlways) {
+          // TODO(johnniwinther): It seems wrong to set `isReachable` to `false`
+          // since we are _not_ going to inline [function]. This has
+          // implications in switch cases where we might need to insert a
+          // `break` that was skipped due to `isReachable` being `false`.
           isReachable = false;
           return false;
         }
@@ -4684,7 +4682,7 @@
     MemberDefinition definition = _elementMap.getMemberDefinition(function);
     switch (definition.kind) {
       case MemberKind.constructor:
-        buildConstructor(definition.node);
+        buildConstructor(function, definition.node);
         return;
       case MemberKind.constructorBody:
         ir.Constructor constructor = definition.node;
@@ -4730,7 +4728,7 @@
     return _allInlinedFunctionsCalledOnce && _isFunctionCalledOnce(element);
   }
 
-  void _insertTraceCall(FunctionEntity element) {
+  void _insertTraceCall(MemberEntity element) {
     if (JavaScriptBackend.TRACE_METHOD == 'console') {
       if (element == commonElements.traceHelper) return;
       n(e) => e == null ? '' : e.name;
@@ -4742,7 +4740,7 @@
     }
   }
 
-  void _insertCoverageCall(FunctionEntity element) {
+  void _insertCoverageCall(MemberEntity element) {
     if (JavaScriptBackend.TRACE_METHOD == 'post') {
       if (element == commonElements.traceHelper) return;
       // TODO(sigmund): create a better uuid for elements.
@@ -4756,6 +4754,19 @@
   }
 }
 
+/// Data collected to create a constructor.
+class ConstructorData {
+  /// Inlined (super) constructors.
+  final List<ir.Constructor> constructorChain = <ir.Constructor>[];
+
+  /// Initial values for all instance fields.
+  final Map<FieldEntity, HInstruction> fieldValues =
+      <FieldEntity, HInstruction>{};
+
+  /// Classes for which type variables have been prepared.
+  final Set<ClassEntity> includedClasses = new Set<ClassEntity>();
+}
+
 class KernelInliningState {
   final FunctionEntity function;
   final Local oldReturnLocal;
@@ -4798,6 +4809,13 @@
     InlineWeeder visitor = new InlineWeeder(maxInliningNodes, allowLoops);
     ir.FunctionNode node = getFunctionNode(elementMap, function);
     node.accept(visitor);
+    if (function.isConstructor) {
+      MemberDefinition definition = elementMap.getMemberDefinition(function);
+      ir.Node node = definition.node;
+      if (node is ir.Constructor) {
+        node.initializers.forEach((n) => n.accept(visitor));
+      }
+    }
     return visitor.tooDifficultReason;
   }
 
@@ -4831,17 +4849,22 @@
   }
 
   visitReturnStatement(ir.ReturnStatement node) {
+    if (!registerNode()) return;
     if (seenReturn) {
       tooDifficultReason = 'code after return';
-    } else {
-      seenReturn = true;
+      return;
     }
+    node.visitChildren(this);
+    seenReturn = true;
   }
 
   visitThrow(ir.Throw node) {
+    if (!registerNode()) return;
     if (seenReturn) {
       tooDifficultReason = 'code after return';
+      return;
     }
+    node.visitChildren(this);
   }
 
   _handleLoop() {
diff --git a/pkg/compiler/lib/src/ssa/kernel_impact.dart b/pkg/compiler/lib/src/ssa/kernel_impact.dart
index 8853267..9f3166d 100644
--- a/pkg/compiler/lib/src/ssa/kernel_impact.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart
@@ -43,7 +43,7 @@
   KernelImpactBuilder(this.elementMap, this.currentMember, this.reporter)
       : this.impactBuilder =
             new ResolutionWorldImpactBuilder('${currentMember.name}') {
-    this.classEnsurer = new _ClassEnsurer(this);
+    this.classEnsurer = new _ClassEnsurer(this, this.elementMap.types);
   }
 
   CommonElements get commonElements => elementMap.commonElements;
@@ -656,10 +656,13 @@
 
 class _ClassEnsurer extends BaseDartTypeVisitor<dynamic, Null> {
   final KernelImpactBuilder builder;
+  final DartTypes types;
+  final seenTypes = new Set<InterfaceType>();
 
-  _ClassEnsurer(this.builder);
+  _ClassEnsurer(this.builder, this.types);
 
   void ensureClassesInType(DartType type) {
+    seenTypes.clear();
     type.accept(this, null);
   }
 
@@ -682,10 +685,15 @@
 
   @override
   visitInterfaceType(InterfaceType type, _) {
+    if (!seenTypes.add(type)) {
+      return;
+    }
     builder.impactBuilder.registerSeenClass(type.element);
     type.typeArguments.forEach((t) {
       t.accept(this, null);
     });
+    var supertype = types.getSupertype(type.element);
+    supertype?.accept(this, null);
   }
 
   @override
diff --git a/pkg/compiler/lib/src/ssa/locals_handler.dart b/pkg/compiler/lib/src/ssa/locals_handler.dart
index 5b33fe2..6626095 100644
--- a/pkg/compiler/lib/src/ssa/locals_handler.dart
+++ b/pkg/compiler/lib/src/ssa/locals_handler.dart
@@ -76,7 +76,6 @@
   /// Substituted type variables occurring in [type] into the context of
   /// [contextClass].
   DartType substInContext(DartType type) {
-    //DartType input = type;
     DartType newType = type;
     if (instanceType != null) {
       ClassEntity typeContext = DartTypes.getClassContext(newType);
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index fdc4754..767e633 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -10,7 +10,6 @@
 import '../constants/values.dart';
 import '../common_elements.dart' show CommonElements;
 import '../elements/entities.dart';
-import '../elements/resolution_types.dart';
 import '../elements/types.dart';
 import '../js/js.dart' as js;
 import '../js_backend/backend.dart';
@@ -1305,7 +1304,7 @@
         HInstruction selectTypeArgumentFromObjectCreation(int index)) {
       InterfaceType thisType = _closedWorld.dartTypes.getThisType(createdClass);
 
-      HInstruction instructionForTypeVariable(ResolutionTypeVariableType tv) {
+      HInstruction instructionForTypeVariable(TypeVariableType tv) {
         return selectTypeArgumentFromObjectCreation(
             thisType.typeArguments.indexOf(tv));
       }
diff --git a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
index c9bd25e..030011b 100644
--- a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
@@ -3078,6 +3078,17 @@
       var member = _emitMemberName(name,
           isStatic: isStatic, type: type, element: accessor);
 
+      // A static native element should just forward directly to the
+      // JS type's member.
+      if (isStatic && _isExternal(element)) {
+        var nativeName = getAnnotationName(classElem, isNativeAnnotation);
+        if (nativeName != null) {
+          var memberName = getAnnotationName(element, isJSName) ?? member;
+          return js
+              .call('#.#.#', [_callHelper('global'), nativeName, memberName]);
+        }
+      }
+
       // For instance members, we add implicit-this.
       // For method tear-offs, we ensure it's a bound method.
       if (element is MethodElement &&
diff --git a/pkg/dev_compiler/lib/src/kernel/source_map_printer.dart b/pkg/dev_compiler/lib/src/kernel/source_map_printer.dart
index dafae50..6e47bd9 100644
--- a/pkg/dev_compiler/lib/src/kernel/source_map_printer.dart
+++ b/pkg/dev_compiler/lib/src/kernel/source_map_printer.dart
@@ -54,10 +54,11 @@
 
       if (srcInfo is FileUriNode) {
         parentsStack.add(srcInfo);
-        if (srcInfo is Procedure || srcInfo is Class) mark = false;
-      } else if (srcInfo is Constructor) {
-        parentsStack.add(srcInfo.parent);
-        mark = false;
+        if (srcInfo is Procedure ||
+            srcInfo is Class ||
+            srcInfo is Constructor) {
+          mark = false;
+        }
       }
       if (mark && srcInfo is Block) mark = false;
     } else {
@@ -94,8 +95,6 @@
 
     if (srcInfo is FileUriNode) {
       parentsStack.removeLast();
-    } else if (srcInfo is Constructor) {
-      parentsStack.removeLast();
     }
   }
 
@@ -113,8 +112,14 @@
     FileUriNode fileParent = parentsStack.last;
     Program p = fileParent.enclosingProgram;
     Uri fileUri = fileParent.fileUri;
+    while (fileUri == null && fileParent.parent is FileUriNode) {
+      fileParent = fileParent.parent;
+      fileUri = fileParent.fileUri;
+    }
+    if (fileUri == null) return;
 
     var loc = p.getLocation(fileUri, offset);
+    if (loc == null) return;
     _previousLine = _line;
     _previousColumn = adjustedColumn;
     sourceMap.addLocation(
diff --git a/pkg/dev_compiler/test/sourcemap/ddc_common.dart b/pkg/dev_compiler/test/sourcemap/ddc_common.dart
index 6207547..78c653f 100644
--- a/pkg/dev_compiler/test/sourcemap/ddc_common.dart
+++ b/pkg/dev_compiler/test/sourcemap/ddc_common.dart
@@ -4,16 +4,21 @@
 
 import 'dart:io';
 
+import 'package:front_end/src/api_unstable/ddc.dart' as fe;
 import 'package:path/path.dart' as path;
 import 'package:sourcemap_testing/src/annotated_code_helper.dart';
 import 'package:sourcemap_testing/src/stacktrace_helper.dart';
-import 'package:testing/testing.dart';
 import 'package:sourcemap_testing/src/stepping_helper.dart';
+import 'package:testing/testing.dart';
 
 import 'common.dart';
 
 abstract class DdcRunner {
-  ProcessResult runDDC(Uri inputFile, Uri outputFile, Uri outWrapperPath);
+  Future<Null> runDDC(Uri inputFile, Uri outputFile, Uri outWrapperPath);
+}
+
+abstract class WithCompilerState {
+  fe.InitializedCompilerState compilerState;
 }
 
 class Compile extends Step<Data, Data, ChainContext> {
@@ -37,7 +42,7 @@
     var outputFile = outDirUri.resolve(outputFilename);
     var outWrapperPath = outDirUri.resolve("wrapper.js");
 
-    ddcRunner.runDDC(testFile, outputFile, outWrapperPath);
+    await ddcRunner.runDDC(testFile, outputFile, outWrapperPath);
 
     return pass(data);
   }
@@ -66,7 +71,8 @@
 
   Future<bool> _compile(String input, String output) async {
     var outWrapperPath = _getWrapperPathFromDirectoryFile(new Uri.file(input));
-    ddcRunner.runDDC(new Uri.file(input), new Uri.file(output), outWrapperPath);
+    await ddcRunner.runDDC(
+        new Uri.file(input), new Uri.file(output), outWrapperPath);
     return true;
   }
 
diff --git a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart
index 513b64b..684aadc 100644
--- a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart
@@ -4,6 +4,7 @@
 
 import 'dart:io';
 
+import 'package:dev_compiler/src/analyzer/command.dart';
 import 'package:testing/testing.dart';
 
 import 'common.dart';
@@ -37,7 +38,7 @@
 
   const RunDdc([this.debugging = false]);
 
-  ProcessResult runDDC(Uri inputFile, Uri outputFile, Uri outWrapperFile) {
+  Future<Null> runDDC(Uri inputFile, Uri outputFile, Uri outWrapperFile) async {
     Uri outDir = outputFile.resolve(".");
     String outputFilename = outputFile.pathSegments.last;
 
@@ -47,11 +48,8 @@
     File ddcSdkSummary = findInOutDir("gen/utils/dartdevc/ddc_sdk.sum");
 
     var ddc = getDdcDir().uri.resolve("bin/dartdevc.dart");
-    if (!new File.fromUri(ddc).existsSync())
-      throw "Couldn't find 'bin/dartdevc.dart'";
 
     List<String> args = <String>[
-      ddc.toFilePath(),
       "--modules=es6",
       "--dart-sdk-summary=${ddcSdkSummary.path}",
       "--library-root",
@@ -62,12 +60,11 @@
       outputFile.toFilePath(),
       inputFile.toFilePath()
     ];
-    ProcessResult runResult = Process.runSync(dartExecutable, args);
-    if (runResult.exitCode != 0) {
-      print(runResult.stderr);
-      print(runResult.stdout);
-      throw "Exit code: ${runResult.exitCode} from ddc when running "
-          "$dartExecutable "
+
+    var exitCode = compile(args);
+    if (exitCode != 0) {
+      throw "Exit code: $exitCode from ddc when running something like "
+          "$dartExecutable ${ddc.toFilePath()} "
           "${args.reduce((value, element) => '$value "$element"')}";
     }
 
@@ -85,8 +82,6 @@
         inputFileName.substring(0, inputFileName.lastIndexOf("."));
     new File.fromUri(outWrapperFile).writeAsStringSync(
         getWrapperContent(jsSdkPath, inputFileNameNoExt, outputFilename));
-
-    return runResult;
   }
 }
 
diff --git a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
index 7bc4e79..9ce07ce 100644
--- a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
@@ -2,8 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:async';
 import 'dart:io';
 
+import 'package:dev_compiler/src/kernel/command.dart';
+import 'package:front_end/src/api_unstable/ddc.dart' as fe;
+import 'package:sourcemap_testing/src/stepping_helper.dart';
 import 'package:testing/testing.dart';
 
 import 'common.dart';
@@ -14,8 +18,11 @@
   return new SourceMapContext(environment);
 }
 
-class SourceMapContext extends ChainContextWithCleanupHelper {
+class SourceMapContext extends ChainContextWithCleanupHelper
+    implements WithCompilerState {
   final Map<String, String> environment;
+  fe.InitializedCompilerState compilerState;
+
   SourceMapContext(this.environment);
 
   List<Step> _steps;
@@ -23,9 +30,9 @@
   List<Step> get steps {
     return _steps ??= <Step>[
       const Setup(),
-      new Compile(new RunDdc(environment.containsKey("debug"))),
+      new Compile(new RunDdc(this, debugging())),
       const StepWithD8(),
-      new CheckSteps(environment.containsKey("debug")),
+      new CheckSteps(debugging()),
     ];
   }
 
@@ -33,11 +40,12 @@
 }
 
 class RunDdc implements DdcRunner {
+  final WithCompilerState context;
   final bool debugging;
 
-  const RunDdc([this.debugging = false]);
+  const RunDdc(this.context, [this.debugging = false]);
 
-  ProcessResult runDDC(Uri inputFile, Uri outputFile, Uri outWrapperFile) {
+  Future<Null> runDDC(Uri inputFile, Uri outputFile, Uri outWrapperFile) async {
     Uri outDir = outputFile.resolve(".");
     String outputFilename = outputFile.pathSegments.last;
 
@@ -47,23 +55,30 @@
     File ddcSdkSummary = findInOutDir("gen/utils/dartdevc/ddc_sdk.dill");
 
     var ddc = getDdcDir().uri.resolve("bin/dartdevk.dart");
-    if (!new File.fromUri(ddc).existsSync())
-      throw "Couldn't find 'bin/dartdevk.dart'";
 
     List<String> args = <String>[
-      ddc.toFilePath(),
+      "--packages=${sdkRoot.uri.resolve(".packages").toFilePath()}",
       "--modules=es6",
       "--dart-sdk-summary=${ddcSdkSummary.path}",
       "-o",
       outputFile.toFilePath(),
       inputFile.toFilePath()
     ];
-    ProcessResult runResult = Process.runSync(dartExecutable, args);
-    if (runResult.exitCode != 0) {
-      print(runResult.stderr);
-      print(runResult.stdout);
-      throw "Exit code: ${runResult.exitCode} from ddc when running "
-          "$dartExecutable "
+
+    bool succeeded = false;
+    try {
+      var result = await compile(args, compilerState: context.compilerState);
+      context.compilerState = result.compilerState;
+      succeeded = result.result;
+    } catch (e, s) {
+      print('Unhandled exception:');
+      print(e);
+      print(s);
+    }
+
+    if (!succeeded) {
+      throw "Error from ddc when executing with something like "
+          "$dartExecutable ${ddc.toFilePath()} "
           "${args.reduce((value, element) => '$value "$element"')}";
     }
 
@@ -81,8 +96,6 @@
         inputFileName.substring(0, inputFileName.lastIndexOf("."));
     new File.fromUri(outWrapperFile).writeAsStringSync(
         getWrapperContent(jsSdkPath, inputFileNameNoExt, outputFilename));
-
-    return runResult;
   }
 }
 
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart
index 43f05df..5e5b50a 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart
@@ -1,3 +1,4 @@
+import 'package:front_end/src/api_unstable/ddc.dart' as fe;
 import 'package:testing/testing.dart';
 
 import 'common.dart';
@@ -9,13 +10,20 @@
   return new StackTraceContext();
 }
 
-class StackTraceContext extends ChainContextWithCleanupHelper {
-  final List<Step> steps = <Step>[
-    const Setup(),
-    const SetCwdToSdkRoot(),
-    const TestStackTrace(
-        const ddk.RunDdc(false), "ddk.", const ["ddk.", "ddc."]),
-  ];
+class StackTraceContext extends ChainContextWithCleanupHelper
+    implements WithCompilerState {
+  fe.InitializedCompilerState compilerState;
+
+  List<Step> _steps;
+
+  List<Step> get steps {
+    return _steps ??= <Step>[
+      const Setup(),
+      const SetCwdToSdkRoot(),
+      new TestStackTrace(
+          new ddk.RunDdc(this, false), "ddk.", const ["ddk.", "ddc."]),
+    ];
+  }
 }
 
 main(List<String> arguments) => runMe(arguments, createContext, "testing.json");
diff --git a/pkg/dev_compiler/tool/build_sdk.sh b/pkg/dev_compiler/tool/build_sdk.sh
index b25f30a..62c012d 100755
--- a/pkg/dev_compiler/tool/build_sdk.sh
+++ b/pkg/dev_compiler/tool/build_sdk.sh
@@ -6,10 +6,10 @@
 echo "*** Patching SDK"
 { # Try
   dart -c tool/patch_sdk.dart ../.. tool/input_sdk gen/patched_sdk \
-      > tool/sdk_expected_errors.txt
+      > gen/sdk_analyzer_errors.txt
 } || { # Catch
   # Show errors if the sdk didn't compile.
-  cat tool/sdk_expected_errors.txt
+  cat gen/sdk_analyzer_errors.txt
   exit 1
 }
 
@@ -31,9 +31,9 @@
       -o gen/sdk/common/dart_sdk.js \
       --modules=legacy \
       -o gen/sdk/legacy/dart_sdk.js \
-      "$@" > tool/sdk_expected_errors.txt
+      "$@" > gen/sdk_analyzer_errors.txt
 } || { # Catch
   # Show errors if the sdk didn't compile.
-  cat tool/sdk_expected_errors.txt
+  cat gen/sdk_analyzer_errors.txt
   exit 1
 }
diff --git a/pkg/dev_compiler/tool/ddc b/pkg/dev_compiler/tool/ddc
index 1caca36..1d30ae3 100755
--- a/pkg/dev_compiler/tool/ddc
+++ b/pkg/dev_compiler/tool/ddc
@@ -29,7 +29,7 @@
 fi
 
 if [ "$KERNEL" = true ]; then
-  dart -c $DDC_PATH/bin/dartdevk.dart \
+  dart -c $DDC_PATH/bin/dartdevk.dart --modules=node \
       -o $BASENAME.js $*
 else
   dart -c $DDC_PATH/bin/dartdevc.dart --modules=node --library-root=$LIBROOT \
diff --git a/pkg/dev_compiler/tool/ddw b/pkg/dev_compiler/tool/ddw
index 8d2442f..9169c84 100755
--- a/pkg/dev_compiler/tool/ddw
+++ b/pkg/dev_compiler/tool/ddw
@@ -30,7 +30,7 @@
 fi
 
 if [ "$KERNEL" = true ]; then
-  dart -c $DDC_PATH/bin/dartdevk.dart \
+  dart -c $DDC_PATH/bin/dartdevk.dart --modules=node \
       -o $BASENAME.js $*
 else
   dart -c $DDC_PATH/bin/dartdevc.dart --modules=node --library-root=$LIBROOT \
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart
index 133f070..2955ef8 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart
@@ -327,6 +327,14 @@
       jsType, _setterSig, JS('', '() => #[#]', dartExtType, _setterSig));
 }
 
+/// Apply the previously registered extension to the type of [nativeObject].
+/// This is intended for types that are not available to polyfill at startup.
+applyExtension(name, nativeObject) {
+  var dartExtType = JS('', '#.get(#)', _extensionMap, name);
+  var jsType = JS('', '#.constructor', nativeObject);
+  _applyExtension(jsType, dartExtType);
+}
+
 /// Apply all registered extensions to a window.  This is intended for
 /// different frames, where registrations need to be reapplied.
 applyAllExtensions(global) {
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/generators.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/generators.dart
index 6fdf32f..dc2d82e 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/generators.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/generators.dart
@@ -156,6 +156,7 @@
           () => {
         this.isAdding = false;
         this.scheduleGenerator();
+        if (!this.isScheduled) this.isSuspendedAtYield = true;
       }, { onError: (e, s) => this.throwError(e, s) });
     }
 
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
index 92dddf2..e85d898 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
@@ -94,7 +94,7 @@
     var raw = _rawJSType();
     if (raw != null) return raw;
     _warn('Cannot find native JavaScript type ($_dartName) for type check');
-    return _dynamic;
+    return JS('', '#.Object', global_);
   }
 
   @JSExportName('is')
diff --git a/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart b/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
index f815459..4adfd4f 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
@@ -837,6 +837,11 @@
   }
 }
 
+/// Expose browser JS classes.
+void applyExtension(name, nativeObject) {
+  dart.applyExtension(name, nativeObject);
+}
+
 /// Used internally by DDC to map ES6 symbols to Dart.
 class PrivateSymbol implements Symbol {
   // TODO(jmesserly): could also get this off the native symbol instead of
diff --git a/pkg/dev_compiler/tool/sdk_expected_errors.txt b/pkg/dev_compiler/tool/sdk_expected_errors.txt
deleted file mode 100644
index cd24172..0000000
--- a/pkg/dev_compiler/tool/sdk_expected_errors.txt
+++ /dev/null
@@ -1,85 +0,0 @@
-[warning] The final variable 'length' must be initialized. (dart:_interceptors/js_string.dart, line 15, col 9)
-[warning] The final variable 'origin' must be initialized. (dart:html, line 193, col 3)
-[warning] The final variable 'origin' must be initialized. (dart:html, line 863, col 3)
-[warning] The final variables 'form', 'labels' and '3' more must be initialized. (dart:html, line 1679, col 3)
-[warning] The final variable 'options' must be initialized. (dart:html, line 8979, col 3)
-[warning] The final variables '_attributes', '_childElementCount' and '19' more must be initialized. (dart:html, line 13235, col 3)
-[warning] The final variables 'elements', 'form' and '4' more must be initialized. (dart:html, line 17108, col 3)
-[warning] The final variable 'length' must be initialized. (dart:html, line 18058, col 3)
-[warning] The final variables '_get_contentWindow' and 'sandbox' must be initialized. (dart:html, line 20770, col 3)
-[warning] The final variables 'complete', 'currentSrc' and '2' more must be initialized. (dart:html, line 20977, col 3)
-[warning] The final variables '_get_valueAsDate', 'entries' and '6' more must be initialized. (dart:html, line 21142, col 3)
-[warning] The final variables 'form', 'labels' and '4' more must be initialized. (dart:html, line 22352, col 3)
-[warning] The final variables 'control' and 'form' must be initialized. (dart:html, line 22499, col 3)
-[warning] The final variable 'form' must be initialized. (dart:html, line 22538, col 3)
-[warning] The final variables 'import', 'relList' and '2' more must be initialized. (dart:html, line 22627, col 3)
-[warning] The final variable 'areas' must be initialized. (dart:html, line 22790, col 3)
-[warning] The final variables 'audioDecodedByteCount', 'audioTracks' and '16' more must be initialized. (dart:html, line 23091, col 3)
-[warning] The final variable 'labels' must be initialized. (dart:html, line 24685, col 3)
-[warning] The final variables 'baseUri', 'childNodes' and '11' more must be initialized. (dart:html, line 26229, col 3)
-[warning] The final variables 'form', 'validationMessage' and '2' more must be initialized. (dart:html, line 27181, col 3)
-[warning] The final variables 'form' and 'index' must be initialized. (dart:html, line 27363, col 3)
-[warning] The final variables 'form', 'htmlFor' and '5' more must be initialized. (dart:html, line 27417, col 3)
-[warning] The final variables 'labels' and 'position' must be initialized. (dart:html, line 28979, col 3)
-[warning] The final variables 'form', 'labels' and '4' more must be initialized. (dart:html, line 30908, col 3)
-[warning] The final variable 'sheet' must be initialized. (dart:html, line 33383, col 3)
-[warning] The final variable 'cellIndex' must be initialized. (dart:html, line 33648, col 3)
-[warning] The final variables '_rows' and '_tBodies' must be initialized. (dart:html, line 33767, col 3)
-[warning] The final variables '_cells', 'rowIndex' and '1' more must be initialized. (dart:html, line 33884, col 3)
-[warning] The final variable '_rows' must be initialized. (dart:html, line 33953, col 3)
-[warning] The final variable 'content' must be initialized. (dart:html, line 33997, col 3)
-[warning] The final variables 'form', 'labels' and '5' more must be initialized. (dart:html, line 34086, col 3)
-[warning] The final variables 'readyState' and 'track' must be initialized. (dart:html, line 35146, col 3)
-[warning] The final variables 'decodedFrameCount', 'droppedFrameCount' and '2' more must be initialized. (dart:html, line 36053, col 3)
-[warning] The final variable 'sourceCapabilities' must be initialized. (dart:html, line 46029, col 3)
-[warning] The final variables 'href' and 'target' must be initialized. (dart:svg, line 56, col 3)
-[warning] The final variables 'requiredExtensions', 'requiredFeatures' and '2' more must be initialized. (dart:svg, line 512, col 3)
-[warning] The final variables 'cx', 'cy' and '1' more must be initialized. (dart:svg, line 583, col 3)
-[warning] The final variable 'clipPathUnits' must be initialized. (dart:svg, line 620, col 3)
-[warning] The final variables 'cx', 'cy' and '2' more must be initialized. (dart:svg, line 719, col 3)
-[warning] The final variables 'height', 'in1' and '6' more must be initialized. (dart:svg, line 765, col 3)
-[warning] The final variables 'height', 'in1' and '6' more must be initialized. (dart:svg, line 858, col 3)
-[warning] The final variables 'height', 'in1' and '4' more must be initialized. (dart:svg, line 947, col 3)
-[warning] The final variables 'height', 'in1' and '10' more must be initialized. (dart:svg, line 999, col 3)
-[warning] The final variables 'bias', 'divisor' and '15' more must be initialized. (dart:svg, line 1107, col 3)
-[warning] The final variables 'diffuseConstant', 'height' and '8' more must be initialized. (dart:svg, line 1228, col 3)
-[warning] The final variables 'height', 'in1' and '8' more must be initialized. (dart:svg, line 1305, col 3)
-[warning] The final variables 'azimuth' and 'elevation' must be initialized. (dart:svg, line 1401, col 3)
-[warning] The final variables 'height', 'result' and '3' more must be initialized. (dart:svg, line 1444, col 3)
-[warning] The final variables 'height', 'in1' and '6' more must be initialized. (dart:svg, line 1637, col 3)
-[warning] The final variables 'height', 'href' and '5' more must be initialized. (dart:svg, line 1710, col 3)
-[warning] The final variables 'height', 'result' and '3' more must be initialized. (dart:svg, line 1777, col 3)
-[warning] The final variable 'in1' must be initialized. (dart:svg, line 1833, col 3)
-[warning] The final variables 'height', 'in1' and '7' more must be initialized. (dart:svg, line 1867, col 3)
-[warning] The final variables 'dx', 'dy' and '6' more must be initialized. (dart:svg, line 1947, col 3)
-[warning] The final variables 'x', 'y' and '1' more must be initialized. (dart:svg, line 2015, col 3)
-[warning] The final variables 'height', 'in1' and '9' more must be initialized. (dart:svg, line 2062, col 3)
-[warning] The final variables 'limitingConeAngle', 'pointsAtX' and '6' more must be initialized. (dart:svg, line 2144, col 3)
-[warning] The final variables 'height', 'in1' and '4' more must be initialized. (dart:svg, line 2211, col 3)
-[warning] The final variables 'baseFrequencyX', 'baseFrequencyY' and '9' more must be initialized. (dart:svg, line 2272, col 3)
-[warning] The final variables 'filterUnits', 'height' and '5' more must be initialized. (dart:svg, line 2376, col 3)
-[warning] The final variables 'height', 'width' and '2' more must be initialized. (dart:svg, line 2479, col 3)
-[warning] The final variables 'farthestViewportElement', 'nearestViewportElement' and '4' more must be initialized. (dart:svg, line 2574, col 3)
-[warning] The final variables 'height', 'href' and '4' more must be initialized. (dart:svg, line 2648, col 3)
-[warning] The final variables 'x1', 'x2' and '2' more must be initialized. (dart:svg, line 2882, col 3)
-[warning] The final variables 'x1', 'x2' and '2' more must be initialized. (dart:svg, line 2923, col 3)
-[warning] The final variables 'markerHeight', 'markerUnits' and '7' more must be initialized. (dart:svg, line 2964, col 3)
-[warning] The final variables 'height', 'maskContentUnits' and '7' more must be initialized. (dart:svg, line 3059, col 3)
-[warning] The final variable 'pathLength' must be initialized. (dart:svg, line 3343, col 3)
-[warning] The final variables 'height', 'href' and '11' more must be initialized. (dart:svg, line 3385, col 3)
-[warning] The final variables 'animatedPoints' and 'points' must be initialized. (dart:svg, line 3550, col 3)
-[warning] The final variables 'animatedPoints' and 'points' must be initialized. (dart:svg, line 3583, col 3)
-[warning] The final variables 'cx', 'cy' and '4' more must be initialized. (dart:svg, line 3694, col 3)
-[warning] The final variables 'height', 'rx' and '4' more must be initialized. (dart:svg, line 3773, col 3)
-[warning] The final variable 'href' must be initialized. (dart:svg, line 3822, col 3)
-[warning] The final variable 'gradientOffset' must be initialized. (dart:svg, line 3890, col 3)
-[warning] The final variable 'sheet' must be initialized. (dart:svg, line 4022, col 3)
-[warning] The final variables 'ownerSvgElement' and 'viewportElement' must be initialized. (dart:svg, line 4536, col 3)
-[warning] The final variables 'currentTranslate', 'currentView' and '8' more must be initialized. (dart:svg, line 4880, col 3)
-[warning] The final variables 'preserveAspectRatio' and 'viewBox' must be initialized. (dart:svg, line 5086, col 3)
-[warning] The final variables 'lengthAdjust' and 'textLength' must be initialized. (dart:svg, line 5160, col 3)
-[warning] The final variables 'href', 'method' and '2' more must be initialized. (dart:svg, line 5261, col 3)
-[warning] The final variables 'dx', 'dy' and '3' more must be initialized. (dart:svg, line 5323, col 3)
-[warning] The final variables 'height', 'href' and '3' more must be initialized. (dart:svg, line 5622, col 3)
-[warning] The final variables 'preserveAspectRatio', 'viewBox' and '1' more must be initialized. (dart:svg, line 5669, col 3)
-[warning] The final variables 'gradientTransform', 'gradientUnits' and '2' more must be initialized. (dart:svg, line 5827, col 3)
diff --git a/pkg/expect/lib/expect.dart b/pkg/expect/lib/expect.dart
index 86cea6b..020e409 100644
--- a/pkg/expect/lib/expect.dart
+++ b/pkg/expect/lib/expect.dart
@@ -497,6 +497,15 @@
         f, (error) => error is UnsupportedError, reason ?? "UnsupportedError");
   }
 
+  /// Reports that there is an error in the test itself and not the code under
+  /// test.
+  ///
+  /// It may be using the expect API incorrectly or failing some other
+  /// invariant that the test expects to be true.
+  static void testError(String message) {
+    _fail("Test error: $message");
+  }
+
   static String _getMessage(String reason) =>
       (reason == null) ? "" : ", '$reason'";
 
diff --git a/pkg/expect/lib/minitest.dart b/pkg/expect/lib/minitest.dart
index d3057c2..d3f2ce6 100644
--- a/pkg/expect/lib/minitest.dart
+++ b/pkg/expect/lib/minitest.dart
@@ -21,6 +21,7 @@
 ///
 /// Eventually, it would be good to refactor those tests to use the expect
 /// package directly and remove this.
+import 'dart:async';
 
 import 'package:expect/expect.dart';
 
@@ -77,7 +78,10 @@
   _groups.add(new _Group());
 
   try {
-    body();
+    var result = body();
+    if (result is Future) {
+      Expect.testError("group() does not support asynchronous functions.");
+    }
   } finally {
     _groups.removeLast();
   }
@@ -86,15 +90,29 @@
 void test(String description, body()) {
   // TODO(rnystrom): Do something useful with the description.
   for (var group in _groups) {
-    if (group.setUpFunction != null) group.setUpFunction();
+    if (group.setUpFunction != null) {
+      var result = group.setUpFunction();
+      if (result is Future) {
+        Expect.testError("setUp() does not support asynchronous functions.");
+      }
+    }
   }
 
   try {
-    body();
+    var result = body();
+    if (result is Future) {
+      Expect.testError("test() does not support asynchronous functions.");
+    }
   } finally {
     for (var i = _groups.length - 1; i >= 0; i--) {
       var group = _groups[i];
-      if (group.tearDownFunction != null) group.tearDownFunction();
+      if (group.tearDownFunction != null) {
+        var result = group.tearDownFunction();
+        if (result is Future) {
+          Expect
+              .testError("tearDown() does not support asynchronous functions.");
+        }
+      }
     }
   }
 }
@@ -137,10 +155,9 @@
       Expect.setEquals(value, actual);
     });
 
-// TODO(bob): Do something useful with the description.
 Object predicate(bool fn(Object value), [String description]) =>
     new _Expectation((actual) {
-      Expect.isTrue(fn(actual));
+      Expect.isTrue(fn(actual), description);
     });
 
 Object inInclusiveRange(num min, num max) => new _Expectation((actual) {
diff --git a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
index c08284c..d2eedd1 100644
--- a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
@@ -10,6 +10,9 @@
 import 'package:front_end/src/minimal_incremental_kernel_generator.dart';
 import 'package:kernel/kernel.dart';
 
+import 'package:front_end/src/fasta/incremental_compiler.dart'
+    show IncrementalCompiler;
+
 import 'compiler_options.dart';
 
 /// The type of the function that clients can pass to track used files.
@@ -140,10 +143,13 @@
       CompilerOptions options, Uri entryPoint,
       {WatchUsedFilesFn watch, bool useMinimalGenerator: false}) async {
     var processedOptions = new ProcessedOptions(options, false, [entryPoint]);
-    return await CompilerContext.runWithOptions(processedOptions, (_) async {
+    return await CompilerContext.runWithOptions(processedOptions,
+        (compilerContext) async {
       var uriTranslator = await processedOptions.getUriTranslator();
       var sdkOutlineBytes = await processedOptions.loadSdkSummaryBytes();
-      if (useMinimalGenerator) {
+      if (const String.fromEnvironment("ikg-variant") == "fasta") {
+        return new IncrementalCompiler(compilerContext);
+      } else if (useMinimalGenerator) {
         return new MinimalIncrementalKernelGenerator(
             processedOptions, uriTranslator, sdkOutlineBytes, entryPoint,
             watch: watch);
diff --git a/pkg/front_end/lib/src/api_unstable/dart2js.dart b/pkg/front_end/lib/src/api_unstable/dart2js.dart
index 3276f89..fc92b87 100644
--- a/pkg/front_end/lib/src/api_unstable/dart2js.dart
+++ b/pkg/front_end/lib/src/api_unstable/dart2js.dart
@@ -5,7 +5,6 @@
 import 'dart:async' show Future;
 
 import 'package:front_end/src/base/processed_options.dart';
-import 'package:front_end/src/fasta/scanner/token.dart' show StringToken;
 import 'package:front_end/src/kernel_generator_impl.dart';
 import 'package:kernel/kernel.dart' show Program;
 import 'package:kernel/target/targets.dart' show Target;
@@ -52,7 +51,6 @@
   processedOpts.inputs.clear();
   processedOpts.inputs.add(input);
   processedOpts.clearFileSystemCache();
-  StringToken.canonicalizer.clear();
 
   var compilerResult = await CompilerContext.runWithOptions(processedOpts,
       (CompilerContext context) async {
diff --git a/pkg/front_end/lib/src/api_unstable/ddc.dart b/pkg/front_end/lib/src/api_unstable/ddc.dart
index 18ea8cf..b50f8a1 100644
--- a/pkg/front_end/lib/src/api_unstable/ddc.dart
+++ b/pkg/front_end/lib/src/api_unstable/ddc.dart
@@ -6,7 +6,6 @@
 
 import 'package:front_end/src/api_prototype/physical_file_system.dart';
 import 'package:front_end/src/base/processed_options.dart';
-import 'package:front_end/src/fasta/scanner/token.dart' show StringToken;
 import 'package:front_end/src/kernel_generator_impl.dart';
 import 'package:front_end/src/multi_root_file_system.dart';
 import 'package:kernel/kernel.dart' show Program;
@@ -57,9 +56,6 @@
     (await oldState.processedOpts.loadInputSummaries(null))
         .forEach((p) => p.libraries.forEach((lib) => lib.isExternal = false));
 
-    // Avoid static leak.
-    StringToken.canonicalizer.clear();
-
     return oldState;
   }
 
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index 315e710..48d6b74 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -219,11 +219,11 @@
     library.addCompileTimeError(message, charOffset, fileUri, context: context);
   }
 
-  void addWarning(Message message, int charOffset) {
-    library.addWarning(message, charOffset, fileUri);
+  void addWarning(Message message, int charOffset, {LocatedMessage context}) {
+    library.addWarning(message, charOffset, fileUri, context: context);
   }
 
-  void addNit(Message message, int charOffset) {
-    library.addNit(message, charOffset, fileUri);
+  void addNit(Message message, int charOffset, {LocatedMessage context}) {
+    library.addNit(message, charOffset, fileUri, context: context);
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/invalid_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/invalid_type_builder.dart
index 0346e02..4b67433 100644
--- a/pkg/front_end/lib/src/fasta/builder/invalid_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/invalid_type_builder.dart
@@ -4,7 +4,7 @@
 
 library fasta.invalid_type_builder;
 
-import '../fasta_codes.dart' show Message;
+import '../fasta_codes.dart' show LocatedMessage;
 
 import 'builder.dart' show TypeBuilder, TypeDeclarationBuilder;
 
@@ -13,7 +13,7 @@
   InvalidTypeBuilder(String name, int charOffset, [Uri fileUri])
       : super(null, 0, name, null, charOffset, fileUri);
 
-  Message get message;
+  LocatedMessage get message;
 
   String get debugName => "InvalidTypeBuilder";
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/library_builder.dart b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
index b441474..dea20dc 100644
--- a/pkg/front_end/lib/src/fasta/builder/library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
@@ -45,9 +45,6 @@
 
   LibraryBuilder partOfLibrary;
 
-  /// True if a compile-time error has been reported in this library.
-  bool hasCompileTimeErrors = false;
-
   bool mayImplementRestrictedTypes = false;
 
   LibraryBuilder(Uri fileUri, this.scope, this.exportScope)
@@ -82,7 +79,6 @@
   void addCompileTimeError(Message message, int charOffset, Uri fileUri,
       {bool wasHandled: false, LocatedMessage context}) {
     fileUri ??= this.fileUri;
-    hasCompileTimeErrors = true;
     loader.addCompileTimeError(message, charOffset, fileUri,
         wasHandled: wasHandled, context: context);
   }
@@ -126,8 +122,6 @@
 
   int finishDeferredLoadTearoffs() => 0;
 
-  int finishStaticInvocations() => 0;
-
   int finishNativeMethods() => 0;
 
   int finishPatchMethods() => 0;
diff --git a/pkg/front_end/lib/src/fasta/compiler_context.dart b/pkg/front_end/lib/src/fasta/compiler_context.dart
index 5a319d0..3194861 100644
--- a/pkg/front_end/lib/src/fasta/compiler_context.dart
+++ b/pkg/front_end/lib/src/fasta/compiler_context.dart
@@ -6,16 +6,22 @@
 
 import 'dart:async' show Zone, runZoned;
 
-import 'package:front_end/src/api_prototype/compiler_options.dart';
-import 'package:front_end/src/api_prototype/file_system.dart';
-import 'package:front_end/src/base/processed_options.dart';
-import 'package:front_end/src/fasta/fasta_codes.dart';
 import 'package:kernel/ast.dart' show Source;
+
+import '../api_prototype/compiler_options.dart' show CompilerOptions;
+
+import '../api_prototype/file_system.dart' show FileSystem;
+
+import '../base/processed_options.dart' show ProcessedOptions;
+
+import 'scanner/token.dart' show StringToken;
+
 import 'command_line_reporting.dart' as command_line_reporting;
 
 import 'colors.dart' show computeEnableColors;
 
-import 'fasta_codes.dart' show LocatedMessage, Message;
+import 'fasta_codes.dart'
+    show LocatedMessage, Message, messageInternalProblemMissingContext;
 
 import 'severity.dart' show Severity;
 
@@ -84,9 +90,14 @@
   }
 
   /// Perform [action] in a [Zone] where [this] will be available as
-  /// `CompilerContext.current.options`.
+  /// `CompilerContext.current`.
   T runInContext<T>(T action(CompilerContext c)) {
-    return runZoned(() => action(this), zoneValues: {compilerContextKey: this});
+    try {
+      return runZoned(() => action(this),
+          zoneValues: {compilerContextKey: this});
+    } finally {
+      clear();
+    }
   }
 
   /// Perform [action] in a [Zone] where [options] will be available as
@@ -104,4 +115,8 @@
   static bool get enableColors {
     return current.enableColorsCached ??= computeEnableColors(current);
   }
+
+  static void clear() {
+    StringToken.canonicalizer.clear();
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_target.dart b/pkg/front_end/lib/src/fasta/dill/dill_target.dart
index af316d7..7da0d21 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_target.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_target.dart
@@ -66,10 +66,5 @@
   void addDirectSupertype(ClassBuilder cls, Set<ClassBuilder> set) {}
 
   @override
-  List<ClassBuilder> collectAllClasses() {
-    return null;
-  }
-
-  @override
   void breakCycle(ClassBuilder cls) {}
 }
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes.dart b/pkg/front_end/lib/src/fasta/fasta_codes.dart
index ee786717..59eee7e 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes.dart
@@ -72,7 +72,7 @@
   const Template({this.messageTemplate, this.tipTemplate, this.withArguments});
 }
 
-class LocatedMessage {
+class LocatedMessage implements Comparable<LocatedMessage> {
   final Uri uri;
 
   final int charOffset;
@@ -88,6 +88,14 @@
   String get tip => messageObject.tip;
 
   Map<String, dynamic> get arguments => messageObject.arguments;
+
+  int compareTo(LocatedMessage other) {
+    int result = "${uri}".compareTo("${other.uri}");
+    if (result != 0) return result;
+    result = charOffset.compareTo(other.charOffset);
+    if (result != 0) return result;
+    return message.compareTo(message);
+  }
 }
 
 String relativizeUri(Uri uri) {
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
index a2ca05a..e5e5b6e 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -335,6 +335,59 @@
     tip: r"""Try specifying the file explicitly with the --packages option.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String
+            string)> templateCantInferTypeDueToCircularity = const Template<
+        Message Function(String string)>(
+    messageTemplate:
+        r"""Can't infer the type of '#string': circularity found during type inference.""",
+    tipTemplate: r"""Specify the type explicitly.""",
+    withArguments: _withArgumentsCantInferTypeDueToCircularity);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string)> codeCantInferTypeDueToCircularity =
+    const Code<Message Function(String string)>(
+  "CantInferTypeDueToCircularity",
+  templateCantInferTypeDueToCircularity,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsCantInferTypeDueToCircularity(String string) {
+  return new Message(codeCantInferTypeDueToCircularity,
+      message:
+          """Can't infer the type of '$string': circularity found during type inference.""",
+      tip: """Specify the type explicitly.""",
+      arguments: {'string': string});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String string)>
+    templateCantInferTypeDueToInconsistentOverrides =
+    const Template<Message Function(String string)>(
+        messageTemplate:
+            r"""Can't infer the type of '#string': overridden members must all have the same type.""",
+        tipTemplate: r"""Specify the type explicitly.""",
+        withArguments: _withArgumentsCantInferTypeDueToInconsistentOverrides);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string)>
+    codeCantInferTypeDueToInconsistentOverrides =
+    const Code<Message Function(String string)>(
+  "CantInferTypeDueToInconsistentOverrides",
+  templateCantInferTypeDueToInconsistentOverrides,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsCantInferTypeDueToInconsistentOverrides(String string) {
+  return new Message(codeCantInferTypeDueToInconsistentOverrides,
+      message:
+          """Can't infer the type of '$string': overridden members must all have the same type.""",
+      tip: """Specify the type explicitly.""",
+      arguments: {'string': string});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeCatchSyntax = messageCatchSyntax;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1270,7 +1323,7 @@
 const Code<Message Function(Token token)> codeExpectedIdentifier =
     const Code<Message Function(Token token)>(
         "ExpectedIdentifier", templateExpectedIdentifier,
-        analyzerCode: "MISSING_IDENTIFIER", dart2jsCode: "EXPECTED_IDENTIFIER");
+        analyzerCode: "MISSING_IDENTIFIER", dart2jsCode: "*fatal*");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsExpectedIdentifier(Token token) {
@@ -1319,7 +1372,7 @@
 const Code<Message Function(String string)> codeExpectedToken =
     const Code<Message Function(String string)>(
         "ExpectedToken", templateExpectedToken,
-        analyzerCode: "EXPECTED_TOKEN", dart2jsCode: "GENERIC");
+        analyzerCode: "EXPECTED_TOKEN", dart2jsCode: "*fatal*");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsExpectedToken(String string) {
@@ -3356,6 +3409,26 @@
     message: r"""An operator can't have optional parameters.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)> templateOverriddenMethodCause =
+    const Template<Message Function(String name)>(
+        messageTemplate: r"""This is the overriden method ('#name').""",
+        withArguments: _withArgumentsOverriddenMethodCause);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeOverriddenMethodCause =
+    const Code<Message Function(String name)>(
+  "OverriddenMethodCause",
+  templateOverriddenMethodCause,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsOverriddenMethodCause(String name) {
+  return new Message(codeOverriddenMethodCause,
+      message: """This is the overriden method ('$name').""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         String name,
@@ -3792,6 +3865,18 @@
     message: r"""An optional named parameter can't start with '_'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeRedirectionInNonFactory = messageRedirectionInNonFactory;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageRedirectionInNonFactory = const MessageCode(
+    "RedirectionInNonFactory",
+    analyzerCode: "REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR",
+    dart2jsCode: "*fatal*",
+    message: r"""Only factory constructor can specify '=' redirection.""",
+    tip:
+        r"""Try making this a factory constructor, or remove the redirection.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateRedirectionTargetNotFound =
     const Template<Message Function(String name)>(
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 15f806a..30ac413 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -11,10 +11,16 @@
 import '../api_prototype/incremental_kernel_generator.dart'
     show DeltaProgram, IncrementalKernelGenerator;
 
+import 'builder/builder.dart' show LibraryBuilder;
+
 import 'dill/dill_target.dart' show DillTarget;
 
 import 'kernel/kernel_target.dart' show KernelTarget;
 
+import 'source/source_graph.dart' show SourceGraph;
+
+import 'source/source_library_builder.dart' show SourceLibraryBuilder;
+
 import 'compiler_context.dart' show CompilerContext;
 
 import 'problems.dart' show unsupported;
@@ -63,12 +69,15 @@
 
   DillTarget platform;
 
+  KernelTarget userCode;
+
   IncrementalCompiler(this.context)
       : ticker = new Ticker(isVerbose: context.options.verbose);
 
   @override
   Future<FastaDelta> computeDelta({Uri entryPoint}) async {
     return context.runInContext<Future<FastaDelta>>((CompilerContext c) async {
+      ticker.reset();
       if (platform == null) {
         UriTranslator uriTranslator = await c.options.getUriTranslator();
         ticker.logMs("Read packages file");
@@ -85,21 +94,84 @@
 
       List<Uri> invalidatedUris = this.invalidatedUris.toList();
       this.invalidatedUris.clear();
-      print("Changed URIs: ${invalidatedUris.join('\n')}");
 
-      KernelTarget kernelTarget = new KernelTarget(
+      List<LibraryBuilder> reusedLibraries =
+          computeReusedLibraries(invalidatedUris);
+      ticker.logMs("Decided to reuse ${reusedLibraries.length} libraries");
+
+      userCode = new KernelTarget(
           c.fileSystem, false, platform, platform.uriTranslator,
           uriToSource: c.uriToSource);
+      for (LibraryBuilder library in reusedLibraries) {
+        userCode.loader.builders[library.uri] = library;
+      }
 
-      kernelTarget.read(entryPoint);
+      userCode.read(entryPoint);
 
-      await kernelTarget.buildOutlines();
+      await userCode.buildOutlines();
 
       return new FastaDelta(
-          await kernelTarget.buildProgram(verify: c.options.verify));
+          await userCode.buildProgram(verify: c.options.verify));
     });
   }
 
+  List<LibraryBuilder> computeReusedLibraries(Iterable<Uri> invalidatedUris) {
+    if (userCode == null) return const <LibraryBuilder>[];
+
+    // [invalidatedUris] converted to a set.
+    Set<Uri> invalidatedFileUris = invalidatedUris.toSet();
+
+    // Maps all non-platform LibraryBuilders from their import URI.
+    Map<Uri, LibraryBuilder> builders = <Uri, LibraryBuilder>{};
+
+    // Invalidated URIs translated back to their import URI (package:, dart:,
+    // etc.).
+    List<Uri> invalidatedImportUris = <Uri>[];
+
+    // Compute [builders] and [invalidatedImportUris].
+    userCode.loader.builders.forEach((Uri uri, LibraryBuilder library) {
+      if (library.loader != platform.loader) {
+        assert(library is SourceLibraryBuilder);
+        builders[uri] = library;
+        if (invalidatedFileUris.contains(uri) ||
+            (uri != library.fileUri &&
+                invalidatedFileUris.contains(library.fileUri))) {
+          invalidatedImportUris.add(uri);
+        }
+      }
+    });
+
+    SourceGraph graph = new SourceGraph(builders);
+
+    // Compute direct dependencies for each import URI (the reverse of the
+    // edges returned by `graph.neighborsOf`).
+    Map<Uri, Set<Uri>> directDependencies = <Uri, Set<Uri>>{};
+    for (Uri vertex in graph.vertices) {
+      for (Uri neighbor in graph.neighborsOf(vertex)) {
+        (directDependencies[neighbor] ??= new Set<Uri>()).add(vertex);
+      }
+    }
+
+    // Remove all dependencies of [invalidatedImportUris] from builders.
+    List<Uri> workList = invalidatedImportUris;
+    while (workList.isNotEmpty) {
+      LibraryBuilder current = builders.remove(workList.removeLast());
+      // [current] is null if the corresponding key (URI) has already been
+      // removed.
+      if (current != null) {
+        Set<Uri> s = directDependencies[current.uri];
+        if (s != null) {
+          // [s] is null for leaves.
+          for (Uri dependency in s) {
+            workList.add(dependency);
+          }
+        }
+      }
+    }
+
+    return builders.values.toList();
+  }
+
   @override
   void invalidate(Uri uri) {
     invalidatedUris.add(uri);
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 af82655..9a47639 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1427,9 +1427,7 @@
     debugEvent("LiteralInt");
     int value = int.parse(token.lexeme, onError: (_) => null);
     if (value == null) {
-      push(buildCompileTimeError(
-          fasta.templateIntegerLiteralIsOutOfRange.withArguments(token),
-          token.charOffset));
+      push(new LargeIntAccessor(this, token));
     } else {
       push(new ShadowIntLiteral(value)..fileOffset = offsetForToken(token));
     }
@@ -2207,6 +2205,17 @@
       String operator = token.stringValue;
       if (optional("-", token)) {
         operator = "unary-";
+
+        var new_receiver = null;
+        if (receiver is LargeIntAccessor) {
+          int value =
+              int.parse("-" + receiver.token.lexeme, onError: (_) => null);
+          if (value != null) {
+            new_receiver = new ShadowIntLiteral(value)
+              ..fileOffset = offsetForToken(token);
+          }
+        }
+        if (new_receiver != null) receiver = new_receiver;
       }
       bool isSuper = false;
       Expression receiverValue;
@@ -2689,7 +2698,9 @@
     } else if (declaration is ExpressionStatement) {
       // If [declaration] isn't a [FunctionDeclaration], it must be because
       // there was a compile-time error.
-      assert(library.hasCompileTimeErrors);
+      // TODO(askesc): Be more specific about the error code when we have
+      // errors represented as explicit invalid nodes.
+      assert(library.loader.handledErrors.isNotEmpty);
 
       // TODO(paulberry,ahe): ensure that when integrating with analyzer, type
       // inference is still performed for the dropped declaration.
@@ -3599,8 +3610,10 @@
   }
 
   @override
-  StaticGet makeStaticGet(Member readTarget, Token token) {
-    return new ShadowStaticGet(readTarget)..fileOffset = offsetForToken(token);
+  StaticGet makeStaticGet(Member readTarget, Token token,
+      {int targetOffset: -1, Class targetClass}) {
+    return new ShadowStaticGet(targetOffset, targetClass, readTarget)
+      ..fileOffset = offsetForToken(token);
   }
 }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart b/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
index d6091aa..04b5bf2 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
@@ -10,7 +10,10 @@
 import '../../scanner/token.dart' show Token;
 
 import '../fasta_codes.dart'
-    show messageInvalidInitializer, messageLoadLibraryTakesNoArguments;
+    show
+        messageInvalidInitializer,
+        messageLoadLibraryTakesNoArguments,
+        templateIntegerLiteralIsOutOfRange;
 
 import '../messages.dart' show Message;
 
@@ -29,6 +32,7 @@
         LoadLibraryAccessor,
         PropertyAccessor,
         ReadOnlyAccessor,
+        DelayedErrorAccessor,
         StaticAccessor,
         SuperIndexAccessor,
         SuperPropertyAccessor,
@@ -126,7 +130,8 @@
   bool checkArguments(FunctionNode function, Arguments arguments,
       List<TypeParameter> typeParameters);
 
-  StaticGet makeStaticGet(Member readTarget, Token token);
+  StaticGet makeStaticGet(Member readTarget, Token token,
+      {int targetOffset: -1, Class targetClass});
 
   dynamic deprecated_addCompileTimeError(int charOffset, String message);
 
@@ -790,7 +795,7 @@
 
   @override
   ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
-      new ShadowStaticAssignment(rhs);
+      new ShadowStaticAssignment(targetOffset, targetClass, rhs);
 }
 
 class LoadLibraryAccessor extends kernel.LoadLibraryAccessor
@@ -984,6 +989,18 @@
   }
 }
 
+class LargeIntAccessor extends kernel.DelayedErrorAccessor with FastaAccessor {
+  final String plainNameForRead = null;
+
+  LargeIntAccessor(BuilderHelper helper, Token token) : super(helper, token);
+
+  Expression buildError() => helper.buildCompileTimeError(
+      templateIntegerLiteralIsOutOfRange.withArguments(token),
+      token.charOffset);
+
+  Expression doInvocation(int offset, Arguments arguments) => buildError();
+}
+
 class ParenthesizedExpression extends ReadOnlyAccessor {
   ParenthesizedExpression(
       BuilderHelper helper, Expression expression, Token token)
@@ -1011,9 +1028,8 @@
       int offset = offsetForToken(token);
       if (declaration is KernelInvalidTypeBuilder) {
         KernelInvalidTypeBuilder declaration = this.declaration;
-        helper.library.addWarning(
-            declaration.message, declaration.charOffset, declaration.fileUri);
-        helper.addWarning(declaration.message, offset, token.length);
+        helper.addWarning(
+            declaration.message.messageObject, offset, token.length);
         super.expression = new Throw(
             new StringLiteral(declaration.message.message)
               ..fileOffset = offsetForToken(token))
diff --git a/pkg/front_end/lib/src/fasta/kernel/frontend_accessors.dart b/pkg/front_end/lib/src/fasta/kernel/frontend_accessors.dart
index 8f7b16f..758d701 100644
--- a/pkg/front_end/lib/src/fasta/kernel/frontend_accessors.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/frontend_accessors.dart
@@ -689,7 +689,8 @@
     if (readTarget == null) {
       return makeInvalidRead();
     } else {
-      var read = helper.makeStaticGet(readTarget, token);
+      var read = helper.makeStaticGet(readTarget, token,
+          targetOffset: targetOffset, targetClass: targetClass);
       complexAssignment?.read = read;
       return read;
     }
@@ -755,6 +756,23 @@
       super._finish(makeLet(value, body), complexAssignment);
 }
 
+abstract class DelayedErrorAccessor extends Accessor {
+  DelayedErrorAccessor(BuilderHelper helper, Token token)
+      : super(helper, token);
+
+  Expression buildError();
+
+  Expression _makeSimpleRead() => buildError();
+  Expression _makeSimpleWrite(Expression value, bool voidContext,
+          ShadowComplexAssignment complexAssignment) =>
+      buildError();
+  Expression _makeRead(ShadowComplexAssignment complexAssignment) =>
+      buildError();
+  Expression _makeWrite(Expression value, bool voidContext,
+          ShadowComplexAssignment complexAssignment) =>
+      buildError();
+}
+
 Expression makeLet(VariableDeclaration variable, Expression body) {
   if (variable == null) return body;
   return new Let(variable, body);
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 44fd803..f261875 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
@@ -32,6 +32,7 @@
         messagePatchClassTypeVariablesMismatch,
         messagePatchDeclarationMismatch,
         messagePatchDeclarationOrigin,
+        templateOverriddenMethodCause,
         templateOverrideFewerNamedArguments,
         templateOverrideFewerPositionalArguments,
         templateOverrideMismatchNamedParameter,
@@ -238,7 +239,11 @@
               "$name::${declaredMember.name.name}",
               "${interfaceMember.enclosingClass.name}::"
               "${interfaceMember.name.name}"),
-          declaredMember.fileOffset);
+          declaredMember.fileOffset,
+          context: templateOverriddenMethodCause
+              .withArguments(interfaceMember.name.name)
+              .withLocation(
+                  interfaceMember.fileUri, interfaceMember.fileOffset));
     }
     if (declaredFunction.positionalParameters.length <
             interfaceFunction.requiredParameterCount ||
@@ -249,7 +254,11 @@
               "$name::${declaredMember.name.name}",
               "${interfaceMember.enclosingClass.name}::"
               "${interfaceMember.name.name}"),
-          declaredMember.fileOffset);
+          declaredMember.fileOffset,
+          context: templateOverriddenMethodCause
+              .withArguments(interfaceMember.name.name)
+              .withLocation(
+                  interfaceMember.fileUri, interfaceMember.fileOffset));
     }
     if (interfaceFunction.requiredParameterCount <
         declaredFunction.requiredParameterCount) {
@@ -258,7 +267,11 @@
               "$name::${declaredMember.name.name}",
               "${interfaceMember.enclosingClass.name}::"
               "${interfaceMember.name.name}"),
-          declaredMember.fileOffset);
+          declaredMember.fileOffset,
+          context: templateOverriddenMethodCause
+              .withArguments(interfaceMember.name.name)
+              .withLocation(
+                  interfaceMember.fileUri, interfaceMember.fileOffset));
     }
     if (declaredFunction.namedParameters.isEmpty &&
         interfaceFunction.namedParameters.isEmpty) {
@@ -271,7 +284,11 @@
               "$name::${declaredMember.name.name}",
               "${interfaceMember.enclosingClass.name}::"
               "${interfaceMember.name.name}"),
-          declaredMember.fileOffset);
+          declaredMember.fileOffset,
+          context: templateOverriddenMethodCause
+              .withArguments(interfaceMember.name.name)
+              .withLocation(
+                  interfaceMember.fileUri, interfaceMember.fileOffset));
     }
     Iterator<VariableDeclaration> declaredNamedParameters =
         declaredFunction.namedParameters.iterator;
@@ -289,7 +306,11 @@
                   interfaceNamedParameters.current.name,
                   "${interfaceMember.enclosingClass.name}::"
                   "${interfaceMember.name.name}"),
-              declaredMember.fileOffset);
+              declaredMember.fileOffset,
+              context: templateOverriddenMethodCause
+                  .withArguments(interfaceMember.name.name)
+                  .withLocation(
+                      interfaceMember.fileUri, interfaceMember.fileOffset));
           break outer;
         }
       }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
index a6e179d..744fd1a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
@@ -81,7 +81,7 @@
         isEligibleForInference &&
         !isInstanceMember) {
       library.loader.typeInferenceEngine
-          .recordStaticFieldInferenceCandidate(field);
+          .recordStaticFieldInferenceCandidate(field, library);
     }
     return field;
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart
index d784706..a682a2d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart
@@ -72,9 +72,8 @@
         positionalParameterNames: positionalParameterNames);
   }
 
-  Supertype buildSupertype(LibraryBuilder library) {
-    int charOffset = -1; // TODO(ahe): Provide these.
-    Uri fileUri = null; // TODO(ahe): Provide these.
+  Supertype buildSupertype(
+      LibraryBuilder library, int charOffset, Uri fileUri) {
     library.addCompileTimeError(
         messageSupertypeIsFunction, charOffset, fileUri);
     return null;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_invalid_type_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_invalid_type_builder.dart
index 9093eb1..2784668 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_invalid_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_invalid_type_builder.dart
@@ -6,7 +6,7 @@
 
 import 'package:kernel/ast.dart' show DartType, InvalidType;
 
-import '../fasta_codes.dart' show Message, templateTypeNotFound;
+import '../fasta_codes.dart' show LocatedMessage, Message, templateTypeNotFound;
 
 import 'kernel_builder.dart'
     show InvalidTypeBuilder, KernelTypeBuilder, LibraryBuilder;
@@ -14,11 +14,12 @@
 class KernelInvalidTypeBuilder
     extends InvalidTypeBuilder<KernelTypeBuilder, DartType> {
   @override
-  final Message message;
+  final LocatedMessage message;
 
   KernelInvalidTypeBuilder(String name, int charOffset, Uri fileUri,
       [Message message])
-      : message = message ?? templateTypeNotFound.withArguments(name),
+      : message = (message ?? templateTypeNotFound.withArguments(name))
+            .withLocation(fileUri, charOffset),
         super(name, charOffset, fileUri);
 
   DartType buildType(
@@ -29,7 +30,7 @@
   /// [Arguments] have already been built.
   DartType buildTypesWithBuiltArguments(
       LibraryBuilder library, List<DartType> arguments) {
-    library.addWarning(message, charOffset, fileUri);
+    library.addWarning(message.messageObject, message.charOffset, message.uri);
     return const InvalidType();
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
index 723f871..84bfc98 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
@@ -10,8 +10,6 @@
 import 'package:front_end/src/fasta/import.dart';
 import 'package:kernel/ast.dart';
 
-import 'package:kernel/clone.dart' show CloneVisitor;
-
 import '../../scanner/token.dart' show Token;
 
 import '../fasta_codes.dart'
@@ -92,8 +90,6 @@
   final Map<String, SourceClassBuilder> mixinApplicationClasses =
       <String, SourceClassBuilder>{};
 
-  final List<List> argumentsWithMissingDefaultValues = <List>[];
-
   final List<KernelFunctionBuilder> nativeMethods = <KernelFunctionBuilder>[];
 
   final List<KernelTypeVariableBuilder> boundlessTypeVariables =
@@ -967,45 +963,6 @@
     return total;
   }
 
-  int finishStaticInvocations() {
-    CloneVisitor cloner;
-    for (var list in argumentsWithMissingDefaultValues) {
-      final Arguments arguments = list[0];
-      final FunctionNode function = list[1];
-
-      Expression defaultArgumentFrom(Expression expression) {
-        if (expression == null) {
-          return new NullLiteral();
-        }
-        cloner ??= new CloneVisitor();
-        return cloner.clone(expression);
-      }
-
-      for (int i = function.requiredParameterCount;
-          i < function.positionalParameters.length;
-          i++) {
-        arguments.positional[i] ??=
-            defaultArgumentFrom(function.positionalParameters[i].initializer)
-              ..parent = arguments;
-      }
-      Map<String, VariableDeclaration> names;
-      for (NamedExpression expression in arguments.named) {
-        if (expression.value == null) {
-          if (names == null) {
-            names = <String, VariableDeclaration>{};
-            for (VariableDeclaration parameter in function.namedParameters) {
-              names[parameter.name] = parameter;
-            }
-          }
-          expression.value =
-              defaultArgumentFrom(names[expression.name].initializer)
-                ..parent = expression;
-        }
-      }
-    }
-    return argumentsWithMissingDefaultValues.length;
-  }
-
   void addNativeMethod(KernelFunctionBuilder method) {
     nativeMethods.add(method);
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_mixin_application_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_mixin_application_builder.dart
index bc432b7..bd92c44 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_mixin_application_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_mixin_application_builder.dart
@@ -34,9 +34,8 @@
   }
 
   @override
-  Supertype buildSupertype(LibraryBuilder library) {
-    int charOffset = -1; // TODO(ahe): Provide these.
-    Uri fileUri = null; // TODO(ahe): Provide these.
+  Supertype buildSupertype(
+      LibraryBuilder library, int charOffset, Uri fileUri) {
     return unsupported("buildSupertype", charOffset, fileUri);
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_named_type_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_named_type_builder.dart
index 6ce7bda..9a45b86 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_named_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_named_type_builder.dart
@@ -31,9 +31,8 @@
     return new KernelInvalidTypeBuilder("$name", charOffset, fileUri);
   }
 
-  Supertype handleInvalidSupertype(LibraryBuilder library) {
-    int charOffset = -1; // TODO(ahe): Provide these.
-    Uri fileUri = null; // TODO(ahe): Provide these.
+  Supertype handleInvalidSupertype(
+      LibraryBuilder library, int charOffset, Uri fileUri) {
     var template = builder.isTypeVariable
         ? templateSupertypeIsTypeVariable
         : templateSupertypeIsIllegal;
@@ -46,12 +45,13 @@
     return builder.buildType(library, arguments);
   }
 
-  Supertype buildSupertype(LibraryBuilder library) {
+  Supertype buildSupertype(
+      LibraryBuilder library, int charOffset, Uri fileUri) {
     if (builder is KernelClassBuilder) {
       KernelClassBuilder builder = this.builder;
       return builder.buildSupertype(library, arguments);
     } else {
-      return handleInvalidSupertype(library);
+      return handleInvalidSupertype(library, charOffset, fileUri);
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
index e247e2f..c2ee7b3 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
@@ -358,6 +358,15 @@
   @override
   int finishPatch() {
     if (!isPatch) return 0;
+
+    // TODO(ahe): restore file-offset once we track both origin and patch file
+    // URIs. See https://github.com/dart-lang/sdk/issues/31579
+    origin.procedure.fileUri = fileUri;
+    origin.procedure.fileOffset = procedure.fileOffset;
+    origin.procedure.fileEndOffset = procedure.fileEndOffset;
+    origin.procedure.annotations
+        .forEach((m) => m.fileOffset = procedure.fileOffset);
+
     origin.procedure.isAbstract = procedure.isAbstract;
     origin.procedure.isExternal = procedure.isExternal;
     origin.procedure.function = procedure.function;
@@ -410,7 +419,7 @@
       this.charOpenParenOffset,
       int charEndOffset,
       [String nativeMethodName])
-      : constructor = new Constructor(null)
+      : constructor = new Constructor(null, fileUri: compilationUnit?.fileUri)
           ..fileOffset = charOffset
           ..fileEndOffset = charEndOffset,
         super(metadata, modifiers, returnType, name, typeVariables, formals,
@@ -519,6 +528,15 @@
   @override
   int finishPatch() {
     if (!isPatch) return 0;
+
+    // TODO(ahe): restore file-offset once we track both origin and patch file
+    // URIs. See https://github.com/dart-lang/sdk/issues/31579
+    origin.constructor.fileUri = fileUri;
+    origin.constructor.fileOffset = constructor.fileOffset;
+    origin.constructor.fileEndOffset = constructor.fileEndOffset;
+    origin.constructor.annotations
+        .forEach((m) => m.fileOffset = constructor.fileOffset);
+
     origin.constructor.isExternal = constructor.isExternal;
     origin.constructor.function = constructor.function;
     origin.constructor.function.parent = constructor.function;
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 6e3b588..846289e 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
@@ -325,8 +325,8 @@
 
   /// Creates API members for this class.
   void setupApiMembers(InterfaceResolver interfaceResolver) {
-    interfaceResolver.createApiMembers(
-        this, _inferenceInfo.gettersAndMethods, _inferenceInfo.setters);
+    interfaceResolver.createApiMembers(this, _inferenceInfo.gettersAndMethods,
+        _inferenceInfo.setters, _inferenceInfo.builder.library);
   }
 
   static void clearClassInferenceInfo(ShadowClass class_) {
@@ -1734,7 +1734,16 @@
 
 /// Concrete shadow object representing an assignment to a static variable.
 class ShadowStaticAssignment extends ShadowComplexAssignment {
-  ShadowStaticAssignment(Expression rhs) : super(rhs);
+  /// If [_targetClass] is not `null`, the offset at which the explicit
+  /// reference to it is; otherwise `-1`.
+  int _targetOffset;
+
+  /// The [Class] that was explicitly referenced to get the target [Procedure],
+  /// or `null` if the class is implicit.
+  Class _targetClass;
+
+  ShadowStaticAssignment(this._targetOffset, this._targetClass, Expression rhs)
+      : super(rhs);
 
   @override
   DartType _getWriteType(ShadowTypeInferrer inferrer) {
@@ -1745,8 +1754,8 @@
   @override
   DartType _inferExpression(
       ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
-    typeNeeded = inferrer.listener
-            .staticAssignEnter(desugared, this.write, typeContext) ||
+    typeNeeded = inferrer.listener.staticAssignEnter(
+            desugared, _targetOffset, _targetClass, this.write, typeContext) ||
         typeNeeded;
     DartType readType;
     var read = this.read;
@@ -1776,19 +1785,33 @@
 /// Concrete shadow object representing a read of a static variable in kernel
 /// form.
 class ShadowStaticGet extends StaticGet implements ShadowExpression {
-  ShadowStaticGet(Member target) : super(target);
+  /// If [_targetClass] is not `null`, the offset at which the explicit
+  /// reference to it is; otherwise `-1`.
+  int _targetOffset;
+
+  /// The [Class] that was explicitly referenced to get the target [Procedure],
+  /// or `null` if the class is implicit.
+  Class _targetClass;
+
+  ShadowStaticGet(this._targetOffset, this._targetClass, Member target)
+      : super(target);
 
   @override
   DartType _inferExpression(
       ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
-    typeNeeded =
-        inferrer.listener.staticGetEnter(this, typeContext) || typeNeeded;
+    typeNeeded = inferrer.listener
+            .staticGetEnter(this, _targetOffset, _targetClass, typeContext) ||
+        typeNeeded;
     var target = this.target;
     if (target is ShadowField && target._inferenceNode != null) {
       target._inferenceNode.resolve();
       target._inferenceNode = null;
     }
-    var inferredType = typeNeeded ? target.getterType : null;
+    var type = target.getterType;
+    if (target is Procedure && target.kind == ProcedureKind.Method) {
+      type = inferrer.instantiateTearOff(type, typeContext, this);
+    }
+    var inferredType = typeNeeded ? type : null;
     inferrer.listener.staticGetExit(this, inferredType);
     return inferredType;
   }
@@ -2451,8 +2474,11 @@
           new InstrumentationValueForType(promotedType));
     }
     this.promotedType = promotedType;
-    var inferredType =
-        typeNeeded ? (promotedType ?? declaredOrInferredType) : null;
+    var type = promotedType ?? declaredOrInferredType;
+    if (variable._isLocalFunction) {
+      type = inferrer.instantiateTearOff(type, typeContext, this);
+    }
+    var inferredType = typeNeeded ? type : null;
     inferrer.listener.variableGetExit(this, inferredType);
     return inferredType;
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index b572b7d..24a0534 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -183,30 +183,17 @@
     });
   }
 
-  List<ClassBuilder> collectAllClasses() {
-    List<ClassBuilder> result = <ClassBuilder>[];
-    loader.builders.forEach((Uri uri, LibraryBuilder library) {
-      library.forEach((String name, Builder member) {
-        if (member is KernelClassBuilder) {
-          result.add(member);
-        }
-      });
-      // TODO(ahe): Translate this if needed:
-      // if (library is KernelLibraryBuilder) {
-      //   result.addAll(library.mixinApplicationClasses);
-      // }
-    });
-    return result;
-  }
-
-  List<SourceClassBuilder> collectAllSourceClasses() {
+  /// Returns classes defined in libraries in [loader].
+  List<SourceClassBuilder> collectMyClasses() {
     List<SourceClassBuilder> result = <SourceClassBuilder>[];
     loader.builders.forEach((Uri uri, LibraryBuilder library) {
-      library.forEach((String name, Builder member) {
-        if (member is SourceClassBuilder && !member.isPatch) {
-          result.add(member);
-        }
-      });
+      if (library.loader == loader) {
+        library.forEach((String name, Builder member) {
+          if (member is SourceClassBuilder && !member.isPatch) {
+            result.add(member);
+          }
+        });
+      }
     });
     return result;
   }
@@ -242,11 +229,11 @@
       loader.resolveParts();
       loader.computeLibraryScopes();
       loader.resolveTypes();
-      loader.checkSemantics();
+      List<SourceClassBuilder> myClasses = collectMyClasses();
+      loader.checkSemantics(myClasses);
       loader.buildProgram();
-      List<SourceClassBuilder> sourceClasses = collectAllSourceClasses();
       installDefaultSupertypes();
-      installDefaultConstructors(sourceClasses);
+      installDefaultConstructors(myClasses);
       loader.resolveConstructors();
       loader.finishTypeVariables(objectClassBuilder);
       program =
@@ -255,10 +242,10 @@
         program.addMetadataRepository(metadataCollector.repository);
       }
       loader.computeHierarchy(program);
-      loader.checkOverrides(sourceClasses);
+      loader.checkOverrides(myClasses);
       if (!loader.target.disableTypeInference) {
-        loader.prepareTopLevelInference(sourceClasses);
-        loader.performTopLevelInference(sourceClasses);
+        loader.prepareTopLevelInference(myClasses);
+        loader.performTopLevelInference(myClasses);
       }
     } on deprecated_InputError catch (e) {
       ticker.logMs("Got deprecated_InputError");
@@ -287,9 +274,9 @@
     try {
       ticker.logMs("Building program");
       await loader.buildBodies();
-      loader.finishStaticInvocations();
       loader.finishDeferredLoadTearoffs();
-      finishAllConstructors();
+      List<SourceClassBuilder> myClasses = collectMyClasses();
+      finishAllConstructors(myClasses);
       loader.finishNativeMethods();
       loader.finishPatchMethods();
       runBuildTransformations();
@@ -380,19 +367,22 @@
   void installDefaultSupertypes() {
     Class objectClass = this.objectClass;
     loader.builders.forEach((Uri uri, LibraryBuilder library) {
-      library.forEach((String name, Builder builder) {
-        if (builder is SourceClassBuilder) {
-          Class cls = builder.target;
-          if (cls != objectClass) {
-            cls.supertype ??= objectClass.asRawSupertype;
-            builder.supertype ??= new KernelNamedTypeBuilder("Object", null)
-              ..bind(objectClassBuilder);
+      if (library.loader == loader) {
+        library.forEach((String name, Builder builder) {
+          if (builder is SourceClassBuilder) {
+            Class cls = builder.target;
+            if (cls != objectClass) {
+              cls.supertype ??= objectClass.asRawSupertype;
+              builder.supertype ??= new KernelNamedTypeBuilder("Object", null)
+                ..bind(objectClassBuilder);
+            }
+            if (builder.isMixinApplication) {
+              cls.mixedInType = builder.mixedInType
+                  .buildSupertype(library, builder.charOffset, builder.fileUri);
+            }
           }
-          if (builder.isMixinApplication) {
-            cls.mixedInType = builder.mixedInType.buildSupertype(library);
-          }
-        }
-      });
+        });
+      }
     });
     ticker.logMs("Installed Object as implicit superclass");
   }
@@ -523,9 +513,9 @@
         isSyntheticDefault: true);
   }
 
-  void finishAllConstructors() {
+  void finishAllConstructors(List<SourceClassBuilder> builders) {
     Class objectClass = this.objectClass;
-    for (SourceClassBuilder builder in collectAllSourceClasses()) {
+    for (SourceClassBuilder builder in builders) {
       Class cls = builder.target;
       if (cls != objectClass) {
         finishConstructors(builder);
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_type_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_type_builder.dart
index ff7d5b2..44fc100 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_type_builder.dart
@@ -13,5 +13,5 @@
 
   DartType build(LibraryBuilder library);
 
-  Supertype buildSupertype(LibraryBuilder library);
+  Supertype buildSupertype(LibraryBuilder library, int charOffset, Uri fileUri);
 }
diff --git a/pkg/front_end/lib/src/fasta/loader.dart b/pkg/front_end/lib/src/fasta/loader.dart
index dd8a8e7..576e2a6 100644
--- a/pkg/front_end/lib/src/fasta/loader.dart
+++ b/pkg/front_end/lib/src/fasta/loader.dart
@@ -142,8 +142,10 @@
   Future<Null> buildBodies() async {
     assert(coreLibrary != null);
     for (LibraryBuilder library in builders.values) {
-      currentUriForCrashReporting = library.uri;
-      await buildBody(library);
+      if (library.loader == this) {
+        currentUriForCrashReporting = library.uri;
+        await buildBody(library);
+      }
     }
     currentUriForCrashReporting = null;
     logSummary(templateSourceBodySummary);
diff --git a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
index 54a46f2..ff2104f 100644
--- a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
@@ -998,6 +998,11 @@
   }
 
   @override
+  void handleInterpolationExpression(Token leftBracket, Token rightBracket) {
+    listener?.handleInterpolationExpression(leftBracket, rightBracket);
+  }
+
+  @override
   void handleInvalidExpression(Token token) {
     listener?.handleInvalidExpression(token);
   }
diff --git a/pkg/front_end/lib/src/fasta/parser/listener.dart b/pkg/front_end/lib/src/fasta/parser/listener.dart
index cf5e615..8a9cf34 100644
--- a/pkg/front_end/lib/src/fasta/parser/listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/listener.dart
@@ -609,6 +609,8 @@
 
   void beginLiteralString(Token token) {}
 
+  void handleInterpolationExpression(Token leftBracket, Token rightBracket) {}
+
   void endLiteralString(int interpolationCount, Token endToken) {
     logEvent("LiteralString");
   }
diff --git a/pkg/front_end/lib/src/fasta/parser/modifier_context.dart b/pkg/front_end/lib/src/fasta/parser/modifier_context.dart
index 75091be..c8920ee 100644
--- a/pkg/front_end/lib/src/fasta/parser/modifier_context.dart
+++ b/pkg/front_end/lib/src/fasta/parser/modifier_context.dart
@@ -783,13 +783,13 @@
           // to be interpreted as the top level function's identifier.
           if (identical(next, afterModifiers)) {
             beforeName = next;
-            parser.rewriter.insertToken(
+            parser.rewriter.insertTokenAfter(
+                next,
                 new SyntheticStringToken(
                     TokenType.IDENTIFIER,
                     '#synthetic_function_${next.charOffset}',
                     token.charOffset,
-                    0),
-                next.next);
+                    0));
             return next;
           }
           // If the next token is an operator, then skip it
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index c5d0ff8..9af160a 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -462,12 +462,12 @@
     if (next.isOperator && optional('(', next.next)) {
       // This appears to be a top level operator declaration, which is invalid.
       reportRecoverableError(next, fasta.messageTopLevelOperator);
-      // Insert a synthetic identifer
+      // Insert a synthetic identifier
       // and continue parsing as a top level function.
-      rewriter.insertToken(
+      rewriter.insertTokenAfter(
+          next,
           new SyntheticStringToken(TokenType.IDENTIFIER,
-              '#synthetic_function_${next.charOffset}', token.charOffset, 0),
-          next.next);
+              '#synthetic_function_${next.charOffset}', token.charOffset, 0));
       return parseTopLevelMember(next);
     }
     // Ignore any preceding modifiers and just report the unexpected token
@@ -1065,7 +1065,7 @@
       Token replacement = link(
           new SyntheticBeginToken(TokenType.OPEN_PAREN, next.charOffset),
           new SyntheticToken(TokenType.CLOSE_PAREN, next.charOffset));
-      rewriter.insertToken(replacement, next);
+      rewriter.insertTokenAfter(token, replacement);
     }
     return parseFormalParameters(token, kind);
   }
@@ -1347,9 +1347,10 @@
   }
 
   Token skipBlock(Token token) {
+    Token previousToken = token;
     token = token.next;
     if (!optional('{', token)) {
-      token = recoverFromMissingBlock(token);
+      token = recoverFromMissingBlock(previousToken);
     }
     Token closeBrace = closeBraceTokenFor(token);
     if (closeBrace == null ||
@@ -1511,9 +1512,9 @@
         Token extendsKeyword =
             new SyntheticKeywordToken(Keyword.EXTENDS, next.offset);
         Token superclassToken = new SyntheticStringToken(
-            TokenType.IDENTIFIER, 'Object', next.offset);
-        rewriter.insertToken(extendsKeyword, next);
-        rewriter.insertToken(superclassToken, next);
+            TokenType.IDENTIFIER, 'Object', next.offset, 0);
+        rewriter.insertTokenAfter(token, extendsKeyword);
+        rewriter.insertTokenAfter(extendsKeyword, superclassToken);
         token = parseType(extendsKeyword);
         token = parseMixinApplicationRest(token);
         listener.handleClassExtends(extendsKeyword);
@@ -1632,7 +1633,7 @@
     Message message = context.recoveryTemplate.withArguments(next);
     Token identifier = new SyntheticStringToken(
         TokenType.IDENTIFIER, stringValue, next.charOffset, 0);
-    return rewriteAndRecover(token, message, identifier);
+    return rewriteAndRecover(token, message, identifier).next;
   }
 
   /// Parse a simple identifier at the given [token], and return the identifier
@@ -1670,9 +1671,7 @@
         // forgotten the `operator` keyword.
         token = rewriteAndRecover(token, fasta.messageMissingOperatorKeyword,
             new SyntheticKeywordToken(Keyword.OPERATOR, next.offset));
-        // TODO(brianwilkerson): Remove the invocation of `previous` when
-        // `rewriteAndRecover` returns the token before the new token.
-        return parseOperatorName(token.previous);
+        return parseOperatorName(token);
       } else {
         reportRecoverableErrorWithToken(next, context.recoveryTemplate);
         if (context == IdentifierContext.methodDeclaration) {
@@ -1723,6 +1722,27 @@
     return token;
   }
 
+  /// Return `true` if the given [token] should be treated like the start of
+  /// an expression for the purposes of recovery.
+  bool isExpressionStartForRecovery(Token next) =>
+      next.isKeywordOrIdentifier ||
+      next.type == TokenType.DOUBLE ||
+      next.type == TokenType.HASH ||
+      next.type == TokenType.HEXADECIMAL ||
+      next.type == TokenType.IDENTIFIER ||
+      next.type == TokenType.INT ||
+      next.type == TokenType.STRING ||
+      optional('{', next) ||
+      optional('(', next) ||
+      optional('[', next) ||
+      optional('[]', next) ||
+      optional('<', next) ||
+      optional('!', next) ||
+      optional('-', next) ||
+      optional('~', next) ||
+      optional('++', next) ||
+      optional('--', next);
+
   /// Return `true` if the given [token] should be treated like an identifier in
   /// the given [context] for the purposes of recovery.
   bool isIdentifierForRecovery(Token token, IdentifierContext context) {
@@ -1744,7 +1764,7 @@
     } else if (context == IdentifierContext.combinator) {
       followingValues = [';'];
     } else if (context == IdentifierContext.fieldDeclaration) {
-      followingValues = [';', '=', ','];
+      followingValues = [';', '=', ',', '}'];
     } else if (context == IdentifierContext.enumDeclaration) {
       followingValues = ['{'];
     } else if (context == IdentifierContext.enumValueDeclaration) {
@@ -1755,6 +1775,7 @@
         return true;
       }
       followingValues = [
+        '.',
         ',',
         '(',
         ')',
@@ -2469,7 +2490,8 @@
             Message message = fasta.templateExpectedButGot.withArguments('.');
             Token newToken =
                 new SyntheticToken(TokenType.PERIOD, token.charOffset);
-            periodAfterThis = rewriteAndRecover(thisKeyword, message, newToken);
+            periodAfterThis =
+                rewriteAndRecover(thisKeyword, message, newToken).next;
           } else {
             periodAfterThis = token;
           }
@@ -2479,7 +2501,6 @@
           if (!token.isIdentifier) {
             // Recover from a missing identifier by inserting one.
             token = insertSyntheticIdentifier(beforeToken, nameContext);
-            beforeToken = previousToken(periodAfterThis, token);
           }
           beforeNameToken = beforeToken;
           beforeToken = nameToken = token;
@@ -2576,7 +2597,6 @@
           // We need to recompute the before tokens because [ensureIdentifier]
           // can cause synthetic tokens to be inserted.
           beforeToken = previousToken(beforeToken, token);
-          beforeNameToken = previousToken(beforeNameToken, nameToken);
         } else {
           listener.handleNoName(nameToken);
         }
@@ -2634,59 +2654,21 @@
       Function endStuff, Function handleNoStuff) {
     // TODO(brianwilkerson): Rename to `parseStuffOpt`?
 
-    bool rewriteEndToken(Token beforeEnd) {
-      Token end = beforeEnd.next;
-      String value = end?.stringValue;
-      if (value != null && value.length > 1) {
-        if (identical(value, '>>')) {
-          Token replacement = new Token(TokenType.GT, end.charOffset);
-          replacement.next = new Token(TokenType.GT, end.charOffset + 1);
-          rewriter.replaceTokenFollowing(beforeEnd, replacement);
-          return true;
-        } else if (identical(value, '>=')) {
-          Token replacement = new Token(TokenType.GT, end.charOffset);
-          replacement.next = new Token(TokenType.EQ, end.charOffset + 1);
-          rewriter.replaceTokenFollowing(beforeEnd, replacement);
-          return true;
-        } else if (identical(value, '>>=')) {
-          Token replacement = new Token(TokenType.GT, end.charOffset);
-          replacement.next = new Token(TokenType.GT, end.charOffset + 1);
-          replacement.next.next = new Token(TokenType.EQ, end.charOffset + 2);
-          rewriter.replaceTokenFollowing(beforeEnd, replacement);
-          return true;
-        }
-      }
-      return false;
-    }
-
     // TODO(brianwilkerson): Remove the invocation of `previous` when
     // `injectGenericCommentTypeList` returns the last consumed token.
     token = listener.injectGenericCommentTypeList(token.next).previous;
     Token next = token.next;
     if (optional('<', next)) {
       BeginToken begin = next;
-      Token end = begin.endToken;
-      if (end != null) {
-        Token beforeEnd = previousToken(begin, end);
-        if (rewriteEndToken(beforeEnd)) {
-          begin.endToken = null;
-        }
-      }
+      rewriteLtEndGroupOpt(begin);
       beginStuff(begin);
       int count = 0;
       do {
         token = stuffParser(token.next);
         ++count;
       } while (optional(',', token.next));
-      if (end == null) {
-        if (rewriteEndToken(token)) {
-          begin.endToken = null;
-        }
-      }
-      token = token.next;
+      token = begin.endToken = ensureGt(token);
       endStuff(count, begin, token);
-      expect('>', token);
-      begin.endToken ??= token;
       return token;
     }
     handleNoStuff(next);
@@ -2760,15 +2742,13 @@
     Token afterModifiers =
         identifiers.isNotEmpty ? identifiers.head.next.next : beforeStart.next;
     return isField
-        ? parseFields(beforeStart, identifiers.reverse(), beforeType?.next,
-            beforeName, true)
+        ? parseFields(beforeStart, identifiers.reverse(), beforeName, true)
         : parseTopLevelMethod(
             beforeStart, afterModifiers, beforeType, getOrSet, beforeName);
   }
 
-  Token parseFields(Token start, Link<Token> modifiers, Token type,
-      Token beforeName, bool isTopLevel) {
-    // TODO(brianwilkerson): Remove the parameter `type` because it isn't used.
+  Token parseFields(
+      Token start, Link<Token> modifiers, Token beforeName, bool isTopLevel) {
     Token varFinalOrConst = null;
     for (Token beforeModifier in modifiers) {
       Token modifier = beforeModifier.next;
@@ -3213,10 +3193,11 @@
   /// If the next token is a colon, return it. Otherwise, report an
   /// error, insert a synthetic colon, and return the inserted colon.
   Token ensureColon(Token token) {
-    if (optional(':', token.next)) return token.next;
+    Token next = token.next;
+    if (optional(':', next)) return next;
     Message message = fasta.templateExpectedButGot.withArguments(':');
-    Token newToken = new SyntheticToken(TokenType.COLON, token.charOffset);
-    return rewriteAndRecover(token, message, newToken);
+    Token newToken = new SyntheticToken(TokenType.COLON, next.charOffset);
+    return rewriteAndRecover(token, message, newToken).next;
   }
 
   Token ensureParseLiteralString(Token token) {
@@ -3231,8 +3212,24 @@
     return parseLiteralString(token);
   }
 
-  /// If the given [token] is a semi-colon, return it. Otherwise, report an
-  /// error, insert a synthetic semi-colon, and return the inserted semi-colon.
+  /// If the token after [token] is a '>', return it.
+  /// If the next token is a composite greater-than token such as '>>',
+  /// then replace that token with separate tokens, and return the first '>'.
+  /// Otherwise, report an error, insert a synthetic '>',
+  /// and return that newly inserted synthetic '>'.
+  Token ensureGt(Token token) {
+    Token next = token.next;
+    String value = next.stringValue;
+    if (value == '>') {
+      return next;
+    }
+    rewriteGtCompositeOrRecover(token, next, value);
+    return token.next;
+  }
+
+  /// If the token after [token] is a semi-colon, return it.
+  /// Otherwise, report an error, insert a synthetic semi-colon,
+  /// and return the inserted semi-colon.
   Token ensureSemicolon(Token token) {
     // TODO(danrubel): Once all expect(';'...) call sites have been converted
     // to use this method, remove similar semicolon recovery code
@@ -3241,13 +3238,45 @@
     if (optional(';', next)) return next;
     Message message = fasta.templateExpectedButGot.withArguments(';');
     Token newToken = new SyntheticToken(TokenType.SEMICOLON, next.charOffset);
-    return rewriteAndRecover(token, message, newToken);
+    return rewriteAndRecover(token, message, newToken).next;
   }
 
+  /// Report an error at the token after [token] that has the given [message].
+  /// Insert the [newToken] after [token] and return [token].
   Token rewriteAndRecover(Token token, Message message, Token newToken) {
-    token = token.next;
-    reportRecoverableError(token, message);
-    return rewriter.insertToken(newToken, token);
+    reportRecoverableError(token.next, message);
+    rewriter.insertTokenAfter(token, newToken);
+    return token;
+  }
+
+  void rewriteGtCompositeOrRecover(Token token, Token next, String value) {
+    assert(value != '>');
+    Token replacement = new Token(TokenType.GT, next.charOffset);
+    if (identical(value, '>>')) {
+      replacement.next = new Token(TokenType.GT, next.charOffset + 1);
+    } else if (identical(value, '>=')) {
+      replacement.next = new Token(TokenType.EQ, next.charOffset + 1);
+    } else if (identical(value, '>>=')) {
+      replacement.next = new Token(TokenType.GT, next.charOffset + 1);
+      replacement.next.next = new Token(TokenType.EQ, next.charOffset + 2);
+    } else {
+      // Recovery
+      rewriteAndRecover(token, fasta.templateExpectedToken.withArguments('>'),
+          new SyntheticToken(TokenType.GT, next.offset));
+      return;
+    }
+    rewriter.replaceTokenFollowing(token, replacement);
+  }
+
+  void rewriteLtEndGroupOpt(BeginToken beginToken) {
+    assert(optional('<', beginToken));
+    Token end = beginToken.endGroup;
+    String value = end?.stringValue;
+    if (value != null && value.length > 1) {
+      Token beforeEnd = previousToken(beginToken, end);
+      rewriteGtCompositeOrRecover(beforeEnd, end, value);
+      beginToken.endGroup = null;
+    }
   }
 
   /// Report the given token as unexpected and return the next token if the next
@@ -3372,9 +3401,10 @@
   }
 
   Token skipClassBody(Token token) {
+    Token previousToken = token;
     token = token.next;
     if (!optional('{', token)) {
-      token = recoverFromMissingClassBody(token);
+      token = recoverFromMissingClassBody(previousToken);
     }
     Token closeBrace = closeBraceTokenFor(token);
     if (closeBrace == null ||
@@ -3395,10 +3425,11 @@
   Token parseClassBody(Token token, Token beforeBody) {
     // TODO(brianwilkerson): Remove the parameter `beforeBody` because it is not
     // being used.
+    Token previousToken = token;
     Token begin = token = token.next;
     listener.beginClassBody(token);
     if (!optional('{', token)) {
-      token = begin = recoverFromMissingClassBody(token);
+      token = begin = recoverFromMissingClassBody(previousToken);
     }
     int count = 0;
     while (notEofOrValue('}', token.next)) {
@@ -3459,7 +3490,15 @@
 
     Link<Token> identifiers = findMemberName(start);
     if (identifiers.isEmpty) {
-      return recoverFromInvalidClassMember(start);
+      if ((isValidTypeReference(token) || optional('var', token)) &&
+          isPostIdentifierForRecovery(
+              token.next, IdentifierContext.fieldDeclaration)) {
+        // Recovery: Looks like a field declaration but missing a field name.
+        insertSyntheticIdentifier(token, IdentifierContext.fieldDeclaration);
+        return parseFields(start, const Link<Token>(), token, false);
+      } else {
+        return recoverFromInvalidClassMember(start);
+      }
     }
     Token afterName = identifiers.head.next;
     identifiers = identifiers.tail;
@@ -3530,8 +3569,7 @@
 
     Token lastModifier = identifiers.isNotEmpty ? identifiers.head.next : start;
     token = isField
-        ? parseFields(
-            start, identifiers.reverse(), beforeType?.next, beforeName, false)
+        ? parseFields(start, identifiers.reverse(), beforeName, false)
         : parseMethod(start, lastModifier, beforeType, getOrSet, beforeName);
     listener.endMember();
     return token;
@@ -3622,12 +3660,10 @@
       }
     } else {
       token = ensureIdentifier(beforeName, IdentifierContext.methodDeclaration);
+      token = parseQualifiedRestOpt(
+          token, IdentifierContext.methodDeclarationContinuation);
     }
 
-    // TODO(brianwilkerson): Move the next statement inside the else above
-    // because operator names can't be qualified.
-    token = parseQualifiedRestOpt(
-        token, IdentifierContext.methodDeclarationContinuation);
     bool isGetter = false;
     if (getOrSet == null) {
       token = parseTypeVariablesOpt(token);
@@ -3657,6 +3693,7 @@
       allowAbstract = true;
     }
     if (optional('=', next)) {
+      reportRecoverableError(next, fasta.messageRedirectionInNonFactory);
       token = parseRedirectingFactoryBody(token);
     } else {
       token = parseFunctionBody(token, false, allowAbstract);
@@ -3971,7 +4008,7 @@
     Token begin = next;
     int statementCount = 0;
     if (!optional('{', next)) {
-      token = recoverFromMissingFunctionBody(next);
+      token = recoverFromMissingFunctionBody(token);
       listener.handleInvalidFunctionBody(token);
       return token.endGroup;
     }
@@ -4450,11 +4487,9 @@
     listener.beginCascade(cascadeOperator);
     if (optional('[', token.next)) {
       token = parseArgumentOrIndexStar(token, null);
-    } else if (token.next.isIdentifier) {
+    } else {
       token = parseSend(token, IdentifierContext.expressionContinuation);
       listener.endBinaryExpression(cascadeOperator);
-    } else {
-      return reportUnexpectedToken(token.next);
     }
     Token next = token.next;
     Token mark;
@@ -4548,7 +4583,7 @@
           Message message = fasta.templateExpectedButGot.withArguments(']');
           Token newToken = new SyntheticToken(
               TokenType.CLOSE_SQUARE_BRACKET, next.charOffset);
-          next = rewriteAndRecover(token, message, newToken);
+          next = rewriteAndRecover(token, message, newToken).next;
         }
         listener.handleIndexedExpression(openSquareBracket, next);
         token = next;
@@ -4673,6 +4708,7 @@
   }
 
   Token parseParenthesizedExpression(Token token) {
+    Token previousToken = token;
     token = token.next;
     if (!optional('(', token)) {
       // Recover
@@ -4683,7 +4719,7 @@
       BeginToken replacement = link(
           new SyntheticBeginToken(TokenType.OPEN_PAREN, token.charOffset),
           new SyntheticToken(TokenType.CLOSE_PAREN, token.charOffset));
-      token = rewriter.insertToken(replacement, token);
+      token = rewriter.insertTokenAfter(previousToken, replacement).next;
     }
     BeginToken begin = token;
     token = parseExpression(token).next;
@@ -4788,17 +4824,41 @@
     int count = 0;
     bool old = mayParseFunctionExpressions;
     mayParseFunctionExpressions = true;
-    do {
+    while (true) {
       if (optional('}', token.next)) {
         token = token.next;
         break;
       }
-      token = parseMapLiteralEntry(token).next;
+      token = parseMapLiteralEntry(token);
+      Token next = token.next;
       ++count;
-    } while (optional(',', token));
+      if (!optional(',', next)) {
+        if (optional('}', next)) {
+          token = next;
+          break;
+        }
+        // Recovery
+        if (isExpressionStartForRecovery(next)) {
+          // If this looks like the start of an expression,
+          // then report an error, insert the comma, and continue parsing.
+          next = rewriteAndRecover(
+                  token,
+                  fasta.templateExpectedButGot.withArguments(','),
+                  new SyntheticToken(TokenType.COMMA, next.offset))
+              .next;
+        } else {
+          reportRecoverableError(
+              next, fasta.templateExpectedButGot.withArguments('}'));
+          // Scanner guarantees a closing curly bracket
+          token = beginToken.endGroup;
+          break;
+        }
+      }
+      token = next;
+    }
+    assert(optional('}', token));
     mayParseFunctionExpressions = old;
     listener.handleLiteralMap(count, beginToken, constKeyword, token);
-    expect('}', token);
     return token;
   }
 
@@ -4864,10 +4924,9 @@
     // Assume the listener rejects non-string keys.
     // TODO(brianwilkerson): Change the assumption above by moving error
     // checking into the parser, making it possible to recover.
-    token = parseExpression(token).next;
-    Token colon = token;
-    expect(':', colon);
     token = parseExpression(token);
+    Token colon = ensureColon(token);
+    token = parseExpression(colon);
     listener.endLiteralMapEntry(colon, token.next);
     return token;
   }
@@ -4886,9 +4945,9 @@
       reportRecoverableError(
           token, fasta.templateExpectedButGot.withArguments('('));
       BeginToken replacement = link(
-          new SyntheticBeginToken(TokenType.OPEN_PAREN, token.offset),
-          new SyntheticToken(TokenType.CLOSE_PAREN, token.offset));
-      rewriter.insertToken(replacement, next);
+          new SyntheticBeginToken(TokenType.OPEN_PAREN, next.offset),
+          new SyntheticToken(TokenType.CLOSE_PAREN, next.offset));
+      rewriter.insertTokenAfter(token, replacement);
     }
     token = parseArguments(token);
     return token;
@@ -5044,24 +5103,28 @@
     listener.beginLiteralString(token);
     // Parsing the prefix, for instance 'x of 'x${id}y${id}z'
     int interpolationCount = 0;
-    var kind = token.next.kind;
+    Token next = token.next;
+    var kind = next.kind;
     while (kind != EOF_TOKEN) {
       if (identical(kind, STRING_INTERPOLATION_TOKEN)) {
         // Parsing ${expression}.
-        token = parseExpression(token.next).next;
+        token = parseExpression(next).next;
         expect('}', token);
+        listener.handleInterpolationExpression(next, token);
       } else if (identical(kind, STRING_INTERPOLATION_IDENTIFIER_TOKEN)) {
         // Parsing $identifier.
-        token = parseIdentifierExpression(token.next);
+        token = parseIdentifierExpression(next);
+        listener.handleInterpolationExpression(next, null);
       } else {
         break;
       }
       ++interpolationCount;
       // Parsing the infix/suffix, for instance y and z' of 'x${id}y${id}z'
       token = parseStringPart(token);
-      kind = token.next.kind;
+      next = token.next;
+      kind = next.kind;
     }
-    listener.endLiteralString(interpolationCount, token.next);
+    listener.endLiteralString(interpolationCount, next);
     return token;
   }
 
@@ -5184,31 +5247,14 @@
           break;
         }
         // Recovery
-        // TODO(danrubel): Consider using isPostIdentifierForRecovery
-        // and isStartOfNextSibling.
-        if (next.isKeywordOrIdentifier ||
-            next.type == TokenType.DOUBLE ||
-            next.type == TokenType.HASH ||
-            next.type == TokenType.HEXADECIMAL ||
-            next.type == TokenType.IDENTIFIER ||
-            next.type == TokenType.INT ||
-            next.type == TokenType.STRING ||
-            optional('{', next) ||
-            optional('(', next) ||
-            optional('[', next) ||
-            optional('[]', next) ||
-            optional('<', next) ||
-            optional('!', next) ||
-            optional('-', next) ||
-            optional('~', next) ||
-            optional('++', next) ||
-            optional('--', next)) {
+        if (isExpressionStartForRecovery(next)) {
           // If this looks like the start of an expression,
           // then report an error, insert the comma, and continue parsing.
           next = rewriteAndRecover(
-              token,
-              fasta.templateExpectedButGot.withArguments(','),
-              new SyntheticToken(TokenType.COMMA, next.offset));
+                  token,
+                  fasta.templateExpectedButGot.withArguments(','),
+                  new SyntheticToken(TokenType.COMMA, next.offset))
+              .next;
         } else {
           reportRecoverableError(
               next, fasta.templateExpectedButGot.withArguments(')'));
@@ -5525,11 +5571,12 @@
   /// ;
   /// ```
   Token parseBlock(Token token) {
+    Token previousToken = token;
     Token begin = token = token.next;
     listener.beginBlock(begin);
     int statementCount = 0;
     if (!optional('{', token)) {
-      token = recoverFromMissingBlock(token);
+      token = recoverFromMissingBlock(previousToken);
     }
     while (notEofOrValue('}', token.next)) {
       Token startToken = token.next;
@@ -5964,44 +6011,47 @@
         next, fasta.templateExpectedClassMember);
   }
 
-  /// Report that the given [token] was expected to be the beginning of a block
-  /// but isn't, insert a synthetic pair of curly braces, and return the opening
-  /// curly brace.
-  Token recoverFromMissingBlock(Token token) {
+  /// Report that the token after [previousToken] was expected to be the
+  /// beginning of a block but isn't, insert a synthetic pair of curly braces,
+  /// and return the opening curly brace.
+  Token recoverFromMissingBlock(Token previousToken) {
     // TODO(brianwilkerson): Add context information (as a parameter) so that we
     // can (a) generate a better error and (b) unify this method with
     // `recoverFromMissingClassBody` and `recoverFromMissingFunctionBody`.
+    Token token = previousToken.next;
     reportRecoverableError(token, fasta.messageExpectedBlock);
     BeginToken replacement = link(
         new SyntheticBeginToken(TokenType.OPEN_CURLY_BRACKET, token.offset),
         new SyntheticToken(TokenType.CLOSE_CURLY_BRACKET, token.offset));
-    rewriter.insertToken(replacement, token);
+    rewriter.insertTokenAfter(previousToken, replacement);
     return replacement;
   }
 
-  /// Report that the given [token] was expected to be the beginning of a class
-  /// body but isn't, insert a synthetic pair of curly braces, and return the
-  /// opening curly brace.
-  Token recoverFromMissingClassBody(Token token) {
+  /// Report that the token after [previousToken] was expected to be the
+  /// beginning of a class body but isn't, insert a synthetic pair of curly
+  /// braces, and return the opening curly brace.
+  Token recoverFromMissingClassBody(Token previousToken) {
+    Token token = previousToken.next;
     reportRecoverableError(
         token, fasta.templateExpectedClassBody.withArguments(token));
     BeginToken replacement = link(
         new SyntheticBeginToken(TokenType.OPEN_CURLY_BRACKET, token.offset),
         new SyntheticToken(TokenType.CLOSE_CURLY_BRACKET, token.offset));
-    rewriter.insertToken(replacement, token);
+    rewriter.insertTokenAfter(previousToken, replacement);
     return replacement;
   }
 
-  /// Report that the given [token] was expected to be the beginning of a block
-  /// function body but isn't, insert a synthetic pair of curly braces, and
-  /// return the opening curly brace.
-  Token recoverFromMissingFunctionBody(Token token) {
+  /// Report that the token after [previousToken] was expected to be the
+  /// beginning of a block function body but isn't, insert a synthetic pair of
+  /// curly braces, and return the opening curly brace.
+  Token recoverFromMissingFunctionBody(Token previousToken) {
+    Token token = previousToken.next;
     reportRecoverableError(
         token, fasta.templateExpectedFunctionBody.withArguments(token));
     BeginToken replacement = link(
         new SyntheticBeginToken(TokenType.OPEN_CURLY_BRACKET, token.offset),
         new SyntheticToken(TokenType.CLOSE_CURLY_BRACKET, token.offset));
-    rewriter.insertToken(replacement, token);
+    rewriter.insertTokenAfter(previousToken, replacement);
     return replacement;
   }
 
diff --git a/pkg/front_end/lib/src/fasta/parser/token_stream_rewriter.dart b/pkg/front_end/lib/src/fasta/parser/token_stream_rewriter.dart
index 758574b..aa850f9 100644
--- a/pkg/front_end/lib/src/fasta/parser/token_stream_rewriter.dart
+++ b/pkg/front_end/lib/src/fasta/parser/token_stream_rewriter.dart
@@ -31,18 +31,17 @@
   TokenStreamRewriter();
 
   /// Insert the chain of tokens starting at the [insertedToken] immediately
-  /// before the [followingToken]. The [followingToken] is assumed to be
-  /// reachable from, but not the same as, the [previousToken].
-  Token insertToken(Token insertedToken, Token followingToken) {
-    Token previous = followingToken.previous;
-    previous.next = insertedToken;
-    insertedToken.previous = previous;
+  /// after the [previousToken]. Return the [previousToken].
+  Token insertTokenAfter(Token previousToken, Token insertedToken) {
+    Token afterToken = previousToken.next;
+    previousToken.next = insertedToken;
+    insertedToken.previous = previousToken;
 
     Token lastReplacement = _lastTokenInChain(insertedToken);
-    lastReplacement.next = followingToken;
-    followingToken.previous = lastReplacement;
+    lastReplacement.next = afterToken;
+    afterToken.previous = lastReplacement;
 
-    return insertedToken;
+    return previousToken;
   }
 
   /// Replace the single token immediately following the [previousToken] with
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 94f43c1..f159350 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -128,14 +128,17 @@
 
     scope.forEach(buildBuilders);
     constructors.forEach(buildBuilders);
-    actualCls.supertype = supertype?.buildSupertype(library);
-    actualCls.mixedInType = mixedInType?.buildSupertype(library);
+    actualCls.supertype =
+        supertype?.buildSupertype(library, charOffset, fileUri);
+    actualCls.mixedInType =
+        mixedInType?.buildSupertype(library, charOffset, fileUri);
     // TODO(ahe): If `cls.supertype` is null, and this isn't Object, report a
     // compile-time error.
     cls.isAbstract = isAbstract;
     if (interfaces != null) {
       for (KernelTypeBuilder interface in interfaces) {
-        Supertype supertype = interface.buildSupertype(library);
+        Supertype supertype =
+            interface.buildSupertype(library, charOffset, fileUri);
         if (supertype != null) {
           // TODO(ahe): Report an error if supertype is null.
           actualCls.implementedTypes.add(supertype);
@@ -205,6 +208,11 @@
   @override
   int finishPatch() {
     if (!isPatch) return 0;
+
+    // TODO(ahe): restore file-offset once we track both origin and patch file
+    // URIs. See https://github.com/dart-lang/sdk/issues/31579
+    cls.annotations.forEach((m) => m.fileOffset = origin.cls.fileOffset);
+
     int count = 0;
     scope.forEach((String name, Builder builder) {
       count += builder.finishPatch();
diff --git a/pkg/front_end/lib/src/fasta/source/source_graph.dart b/pkg/front_end/lib/src/fasta/source/source_graph.dart
new file mode 100644
index 0000000..00297c6
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/source/source_graph.dart
@@ -0,0 +1,48 @@
+// 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.
+
+library fasta.source_graph;
+
+import '../builder/builder.dart' show LibraryBuilder;
+
+import '../export.dart' show Export;
+
+import '../graph/graph.dart' show Graph;
+
+import '../import.dart' show Import;
+
+import 'source_library_builder.dart' show SourceLibraryBuilder;
+
+class SourceGraph implements Graph<Uri> {
+  final Map<Uri, LibraryBuilder> builders;
+
+  SourceGraph(this.builders);
+
+  Iterable<Uri> get vertices => builders.keys;
+
+  Iterable<Uri> neighborsOf(Uri vertex) sync* {
+    SourceLibraryBuilder library = builders[vertex];
+    if (library == null) {
+      throw "Library not found: $vertex";
+    }
+    for (Import import in library.imports) {
+      Uri uri = import.imported.uri;
+      if (builders.containsKey(uri)) {
+        yield uri;
+      }
+    }
+    for (Export export in library.exports) {
+      Uri uri = export.exported.uri;
+      if (builders.containsKey(uri)) {
+        yield uri;
+      }
+    }
+    for (SourceLibraryBuilder part in library.parts) {
+      Uri uri = part.uri;
+      if (builders.containsKey(uri)) {
+        yield uri;
+      }
+    }
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 180d4cb..5c71111 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -209,12 +209,13 @@
   void resolveParts() {
     List<Uri> parts = <Uri>[];
     builders.forEach((Uri uri, LibraryBuilder library) {
-      if (library is SourceLibraryBuilder) {
-        if (library.isPart) {
-          library.validatePart();
+      if (library.loader == this) {
+        SourceLibraryBuilder sourceLibrary = library;
+        if (sourceLibrary.isPart) {
+          sourceLibrary.validatePart();
           parts.add(uri);
         } else {
-          library.includeParts();
+          sourceLibrary.includeParts();
         }
       }
     });
@@ -222,7 +223,7 @@
     ticker.logMs("Resolved parts");
 
     builders.forEach((Uri uri, LibraryBuilder library) {
-      if (library is SourceLibraryBuilder) {
+      if (library.loader == this) {
         library.applyPatches();
       }
     });
@@ -233,8 +234,9 @@
     Set<LibraryBuilder> exporters = new Set<LibraryBuilder>();
     Set<LibraryBuilder> exportees = new Set<LibraryBuilder>();
     builders.forEach((Uri uri, LibraryBuilder library) {
-      if (library is SourceLibraryBuilder) {
-        library.buildInitialScopes();
+      if (library.loader == this) {
+        SourceLibraryBuilder sourceLibrary = library;
+        sourceLibrary.buildInitialScopes();
       }
       if (library.exporters.isNotEmpty) {
         exportees.add(library);
@@ -266,10 +268,18 @@
       }
     } while (wasChanged);
     builders.forEach((Uri uri, LibraryBuilder library) {
-      if (library is SourceLibraryBuilder) {
-        library.addImportsToScope();
+      if (library.loader == this) {
+        SourceLibraryBuilder sourceLibrary = library;
+        sourceLibrary.addImportsToScope();
       }
     });
+    for (LibraryBuilder exportee in exportees) {
+      // TODO(ahe): Change how we track exporters. Currently, when a library
+      // (exporter) exports another library (exportee) we add a reference to
+      // exporter to exportee. This creates a reference in the wrong direction
+      // and can lead to memory leaks.
+      exportee.exporters.clear();
+    }
     ticker.logMs("Computed library scopes");
     // debugPrintExports();
   }
@@ -314,23 +324,19 @@
   void finishDeferredLoadTearoffs() {
     int count = 0;
     builders.forEach((Uri uri, LibraryBuilder library) {
-      count += library.finishDeferredLoadTearoffs();
+      if (library.loader == this) {
+        count += library.finishDeferredLoadTearoffs();
+      }
     });
     ticker.logMs("Finished deferred load tearoffs $count");
   }
 
-  void finishStaticInvocations() {
-    int count = 0;
-    builders.forEach((Uri uri, LibraryBuilder library) {
-      count += library.finishStaticInvocations();
-    });
-    ticker.logMs("Finished static invocations $count");
-  }
-
   void resolveConstructors() {
     int count = 0;
     builders.forEach((Uri uri, LibraryBuilder library) {
-      count += library.resolveConstructors(null);
+      if (library.loader == this) {
+        count += library.resolveConstructors(null);
+      }
     });
     ticker.logMs("Resolved $count constructors");
   }
@@ -338,7 +344,9 @@
   void finishTypeVariables(ClassBuilder object) {
     int count = 0;
     builders.forEach((Uri uri, LibraryBuilder library) {
-      count += library.finishTypeVariables(object);
+      if (library.loader == this) {
+        count += library.finishTypeVariables(object);
+      }
     });
     ticker.logMs("Resolved $count type-variable bounds");
   }
@@ -346,7 +354,9 @@
   void finishNativeMethods() {
     int count = 0;
     builders.forEach((Uri uri, LibraryBuilder library) {
-      count += library.finishNativeMethods();
+      if (library.loader == this) {
+        count += library.finishNativeMethods();
+      }
     });
     ticker.logMs("Finished $count native methods");
   }
@@ -354,7 +364,9 @@
   void finishPatchMethods() {
     int count = 0;
     builders.forEach((Uri uri, LibraryBuilder library) {
-      count += library.finishPatchMethods();
+      if (library.loader == this) {
+        count += library.finishPatchMethods();
+      }
     });
     ticker.logMs("Finished $count patch methods");
   }
@@ -410,36 +422,49 @@
     return output;
   }
 
-  void checkSemantics() {
-    List<ClassBuilder> allClasses = target.collectAllClasses();
-    Iterable<ClassBuilder> candidates = cyclicCandidates(allClasses);
-    Map<ClassBuilder, Set<ClassBuilder>> realCycles =
-        <ClassBuilder, Set<ClassBuilder>>{};
-    for (ClassBuilder cls in candidates) {
-      Set<ClassBuilder> cycles = cyclicCandidates(allSupertypes(cls));
-      if (cycles.isNotEmpty) {
-        realCycles[cls] = cycles;
+  void checkSemantics(List<SourceClassBuilder> classes) {
+    Iterable<ClassBuilder> candidates = cyclicCandidates(classes);
+    if (candidates.isNotEmpty) {
+      Map<ClassBuilder, Set<ClassBuilder>> realCycles =
+          <ClassBuilder, Set<ClassBuilder>>{};
+      for (ClassBuilder cls in candidates) {
+        Set<ClassBuilder> cycles = cyclicCandidates(allSupertypes(cls));
+        if (cycles.isNotEmpty) {
+          realCycles[cls] = cycles;
+        }
       }
-    }
-    Set<ClassBuilder> reported = new Set<ClassBuilder>();
-    realCycles.forEach((ClassBuilder cls, Set<ClassBuilder> cycles) {
-      target.breakCycle(cls);
-      if (reported.add(cls)) {
+      Map<LocatedMessage, ClassBuilder> messages =
+          <LocatedMessage, ClassBuilder>{};
+      realCycles.forEach((ClassBuilder cls, Set<ClassBuilder> cycles) {
+        target.breakCycle(cls);
         List<ClassBuilder> involved = <ClassBuilder>[];
         for (ClassBuilder cls in cycles) {
           if (realCycles.containsKey(cls)) {
             involved.add(cls);
-            reported.add(cls);
           }
         }
-        String involvedString =
-            involved.map((c) => c.fullNameForErrors).join("', '");
-        cls.addCompileTimeError(
-            templateCyclicClassHierarchy.withArguments(
-                cls.fullNameForErrors, involvedString),
-            cls.charOffset);
+        // Sort the class names alphabetically to ensure the order is stable.
+        // TODO(ahe): It's possible that a better UX would be to sort the
+        // classes based on walking the class hierarchy in breadth-first order.
+        String involvedString = (involved
+                .where((c) => c != cls)
+                .map((c) => c.fullNameForErrors)
+                .toList()
+                  ..sort())
+            .join("', '");
+        messages[templateCyclicClassHierarchy
+            .withArguments(cls.fullNameForErrors, involvedString)
+            .withLocation(cls.fileUri, cls.charOffset)] = cls;
+      });
+
+      // Report all classes involved in a cycle, sorted to ensure stability as
+      // [cyclicCandidates] is sensitive to if the platform (or other modules)
+      // are included in [classes].
+      for (LocatedMessage message in messages.keys.toList()..sort()) {
+        messages[message]
+            .addCompileTimeError(message.messageObject, message.charOffset);
       }
-    });
+    }
     ticker.logMs("Found cycles");
     Set<ClassBuilder> blackListedClasses = new Set<ClassBuilder>.from([
       coreLibrary["bool"],
@@ -448,7 +473,7 @@
       coreLibrary["double"],
       coreLibrary["String"],
     ]);
-    for (ClassBuilder cls in allClasses) {
+    for (ClassBuilder cls in classes) {
       if (cls.library.loader != this) continue;
       Set<ClassBuilder> directSupertypes = new Set<ClassBuilder>();
       target.addDirectSupertype(cls, directSupertypes);
@@ -497,8 +522,9 @@
 
   void buildProgram() {
     builders.forEach((Uri uri, LibraryBuilder library) {
-      if (library is SourceLibraryBuilder) {
-        L target = library.build(coreLibrary);
+      if (library.loader == this) {
+        SourceLibraryBuilder sourceLibrary = library;
+        L target = sourceLibrary.build(coreLibrary);
         if (!library.isPatch) {
           libraries.add(target);
         }
@@ -517,7 +543,9 @@
   void checkOverrides(List<SourceClassBuilder> sourceClasses) {
     assert(hierarchy != null);
     for (SourceClassBuilder builder in sourceClasses) {
-      builder.checkOverrides(hierarchy);
+      if (builder.library.loader == this) {
+        builder.checkOverrides(hierarchy);
+      }
     }
     ticker.logMs("Checked overrides");
   }
@@ -539,7 +567,7 @@
         instrumentation,
         target.strongMode);
     builders.forEach((Uri uri, LibraryBuilder library) {
-      if (library is SourceLibraryBuilder) {
+      if (library.loader == this) {
         library.prepareTopLevelInference(library, null);
       }
     });
@@ -574,7 +602,7 @@
     typeInferenceEngine.finishTopLevelInitializingFormals();
     if (instrumentation != null) {
       builders.forEach((Uri uri, LibraryBuilder library) {
-        if (library is SourceLibraryBuilder) {
+        if (library.loader == this) {
           library.instrumentTopLevelInference(instrumentation);
         }
       });
@@ -644,10 +672,7 @@
             message.code == fasta_codes.codeConstConstructorWithBody ||
             message.code == fasta_codes.codeConstructorNotFound ||
             message.code == fasta_codes.codeSuperclassHasNoDefaultConstructor ||
-            message.code == fasta_codes.codeSupertypeIsIllegal ||
-            message.code == fasta_codes.codeSupertypeIsTypeVariable ||
             message.code == fasta_codes.codeTypeArgumentsOnTypeVariable ||
-            message.code == fasta_codes.codeTypeNotFound ||
             message.code == fasta_codes.codeUnspecified)) {
       // TODO(ahe): All warnings should have a charOffset, but currently, some
       // warnings lack them.
diff --git a/pkg/front_end/lib/src/fasta/source/stack_listener.dart b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
index a82e12d..6bb8712 100644
--- a/pkg/front_end/lib/src/fasta/source/stack_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
@@ -397,6 +397,7 @@
     for (int i = 0; i < count; i++) {
       final value = table[startIndex + i];
       tailList[i] = value is NullValue ? null : value;
+      table[startIndex + i] = null;
     }
     arrayLength -= count;
 
diff --git a/pkg/front_end/lib/src/fasta/target_implementation.dart b/pkg/front_end/lib/src/fasta/target_implementation.dart
index 095b493..938f7cae 100644
--- a/pkg/front_end/lib/src/fasta/target_implementation.dart
+++ b/pkg/front_end/lib/src/fasta/target_implementation.dart
@@ -48,9 +48,6 @@
   /// Add the classes extended or implemented directly by [cls] to [set].
   void addDirectSupertype(ClassBuilder cls, Set<ClassBuilder> set);
 
-  /// Returns all classes that will be included in the resulting program.
-  List<ClassBuilder> collectAllClasses();
-
   /// The class [cls] is involved in a cyclic definition. This method should
   /// ensure that the cycle is broken, for example, by removing superclass and
   /// implemented interfaces.
diff --git a/pkg/front_end/lib/src/fasta/ticker.dart b/pkg/front_end/lib/src/fasta/ticker.dart
index ffa94366..b785cba 100644
--- a/pkg/front_end/lib/src/fasta/ticker.dart
+++ b/pkg/front_end/lib/src/fasta/ticker.dart
@@ -29,4 +29,9 @@
       previousTick = sw.elapsed;
     }
   }
+
+  void reset() {
+    sw.reset();
+    previousTick = sw.elapsed;
+  }
 }
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 ea8dc78..25f7ae3 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
@@ -3,7 +3,9 @@
 // BSD-style license that can be found in the LICENSE.md file.
 
 import 'package:front_end/src/base/instrumentation.dart';
+import 'package:front_end/src/fasta/builder/library_builder.dart';
 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart';
+import 'package:front_end/src/fasta/messages.dart';
 import 'package:front_end/src/fasta/problems.dart';
 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart';
 import 'package:front_end/src/fasta/type_inference/type_inferrer.dart';
@@ -29,17 +31,43 @@
 /// Concrete class derived from [InferenceNode] to represent type inference of
 /// getters, setters, and fields based on inheritance.
 class AccessorInferenceNode extends MemberInferenceNode {
-  AccessorInferenceNode(InterfaceResolver interfaceResolver,
-      Procedure declaredMethod, List<Member> candidates, int start, int end)
-      : super(interfaceResolver, declaredMethod, candidates, start, end);
+  AccessorInferenceNode(
+      InterfaceResolver interfaceResolver,
+      Procedure declaredMethod,
+      List<Member> candidates,
+      int start,
+      int end,
+      LibraryBuilder library,
+      Uri fileUri)
+      : super(interfaceResolver, declaredMethod, candidates, start, end,
+            library, fileUri);
+
+  String get _name {
+    if (_declaredMethod is! SyntheticAccessor && _declaredMethod.isSetter) {
+      return _declaredMethod.function.positionalParameters[0].name;
+    }
+    return _declaredMethod.name.name;
+  }
+
+  int get _offset {
+    if (_declaredMethod is! SyntheticAccessor && _declaredMethod.isSetter) {
+      return _declaredMethod.function.positionalParameters[0].fileOffset;
+    }
+    return _declaredMethod.fileOffset;
+  }
 
   @override
   void resolveInternal() {
     var declaredMethod = _declaredMethod;
     var kind = declaredMethod.kind;
     var overriddenTypes = _computeAccessorOverriddenTypes();
-    if (!isCircular) {
-      var inferredType = _matchTypes(overriddenTypes);
+    if (isCircular) {
+      _library.addCompileTimeError(
+          templateCantInferTypeDueToCircularity.withArguments(_name),
+          _offset,
+          _fileUri);
+    } else {
+      var inferredType = _matchTypes(overriddenTypes, _name, _offset);
       if (declaredMethod is SyntheticAccessor) {
         declaredMethod._field.type = inferredType;
       } else {
@@ -673,8 +701,8 @@
   ///
   /// If [setters] is `true`, the list will be populated by setters; otherwise
   /// it will be populated by getters and methods.
-  void createApiMembers(
-      Class class_, List<Member> getters, List<Member> setters) {
+  void createApiMembers(Class class_, List<Member> getters,
+      List<Member> setters, LibraryBuilder library) {
     var candidates = ClassHierarchy.mergeSortedLists(
         getCandidates(class_, false), getCandidates(class_, true));
     // Now create getter and perhaps setter forwarding nodes for each unique
@@ -722,7 +750,9 @@
               inheritedGetterStart,
               getterEnd,
               inheritedSetterStart,
-              setterEnd);
+              setterEnd,
+              library,
+              class_.fileUri);
         }
         var forwardingNode = new ForwardingNode(
             this,
@@ -755,7 +785,9 @@
                 inheritedSetterStart,
                 setterEnd,
                 inheritedGetterStart,
-                getterEnd);
+                getterEnd,
+                library,
+                class_.fileUri);
           }
         }
         var forwardingNode = new ForwardingNode(
@@ -844,21 +876,23 @@
       int start,
       int end,
       int crossStart,
-      int crossEnd) {
+      int crossEnd,
+      LibraryBuilder library,
+      Uri fileUri) {
     if (!_requiresTypeInference(procedure)) return null;
     switch (procedure.kind) {
       case ProcedureKind.Getter:
       case ProcedureKind.Setter:
         if (strongMode && start < end) {
           return new AccessorInferenceNode(
-              this, procedure, candidates, start, end);
+              this, procedure, candidates, start, end, library, fileUri);
         } else if (strongMode && crossStart < crossEnd) {
-          return new AccessorInferenceNode(
-              this, procedure, candidates, crossStart, crossEnd);
+          return new AccessorInferenceNode(this, procedure, candidates,
+              crossStart, crossEnd, library, fileUri);
         } else if (procedure is SyntheticAccessor &&
             procedure._field.initializer != null) {
           var node = new FieldInitializerInferenceNode(
-              _typeInferenceEngine, procedure._field);
+              _typeInferenceEngine, procedure._field, library);
           ShadowField.setInferenceNode(procedure._field, node);
           return node;
         }
@@ -866,7 +900,7 @@
       default: // Method || Operator
         if (strongMode) {
           return new MethodInferenceNode(
-              this, procedure, candidates, start, end);
+              this, procedure, candidates, start, end, library, fileUri);
         }
         return null;
     }
@@ -1086,10 +1120,14 @@
   /// [_declaredMethod].
   final int _end;
 
-  MemberInferenceNode(this._interfaceResolver, this._declaredMethod,
-      this._candidates, this._start, this._end);
+  final LibraryBuilder _library;
 
-  DartType _matchTypes(Iterable<DartType> types) {
+  final Uri _fileUri;
+
+  MemberInferenceNode(this._interfaceResolver, this._declaredMethod,
+      this._candidates, this._start, this._end, this._library, this._fileUri);
+
+  DartType _matchTypes(Iterable<DartType> types, String name, int charOffset) {
     var iterator = types.iterator;
     if (!iterator.moveNext()) {
       // No overridden types.  Infer `dynamic`.
@@ -1098,7 +1136,11 @@
     var inferredType = iterator.current;
     while (iterator.moveNext()) {
       if (inferredType != iterator.current) {
-        // TODO(paulberry): Types don't match.  Report an error.
+        // Types don't match.  Report an error.
+        _library.addCompileTimeError(
+            templateCantInferTypeDueToInconsistentOverrides.withArguments(name),
+            charOffset,
+            _fileUri);
         return const DynamicType();
       }
     }
@@ -1109,17 +1151,26 @@
 /// Concrete class derived from [InferenceNode] to represent type inference of
 /// methods.
 class MethodInferenceNode extends MemberInferenceNode {
-  MethodInferenceNode(InterfaceResolver interfaceResolver,
-      Procedure declaredMethod, List<Member> candidates, int start, int end)
-      : super(interfaceResolver, declaredMethod, candidates, start, end);
+  MethodInferenceNode(
+      InterfaceResolver interfaceResolver,
+      Procedure declaredMethod,
+      List<Member> candidates,
+      int start,
+      int end,
+      LibraryBuilder library,
+      Uri fileUri)
+      : super(interfaceResolver, declaredMethod, candidates, start, end,
+            library, fileUri);
 
   @override
   void resolveInternal() {
     var declaredMethod = _declaredMethod;
     var overriddenTypes = _computeMethodOverriddenTypes();
     if (ShadowProcedure.hasImplicitReturnType(declaredMethod)) {
-      declaredMethod.function.returnType =
-          _matchTypes(overriddenTypes.map((type) => type.returnType));
+      declaredMethod.function.returnType = _matchTypes(
+          overriddenTypes.map((type) => type.returnType),
+          declaredMethod.name.name,
+          declaredMethod.fileOffset);
     }
     var positionalParameters = declaredMethod.function.positionalParameters;
     for (int i = 0; i < positionalParameters.length; i++) {
@@ -1141,7 +1192,9 @@
         //     tools are free to either emit an error, or to defer the error to
         //     override checking.
         positionalParameters[i].type = _matchTypes(
-            overriddenTypes.map((type) => getPositionalParameterType(type, i)));
+            overriddenTypes.map((type) => getPositionalParameterType(type, i)),
+            positionalParameters[i].name,
+            positionalParameters[i].fileOffset);
       }
     }
     var namedParameters = declaredMethod.function.namedParameters;
@@ -1149,7 +1202,9 @@
       if (ShadowVariableDeclaration.isImplicitlyTyped(namedParameters[i])) {
         var name = namedParameters[i].name;
         namedParameters[i].type = _matchTypes(
-            overriddenTypes.map((type) => getNamedParameterType(type, name)));
+            overriddenTypes.map((type) => getNamedParameterType(type, name)),
+            namedParameters[i].name,
+            namedParameters[i].fileOffset);
       }
     }
     // Circularities should never occur with method inference, since the
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
index 2404585..b933a4887 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
@@ -3,7 +3,9 @@
 // BSD-style license that can be found in the LICENSE.md file.
 
 import 'package:front_end/src/base/instrumentation.dart';
+import 'package:front_end/src/fasta/builder/library_builder.dart';
 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart';
+import 'package:front_end/src/fasta/messages.dart';
 import 'package:front_end/src/fasta/source/source_library_builder.dart';
 import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart';
 import 'package:front_end/src/fasta/type_inference/type_inferrer.dart';
@@ -34,7 +36,10 @@
   /// The field whose type should be inferred.
   final ShadowField field;
 
-  FieldInitializerInferenceNode(this._typeInferenceEngine, this.field);
+  final LibraryBuilder _library;
+
+  FieldInitializerInferenceNode(
+      this._typeInferenceEngine, this.field, this._library);
 
   @override
   void resolveInternal() {
@@ -47,7 +52,12 @@
         var inferredType = typeInferrer.inferDeclarationType(
             typeInferrer.inferFieldTopLevel(field, null, true));
         if (isCircular) {
-          // TODO(paulberry): report the appropriate error.
+          // Report the appropriate error.
+          _library.addCompileTimeError(
+              templateCantInferTypeDueToCircularity
+                  .withArguments(field.name.name),
+              field.fileOffset,
+              field.fileUri);
           inferredType = const DynamicType();
         }
         field.setInferredType(
@@ -227,7 +237,8 @@
   void recordInitializingFormal(ShadowVariableDeclaration formal);
 
   /// Records that the given static [field] will need top level type inference.
-  void recordStaticFieldInferenceCandidate(ShadowField field);
+  void recordStaticFieldInferenceCandidate(
+      ShadowField field, LibraryBuilder library);
 }
 
 /// Derived class containing generic implementations of
@@ -299,8 +310,9 @@
     initializingFormals.add(formal);
   }
 
-  void recordStaticFieldInferenceCandidate(ShadowField field) {
-    var node = new FieldInitializerInferenceNode(this, field);
+  void recordStaticFieldInferenceCandidate(
+      ShadowField field, LibraryBuilder library) {
+    var node = new FieldInitializerInferenceNode(this, field, library);
     ShadowField.setInferenceNode(field, node);
     staticInferenceNodes.add(node);
   }
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
index 60f5508..4a42bac 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
@@ -394,8 +394,8 @@
   void returnStatementExit(ReturnStatement statement) =>
       genericStatementExit('returnStatement', statement);
 
-  bool staticAssignEnter(
-          Expression expression, Expression write, DartType typeContext) =>
+  bool staticAssignEnter(Expression expression, int targetOffset,
+          Class targetClass, Expression write, DartType typeContext) =>
       genericExpressionEnter("staticAssign", expression, typeContext);
 
   void staticAssignExit(
@@ -407,7 +407,8 @@
           DartType inferredType) =>
       genericExpressionExit("staticAssign", expression, inferredType);
 
-  bool staticGetEnter(StaticGet expression, DartType typeContext) =>
+  bool staticGetEnter(StaticGet expression, int targetOffset, Class targetClass,
+          DartType typeContext) =>
       genericExpressionEnter("staticGet", expression, typeContext);
 
   void staticGetExit(StaticGet expression, DartType inferredType) =>
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index ab6c6cc..aab2c19 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -33,6 +33,7 @@
         FunctionNode,
         FunctionType,
         Initializer,
+        Instantiation,
         InterfaceType,
         InvocationExpression,
         Let,
@@ -742,7 +743,10 @@
 
   /// Determines the dispatch category of a [PropertyGet] and adds an "as" check
   /// if necessary due to contravariance.
-  void handlePropertyGetContravariance(
+  ///
+  /// Returns the "as" check if it was added; otherwise returns the original
+  /// expression.
+  Expression handlePropertyGetContravariance(
       Expression receiver,
       Object interfaceMember,
       PropertyGet desugaredGet,
@@ -763,13 +767,14 @@
         interfaceMember is Procedure) {
       checkReturn = interfaceMember.isGenericContravariant;
     }
+    var replacedExpression = desugaredGet ?? expression;
     if (checkReturn) {
-      var expressionToReplace = desugaredGet ?? expression;
-      expressionToReplace.parent.replaceChild(
-          expressionToReplace,
-          new AsExpression(expressionToReplace, inferredType)
-            ..isTypeError = true
-            ..fileOffset = fileOffset);
+      var expressionToReplace = replacedExpression;
+      var parent = expressionToReplace.parent;
+      replacedExpression = new AsExpression(expressionToReplace, inferredType)
+        ..isTypeError = true
+        ..fileOffset = fileOffset;
+      parent.replaceChild(expressionToReplace, replacedExpression);
     }
     if (instrumentation != null) {
       int offset = expression.fileOffset;
@@ -790,6 +795,7 @@
             new InstrumentationValueForType(inferredType));
       }
     }
+    return replacedExpression;
   }
 
   /// Determines the dispatch category of a [PropertySet].
@@ -900,11 +906,9 @@
     Substitution substitution;
     List<DartType> formalTypes;
     List<DartType> actualTypes;
-    List<Expression> expressions;
     if (inferenceNeeded || typeChecksNeeded) {
       formalTypes = [];
       actualTypes = [];
-      expressions = [];
     }
     if (inferenceNeeded) {
       if (isConst && typeContext != null) {
@@ -946,7 +950,6 @@
       if (inferenceNeeded || typeChecksNeeded) {
         formalTypes.add(formalType);
         actualTypes.add(expressionType);
-        expressions.add(expression);
       }
       if (isOverloadedArithmeticOperator) {
         returnType = typeSchemaEnvironment.getTypeOfOverloadedArithmetic(
@@ -969,13 +972,16 @@
       arguments.types.addAll(inferredTypes);
     }
     if (typeChecksNeeded) {
+      int numPositionalArgs = arguments.positional.length;
       for (int i = 0; i < formalTypes.length; i++) {
         var formalType = formalTypes[i];
         var expectedType = substitution != null
             ? substitution.substituteType(formalType)
             : formalType;
         var actualType = actualTypes[i];
-        var expression = expressions[i];
+        var expression = i < numPositionalArgs
+            ? arguments.positional[i]
+            : arguments.named[i - numPositionalArgs].value;
         checkAssignability(
             expectedType, actualType, expression, expression.fileOffset);
       }
@@ -1248,9 +1254,14 @@
       }
     }
     var inferredType = getCalleeType(interfaceMember, receiverType);
-    // TODO(paulberry): Infer tear-off type arguments if appropriate.
-    handlePropertyGetContravariance(receiver, interfaceMember, desugaredGet,
-        expression, inferredType, fileOffset);
+    var replacedExpression = handlePropertyGetContravariance(receiver,
+        interfaceMember, desugaredGet, expression, inferredType, fileOffset);
+    if ((interfaceMember is Procedure &&
+            interfaceMember.kind == ProcedureKind.Method) ||
+        interfaceMember == 'call') {
+      inferredType =
+          instantiateTearOff(inferredType, typeContext, replacedExpression);
+    }
     if (identical(interfaceMember, 'call')) {
       listener.propertyGetExitCall(expression, inferredType);
     } else {
@@ -1275,6 +1286,36 @@
   /// the statement type and calls the appropriate specialized "infer" method.
   void inferStatement(Statement statement);
 
+  /// Performs the type inference steps necessary to instantiate a tear-off
+  /// (if necessary).
+  DartType instantiateTearOff(
+      DartType tearoffType, DartType context, Expression expression) {
+    if (strongMode &&
+        tearoffType is FunctionType &&
+        context is FunctionType &&
+        context.typeParameters.isEmpty) {
+      var typeParameters = tearoffType.typeParameters;
+      if (typeParameters.isNotEmpty) {
+        var inferredTypes = new List<DartType>.filled(
+            typeParameters.length, const UnknownType());
+        var instantiatedType = tearoffType.withoutTypeParameters;
+        typeSchemaEnvironment.inferGenericFunctionOrType(
+            instantiatedType, typeParameters, [], [], context, inferredTypes);
+        if (!isTopLevel) {
+          var parent = expression.parent;
+          parent.replaceChild(
+              expression,
+              new Instantiation(expression, inferredTypes)
+                ..fileOffset = expression.fileOffset);
+        }
+        var substitution =
+            Substitution.fromPairs(typeParameters, inferredTypes);
+        return substitution.substituteType(instantiatedType);
+      }
+    }
+    return tearoffType;
+  }
+
   /// Determines the dispatch category of a [MethodInvocation] and returns a
   /// boolean indicating whether an "as" check will need to be added due to
   /// contravariance.
diff --git a/pkg/front_end/lib/src/incremental/kernel_driver.dart b/pkg/front_end/lib/src/incremental/kernel_driver.dart
index 189e2fd..492ad53 100644
--- a/pkg/front_end/lib/src/incremental/kernel_driver.dart
+++ b/pkg/front_end/lib/src/incremental/kernel_driver.dart
@@ -5,6 +5,7 @@
 import 'dart:async';
 
 import 'package:front_end/src/api_prototype/byte_store.dart';
+import 'package:front_end/src/api_prototype/compilation_message.dart';
 import 'package:front_end/src/api_prototype/file_system.dart';
 import 'package:front_end/src/base/api_signature.dart';
 import 'package:front_end/src/base/performance_logger.dart';
@@ -87,6 +88,9 @@
   /// Factory for working with metadata.
   final MetadataFactory _metadataFactory;
 
+  /// The listener to errors during kernel compilation.
+  final KernelErrorListener kernelErrorListener;
+
   /// The optional SDK outline loaded from [_sdkOutlineBytes].
   /// Might be `null` if the bytes are not provided, or if not loaded yet.
   Program _sdkOutline;
@@ -104,7 +108,7 @@
   /// The object that provides additional information for tests.
   final _TestView _testView = new _TestView();
 
-  KernelDriver(this._options, this.uriTranslator,
+  KernelDriver(this._options, this.uriTranslator, this.kernelErrorListener,
       {List<int> sdkOutlineBytes,
       KernelDriverFileAddedFn fileAddedFn,
       MetadataFactory metadataFactory})
@@ -181,7 +185,13 @@
       // We need to be able to access dart:core and dart:async classes.
       if (_sdkOutline != null) {
         results.add(new LibraryCycleResult(
-            new LibraryCycle(), '<sdk>', {}, _sdkOutline.libraries));
+            new LibraryCycle(),
+            '<sdk>',
+            {},
+            _sdkOutline.libraries
+                // TODO are there errors to report here?
+                .map((l) => new LibraryResult(l, []))
+                .toList()));
       }
 
       var lastCycle = cycles.last;
@@ -227,19 +237,19 @@
     KernelSequenceResult sequence = await getKernelSequence(uri);
 
     var dependencies = <Library>[];
-    Library requestedLibrary;
+    LibraryResult requestedLibrary;
     for (var i = 0; i < sequence.results.length; i++) {
-      List<Library> libraries = sequence.results[i].kernelLibraries;
+      List<LibraryResult> libraryResults = sequence.results[i].libraryResults;
       if (i == sequence.results.length - 1) {
-        for (var library in libraries) {
-          if (library.importUri == uri) {
-            requestedLibrary = library;
+        for (var libraryResult in libraryResults) {
+          if (libraryResult.library.importUri == uri) {
+            requestedLibrary = libraryResult;
           } else {
-            dependencies.add(library);
+            dependencies.add(libraryResult.library);
           }
         }
       } else {
-        dependencies.addAll(libraries);
+        dependencies.addAll(libraryResults.map((l) => l.library));
       }
     }
 
@@ -278,11 +288,16 @@
         return await _fsState.getFile(uri);
       });
 
-      List<LibraryCycle> cycles = _logger.run('Compute library cycles', () {
-        List<LibraryCycle> cycles = entryLibrary.topologicalOrder;
-        _logger.writeln('Computed ${cycles.length} cycles.');
-        return cycles;
-      });
+      List<LibraryCycle> cycles;
+      if (_fsState.skipSdkLibraries.contains(uri)) {
+        cycles = <LibraryCycle>[];
+      } else {
+        cycles = _logger.run('Compute library cycles', () {
+          List<LibraryCycle> cycles = entryLibrary.topologicalOrder;
+          _logger.writeln('Computed ${cycles.length} cycles.');
+          return cycles;
+        });
+      }
 
       DillTarget dillTarget = new DillTarget(
           new Ticker(isVerbose: false), uriTranslator, _options.target);
@@ -299,7 +314,13 @@
       // We need to be able to access dart:core and dart:async classes.
       if (_sdkOutline != null) {
         results.add(new LibraryCycleResult(
-            new LibraryCycle(), '<sdk>', {}, _sdkOutline.libraries));
+            new LibraryCycle(),
+            '<sdk>',
+            {},
+            _sdkOutline.libraries
+                // TODO are there errors to report here?
+                .map((l) => new LibraryResult(l, []))
+                .toList()));
       }
 
       _testView.compiledCycles.clear();
@@ -345,7 +366,8 @@
   /// All the libraries for [CoreTypes] are expected to be in the first result.
   TypeEnvironment _buildTypeEnvironment(
       CanonicalName nameRoot, List<LibraryCycleResult> results) {
-    var coreLibraries = results.first.kernelLibraries;
+    var coreLibraries =
+        results.first.libraryResults.map((l) => l.library).toList();
     var program = new Program(nameRoot: nameRoot, libraries: coreLibraries);
     return new TypeEnvironment(
         new CoreTypes(program), new IncrementalClassHierarchy());
@@ -400,7 +422,13 @@
             await appendNewDillLibraries(program);
 
             return new LibraryCycleResult(
-                cycle, signature, program.uriToSource, program.libraries);
+                cycle,
+                signature,
+                program.uriToSource,
+                program.libraries
+                    // TODO report errors here
+                    .map((l) => new LibraryResult(l, []))
+                    .toList());
           });
         }
       }
@@ -419,6 +447,7 @@
         await kernelTarget.buildOutlines(nameRoot: nameRoot);
         return await kernelTarget.buildProgram();
       });
+
       _testView.compiledCycles.add(cycle);
 
       // Add newly compiled libraries into DILL.
@@ -428,6 +457,15 @@
           .where((library) => libraryUris.contains(library.importUri))
           .toList();
 
+      final indexedErrors = <Uri, List<CompilationMessage>>{};
+      kernelErrorListener.errors.forEach((error) =>
+          indexedErrors.putIfAbsent(error.span.sourceUrl, () => []).add(error));
+      List<LibraryResult> kernelLibrariesResults = kernelLibraries
+          .map((l) => new LibraryResult(l, indexedErrors[l.fileUri]))
+          .toList();
+
+      kernelErrorListener.errors.clear();
+
       // Remove source for libraries outside of the cycle.
       {
         var urisToRemoveSources = <Uri>[];
@@ -447,7 +485,7 @@
       });
 
       return new LibraryCycleResult(
-          cycle, signature, program.uriToSource, kernelLibraries);
+          cycle, signature, program.uriToSource, kernelLibrariesResults);
     });
   }
 
@@ -567,9 +605,9 @@
   final TypeEnvironment types;
 
   /// The library of the requested file.
-  final Library library;
+  final LibraryResult libraryResult;
 
-  KernelResult(this.dependencies, this.types, this.library);
+  KernelResult(this.dependencies, this.types, this.libraryResult);
 }
 
 /// The result of compiling of a sequence of libraries.
@@ -598,10 +636,18 @@
 
   /// Kernel libraries for libraries in the [cycle].  Bodies of dependencies
   /// are not included, but but references to those dependencies are included.
-  final List<Library> kernelLibraries;
+  final List<LibraryResult> libraryResults;
 
   LibraryCycleResult(
-      this.cycle, this.signature, this.uriToSource, this.kernelLibraries);
+      this.cycle, this.signature, this.uriToSource, this.libraryResults);
+}
+
+/// A [Library] produced by front end and the errors produced from compiling it.
+class LibraryResult {
+  final Library library;
+  final List<CompilationMessage> errors;
+
+  LibraryResult(this.library, this.errors);
 }
 
 /// Factory for creating [MetadataCollector]s and [MetadataRepository]s.
@@ -626,3 +672,9 @@
   /// It does not include libraries which were read from the cache.
   final List<LibraryCycle> compiledCycles = [];
 }
+
+/// A simple errors listener for [CompilationMessage]s from kernel.
+class KernelErrorListener {
+  final List<CompilationMessage> errors = [];
+  void onError(CompilationMessage error) => errors.add(error);
+}
diff --git a/pkg/front_end/lib/src/scanner/token.dart b/pkg/front_end/lib/src/scanner/token.dart
index d52abcf..4e858ff 100644
--- a/pkg/front_end/lib/src/scanner/token.dart
+++ b/pkg/front_end/lib/src/scanner/token.dart
@@ -702,7 +702,7 @@
   int get length => _length ?? super.length;
 
   @override
-  Token copy() => new SyntheticStringToken(type, _value, offset);
+  Token copy() => new SyntheticStringToken(type, _value, offset, _length);
 }
 
 /**
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 56bc399..32caeb0 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -236,7 +236,7 @@
 ExpectedIdentifier:
   template: "Expected an identifier, but got '#lexeme'."
   analyzerCode: MISSING_IDENTIFIER
-  dart2jsCode: EXPECTED_IDENTIFIER
+  dart2jsCode: "*fatal*"
   script: "do() {} main() {}"
 
 EqualityCannotBeEqualityOperand:
@@ -260,7 +260,7 @@
 ExpectedToken:
   template: "Expected to find '#string'."
   analyzerCode: EXPECTED_TOKEN
-  dart2jsCode: GENERIC
+  dart2jsCode: "*fatal*"
 
 ExpectedType:
   template: "Expected a type, but got '#lexeme'."
@@ -1148,6 +1148,9 @@
 OverrideTypeVariablesMismatch:
   template: "Declared type variables of '#name' doesn't match those on overridden method '#name2'."
 
+OverriddenMethodCause:
+  template: "This is the overriden method ('#name')."
+
 OverrideMismatchNamedParameter:
   template: "The method '#name' doesn't have the named parameter '#name2' of overriden method '#name3'."
 
@@ -1291,6 +1294,14 @@
   script:
     - "factory class C {}"
 
+RedirectionInNonFactory:
+  template: "Only factory constructor can specify '=' redirection."
+  tip: "Try making this a factory constructor, or remove the redirection."
+  analyzerCode: REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR
+  dart2jsCode: "*fatal*"
+  script:
+    - "class C { C() = D; }"
+
 TopLevelOperator:
   template: "Operators must be declared within a class."
   tip: "Try removing the operator, moving it to a class, or converting it to be a function."
@@ -1662,3 +1673,11 @@
     Indexed #count libraries (#count2 bytes) in #string, that is,
     #string2 bytes/ms, and
     #string3 ms/libraries.
+
+CantInferTypeDueToInconsistentOverrides:
+  template: "Can't infer the type of '#string': overridden members must all have the same type."
+  tip: "Specify the type explicitly."
+
+CantInferTypeDueToCircularity:
+  template: "Can't infer the type of '#string': circularity found during type inference."
+  tip: "Specify the type explicitly."
diff --git a/pkg/front_end/test/fasta/graph_test.dart b/pkg/front_end/test/fasta/graph_test.dart
index b9a2d2f..f9732b1 100644
--- a/pkg/front_end/test/fasta/graph_test.dart
+++ b/pkg/front_end/test/fasta/graph_test.dart
@@ -6,8 +6,13 @@
 
 import 'package:expect/expect.dart' show Expect;
 
+import 'package:test_reflective_loader/test_reflective_loader.dart'
+    show defineReflectiveSuite, defineReflectiveTests, reflectiveTest;
+
 import 'package:front_end/src/fasta/graph/graph.dart';
 
+import '../src/dependency_walker_test.dart' show DependencyWalkerTest;
+
 class TestGraph implements Graph<String> {
   final Map<String, List<String>> graph;
 
@@ -18,7 +23,7 @@
   Iterable<String> neighborsOf(String vertex) => graph[vertex];
 }
 
-test(String expected, Map<String, List<String>> graph) {
+void test(String expected, Map<String, List<String>> graph) {
   List<List<String>> result = computeStrongComponents(new TestGraph(graph));
   Expect.stringEquals(expected, "$result");
 }
@@ -60,4 +65,29 @@
     "B": ["C"],
     "A": ["B"],
   });
+
+  test("[[A], [B], [C], [D]]", {
+    "A": [],
+    "B": ["A"],
+    "C": ["A"],
+    "D": ["B", "C"],
+  });
+
+  // TODO(ahe): Move the tests from DependencyWalkerTest here.
+  defineReflectiveSuite(() {
+    defineReflectiveTests(GraphTest);
+  });
+}
+
+@reflectiveTest
+class GraphTest extends DependencyWalkerTest {
+  void checkGraph(Map<String, List<String>> graph, String startingNodeName,
+      List<List<String>> expectedEvaluations, List<bool> expectedSccFlags) {
+    List<List<String>> result = computeStrongComponents(new TestGraph(graph));
+    List<List<String>> expectedReversed = <List<String>>[];
+    for (List<String> list in expectedEvaluations) {
+      expectedReversed.add(list.reversed.toList());
+    }
+    Expect.stringEquals(expectedReversed.join(", "), result.join(", "));
+  }
 }
diff --git a/pkg/front_end/test/fasta/incremental_test.dart b/pkg/front_end/test/fasta/incremental_test.dart
index a587ef1..54c5e9f 100644
--- a/pkg/front_end/test/fasta/incremental_test.dart
+++ b/pkg/front_end/test/fasta/incremental_test.dart
@@ -192,9 +192,9 @@
           foundSources = true;
           context.compiler.invalidate(uri);
           if (edits == 0) {
-            print("==> t.dart <==");
+            print("==> $uri <==");
           } else {
-            print("==> t.dart (edit #$edits) <==");
+            print("==> $uri (edit #$edits) <==");
           }
           print(source.trimRight());
         }
diff --git a/pkg/front_end/test/fasta/parser/token_stream_rewriter_test.dart b/pkg/front_end/test/fasta/parser/token_stream_rewriter_test.dart
index 6be8843..6a5ddce 100644
--- a/pkg/front_end/test/fasta/parser/token_stream_rewriter_test.dart
+++ b/pkg/front_end/test/fasta/parser/token_stream_rewriter_test.dart
@@ -4,8 +4,7 @@
 
 import 'package:front_end/src/fasta/parser/token_stream_rewriter.dart';
 import 'package:front_end/src/fasta/scanner/token.dart';
-import 'package:front_end/src/scanner/token.dart'
-    show BeginToken, Token, TokenType;
+import 'package:front_end/src/scanner/token.dart' show Token;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -21,19 +20,19 @@
   /// Indicates whether the tests should set up [Token.previous].
   bool get setPrevious;
 
-  void test_insertToken_end_single() {
+  void test_insertTokenAfter_end_single() {
     var a = _makeToken(0, 'a');
     var b = _makeToken(1, 'b');
     var eof = _link([a]);
     var rewriter = new TokenStreamRewriter();
-    expect(rewriter.insertToken(b, eof), same(b));
+    expect(rewriter.insertTokenAfter(a, b), same(a));
     expect(a.next, same(b));
     expect(b.next, same(eof));
     expect(eof.previous, same(b));
     expect(b.previous, same(a));
   }
 
-  void test_insertToken_middle_multiple() {
+  void test_insertTokenAfter_middle_multiple() {
     var a = _makeToken(0, 'a');
     var b = _makeToken(1, 'b');
     var c = _makeToken(2, 'c');
@@ -42,20 +41,38 @@
     _link([a, b, e]);
     _link([c, d]);
     var rewriter = new TokenStreamRewriter();
-    rewriter.insertToken(c, e);
+    rewriter.insertTokenAfter(b, c);
     expect(a.next, same(b));
     expect(b.next, same(c));
     expect(c.next, same(d));
     expect(d.next, same(e));
   }
 
-  void test_insertToken_middle_single() {
+  void test_insertTokenAfter_middle_single() {
     var a = _makeToken(0, 'a');
     var b = _makeToken(1, 'b');
     var c = _makeToken(2, 'c');
     _link([a, c]);
     var rewriter = new TokenStreamRewriter();
-    rewriter.insertToken(b, c);
+    rewriter.insertTokenAfter(a, b);
+    expect(a.next, same(b));
+    expect(b.next, same(c));
+  }
+
+  void test_insertTokenAfter_second_insertion_earlier_in_stream() {
+    var a = _makeToken(0, 'a');
+    var b = _makeToken(1, 'b');
+    var c = _makeToken(2, 'c');
+    var d = _makeToken(3, 'd');
+    var e = _makeToken(4, 'e');
+    _link([a, c, e]);
+    var rewriter = new TokenStreamRewriter();
+    rewriter.insertTokenAfter(c, d);
+    expect(c.next, same(d));
+    expect(d.next, same(e));
+    // The next call to rewriter should be able to find the insertion point
+    // even though it is before the insertion point used above.
+    rewriter.insertTokenAfter(a, b);
     expect(a.next, same(b));
     expect(b.next, same(c));
   }
@@ -89,41 +106,6 @@
     expect(c.next, same(d));
   }
 
-  void test_second_insertion_earlier_in_stream() {
-    var a = _makeToken(0, 'a');
-    var b = _makeToken(1, 'b');
-    var c = _makeToken(2, 'c');
-    var d = _makeToken(3, 'd');
-    var e = _makeToken(4, 'e');
-    _link([a, c, e]);
-    var rewriter = new TokenStreamRewriter();
-    rewriter.insertToken(d, e);
-    expect(c.next, same(d));
-    expect(d.next, same(e));
-    // The next call to rewriter should be able to find the insertion point
-    // even though it is before the insertion point used above.
-    rewriter.insertToken(b, c);
-    expect(a.next, same(b));
-    expect(b.next, same(c));
-  }
-
-  void test_skip_group() {
-    var a = _makeBeginGroupToken(0);
-    var b = _makeToken(1, 'b');
-    var c = _makeToken(2, 'c');
-    var d = _makeToken(3, 'd');
-    var e = _makeToken(4, 'e');
-    a.endGroup = c;
-    _link([a, b, c, e]);
-    // The rewriter should skip from a to c when finding the insertion position;
-    // we test this by corrupting b's next pointer.
-    b.next = null;
-    var rewriter = new TokenStreamRewriter();
-    rewriter.insertToken(d, e);
-    expect(c.next, same(d));
-    expect(d.next, same(e));
-  }
-
   /// Links together the given [tokens] and adds an EOF token to the end of the
   /// token stream.
   ///
@@ -145,10 +127,6 @@
     return eof;
   }
 
-  BeginToken _makeBeginGroupToken(int charOffset) {
-    return new BeginToken(TokenType.OPEN_PAREN, charOffset);
-  }
-
   StringToken _makeToken(int charOffset, String text) {
     return new StringToken.fromString(null, text, charOffset);
   }
@@ -166,36 +144,6 @@
 
   @override
   bool get setPrevious => false;
-
-  @override
-  @failingTest
-  void test_insertToken_end_single() {
-    super.test_insertToken_end_single();
-  }
-
-  @override
-  @failingTest
-  void test_insertToken_middle_multiple() {
-    super.test_insertToken_middle_multiple();
-  }
-
-  @override
-  @failingTest
-  void test_insertToken_middle_single() {
-    super.test_insertToken_middle_single();
-  }
-
-  @override
-  @failingTest
-  void test_second_insertion_earlier_in_stream() {
-    super.test_second_insertion_earlier_in_stream();
-  }
-
-  @override
-  @failingTest
-  void test_skip_group() {
-    super.test_skip_group();
-  }
 }
 
 /// Concrete implementation of [TokenStreamRewriterTest] in which
diff --git a/pkg/front_end/test/fasta/testing/analyzer_diet_listener.dart b/pkg/front_end/test/fasta/testing/analyzer_diet_listener.dart
index 8813c76..4721579 100644
--- a/pkg/front_end/test/fasta/testing/analyzer_diet_listener.dart
+++ b/pkg/front_end/test/fasta/testing/analyzer_diet_listener.dart
@@ -19,7 +19,7 @@
 import 'package:analyzer/src/fasta/ast_builder.dart' show AstBuilder;
 
 import 'package:analyzer/src/fasta/resolution_applier.dart'
-    show ResolutionApplier, TypeContext;
+    show ValidatingResolutionApplier, TypeContext;
 
 import 'package:analyzer/src/fasta/resolution_storer.dart'
     show InstrumentedResolutionStorer;
@@ -184,13 +184,13 @@
     // Now apply the resolution data and inferred types to the analyzer AST.
     var translatedDeclarations = _translateDeclarations(_kernelDeclarations);
     var translatedReferences = _translateReferences(_kernelReferences);
-    var resolutionApplier = new ResolutionApplier(
+    var resolutionApplier = new ValidatingResolutionApplier(
         new _TestTypeContext(),
         translatedDeclarations,
-        _declarationOffsets,
         translatedReferences,
-        _referenceOffsets,
         _kernelTypes,
+        _declarationOffsets,
+        _referenceOffsets,
         _typeOffsets);
     ast.AstNode fields = listener.finishFields();
     fields.accept(resolutionApplier);
@@ -242,15 +242,17 @@
     // Now apply the resolution data and inferred types to the analyzer AST.
     var translatedDeclarations = _translateDeclarations(_kernelDeclarations);
     var translatedReferences = _translateReferences(_kernelReferences);
-    var resolutionApplier = new ResolutionApplier(
+    var resolutionApplier = new ValidatingResolutionApplier(
         new _TestTypeContext(),
         translatedDeclarations,
-        _declarationOffsets,
         translatedReferences,
-        _referenceOffsets,
         _kernelTypes,
+        _declarationOffsets,
+        _referenceOffsets,
         _typeOffsets);
+    ast.AstNode formalsAsAstNode = formals;
     ast.AstNode bodyAsAstNode = body;
+    formalsAsAstNode?.accept(resolutionApplier);
     bodyAsAstNode.accept(resolutionApplier);
     resolutionApplier.checkDone();
 
diff --git a/pkg/front_end/test/src/incremental/kernel_driver_test.dart b/pkg/front_end/test/src/incremental/kernel_driver_test.dart
index 80eb87b..94252e4 100644
--- a/pkg/front_end/test/src/incremental/kernel_driver_test.dart
+++ b/pkg/front_end/test/src/incremental/kernel_driver_test.dart
@@ -7,12 +7,12 @@
 import 'package:front_end/src/api_prototype/byte_store.dart';
 import 'package:front_end/src/api_prototype/compiler_options.dart';
 import 'package:front_end/src/api_prototype/memory_file_system.dart';
+import 'package:front_end/src/api_prototype/summary_generator.dart';
 import 'package:front_end/src/base/performance_logger.dart';
 import 'package:front_end/src/base/processed_options.dart';
 import 'package:front_end/src/fasta/kernel/utils.dart';
 import 'package:front_end/src/fasta/uri_translator_impl.dart';
 import 'package:front_end/src/incremental/kernel_driver.dart';
-import 'package:front_end/src/api_prototype/summary_generator.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/binary/ast_from_binary.dart';
 import 'package:kernel/target/targets.dart';
@@ -63,7 +63,7 @@
       KernelResult result = await driver.getKernel(cUri);
       _assertKernelResult(result, cUri,
           includes: [aUri, bUri, Uri.parse('dart:core')]);
-      expect(_getLibraryText(result.library), r'''
+      expect(_getLibraryText(result.libraryResult.library), r'''
 library;
 import self as self;
 import "dart:core" as core;
@@ -85,7 +85,7 @@
       KernelResult result = await driver.getKernel(cUri);
       _assertKernelResult(result, cUri,
           includes: [aUri, bUri, Uri.parse('dart:core')]);
-      expect(_getLibraryText(result.library), r'''
+      expect(_getLibraryText(result.libraryResult.library), r'''
 library;
 import self as self;
 import "dart:core" as core;
@@ -122,7 +122,7 @@
       // We still get c.dart as the library, and b.dart in dependencies.
       _assertKernelResult(result, cUri,
           includes: [aUri, bUri, Uri.parse('dart:core')]);
-      expect(_getLibraryText(result.library), r'''
+      expect(_getLibraryText(result.libraryResult.library), r'''
 library;
 import self as self;
 import "dart:core" as core;
@@ -143,7 +143,7 @@
       KernelResult result = await driver.getKernel(cUri);
       _assertKernelResult(result, cUri,
           includes: [aUri, bUri, Uri.parse('dart:core')]);
-      expect(_getLibraryText(result.library), r'''
+      expect(_getLibraryText(result.libraryResult.library), r'''
 library;
 import self as self;
 import "dart:core" as core;
@@ -550,7 +550,7 @@
       driver.invalidate(aUri);
       var kernelResult = await driver.getKernelSequence(bUri);
       var allLibraries = kernelResult.results
-          .map((c) => c.kernelLibraries)
+          .map((c) => c.libraryResults.map((result) => result.library))
           .expand((libs) => libs)
           .toList();
 
@@ -572,6 +572,22 @@
       serializeProgram(program,
           filter: (library) => !library.importUri.isScheme('dart'));
     }
+
+    // Ask dart:core, should be served from the outline.
+    {
+      var dartCoreUri = Uri.parse('dart:core');
+      var kernelResult = await driver.getKernelSequence(dartCoreUri);
+      bool hasDartCore = false;
+      for (var libraryResult in kernelResult.results) {
+        for (var libResult in libraryResult.libraryResults) {
+          if (libResult.library.importUri == dartCoreUri) {
+            hasDartCore = true;
+            break;
+          }
+        }
+      }
+      expect(hasDartCore, isTrue);
+    }
   }
 
   test_limitedStore_exportDependencies() async {
@@ -907,7 +923,7 @@
 
   List<Library> _allLibraries(KernelSequenceResult result) {
     return result.results
-        .map((cycle) => cycle.kernelLibraries)
+        .map((cycle) => cycle.libraryResults.map((result) => result.library))
         .expand((libraries) => libraries)
         .toList();
   }
@@ -929,8 +945,8 @@
 
   void _assertKernelResult(KernelResult result, Uri libraryUri,
       {List<Uri> includes: const [], List<Uri> excludes: const []}) {
-    expect(result.library, isNotNull);
-    expect(result.library.importUri, libraryUri);
+    expect(result.libraryResult?.library, isNotNull);
+    expect(result.libraryResult.library.importUri, libraryUri);
 
     List<Uri> dependencyUris = [];
     for (var library in result.dependencies) {
@@ -950,8 +966,8 @@
     List<Uri> libraryUris = [];
     for (LibraryCycleResult cycleResult in result.results) {
       uriToSource.addAll(cycleResult.uriToSource);
-      for (var library in cycleResult.kernelLibraries) {
-        libraryUris.add(library.importUri);
+      for (var result in cycleResult.libraryResults) {
+        libraryUris.add(result.library.importUri);
       }
     }
     for (var shouldInclude in includes) {
@@ -993,14 +1009,15 @@
       ..strongMode = true
       ..target = new NoneTarget(new TargetFlags(strongMode: true));
 
-    driver = new KernelDriver(new ProcessedOptions(options), uriTranslator,
+    driver = new KernelDriver(
+        new ProcessedOptions(options), uriTranslator, new KernelErrorListener(),
         sdkOutlineBytes: sdkOutlineBytes, fileAddedFn: fileAddedFn);
   }
 
   Library _getLibrary(KernelSequenceResult result, Uri uri) {
     for (var cycleResult in result.results) {
-      for (var library in cycleResult.kernelLibraries) {
-        if (library.importUri == uri) return library;
+      for (var result in cycleResult.libraryResults) {
+        if (result.library.importUri == uri) return result.library;
       }
     }
     throw fail('No library found with URI "$uri"');
diff --git a/pkg/front_end/test/subpackage_relationships_test.dart b/pkg/front_end/test/subpackage_relationships_test.dart
index 9ddcf3f..e8331ad 100644
--- a/pkg/front_end/test/subpackage_relationships_test.dart
+++ b/pkg/front_end/test/subpackage_relationships_test.dart
@@ -56,7 +56,6 @@
     'lib/src/api_prototype',
     'lib/src/base',
     'lib/src/fasta',
-    'lib/src/fasta/scanner',
   ]),
   'lib/src/base': new SubpackageRules(allowedDependencies: [
     'lib/src/api_prototype',
@@ -75,6 +74,7 @@
     'lib/src/fasta/kernel',
     'lib/src/fasta/parser',
     'lib/src/fasta/scanner',
+    'lib/src/fasta/source',
     'lib/src/fasta/util',
     'lib/src/scanner',
   ]),
@@ -88,6 +88,7 @@
     'lib/src/fasta',
     'lib/src/fasta/kernel',
   ]),
+  'lib/src/fasta/graph': new SubpackageRules(),
   'lib/src/fasta/kernel': new SubpackageRules(allowedDependencies: [
     'lib/src/api_prototype',
     'lib/src/fasta',
@@ -118,6 +119,7 @@
     'lib/src/base',
     'lib/src/fasta/builder',
     'lib/src/fasta/dill',
+    'lib/src/fasta/graph',
     'lib/src/fasta/kernel',
     'lib/src/fasta/parser',
     'lib/src/fasta/type_inference',
@@ -134,6 +136,7 @@
   ]),
   'lib/src/fasta/type_inference': new SubpackageRules(allowedDependencies: [
     'lib/src/base',
+    'lib/src/fasta/builder',
     'lib/src/fasta',
     'lib/src/fasta/kernel',
     'lib/src/fasta/source',
@@ -199,6 +202,15 @@
   /// Check for problems resulting from URI [src] having a direct dependency on
   /// URI [dst].
   void checkDependency(Uri src, Uri dst) {
+    var srcSubpackage = subpackageForUri(src);
+    if (srcSubpackage == null) return;
+    var srcSubpackageRules = subpackageRules[srcSubpackage];
+    if (srcSubpackageRules == null) {
+      problem('$src is in subpackage "$srcSubpackage", which is not found in '
+          'subpackageRules');
+      return;
+    }
+    srcSubpackageRules.actuallyContainsFiles = true;
     if (dst.scheme == 'dart') return;
     if (dst.scheme != 'package') {
       problem('$src depends on $dst, which is neither a package: or dart: URI');
@@ -215,15 +227,6 @@
             'not found in allowedPackageDependencies');
       }
     }
-    var srcSubpackage = subpackageForUri(src);
-    if (srcSubpackage == null) return;
-    var srcSubpackageRules = subpackageRules[srcSubpackage];
-    if (srcSubpackageRules == null) {
-      problem('$src is in subpackage "$srcSubpackage", which is not found in '
-          'subpackageRules');
-      return;
-    }
-    srcSubpackageRules.actuallyContainsFiles = true;
     var dstSubPackage = subpackageForUri(dst);
     if (dstSubPackage == null) return;
     if (dstSubPackage == srcSubpackage) return;
diff --git a/pkg/front_end/testcases/ast_builder.status b/pkg/front_end/testcases/ast_builder.status
index 9b5c308..60e5a87 100644
--- a/pkg/front_end/testcases/ast_builder.status
+++ b/pkg/front_end/testcases/ast_builder.status
@@ -12,7 +12,6 @@
 call: Crash
 cascade: Crash
 classes: Crash
-default_values: Crash
 duplicated_named_args_3: Crash
 expressions: Crash
 function_type_is_check: Crash
@@ -40,82 +39,31 @@
 inference/downwards_inference_annotations_type_variable: Fail
 inference/downwards_inference_annotations_type_variable_local: Crash
 inference/downwards_inference_annotations_typedef: Crash
-inference/downwards_inference_initializing_formal_default_formal: Crash
-inference/downwards_inference_on_constructor_arguments_infer_downwards: Crash
-inference/downwards_inference_on_function_arguments_infer_downwards: Crash
 inference/downwards_inference_on_function_of_t_using_the_t: Crash
-inference/downwards_inference_on_generic_constructor_arguments_empty_list: Crash
-inference/downwards_inference_on_generic_constructor_arguments_infer_downwards: Crash
 inference/downwards_inference_on_generic_function_expressions: Crash
 inference/downwards_inference_on_instance_creations_infer_downwards: Crash
-inference/downwards_inference_on_list_literals_infer_downwards: Crash
-inference/downwards_inference_on_list_literals_infer_if_value_types_match_context: Crash
-inference/downwards_inference_on_map_literals: Crash
 inference/downwards_inference_yield_yield_star: Fail
 inference/field_initializer_context_explicit: Crash
 inference/field_initializer_context_implicit: Crash
 inference/field_initializer_context_this: Crash
 inference/field_initializer_parameter: Crash
 inference/for_loop_initializer_expression: Crash
-inference/future_then: Crash
-inference/future_then_2: Crash
-inference/future_then_3: Crash
-inference/future_then_4: Crash
-inference/future_then_5: Crash
-inference/future_then_6: Crash
-inference/future_then_conditional: Crash
-inference/future_then_conditional_2: Crash
-inference/future_then_conditional_3: Crash
-inference/future_then_conditional_4: Crash
-inference/future_then_conditional_5: Crash
-inference/future_then_conditional_6: Crash
 inference/future_then_explicit_future: Fail
-inference/future_then_ifNull: Crash
-inference/future_then_upwards: Crash
-inference/future_then_upwards_2: Crash
-inference/future_then_upwards_3: Crash
-inference/future_union_async_conditional: Crash
-inference/future_union_async_conditional_2: Crash
-inference/future_union_downwards: Crash
-inference/future_union_downwards_2: Crash
-inference/future_union_downwards_3: Crash
-inference/future_union_downwards_4: Crash
 inference/generic_functions_return_typedef: Fail
 inference/generic_methods_basic_downward_inference: Crash
 inference/generic_methods_downwards_inference_fold: Crash
 inference/generic_methods_infer_generic_instantiation: Crash
 inference/generic_methods_infer_js_builtin: Fail
 inference/generic_methods_nested_generic_instantiation: Crash
-inference/greatest_closure_multiple_params: Crash
-inference/infer_assign_to_static: Crash
 inference/infer_correctly_on_multiple_variables_declared_together: Crash
 inference/infer_from_complex_expressions_if_outer_most_value_is_precise: Crash
-inference/infer_from_variables_in_cycle_libs_when_flag_is_on2: Crash
-inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a: Crash
-inference/infer_from_variables_in_cycle_libs_when_flag_is_on: Crash
-inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a: Crash
-inference/infer_from_variables_in_non_cycle_imports_with_flag2: Crash
-inference/infer_generic_method_type_named: Crash
-inference/infer_generic_method_type_positional2: Crash
-inference/infer_generic_method_type_positional: Crash
 inference/infer_local_function_referenced_before_declaration: Crash
-inference/infer_method_missing_params: Crash
 inference/infer_rethrow: Crash
 inference/infer_statics_transitively3: Crash
-inference/infer_statics_transitively: Crash
-inference/infer_statics_transitively_2_a: Crash
-inference/infer_statics_transitively_a: Crash
-inference/infer_statics_with_method_invocations: Crash
-inference/infer_statics_with_method_invocations_a: Crash
-inference/inferred_initializing_formal_checks_default_value: Crash
-inference/inferred_type_is_enum: Crash
-inference/inferred_type_is_enum_values: Crash
-inference/inferred_type_uses_synthetic_function_type_named_param: Crash
-inference/inferred_type_uses_synthetic_function_type_positional_param: Crash
+inference/instantiate_tearoff: Crash
+inference/instantiate_tearoff_after_contravariance_check: Crash
+inference/instantiate_tearoff_of_call: Crash
 inference/lambda_does_not_have_propagated_type_hint: Crash
-inference/parameter_defaults_downwards: Crash
-inference/parameter_defaults_upwards: Crash
-inference/static_method_tear_off: Crash
 inference/super_initializer: Crash
 inference/super_initializer_substitution: Crash
 inference/switch_continue: Crash
@@ -130,7 +78,6 @@
 inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: Crash
 inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr: Crash
 inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr: Crash
-inference_new/infer_assign_to_static: Crash
 inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2: Crash
 inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: Crash
 invalid_cast: Crash
@@ -138,9 +85,6 @@
 metadata_enum: Crash
 metadata_named_mixin_application: Crash
 micro: Crash
-named_parameters: Crash
-null_aware: Crash
-optional: Crash
 qualified: Crash
 rasta/abstract_constructor: Crash
 rasta/bad_continue: Crash
@@ -166,14 +110,12 @@
 rasta/issue_000069: Crash
 rasta/issue_000070: Crash
 rasta/malformed_function: Crash
-rasta/mandatory_parameter_initializer: VerificationError
-rasta/mixin_library: Crash
+rasta/mandatory_parameter_initializer: Crash
 rasta/parser_error: Crash
 rasta/previsit_deferred: Crash
 rasta/static: Crash
 rasta/super: Crash
 rasta/super_initializer: Crash
-rasta/super_mixin: Crash
 rasta/supports_reflection: VerificationError
 rasta/this_invoke: Crash
 rasta/try_label: Crash
@@ -201,14 +143,9 @@
 regress/issue_31187: Crash
 regress/issue_31198: Crash
 reorder_super: Crash
-runtime_checks/covariant_generic_parameter_in_interface: Crash
-runtime_checks/forwarding_stub_with_default_values: Crash
 runtime_checks/implicit_downcast_assert_initializer: Crash
 runtime_checks/implicit_downcast_constructor_initializer: Crash
-runtime_checks_new/contravariant_combiner: Crash
-runtime_checks_new/derived_class_typed: Crash
 runtime_checks_new/for_in_call_kinds: Crash
-runtime_checks_new/implicit_downcast_field: Crash
 statements: Crash
 super_rasta_copy: Crash
 type_variable_as_super: Crash
diff --git a/pkg/front_end/testcases/cycles.dart.direct.expect b/pkg/front_end/testcases/cycles.dart.direct.expect
index c4479ea..f77118c 100644
--- a/pkg/front_end/testcases/cycles.dart.direct.expect
+++ b/pkg/front_end/testcases/cycles.dart.direct.expect
@@ -22,7 +22,7 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself via 'A', 'C', 'B'.\nclass B extends A {}\n      ^"]/* from null */;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself via 'B', 'C'.\nclass A implements C {}\n      ^", "pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself via 'A', 'C'.\nclass B extends A {}\n      ^", "pkg/front_end/testcases/cycles.dart:9:7: Error: 'C' is a supertype of itself via 'A', 'B'.\nclass C extends B implements D {}\n      ^"]/* from null */;
 static method main() → dynamic {
   core::print(new self::A::•());
   core::print(new self::B::•());
diff --git a/pkg/front_end/testcases/duplicated_named_args_3.dart.strong.expect b/pkg/front_end/testcases/duplicated_named_args_3.dart.strong.expect
index 22a2efc..205c40b 100644
--- a/pkg/front_end/testcases/duplicated_named_args_3.dart.strong.expect
+++ b/pkg/front_end/testcases/duplicated_named_args_3.dart.strong.expect
@@ -9,6 +9,6 @@
   static method m({core::int a = 0}) → dynamic {}
 }
 static method test() → void {
-  self::C::m(a: const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/duplicated_named_args_3.dart:13:19: Error: Duplicated named argument 'a'.\n  C.m(a: 1, a: 2, a: 3);\n                  ^")));
+  self::C::m(a: const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/duplicated_named_args_3.dart:13:19: Error: Duplicated named argument 'a'.\n  C.m(a: 1, a: 2, a: 3);\n                  ^")) as{TypeError} core::int);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.expect
index a191e19..e59a94a 100644
--- a/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.expect
@@ -14,5 +14,5 @@
     ;
   abstract method f(dynamic x) → dynamic;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B', 'A'.\nabstract class A extends B {\n               ^"]/* from null */;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.\nabstract class A extends B {\n               ^", "pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself via 'A'.\nabstract class B extends A {\n               ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.expect
index a191e19..e59a94a 100644
--- a/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.expect
@@ -14,5 +14,5 @@
     ;
   abstract method f(dynamic x) → dynamic;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B', 'A'.\nabstract class A extends B {\n               ^"]/* from null */;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.\nabstract class A extends B {\n               ^", "pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself via 'A'.\nabstract class B extends A {\n               ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart
index e91299a..2e499a1 100644
--- a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart
@@ -2,10 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=inference*/
+/*@testedFeatures=inference,error*/
 library test;
 
-var /*@topType=dynamic*/ x = /*@returnType=dynamic*/ () => /*error:TOP_LEVEL_CYCLE*/ y;
-var /*@topType=dynamic*/ y = /*@returnType=dynamic*/ () => /*error:TOP_LEVEL_CYCLE*/ x;
+var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
+    y;
+var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
+    x;
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.expect
index fd3ef5e..80af899 100644
--- a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.expect
@@ -3,4 +3,5 @@
 
 static field dynamic x = () → dynamic => self::y;
 static field dynamic y = () → dynamic => self::x;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/circular_reference_via_closures.dart:10:67: Error: Can't infer the type of 'y': circularity found during type inference.\nSpecify the type explicitly.\nvar /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>\n                                                                  ^", "pkg/front_end/testcases/inference/circular_reference_via_closures.dart:8:67: Error: Can't infer the type of 'x': circularity found during type inference.\nSpecify the type explicitly.\nvar /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>\n                                                                  ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart
index e91299a..2e499a1 100644
--- a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart
@@ -2,10 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=inference*/
+/*@testedFeatures=inference,error*/
 library test;
 
-var /*@topType=dynamic*/ x = /*@returnType=dynamic*/ () => /*error:TOP_LEVEL_CYCLE*/ y;
-var /*@topType=dynamic*/ y = /*@returnType=dynamic*/ () => /*error:TOP_LEVEL_CYCLE*/ x;
+var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
+    y;
+var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
+    x;
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.expect
index fd3ef5e..a19d846 100644
--- a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.expect
@@ -3,4 +3,5 @@
 
 static field dynamic x = () → dynamic => self::y;
 static field dynamic y = () → dynamic => self::x;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:10:67: Error: Can't infer the type of 'y': circularity found during type inference.\nSpecify the type explicitly.\nvar /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>\n                                                                  ^", "pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:8:67: Error: Can't infer the type of 'x': circularity found during type inference.\nSpecify the type explicitly.\nvar /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>\n                                                                  ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart b/pkg/front_end/testcases/inference/conflicts_can_happen.dart
index 8e72908..aaebf32 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=inference*/
+/*@testedFeatures=inference,error*/
 library test;
 
 class I1 {
@@ -22,12 +22,14 @@
 }
 
 class C1 implements A, B {
-  /*error:INVALID_METHOD_OVERRIDE*/ get /*@topType=dynamic*/ a => null;
+  get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ a =>
+      null;
 }
 
 // Still ambiguous
 class C2 implements B, A {
-  /*error:INVALID_METHOD_OVERRIDE*/ get /*@topType=dynamic*/ a => null;
+  get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ a =>
+      null;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
index ece81ce..0b25c09 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
@@ -40,4 +40,5 @@
   get a() → dynamic
     return null;
 }
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:79: Error: Can't infer the type of 'a': overridden members must all have the same type.\nSpecify the type explicitly.\n  get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ a =>\n                                                                              ^", "pkg/front_end/testcases/inference/conflicts_can_happen.dart:31:79: Error: Can't infer the type of 'a': overridden members must all have the same type.\nSpecify the type explicitly.\n  get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ a =>\n                                                                              ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart
index 61b622a..85e0bd5 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=inference*/
+/*@testedFeatures=inference,error*/
 library test;
 
 class I1 {
@@ -31,7 +31,8 @@
 }
 
 class C2 implements A, B {
-  /*error:INVALID_METHOD_OVERRIDE*/ get /*@topType=dynamic*/ a => null;
+  get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ a =>
+      null;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
index cc41ea3..60f5c4b 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
@@ -47,4 +47,5 @@
   get a() → dynamic
     return null;
 }
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:79: Error: Can't infer the type of 'a': overridden members must all have the same type.\nSpecify the type explicitly.\n  get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ a =>\n                                                                              ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
index 1f6725e..dd144e6 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
@@ -11,48 +11,48 @@
     return null;
 }
 static method test() → dynamic {
-  self::takeIII(let final dynamic #t1 = math::max in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:16:16: Error: A value of type '<T extends dart.core::num>(dart.math::max::T, dart.math::max::T) \u8594 dart.math::max::T' can't be assigned to a variable of type '(dart.core::int, dart.core::int) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::int) \u8594 dart.core::int'.\n  takeIII(math.max);\n               ^")));
-  self::takeDDD(let final dynamic #t2 = math::max in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:17:16: Error: A value of type '<T extends dart.core::num>(dart.math::max::T, dart.math::max::T) \u8594 dart.math::max::T' can't be assigned to a variable of type '(dart.core::double, dart.core::double) \u8594 dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::double) \u8594 dart.core::double'.\n  takeDDD(math.max);\n               ^")));
-  self::takeNNN(let final dynamic #t3 = math::max in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:18:16: Error: A value of type '<T extends dart.core::num>(dart.math::max::T, dart.math::max::T) \u8594 dart.math::max::T' can't be assigned to a variable of type '(dart.core::num, dart.core::num) \u8594 dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::num, dart.core::num) \u8594 dart.core::num'.\n  takeNNN(math.max);\n               ^")));
-  self::takeIDN(let final dynamic #t4 = math::max in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:19:16: Error: A value of type '<T extends dart.core::num>(dart.math::max::T, dart.math::max::T) \u8594 dart.math::max::T' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::num'.\n  takeIDN(math.max);\n               ^")));
-  self::takeDIN(let final dynamic #t5 = math::max in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:20:16: Error: A value of type '<T extends dart.core::num>(dart.math::max::T, dart.math::max::T) \u8594 dart.math::max::T' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::num'.\n  takeDIN(math.max);\n               ^")));
-  self::takeIIN(let final dynamic #t6 = math::max in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:21:16: Error: A value of type '<T extends dart.core::num>(dart.math::max::T, dart.math::max::T) \u8594 dart.math::max::T' can't be assigned to a variable of type '(dart.core::int, dart.core::int) \u8594 dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::int) \u8594 dart.core::num'.\n  takeIIN(math.max);\n               ^")));
-  self::takeDDN(let final dynamic #t7 = math::max in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:22:16: Error: A value of type '<T extends dart.core::num>(dart.math::max::T, dart.math::max::T) \u8594 dart.math::max::T' can't be assigned to a variable of type '(dart.core::double, dart.core::double) \u8594 dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::double) \u8594 dart.core::num'.\n  takeDDN(math.max);\n               ^")));
-  self::takeIIO(let final dynamic #t8 = math::max in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:23:16: Error: A value of type '<T extends dart.core::num>(dart.math::max::T, dart.math::max::T) \u8594 dart.math::max::T' can't be assigned to a variable of type '(dart.core::int, dart.core::int) \u8594 dart.core::Object'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::int) \u8594 dart.core::Object'.\n  takeIIO(math.max);\n               ^")));
-  self::takeDDO(let final dynamic #t9 = math::max in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:24:16: Error: A value of type '<T extends dart.core::num>(dart.math::max::T, dart.math::max::T) \u8594 dart.math::max::T' can't be assigned to a variable of type '(dart.core::double, dart.core::double) \u8594 dart.core::Object'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::double) \u8594 dart.core::Object'.\n  takeDDO(math.max);\n               ^")));
-  self::takeOOI(let final dynamic #t10 = math::max in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:26:70: Error: A value of type '<T extends dart.core::num>(dart.math::max::T, dart.math::max::T) \u8594 dart.math::max::T' can't be assigned to a variable of type '(dart.core::Object, dart.core::Object) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::Object, dart.core::Object) \u8594 dart.core::int'.\n  takeOOI(/*error:COULD_NOT_INFER,error:INVALID_CAST_FUNCTION*/ math.max);\n                                                                     ^")));
-  self::takeIDI(let final dynamic #t11 = math::max in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: A value of type '<T extends dart.core::num>(dart.math::max::T, dart.math::max::T) \u8594 dart.math::max::T' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\n      /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);\n                                                                        ^")));
-  self::takeDID(let final dynamic #t12 = math::max in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: A value of type '<T extends dart.core::num>(dart.math::max::T, dart.math::max::T) \u8594 dart.math::max::T' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\n      /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);\n                                                                        ^")));
-  self::takeOON(let final dynamic #t13 = math::max in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:31:70: Error: A value of type '<T extends dart.core::num>(dart.math::max::T, dart.math::max::T) \u8594 dart.math::max::T' can't be assigned to a variable of type '(dart.core::Object, dart.core::Object) \u8594 dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::Object, dart.core::Object) \u8594 dart.core::num'.\n  takeOON(/*error:COULD_NOT_INFER,error:INVALID_CAST_FUNCTION*/ math.max);\n                                                                     ^")));
-  self::takeOOO(let final dynamic #t14 = math::max in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:32:70: Error: A value of type '<T extends dart.core::num>(dart.math::max::T, dart.math::max::T) \u8594 dart.math::max::T' can't be assigned to a variable of type '(dart.core::Object, dart.core::Object) \u8594 dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::Object, dart.core::Object) \u8594 dart.core::num'.\n  takeOOO(/*error:COULD_NOT_INFER,error:INVALID_CAST_FUNCTION*/ math.max);\n                                                                     ^")));
-  self::takeIII(let final dynamic #t15 = math::min in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:35:11: Error: A value of type '<T extends dart.core::num>(dart.math::min::T, dart.math::min::T) \u8594 dart.math::min::T' can't be assigned to a variable of type '(dart.core::int, dart.core::int) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::int) \u8594 dart.core::int'.\n  takeIII(min);\n          ^")));
-  self::takeDDD(let final dynamic #t16 = math::min in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:36:11: Error: A value of type '<T extends dart.core::num>(dart.math::min::T, dart.math::min::T) \u8594 dart.math::min::T' can't be assigned to a variable of type '(dart.core::double, dart.core::double) \u8594 dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::double) \u8594 dart.core::double'.\n  takeDDD(min);\n          ^")));
-  self::takeNNN(let final dynamic #t17 = math::min in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:37:11: Error: A value of type '<T extends dart.core::num>(dart.math::min::T, dart.math::min::T) \u8594 dart.math::min::T' can't be assigned to a variable of type '(dart.core::num, dart.core::num) \u8594 dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::num, dart.core::num) \u8594 dart.core::num'.\n  takeNNN(min);\n          ^")));
-  self::takeIDN(let final dynamic #t18 = math::min in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:38:11: Error: A value of type '<T extends dart.core::num>(dart.math::min::T, dart.math::min::T) \u8594 dart.math::min::T' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::num'.\n  takeIDN(min);\n          ^")));
-  self::takeDIN(let final dynamic #t19 = math::min in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:39:11: Error: A value of type '<T extends dart.core::num>(dart.math::min::T, dart.math::min::T) \u8594 dart.math::min::T' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::num'.\n  takeDIN(min);\n          ^")));
-  self::takeIIN(let final dynamic #t20 = math::min in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:40:11: Error: A value of type '<T extends dart.core::num>(dart.math::min::T, dart.math::min::T) \u8594 dart.math::min::T' can't be assigned to a variable of type '(dart.core::int, dart.core::int) \u8594 dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::int) \u8594 dart.core::num'.\n  takeIIN(min);\n          ^")));
-  self::takeDDN(let final dynamic #t21 = math::min in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:41:11: Error: A value of type '<T extends dart.core::num>(dart.math::min::T, dart.math::min::T) \u8594 dart.math::min::T' can't be assigned to a variable of type '(dart.core::double, dart.core::double) \u8594 dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::double) \u8594 dart.core::num'.\n  takeDDN(min);\n          ^")));
-  self::takeIIO(let final dynamic #t22 = math::min in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:42:11: Error: A value of type '<T extends dart.core::num>(dart.math::min::T, dart.math::min::T) \u8594 dart.math::min::T' can't be assigned to a variable of type '(dart.core::int, dart.core::int) \u8594 dart.core::Object'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::int) \u8594 dart.core::Object'.\n  takeIIO(min);\n          ^")));
-  self::takeDDO(let final dynamic #t23 = math::min in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:43:11: Error: A value of type '<T extends dart.core::num>(dart.math::min::T, dart.math::min::T) \u8594 dart.math::min::T' can't be assigned to a variable of type '(dart.core::double, dart.core::double) \u8594 dart.core::Object'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::double) \u8594 dart.core::Object'.\n  takeDDO(min);\n          ^")));
-  self::takeOOI(let final dynamic #t24 = math::min in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:45:65: Error: A value of type '<T extends dart.core::num>(dart.math::min::T, dart.math::min::T) \u8594 dart.math::min::T' can't be assigned to a variable of type '(dart.core::Object, dart.core::Object) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::Object, dart.core::Object) \u8594 dart.core::int'.\n  takeOOI(/*error:COULD_NOT_INFER,error:INVALID_CAST_FUNCTION*/ min);\n                                                                ^")));
-  self::takeIDI(let final dynamic #t25 = math::min in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: A value of type '<T extends dart.core::num>(dart.math::min::T, dart.math::min::T) \u8594 dart.math::min::T' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\n  takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);\n                                                                       ^")));
-  self::takeDID(let final dynamic #t26 = math::min in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: A value of type '<T extends dart.core::num>(dart.math::min::T, dart.math::min::T) \u8594 dart.math::min::T' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\n  takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);\n                                                                       ^")));
-  self::takeOON(let final dynamic #t27 = math::min in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:48:65: Error: A value of type '<T extends dart.core::num>(dart.math::min::T, dart.math::min::T) \u8594 dart.math::min::T' can't be assigned to a variable of type '(dart.core::Object, dart.core::Object) \u8594 dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::Object, dart.core::Object) \u8594 dart.core::num'.\n  takeOON(/*error:COULD_NOT_INFER,error:INVALID_CAST_FUNCTION*/ min);\n                                                                ^")));
-  self::takeOOO(let final dynamic #t28 = math::min in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:49:65: Error: A value of type '<T extends dart.core::num>(dart.math::min::T, dart.math::min::T) \u8594 dart.math::min::T' can't be assigned to a variable of type '(dart.core::Object, dart.core::Object) \u8594 dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::Object, dart.core::Object) \u8594 dart.core::num'.\n  takeOOO(/*error:COULD_NOT_INFER,error:INVALID_CAST_FUNCTION*/ min);\n                                                                ^")));
-  self::takeIII(let final dynamic #t29 = new self::C::•().{self::C::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:52:37: Error: A value of type '<T extends dart.core::num>(test::C::m::T, test::C::m::T) \u8594 test::C::m::T' can't be assigned to a variable of type '(dart.core::int, dart.core::int) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::int) \u8594 dart.core::int'.\n  takeIII(new C(). /*@target=C::m*/ m);\n                                    ^")));
-  self::takeDDD(let final dynamic #t30 = new self::C::•().{self::C::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:53:37: Error: A value of type '<T extends dart.core::num>(test::C::m::T, test::C::m::T) \u8594 test::C::m::T' can't be assigned to a variable of type '(dart.core::double, dart.core::double) \u8594 dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::double) \u8594 dart.core::double'.\n  takeDDD(new C(). /*@target=C::m*/ m);\n                                    ^")));
-  self::takeNNN(let final dynamic #t31 = new self::C::•().{self::C::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:54:37: Error: A value of type '<T extends dart.core::num>(test::C::m::T, test::C::m::T) \u8594 test::C::m::T' can't be assigned to a variable of type '(dart.core::num, dart.core::num) \u8594 dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::num, dart.core::num) \u8594 dart.core::num'.\n  takeNNN(new C(). /*@target=C::m*/ m);\n                                    ^")));
-  self::takeIDN(let final dynamic #t32 = new self::C::•().{self::C::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:55:37: Error: A value of type '<T extends dart.core::num>(test::C::m::T, test::C::m::T) \u8594 test::C::m::T' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::num'.\n  takeIDN(new C(). /*@target=C::m*/ m);\n                                    ^")));
-  self::takeDIN(let final dynamic #t33 = new self::C::•().{self::C::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:56:37: Error: A value of type '<T extends dart.core::num>(test::C::m::T, test::C::m::T) \u8594 test::C::m::T' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::num'.\n  takeDIN(new C(). /*@target=C::m*/ m);\n                                    ^")));
-  self::takeIIN(let final dynamic #t34 = new self::C::•().{self::C::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:57:37: Error: A value of type '<T extends dart.core::num>(test::C::m::T, test::C::m::T) \u8594 test::C::m::T' can't be assigned to a variable of type '(dart.core::int, dart.core::int) \u8594 dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::int) \u8594 dart.core::num'.\n  takeIIN(new C(). /*@target=C::m*/ m);\n                                    ^")));
-  self::takeDDN(let final dynamic #t35 = new self::C::•().{self::C::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:58:37: Error: A value of type '<T extends dart.core::num>(test::C::m::T, test::C::m::T) \u8594 test::C::m::T' can't be assigned to a variable of type '(dart.core::double, dart.core::double) \u8594 dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::double) \u8594 dart.core::num'.\n  takeDDN(new C(). /*@target=C::m*/ m);\n                                    ^")));
-  self::takeIIO(let final dynamic #t36 = new self::C::•().{self::C::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:59:37: Error: A value of type '<T extends dart.core::num>(test::C::m::T, test::C::m::T) \u8594 test::C::m::T' can't be assigned to a variable of type '(dart.core::int, dart.core::int) \u8594 dart.core::Object'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::int) \u8594 dart.core::Object'.\n  takeIIO(new C(). /*@target=C::m*/ m);\n                                    ^")));
-  self::takeDDO(let final dynamic #t37 = new self::C::•().{self::C::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:60:37: Error: A value of type '<T extends dart.core::num>(test::C::m::T, test::C::m::T) \u8594 test::C::m::T' can't be assigned to a variable of type '(dart.core::double, dart.core::double) \u8594 dart.core::Object'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::double) \u8594 dart.core::Object'.\n  takeDDO(new C(). /*@target=C::m*/ m);\n                                    ^")));
-  self::takeOON(let final dynamic #t38 = new self::C::•().{self::C::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:73:26: Error: A value of type '<T extends dart.core::num>(test::C::m::T, test::C::m::T) \u8594 test::C::m::T' can't be assigned to a variable of type '(dart.core::Object, dart.core::Object) \u8594 dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::Object, dart.core::Object) \u8594 dart.core::num'.\n      . /*@target=C::m*/ m);\n                         ^")));
-  self::takeOOO(let final dynamic #t39 = new self::C::•().{self::C::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:75:26: Error: A value of type '<T extends dart.core::num>(test::C::m::T, test::C::m::T) \u8594 test::C::m::T' can't be assigned to a variable of type '(dart.core::Object, dart.core::Object) \u8594 dart.core::num'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::Object, dart.core::Object) \u8594 dart.core::num'.\n      . /*@target=C::m*/ m);\n                         ^")));
-  self::takeOOI(let final dynamic #t40 = new self::C::•().{self::C::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:82:26: Error: A value of type '<T extends dart.core::num>(test::C::m::T, test::C::m::T) \u8594 test::C::m::T' can't be assigned to a variable of type '(dart.core::Object, dart.core::Object) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::Object, dart.core::Object) \u8594 dart.core::int'.\n      . /*@target=C::m*/ m);\n                         ^")));
-  self::takeIDI(let final dynamic #t41 = new self::C::•().{self::C::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: A value of type '<T extends dart.core::num>(test::C::m::T, test::C::m::T) \u8594 test::C::m::T' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\n          . /*@target=C::m*/ m);\n                             ^")));
-  self::takeDID(let final dynamic #t42 = new self::C::•().{self::C::m} in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: A value of type '<T extends dart.core::num>(test::C::m::T, test::C::m::T) \u8594 test::C::m::T' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\n          . /*@target=C::m*/ m);\n                             ^")));
+  self::takeIII(math::max<core::int>);
+  self::takeDDD(math::max<core::double>);
+  self::takeNNN(math::max<core::num>);
+  self::takeIDN(math::max<core::num>);
+  self::takeDIN(math::max<core::num>);
+  self::takeIIN(math::max<core::int>);
+  self::takeDDN(math::max<core::double>);
+  self::takeIIO(math::max<core::int>);
+  self::takeDDO(math::max<core::double>);
+  self::takeOOI((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
+  self::takeIDI(let final dynamic #t1 = math::max<core::num> in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\n      /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);\n                                                                        ^")));
+  self::takeDID(let final dynamic #t2 = math::max<core::num> in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\n      /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);\n                                                                        ^")));
+  self::takeOON((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
+  self::takeOOO((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
+  self::takeIII(math::min<core::int>);
+  self::takeDDD(math::min<core::double>);
+  self::takeNNN(math::min<core::num>);
+  self::takeIDN(math::min<core::num>);
+  self::takeDIN(math::min<core::num>);
+  self::takeIIN(math::min<core::int>);
+  self::takeDDN(math::min<core::double>);
+  self::takeIIO(math::min<core::int>);
+  self::takeDDO(math::min<core::double>);
+  self::takeOOI((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
+  self::takeIDI(let final dynamic #t3 = math::min<core::num> in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\n  takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);\n                                                                       ^")));
+  self::takeDID(let final dynamic #t4 = math::min<core::num> in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\n  takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);\n                                                                       ^")));
+  self::takeOON((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
+  self::takeOOO((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
+  self::takeIII(new self::C::•().{self::C::m}<core::int>);
+  self::takeDDD(new self::C::•().{self::C::m}<core::double>);
+  self::takeNNN(new self::C::•().{self::C::m}<core::num>);
+  self::takeIDN(new self::C::•().{self::C::m}<core::num>);
+  self::takeDIN(new self::C::•().{self::C::m}<core::num>);
+  self::takeIIN(new self::C::•().{self::C::m}<core::int>);
+  self::takeDDN(new self::C::•().{self::C::m}<core::double>);
+  self::takeIIO(new self::C::•().{self::C::m}<core::int>);
+  self::takeDDO(new self::C::•().{self::C::m}<core::double>);
+  self::takeOON((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
+  self::takeOOO((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
+  self::takeOOI((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
+  self::takeIDI(let final dynamic #t5 = new self::C::•().{self::C::m}<core::num> in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.\n          . /*@target=C::m*/ m);\n                             ^")));
+  self::takeDID(let final dynamic #t6 = new self::C::•().{self::C::m}<core::num> in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.\n          . /*@target=C::m*/ m);\n                             ^")));
 }
 static method takeIII((core::int, core::int) → core::int fn) → void {}
 static method takeDDD((core::double, core::double) → core::double fn) → void {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.strong.expect
index 703cafd..341eac6 100644
--- a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.strong.expect
@@ -18,6 +18,6 @@
 static method main() → dynamic {
   core::List<self::Trace> traces = <self::Trace>[];
   core::int longest = traces.{core::Iterable::map}<core::int>((self::Trace trace) → core::int {
-    return trace.{self::Trace::frames}.{core::Iterable::map}<core::int>((self::Frame frame) → core::int => frame.{self::Frame::location}.{core::String::length}).{core::Iterable::fold}<core::int>(0, let final dynamic #t1 = math::max in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart:28:69: Error: A value of type '<T extends dart.core::num>(dart.math::max::T, dart.math::max::T) \u8594 dart.math::max::T' can't be assigned to a variable of type '(dart.core::int, dart.core::int) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::int) \u8594 dart.core::int'.\n        . /*@typeArgs=int*/ /*@target=Iterable::fold*/ fold(0, math.max);\n                                                                    ^")));
-  }).{core::Iterable::fold}<core::int>(0, let final dynamic #t2 = math::max in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart:29:65: Error: A value of type '<T extends dart.core::num>(dart.math::max::T, dart.math::max::T) \u8594 dart.math::max::T' can't be assigned to a variable of type '(dart.core::int, dart.core::int) \u8594 dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::int) \u8594 dart.core::int'.\n  }). /*@typeArgs=int*/ /*@target=Iterable::fold*/ fold(0, math.max);\n                                                                ^")));
+    return trace.{self::Trace::frames}.{core::Iterable::map}<core::int>((self::Frame frame) → core::int => frame.{self::Frame::location}.{core::String::length}).{core::Iterable::fold}<core::int>(0, math::max<core::int>);
+  }).{core::Iterable::fold}<core::int>(0, math::max<core::int>);
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart
index 4003e8c..a7484f4 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=inference*/
+/*@testedFeatures=inference,error*/
 library test;
 
 abstract class A {
@@ -29,15 +29,15 @@
 // Superclasses don't have a consistent type for `x` so inference fails, even if
 // the types are related.
 class F extends A implements C {
-  var /*@topType=dynamic*/ x;
+  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ x;
 }
 
 class G extends A implements D {
-  var /*@topType=dynamic*/ x;
+  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ x;
 }
 
 class H extends C implements D {
-  var /*@topType=dynamic*/ x;
+  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ x;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
index 2897e76..a38ad52 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
@@ -50,4 +50,5 @@
     : super self::C::•()
     ;
 }
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:79: Error: Can't infer the type of 'x': overridden members must all have the same type.\nSpecify the type explicitly.\n  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ x;\n                                                                              ^", "pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:79: Error: Can't infer the type of 'x': overridden members must all have the same type.\nSpecify the type explicitly.\n  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ x;\n                                                                              ^", "pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:79: Error: Can't infer the type of 'x': overridden members must all have the same type.\nSpecify the type explicitly.\n  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ x;\n                                                                              ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_method_missing_params.dart b/pkg/front_end/testcases/inference/infer_method_missing_params.dart
index 839e425..57a5515 100644
--- a/pkg/front_end/testcases/inference/infer_method_missing_params.dart
+++ b/pkg/front_end/testcases/inference/infer_method_missing_params.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=inference*/
+/*@testedFeatures=inference,error*/
 library test;
 
 // All of these cases are error conditions; this test checks how we recover.
@@ -20,9 +20,13 @@
 }
 
 abstract class C implements A, B {
-  /*@topType=int*/ f(/*@topType=int*/ x, /*@topType=dynamic*/ y);
-  /*@topType=int*/ g(/*@topType=int*/ x, [/*@topType=dynamic*/ y]);
-  /*@topType=int*/ h(/*@topType=int*/ x, {/*@topType=dynamic*/ y});
+  /*@topType=int*/ f(
+      /*@topType=int*/ x,
+      /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y);
+  /*@topType=int*/ g(/*@topType=int*/ x,
+      [/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y]);
+  /*@topType=int*/ h(/*@topType=int*/ x,
+      {/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y});
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect
index 0eddb83..c07237e 100644
--- a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect
@@ -26,4 +26,5 @@
   abstract method g(core::int x, [dynamic y = null]) → core::int;
   abstract method h(core::int x, {dynamic y = null}) → core::int;
 }
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/infer_method_missing_params.dart:25:79: Error: Can't infer the type of 'y': overridden members must all have the same type.\nSpecify the type explicitly.\n      /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y);\n                                                                              ^", "pkg/front_end/testcases/inference/infer_method_missing_params.dart:29:80: Error: Can't infer the type of 'y': overridden members must all have the same type.\nSpecify the type explicitly.\n      {/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y});\n                                                                               ^", "pkg/front_end/testcases/inference/infer_method_missing_params.dart:27:80: Error: Can't infer the type of 'y': overridden members must all have the same type.\nSpecify the type explicitly.\n      [/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y]);\n                                                                               ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart b/pkg/front_end/testcases/inference/instantiate_tearoff.dart
new file mode 100644
index 0000000..10eeb1f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart
@@ -0,0 +1,31 @@
+// 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.
+
+/*@testedFeatures=inference*/
+library test;
+
+T f<T>(T x) => x;
+
+class C {
+  T f<T>(T x) => x;
+  static T g<T>(T x) => x;
+}
+
+class D extends C {
+  void test() {
+    int Function(int) func;
+    func = super. /*@target=C::f*/ f;
+  }
+}
+
+void test() {
+  T h<T>(T x) => x;
+  int Function(int) func;
+  func = f;
+  func = new C(). /*@target=C::f*/ f;
+  func = C.g;
+  func = h;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.expect
new file mode 100644
index 0000000..47f329d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.expect
@@ -0,0 +1,34 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method f<T extends core::Object>(self::C::f::T x) → self::C::f::T
+    return x;
+  static method g<T extends core::Object>(self::C::g::T x) → self::C::g::T
+    return x;
+}
+class D extends self::C {
+  default constructor •() → void
+    : super self::C::•()
+    ;
+  method test() → void {
+    (core::int) → core::int func;
+    func = super.{self::C::f};
+  }
+}
+static method f<T extends core::Object>(self::f::T x) → self::f::T
+  return x;
+static method test() → void {
+  function h<T extends core::Object>(T x) → T
+    return x;
+  (core::int) → core::int func;
+  func = self::f;
+  func = new self::C::•().f;
+  func = self::C::g;
+  func = h;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.outline.expect
new file mode 100644
index 0000000..c14cfbd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.outline.expect
@@ -0,0 +1,24 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  default constructor •() → void
+    ;
+  method f<T extends core::Object>(self::C::f::T x) → self::C::f::T
+    ;
+  static method g<T extends core::Object>(self::C::g::T x) → self::C::g::T
+    ;
+}
+class D extends self::C {
+  default constructor •() → void
+    ;
+  method test() → void
+    ;
+}
+static method f<T extends core::Object>(self::f::T x) → self::f::T
+  ;
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.expect
new file mode 100644
index 0000000..c6f2f60
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.expect
@@ -0,0 +1,34 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method f<T extends core::Object>(self::C::f::T x) → self::C::f::T
+    return x;
+  static method g<T extends core::Object>(self::C::g::T x) → self::C::g::T
+    return x;
+}
+class D extends self::C {
+  default constructor •() → void
+    : super self::C::•()
+    ;
+  method test() → void {
+    (core::int) → core::int func;
+    func = super.{self::C::f}<core::int>;
+  }
+}
+static method f<T extends core::Object>(self::f::T x) → self::f::T
+  return x;
+static method test() → void {
+  function h<T extends core::Object>(T x) → T
+    return x;
+  (core::int) → core::int func;
+  func = self::f<core::int>;
+  func = new self::C::•().{self::C::f}<core::int>;
+  func = self::C::g<core::int>;
+  func = h<core::int>;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart
new file mode 100644
index 0000000..d272786
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart
@@ -0,0 +1,18 @@
+// 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.
+
+/*@testedFeatures=inference*/
+library test;
+
+class C<T> {
+  void Function(T) f<U>(U x) => /*@returnType=Null*/ (/*@type=C::T*/ y) {};
+}
+
+void test(C<String> c) {
+  // Tear-off of c.f needs to be type checked due to contravariance.  The
+  // instantiation should occur after the type check.
+  void Function(String) Function(int) tearoff = c. /*@target=C::f*/ f;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.expect
new file mode 100644
index 0000000..aee70c3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object> extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method f<U extends core::Object>(self::C::f::U x) → (self::C::T) → void
+    return (dynamic y) → dynamic {};
+}
+static method test(self::C<core::String> c) → void {
+  (core::int) → (core::String) → void tearoff = c.f;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.outline.expect
new file mode 100644
index 0000000..5b4814c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.outline.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object> extends core::Object {
+  default constructor •() → void
+    ;
+  method f<U extends core::Object>(self::C::f::U x) → (self::C::T) → void
+    ;
+}
+static method test(self::C<core::String> c) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect
new file mode 100644
index 0000000..fb13da1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object> extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  generic-contravariant method f<U extends core::Object>(self::C::f::U x) → (self::C::T) → void
+    return (self::C::T y) → core::Null {};
+}
+static method test(self::C<core::String> c) → void {
+  (core::int) → (core::String) → void tearoff = c.{self::C::f} as{TypeError} <U extends core::Object>(U) → (core::String) → void<core::int>;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart
new file mode 100644
index 0000000..1967387
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart
@@ -0,0 +1,13 @@
+// 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.
+
+/*@testedFeatures=inference*/
+library test;
+
+void test(T Function<T>(T) f) {
+  int Function(int) func;
+  func = f.call;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.direct.expect
new file mode 100644
index 0000000..258ba0e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.direct.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test(<T extends core::Object>(T) → T f) → void {
+  (core::int) → core::int func;
+  func = f.call;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.outline.expect
new file mode 100644
index 0000000..65e10ba
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test(<T extends core::Object>(T) → T f) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.strong.expect
new file mode 100644
index 0000000..c944bdb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.strong.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test(<T extends core::Object>(T) → T f) → void {
+  (core::int) → core::int func;
+  func = f.call<core::int>;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart
index 1245688..68d91d1 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=inference*/
+/*@testedFeatures=inference,error*/
 library test;
 
 class A {
@@ -15,9 +15,9 @@
 // There's a circularity between b and c because a.f is generic, so the type of
 // c is required to infer b, and vice versa.
 
-var /*@topType=dynamic*/ b = /*@returnType=dynamic*/ () =>
+var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = /*@returnType=dynamic*/ () =>
     a. /*@typeArgs=dynamic*/ /*@target=A::f*/ f(c);
-var /*@topType=dynamic*/ c = /*@returnType=dynamic*/ () =>
+var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ c = /*@returnType=dynamic*/ () =>
     a. /*@typeArgs=dynamic*/ /*@target=A::f*/ f(b);
 
 // e's use of a.g breaks the circularity, because a.g is not generic, therefore
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.expect
index c5d787c..1965b1b 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.expect
@@ -16,4 +16,5 @@
 static field dynamic c = () → dynamic => self::a.{self::A::f}<dynamic>(self::b);
 static field () → () → core::int d = () → () → core::int => self::a.{self::A::f}<() → core::int>(self::e);
 static field () → core::int e = () → core::int => self::a.{self::A::g}(self::d);
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:20:67: Error: Can't infer the type of 'c': circularity found during type inference.\nSpecify the type explicitly.\nvar /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ c = /*@returnType=dynamic*/ () =>\n                                                                  ^", "pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:18:67: Error: Can't infer the type of 'b': circularity found during type inference.\nSpecify the type explicitly.\nvar /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = /*@returnType=dynamic*/ () =>\n                                                                  ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart
index eb8d3d9..0c3cd9b 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=inference*/
+/*@testedFeatures=inference,error*/
 library test;
 
 int intValue = 0;
@@ -12,9 +12,9 @@
 // There's a circularity between a and b because the type of `int + x` depends
 // on the type of x.
 
-var /*@topType=dynamic*/ a = /*@returnType=num*/ () =>
+var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ a = /*@returnType=num*/ () =>
     intValue /*@target=num::+*/ + b;
-var /*@topType=dynamic*/ b = a();
+var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = a();
 
 // But there's no circularity between c and d because the type of `num + x` is
 // always num.
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.expect
index 576fb78..e86a790 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.expect
@@ -11,4 +11,5 @@
 static field core::num d = self::c.call();
 static field () → core::double e = () → core::double => self::doubleValue.{core::double::+}(self::f);
 static field core::double f = self::e.call();
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:17:67: Error: Can't infer the type of 'b': circularity found during type inference.\nSpecify the type explicitly.\nvar /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = a();\n                                                                  ^", "pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:15:67: Error: Can't infer the type of 'a': circularity found during type inference.\nSpecify the type explicitly.\nvar /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ a = /*@returnType=num*/ () =>\n                                                                  ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart
index 5cef25d..d8b81a7 100644
--- a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart
+++ b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart
@@ -2,21 +2,21 @@
 // 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.
 
-/*@testedFeatures=inference*/
+/*@testedFeatures=inference,error*/
 library test;
 
 // A.x depends on B.x which depends on A.x, so no type is inferred.  But types
 // can be inferred for A.y and B.y.
 
 class A {
-  var /*@topType=dynamic*/ x = /*@returnType=dynamic*/ () =>
+  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
       new B(). /*@target=B::x*/ x;
   var /*@topType=() -> dynamic*/ y = /*@returnType=dynamic*/ () =>
       new B(). /*@target=B::x*/ x;
 }
 
 class B extends A {
-  var /*@topType=dynamic*/ x;
+  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x;
   var /*@topType=() -> dynamic*/ y;
 }
 
diff --git a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.strong.expect b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.strong.expect
index f6aa303..7770e4d 100644
--- a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.strong.expect
@@ -16,4 +16,5 @@
     : super self::A::•()
     ;
 }
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference_new/field_inference_circularity.dart:12:69: Error: Can't infer the type of 'x': circularity found during type inference.\nSpecify the type explicitly.\n  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>\n                                                                    ^", "pkg/front_end/testcases/inference_new/field_inference_circularity.dart:19:69: Error: Can't infer the type of 'x': circularity found during type inference.\nSpecify the type explicitly.\n  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x;\n                                                                    ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart
index b83ee3a..888321e 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart
@@ -2,18 +2,19 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=inference*/
+/*@testedFeatures=inference,error*/
 library test;
 
 // In the code below, there is a circularity between A.b and x.
 
 class A {
-  var /*@topType=dynamic*/ b = /*@returnType=dynamic*/ () => x;
+  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = /*@returnType=dynamic*/ () =>
+      x;
   var /*@topType=() -> dynamic*/ c = /*@returnType=dynamic*/ () => x;
 }
 
 var /*@topType=A*/ a = new A();
-var /*@topType=dynamic*/ x = /*@returnType=dynamic*/ () =>
+var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
     a. /*@target=A::b*/ b;
 var /*@topType=() -> () -> dynamic*/ y = /*@returnType=() -> dynamic*/ () =>
     a. /*@target=A::c*/ c;
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.expect
index f475a19..3db6238 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.expect
@@ -12,4 +12,5 @@
 static field self::A a = new self::A::•();
 static field dynamic x = () → dynamic => self::a.{self::A::b};
 static field () → () → dynamic y = () → () → dynamic => self::a.{self::A::c};
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:11:69: Error: Can't infer the type of 'b': circularity found during type inference.\nSpecify the type explicitly.\n  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = /*@returnType=dynamic*/ () =>\n                                                                    ^", "pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:17:67: Error: Can't infer the type of 'x': circularity found during type inference.\nSpecify the type explicitly.\nvar /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>\n                                                                  ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart
index b5f2ef5..0589e0a 100644
--- a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart
+++ b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=inference*/
+/*@testedFeatures=inference,error*/
 library test;
 
 bool f() => null;
@@ -14,8 +14,10 @@
 // circularity, and for error recovery their type is set to `dynamic`.
 // Thereafter, z infers without problems.
 
-var /*@topType=dynamic*/ x = /*@returnType=dynamic*/ () => f() ? y : z;
-var /*@topType=dynamic*/ y = /*@returnType=dynamic*/ () => x;
+var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
+    f() ? y : z;
+var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
+    x;
 var /*@topType=() -> dynamic*/ z = /*@returnType=dynamic*/ () => x;
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.expect b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.expect
index 9d0892a..a51da21 100644
--- a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.expect
@@ -5,6 +5,7 @@
 static field dynamic x = () → dynamic => self::f() ?{dynamic} self::y : self::z;
 static field dynamic y = () → dynamic => self::x;
 static field () → dynamic z = () → dynamic => self::x;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference_new/strongly_connected_component.dart:19:67: Error: Can't infer the type of 'y': circularity found during type inference.\nSpecify the type explicitly.\nvar /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>\n                                                                  ^", "pkg/front_end/testcases/inference_new/strongly_connected_component.dart:17:67: Error: Can't infer the type of 'x': circularity found during type inference.\nSpecify the type explicitly.\nvar /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>\n                                                                  ^"]/* from null */;
 static method f() → core::bool
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/qualified.dart.direct.expect b/pkg/front_end/testcases/qualified.dart.direct.expect
index 3ea9743..9bc9165 100644
--- a/pkg/front_end/testcases/qualified.dart.direct.expect
+++ b/pkg/front_end/testcases/qualified.dart.direct.expect
@@ -25,7 +25,7 @@
   static factory b<T extends core::Object>() → self::C<self::C::b::T>
     let dynamic #redirecting_factory = lib::C::b in invalid-expression;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart: Error: The type 'lib.Missing' can't be used as supertype."]/* from null */;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:11:7: Error: The type 'lib.Missing' can't be used as supertype.\nclass Bad extends lib.Missing {\n      ^"]/* from null */;
 static method main() → dynamic {
   new self::C::•<core::String>();
   new self::C::a<core::String>();
diff --git a/pkg/front_end/testcases/qualified.dart.strong.expect b/pkg/front_end/testcases/qualified.dart.strong.expect
index 0e14ca2..8540a0d 100644
--- a/pkg/front_end/testcases/qualified.dart.strong.expect
+++ b/pkg/front_end/testcases/qualified.dart.strong.expect
@@ -25,7 +25,7 @@
   static factory b<T extends core::Object>() → self::C<self::C::b::T>
     let dynamic #redirecting_factory = lib::C::b in invalid-expression;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart: Error: The type 'lib.Missing' can't be used as supertype."]/* from null */;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:11:7: Error: The type 'lib.Missing' can't be used as supertype.\nclass Bad extends lib.Missing {\n      ^"]/* from null */;
 static method main() → dynamic {
   new self::C::•<core::String>();
   new self::C::a<core::String>();
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index 36cc99b..b92e4f8 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -102,6 +102,7 @@
 inference/infer_type_regardless_of_declaration_order_or_cycles: RuntimeError
 inference/infer_types_on_generic_instantiations_4: RuntimeError
 inference/infer_types_on_generic_instantiations_infer: TypeCheckError
+inference/instantiate_tearoff_of_call: TypeCheckError
 inference/instantiate_to_bounds_generic_has_bound_defined_after transform: RuntimeError
 inference/unresolved_super: TypeCheckError
 inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1: Fail # Issue #25824
diff --git a/pkg/front_end/tool/incremental_perf.dart b/pkg/front_end/tool/incremental_perf.dart
index b4c07ce..b9ef4a2 100644
--- a/pkg/front_end/tool/incremental_perf.dart
+++ b/pkg/front_end/tool/incremental_perf.dart
@@ -106,6 +106,9 @@
   timer1.stop();
   print("Libraries changed: ${delta.newProgram.libraries.length}");
   print("Initial compilation took: ${timer1.elapsedMilliseconds}ms");
+  if (delta.newProgram.libraries.length < 1) {
+    throw "No libraries were changed";
+  }
 
   for (final ChangeSet changeSet in changeSets) {
     await applyEdits(changeSet.edits, overlayFs, generator, uriTranslator);
@@ -117,6 +120,9 @@
         "Libraries changed: ${delta.newProgram.libraries.length}");
     print("Change '${changeSet.name}' - "
         "Incremental compilation took: ${iterTimer.elapsedMilliseconds}ms");
+    if (delta.newProgram.libraries.length < 1) {
+      throw "No libraries were changed";
+    }
   }
 
   dir.deleteSync(recursive: true);
@@ -239,7 +245,7 @@
   final String replacement;
 
   Edit(String uriString, this.original, this.replacement)
-      : uri = Uri.base.resolve(uriString);
+      : uri = _resolveOverlayUri(uriString);
 
   String toString() => 'Edit($uri, "$original" -> "$replacement")';
 }
@@ -254,8 +260,12 @@
   String toString() => 'ChangeSet($name, $edits)';
 }
 
-_resolveOverlayUri(String uriString) =>
-    Uri.base.resolve(uriString).replace(scheme: 'org-dartlang-overlay');
+_resolveOverlayUri(String uriString) {
+  Uri result = Uri.base.resolve(uriString);
+  return result.isScheme("file")
+      ? result.replace(scheme: 'org-dartlang-overlay')
+      : result;
+}
 
 ArgParser argParser = new ArgParser()
   ..addOption('target',
diff --git a/pkg/js_ast/lib/src/nodes.dart b/pkg/js_ast/lib/src/nodes.dart
index c431f8f..480ab21 100644
--- a/pkg/js_ast/lib/src/nodes.dart
+++ b/pkg/js_ast/lib/src/nodes.dart
@@ -1318,7 +1318,7 @@
 
   static RegExp _identifierRE = new RegExp(r'^[A-Za-z_$][A-Za-z_$0-9]*$');
 
-  accept(NodeVisitor visitor);
+  T accept<T>(NodeVisitor<T> visitor);
 
   int get precedenceLevel => PRIMARY;
 
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index 9556f07..5d9b1e3 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -326,6 +326,7 @@
   FileOffset fileEndOffset;
   Byte flags (isConst, isExternal);
   Name name;
+  UriReference fileUri;
   List<Expression> annotations;
   FunctionNode function;
   List<Initializer> initializers;
@@ -364,6 +365,7 @@
   FileOffset fileEndOffset;
   Byte flags;
   Name name;
+  UriReference fileUri;
   List<Expression> annotations;
   List<DartType> typeArguments;
   MemberReference targetReference;
@@ -802,6 +804,12 @@
   Expression body;
 }
 
+type Instantiation extends Expression {
+  Byte tag = 54;
+  Expression expression;
+  List<DartType> typeArguments;
+}
+
 type LoadLibrary extends Expression {
   Byte tag = 14;
   LibraryDependencyReference deferredImport;
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index a2d8545..e443158 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -1222,11 +1222,14 @@
 /// invocation should be matched with the type parameters declared in the class.
 ///
 /// For unnamed constructors, the name is an empty string (in a [Name]).
-class Constructor extends Member {
+class Constructor extends Member implements FileUriNode {
   int flags = 0;
   FunctionNode function;
   List<Initializer> initializers;
 
+  /// The uri of the source file this field was loaded from.
+  Uri fileUri;
+
   Constructor(this.function,
       {Name name,
       bool isConst: false,
@@ -1234,6 +1237,7 @@
       bool isSyntheticDefault: false,
       List<Initializer> initializers,
       int transformerFlags: 0,
+      this.fileUri,
       Reference reference})
       : this.initializers = initializers ?? <Initializer>[],
         super(name, reference) {
@@ -1297,6 +1301,10 @@
 
   DartType get getterType => const BottomType();
   DartType get setterType => const BottomType();
+
+  Location _getLocationInEnclosingFile(int offset) {
+    return _getLocationInProgram(enclosingProgram, fileUri, offset);
+  }
 }
 
 /// Residue of a redirecting factory constructor for the linking phase.
@@ -1320,9 +1328,12 @@
 ///
 /// Redirecting factory constructors can be unnamed.  In this case, the name is
 /// an empty string (in a [Name]).
-class RedirectingFactoryConstructor extends Member {
+class RedirectingFactoryConstructor extends Member implements FileUriNode {
   int flags = 0;
 
+  /// The uri of the source file this field was loaded from.
+  Uri fileUri;
+
   /// [RedirectingFactoryConstructor]s may redirect to constructors or factories
   /// of instantiated generic types, that is, generic types with supplied type
   /// arguments.  The supplied type arguments are stored in this field.
@@ -1359,6 +1370,7 @@
       List<VariableDeclaration> positionalParameters,
       List<VariableDeclaration> namedParameters,
       int requiredParameterCount,
+      this.fileUri,
       Reference reference})
       : this.typeArguments = typeArguments ?? <DartType>[],
         this.typeParameters = typeParameters ?? <TypeParameter>[],
@@ -1424,6 +1436,10 @@
 
   DartType get getterType => const BottomType();
   DartType get setterType => const BottomType();
+
+  Location _getLocationInEnclosingFile(int offset) {
+    return _getLocationInProgram(enclosingProgram, fileUri, offset);
+  }
 }
 
 /// A method, getter, setter, index-getter, index-setter, operator overloader,
@@ -2898,6 +2914,39 @@
   }
 }
 
+/// An explicit type instantiation of a generic function.
+class Instantiation extends Expression {
+  Expression expression;
+  final List<DartType> typeArguments;
+
+  Instantiation(this.expression, this.typeArguments) {
+    expression?.parent = this;
+  }
+
+  DartType getStaticType(TypeEnvironment types) {
+    FunctionType type = expression.getStaticType(types);
+    return Substitution
+        .fromPairs(type.typeParameters, typeArguments)
+        .substituteType(type.withoutTypeParameters);
+  }
+
+  accept(ExpressionVisitor v) => v.visitInstantiation(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitInstantiation(this, arg);
+
+  visitChildren(Visitor v) {
+    expression?.accept(v);
+    visitList(typeArguments, v);
+  }
+
+  transformChildren(Transformer v) {
+    if (expression != null) {
+      expression = expression.accept(v);
+      expression?.parent = this;
+    }
+    transformTypeList(typeArguments, v);
+  }
+}
+
 /// Expression of form `!x`.
 ///
 /// The `is!` and `!=` operators are desugared into [Not] nodes with `is` and
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index edd4923..4dcd262 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -877,6 +877,7 @@
     var fileEndOffset = readOffset();
     var flags = readByte();
     var name = readName();
+    var fileUri = readUriReference();
     var annotations = readAnnotationList(node);
     assert(((_) => true)(debugPath.add(node.name?.name ?? 'constructor')));
     var function = readFunctionNode(false, -1);
@@ -895,6 +896,7 @@
       node.fileEndOffset = fileEndOffset;
       node.flags = flags;
       node.name = name;
+      node.fileUri = fileUri;
       node.annotations = annotations;
       node.function = function..parent = node;
       node.transformerFlags = transformerFlags;
@@ -959,6 +961,7 @@
     var fileEndOffset = readOffset();
     var flags = readByte();
     var name = readName();
+    var fileUri = readUriReference();
     var annotations = readAnnotationList(node);
     debugPath.add(node.name?.name ?? 'redirecting-factory-constructor');
     var targetReference = readMemberReference();
@@ -978,6 +981,7 @@
       node.fileEndOffset = fileEndOffset;
       node.flags = flags;
       node.name = name;
+      node.fileUri = fileUri;
       node.annotations = annotations;
       node.targetReference = targetReference;
       node.typeArguments.addAll(typeArguments);
@@ -1358,6 +1362,10 @@
         var body = readExpression();
         variableStack.length = stackHeight;
         return new Let(variable, body);
+      case Tag.Instantiation:
+        var expression = readExpression();
+        var typeArguments = readDartTypeList();
+        return new Instantiation(expression, typeArguments);
       case Tag.VectorCreation:
         var length = readUInt();
         return new VectorCreation(length);
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 5098aad..b9b8c99 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -726,6 +726,7 @@
     writeOffset(node.fileEndOffset);
     writeByte(node.flags);
     writeName(node.name ?? _emptyName);
+    writeUriReference(node.fileUri);
     writeAnnotationList(node.annotations);
     assert(node.function.typeParameters.isEmpty);
     writeNode(node.function);
@@ -788,6 +789,7 @@
     writeOffset(node.fileEndOffset);
     writeByte(node.flags);
     writeName(node.name);
+    writeUriReference(node.fileUri);
     writeAnnotationList(node.annotations);
     writeReference(node.targetReference);
     writeNodeList(node.typeArguments);
@@ -1186,6 +1188,12 @@
     --_variableIndexer.stackHeight;
   }
 
+  visitInstantiation(Instantiation node) {
+    writeByte(Tag.Instantiation);
+    writeNode(node.expression);
+    writeNodeList(node.typeArguments);
+  }
+
   visitLoadLibrary(LoadLibrary node) {
     writeByte(Tag.LoadLibrary);
     writeLibraryDependencyReference(node.import);
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index 4fad0cd..3910e5f 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -64,6 +64,7 @@
   static const int AwaitExpression = 51;
   static const int FunctionExpression = 52;
   static const int Let = 53;
+  static const int Instantiation = 54;
   static const int PositiveIntLiteral = 55;
   static const int NegativeIntLiteral = 56;
   static const int BigIntLiteral = 57;
@@ -134,7 +135,7 @@
   /// Internal version of kernel binary format.
   /// Bump it when making incompatible changes in kernel binaries.
   /// Keep in sync with runtime/vm/kernel_binary.h.
-  static const int BinaryFormatVersion = 2;
+  static const int BinaryFormatVersion = 3;
 }
 
 abstract class ConstantTag {
diff --git a/pkg/kernel/lib/target/targets.dart b/pkg/kernel/lib/target/targets.dart
index 7dd610a..d22a14e 100644
--- a/pkg/kernel/lib/target/targets.dart
+++ b/pkg/kernel/lib/target/targets.dart
@@ -129,7 +129,9 @@
   bool allowPlatformPrivateLibraryAccess(Uri importer, Uri imported) =>
       imported.scheme != "dart" ||
       !imported.path.startsWith("_") ||
-      importer.scheme == "dart";
+      importer.scheme == "dart" ||
+      (importer.scheme == "package" &&
+          importer.path.startsWith("dart_internal/"));
 
   /// Whether the `native` language extension is supported within [library].
   ///
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 96c9bc6..24e7ea2 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -1222,6 +1222,13 @@
     writeExpression(node.body);
   }
 
+  visitInstantiation(Instantiation node) {
+    writeExpression(node.expression);
+    writeSymbol('<');
+    writeList(node.typeArguments, writeType);
+    writeSymbol('>');
+  }
+
   visitLoadLibrary(LoadLibrary node) {
     writeWord('LoadLibrary');
     writeSymbol('(');
diff --git a/pkg/kernel/lib/type_checker.dart b/pkg/kernel/lib/type_checker.dart
index 6c8ccb0..f0d1247 100644
--- a/pkg/kernel/lib/type_checker.dart
+++ b/pkg/kernel/lib/type_checker.dart
@@ -281,18 +281,14 @@
         fail(arguments, 'Too many positional arguments');
         return const BottomType();
       }
-      if (arguments.types.length != typeParameters.length) {
+      var typeArguments = arguments.types;
+      if (typeArguments.length != typeParameters.length) {
         fail(arguments, 'Wrong number of type arguments');
         return const BottomType();
       }
-      var instantiation =
-          Substitution.fromPairs(typeParameters, arguments.types);
-      var substitution = Substitution.combine(receiver, instantiation);
-      for (int i = 0; i < typeParameters.length; ++i) {
-        var argument = arguments.types[i];
-        var bound = substitution.substituteType(typeParameters[i].bound);
-        checkAssignable(arguments, argument, bound);
-      }
+      Substitution substitution = _instantiateFunction(
+          typeParameters, typeArguments, arguments,
+          receiverSubstitution: receiver);
       for (int i = 0; i < arguments.positional.length; ++i) {
         var expectedType = substitution.substituteType(
             functionType.positionalParameters[i],
@@ -385,6 +381,21 @@
     }
   }
 
+  Substitution _instantiateFunction(List<TypeParameter> typeParameters,
+      List<DartType> typeArguments, TreeNode where,
+      {Substitution receiverSubstitution}) {
+    var instantiation = Substitution.fromPairs(typeParameters, typeArguments);
+    var substitution = receiverSubstitution == null
+        ? instantiation
+        : Substitution.combine(receiverSubstitution, instantiation);
+    for (int i = 0; i < typeParameters.length; ++i) {
+      var argument = typeArguments[i];
+      var bound = substitution.substituteType(typeParameters[i].bound);
+      checkAssignable(where, argument, bound);
+    }
+    return substitution;
+  }
+
   @override
   DartType visitAsExpression(AsExpression node) {
     visitExpression(node.operand);
@@ -479,6 +490,23 @@
   }
 
   @override
+  DartType visitInstantiation(Instantiation node) {
+    DartType type = visitExpression(node.expression);
+    if (type is! FunctionType) {
+      fail(node, 'Not a function type: $type');
+      return const BottomType();
+    }
+    FunctionType functionType = type;
+    if (functionType.typeParameters.length != node.typeArguments.length) {
+      fail(node, 'Wrong number of type arguments');
+      return const BottomType();
+    }
+    return _instantiateFunction(
+            functionType.typeParameters, node.typeArguments, node)
+        .substituteType(functionType.withoutTypeParameters);
+  }
+
+  @override
   DartType visitListLiteral(ListLiteral node) {
     for (int i = 0; i < node.expressions.length; ++i) {
       node.expressions[i] =
diff --git a/pkg/kernel/lib/visitor.dart b/pkg/kernel/lib/visitor.dart
index 6db182d..01d56b8 100644
--- a/pkg/kernel/lib/visitor.dart
+++ b/pkg/kernel/lib/visitor.dart
@@ -54,6 +54,7 @@
   R visitBoolLiteral(BoolLiteral node) => defaultBasicLiteral(node);
   R visitNullLiteral(NullLiteral node) => defaultBasicLiteral(node);
   R visitLet(Let node) => defaultExpression(node);
+  R visitInstantiation(Instantiation node) => defaultExpression(node);
   R visitLoadLibrary(LoadLibrary node) => defaultExpression(node);
   R visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) =>
       defaultExpression(node);
@@ -179,6 +180,7 @@
   R visitBoolLiteral(BoolLiteral node) => defaultBasicLiteral(node);
   R visitNullLiteral(NullLiteral node) => defaultBasicLiteral(node);
   R visitLet(Let node) => defaultExpression(node);
+  R visitInstantiation(Instantiation node) => defaultExpression(node);
   R visitLoadLibrary(LoadLibrary node) => defaultExpression(node);
   R visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) =>
       defaultExpression(node);
@@ -490,6 +492,8 @@
   R visitBoolLiteral(BoolLiteral node, T arg) => defaultBasicLiteral(node, arg);
   R visitNullLiteral(NullLiteral node, T arg) => defaultBasicLiteral(node, arg);
   R visitLet(Let node, T arg) => defaultExpression(node, arg);
+  R visitInstantiation(Instantiation node, T arg) =>
+      defaultExpression(node, arg);
   R visitLoadLibrary(LoadLibrary node, T arg) => defaultExpression(node, arg);
   R visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node, T arg) =>
       defaultExpression(node, arg);
diff --git a/pkg/status_file/test/data/co19-dart2js.status b/pkg/status_file/test/data/co19-dart2js.status
index 41fe84c..b7155e0 100644
--- a/pkg/status_file/test/data/co19-dart2js.status
+++ b/pkg/status_file/test/data/co19-dart2js.status
@@ -1189,8 +1189,6 @@
 LayoutTests/fast/events/scroll-event-does-not-bubble_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/events/scroll-event-phase_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/events/tabindex-removal-from-focused-element_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/eventsource/eventsource-attribute-listeners_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/eventsource/eventsource-constructor_t01: RuntimeError # https://github.com/dart-lang/sdk/issues/29814
 LayoutTests/fast/exclusions/parsing/parsing-wrap-flow_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/exclusions/parsing/parsing-wrap-through_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/files/blob-close-read_t01: RuntimeError # Please triage this failure
@@ -3344,7 +3342,6 @@
 LayoutTests/fast/events/selectstart-on-selectall_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/events/selectstart-prevent-selectall_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/events/tabindex-removal-from-focused-element_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/eventsource/eventsource-attribute-listeners_t01: RuntimeError # Issue 28983
 LayoutTests/fast/eventsource/eventsource-constructor_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/exclusions/parsing/parsing-wrap-flow_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/exclusions/parsing/parsing-wrap-through_t01: RuntimeError # Please triage this failure
diff --git a/pkg/vm/bin/gen_kernel.dart b/pkg/vm/bin/gen_kernel.dart
index c39bb2b..93d1114 100644
--- a/pkg/vm/bin/gen_kernel.dart
+++ b/pkg/vm/bin/gen_kernel.dart
@@ -35,7 +35,7 @@
 ''';
 
 const int _badUsageExitCode = 1;
-const int _compileTimeErrorExitCode = 250;
+const int _compileTimeErrorExitCode = 254;
 
 const _severityCaptions = const <Severity, String>{
   Severity.error: 'Error: ',
diff --git a/pkg/vm/tool/dart2 b/pkg/vm/tool/dart2
index d849f5b..364820c 100755
--- a/pkg/vm/tool/dart2
+++ b/pkg/vm/tool/dart2
@@ -21,20 +21,29 @@
 # Handle the case where dart-sdk/bin has been symlinked to.
 CUR_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
 
-if [[ `uname` == 'Darwin' ]];
-then
+if [[ `uname` == 'Darwin' ]]; then
   OUT_DIR="$CUR_DIR"/../../../xcodebuild/
 else
   OUT_DIR="$CUR_DIR"/../../../out/
 fi
 
 export DART_CONFIGURATION=${DART_CONFIGURATION:-ReleaseX64}
-BIN_DIR="$OUT_DIR$DART_CONFIGURATION"
+export DART_USE_SDK=${DART_USE_SDK:0}
+BUILD_DIR="$OUT_DIR$DART_CONFIGURATION"
 
-exec "$BIN_DIR"/dart                                                           \
+if [[ $DART_USE_SDK -eq 1 ]]; then
+  DART_BINARY="$BUILD_DIR"/dart-sdk/bin/dart
+  KERNEL_BINARIES_DIR="$BUILD_DIR"/dart-sdk/lib/_internal
+else
+  DART_BINARY="$BUILD_DIR"/dart
+  KERNEL_BINARIES_DIR="$BUILD_DIR"
+fi
+KERNEL_SERVICE_SNAPSHOT="$BUILD_DIR"/gen/kernel-service.dart.snapshot
+
+exec "$DART_BINARY"                                                            \
      --strong                                                                  \
      --reify-generic-functions                                                 \
      --limit-ints-to-64-bits                                                   \
-     --dfe="${BIN_DIR}/gen/kernel-service.dart.snapshot"                       \
-     --kernel-binaries="${BIN_DIR}"                                            \
+     --dfe="$KERNEL_SERVICE_SNAPSHOT"                                          \
+     --kernel-binaries="$KERNEL_BINARIES_DIR"                                  \
      "$@"
diff --git a/pkg/vm/tool/gen_kernel b/pkg/vm/tool/gen_kernel
index ec122ec..5b96047 100755
--- a/pkg/vm/tool/gen_kernel
+++ b/pkg/vm/tool/gen_kernel
@@ -25,6 +25,8 @@
 
 SDK_DIR="$CUR_DIR/../../.."
 
+# TODO(kustermann): For windows as well as for hosts running on arm, our
+# checked-in dart binaries must be adjusted.
 if [[ `uname` == 'Darwin' ]]; then
   DART="$SDK_DIR/tools/sdks/mac/dart-sdk/bin/dart"
   OUT_DIR="$SDK_DIR/xcodebuild"
diff --git a/pkg/vm/tool/precompiler2 b/pkg/vm/tool/precompiler2
index 6c4190d..a3aee3a 100755
--- a/pkg/vm/tool/precompiler2
+++ b/pkg/vm/tool/precompiler2
@@ -78,7 +78,6 @@
 exec "$BIN_DIR"/dart_bootstrap                                                 \
      --strong                                                                  \
      --reify-generic-functions                                                 \
-     --kernel-binaries="${BIN_DIR}"                                            \
      --snapshot-kind=app-aot                                                   \
      --use-blobs                                                               \
      --snapshot="$SNAPSHOT_FILE"                                               \
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index 4c9a73c..33b06b9 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -14,13 +14,6 @@
 import("io_sources.gni")
 import("vmservice/vmservice_sources.gni")
 
-declare_args() {
-  # Controls the kind of core snapshot linked into the standalone VM. Using a
-  # core-jit snapshot breaks the ability to change various flags that affect
-  # code generation.
-  dart_core_snapshot_kind = "core"
-}
-
 # Generate a resources.cc file for the service isolate without Observatory.
 action("gen_resources_cc") {
   visibility = [ ":*" ]  # Only targets in this file can see this.
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index 3b7c5a1..e53d6db 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -20,6 +20,7 @@
 #include "platform/assert.h"
 #include "platform/globals.h"
 #include "platform/memory_sanitizer.h"
+#include "platform/utils.h"
 
 // Return the error from the containing function if handle is in error handle.
 #define RETURN_IF_ERROR(handle)                                                \
@@ -49,13 +50,7 @@
 const char* const DartUtils::kHttpScheme = "http:";
 const char* const DartUtils::kVMServiceLibURL = "dart:vmservice";
 
-struct MagicNumberData {
-  static const intptr_t kMaxLength = 4;
-
-  intptr_t length;
-  const uint8_t bytes[kMaxLength];
-};
-
+MagicNumberData appjit_magic_number = {8, {0xdc, 0xdc, 0xf6, 0xf6, 0, 0, 0, 0}};
 MagicNumberData snapshot_magic_number = {4, {0xf5, 0xf5, 0xdc, 0xdc}};
 MagicNumberData kernel_magic_number = {4, {0x90, 0xab, 0xcd, 0xef}};
 MagicNumberData gzip_magic_number = {2, {0x1f, 0x8b, 0, 0}};
@@ -356,12 +351,41 @@
   return false;
 }
 
+DartUtils::MagicNumber DartUtils::SniffForMagicNumber(const char* filename) {
+  MagicNumber magic_number = DartUtils::kUnknownMagicNumber;
+  if (File::GetType(NULL, filename, true) == File::kIsFile) {
+    File* file = File::Open(NULL, filename, File::kRead);
+    if (file != NULL) {
+      intptr_t max_magic_length = 0;
+      max_magic_length =
+          Utils::Maximum(max_magic_length, snapshot_magic_number.length);
+      max_magic_length =
+          Utils::Maximum(max_magic_length, appjit_magic_number.length);
+      max_magic_length =
+          Utils::Maximum(max_magic_length, kernel_magic_number.length);
+      max_magic_length =
+          Utils::Maximum(max_magic_length, gzip_magic_number.length);
+      ASSERT(max_magic_length <= 8);
+      uint8_t header[8];
+      if (file->ReadFully(&header, max_magic_length)) {
+        magic_number = DartUtils::SniffForMagicNumber(header, sizeof(header));
+      }
+      file->Close();
+    }
+  }
+  return magic_number;
+}
+
 DartUtils::MagicNumber DartUtils::SniffForMagicNumber(const uint8_t* buffer,
                                                       intptr_t buffer_length) {
   if (CheckMagicNumber(buffer, buffer_length, snapshot_magic_number)) {
     return kSnapshotMagicNumber;
   }
 
+  if (CheckMagicNumber(buffer, buffer_length, appjit_magic_number)) {
+    return kAppJITMagicNumber;
+  }
+
   if (CheckMagicNumber(buffer, buffer_length, kernel_magic_number)) {
     return kKernelMagicNumber;
   }
@@ -370,6 +394,10 @@
     return kGzipMagicNumber;
   }
 
+  if (CheckMagicNumber(buffer, buffer_length, gzip_magic_number)) {
+    return kGzipMagicNumber;
+  }
+
   return kUnknownMagicNumber;
 }
 
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index e1119fc..8c619c4 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -202,12 +202,16 @@
 
   enum MagicNumber {
     kSnapshotMagicNumber,
+    kAppJITMagicNumber,
     kKernelMagicNumber,
     kGzipMagicNumber,
     kUnknownMagicNumber
   };
 
   // Checks if the buffer is a script snapshot, kernel file, or gzip file.
+  static MagicNumber SniffForMagicNumber(const char* filename);
+
+  // Checks if the buffer is a script snapshot, kernel file, or gzip file.
   static MagicNumber SniffForMagicNumber(const uint8_t* text_buffer,
                                          intptr_t buffer_len);
 
@@ -644,6 +648,18 @@
   DISALLOW_COPY_AND_ASSIGN(ScopedMemBuffer);
 };
 
+struct MagicNumberData {
+  static const intptr_t kMaxLength = 8;
+
+  intptr_t length;
+  const uint8_t bytes[kMaxLength];
+};
+
+extern MagicNumberData appjit_magic_number;
+extern MagicNumberData snapshot_magic_number;
+extern MagicNumberData kernel_magic_number;
+extern MagicNumberData gzip_magic_number;
+
 }  // namespace bin
 }  // namespace dart
 
diff --git a/runtime/bin/dfe.cc b/runtime/bin/dfe.cc
index 2e244ff..192a332 100644
--- a/runtime/bin/dfe.cc
+++ b/runtime/bin/dfe.cc
@@ -20,6 +20,7 @@
       kernel_binaries_path_(NULL),
       platform_binary_filename_(NULL),
       kernel_platform_(NULL),
+      application_kernel_binary_(NULL),
       kernel_file_specified_(false) {}
 
 DFE::~DFE() {
@@ -31,10 +32,11 @@
   free(platform_binary_filename_);
   platform_binary_filename_ = NULL;
 
-  if (kernel_platform_ != NULL) {
-    delete reinterpret_cast<kernel::Program*>(kernel_platform_);
-    kernel_platform_ = NULL;
-  }
+  delete reinterpret_cast<kernel::Program*>(kernel_platform_);
+  kernel_platform_ = NULL;
+
+  delete reinterpret_cast<kernel::Program*>(application_kernel_binary_);
+  application_kernel_binary_ = NULL;
 }
 
 void DFE::SetKernelBinaries(const char* name) {
diff --git a/runtime/bin/dfe.h b/runtime/bin/dfe.h
index 262b46e..d644b19 100644
--- a/runtime/bin/dfe.h
+++ b/runtime/bin/dfe.h
@@ -33,6 +33,11 @@
     kernel_platform_ = kernel_platform;
   }
 
+  void* application_kernel_binary() const { return application_kernel_binary_; }
+  void set_application_kernel_binary(void* application_kernel_binary) {
+    application_kernel_binary_ = application_kernel_binary;
+  }
+
   bool kernel_file_specified() const { return kernel_file_specified_; }
   void set_kernel_file_specified(bool value) { kernel_file_specified_ = value; }
 
@@ -73,6 +78,11 @@
   char* kernel_binaries_path_;
   char* platform_binary_filename_;
   void* kernel_platform_;
+
+  // Kernel binary specified on the cmd line.
+  // Loaded instead of platform if --kernel-binaries is not specified.
+  void* application_kernel_binary_;
+
   bool kernel_file_specified_;  // Kernel file was specified on the cmd line.
 
   DISALLOW_COPY_AND_ASSIGN(DFE);
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 2f4be2d..c030a71 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -385,6 +385,11 @@
     isolate = Dart_CreateIsolateFromKernel(
         script_uri, NULL, dfe.kernel_platform(), flags, isolate_data, error);
     skip_library_load = true;
+  } else if (dfe.application_kernel_binary() != NULL) {
+    isolate = Dart_CreateIsolateFromKernel(script_uri, NULL,
+                                           dfe.application_kernel_binary(),
+                                           flags, isolate_data, error);
+    skip_library_load = true;
   } else {
     isolate = Dart_CreateIsolate(script_uri, main, isolate_snapshot_data,
                                  isolate_snapshot_instructions, flags,
@@ -1070,6 +1075,12 @@
       Platform::Exit(kErrorExitCode);
     }
     dfe.set_kernel_platform(kernel_platform);
+  } else {
+    void* application_kernel_binary = dfe.ReadScript(script_name);
+    if (application_kernel_binary != NULL) {
+      dfe.set_application_kernel_binary(application_kernel_binary);
+      dfe.set_kernel_file_specified(true);
+    }
   }
 #endif
 
diff --git a/runtime/bin/run_vm_tests.cc b/runtime/bin/run_vm_tests.cc
index d69253ad..9cc4ada 100644
--- a/runtime/bin/run_vm_tests.cc
+++ b/runtime/bin/run_vm_tests.cc
@@ -137,25 +137,33 @@
   }
   script_uri = kernel_snapshot;
 
-  bin::AppSnapshot* app_snapshot =
-      bin::Snapshot::TryReadAppSnapshot(script_uri);
-  if (app_snapshot == NULL) {
-    *error = strdup("Failed to read kernel service app snapshot");
-    return NULL;
-  }
-
+  // Kernel isolate uses an app snapshot or the core libraries snapshot.
+  bool isolate_run_script_snapshot = false;
   const uint8_t* isolate_snapshot_data = bin::core_isolate_snapshot_data;
   const uint8_t* isolate_snapshot_instructions =
       bin::core_isolate_snapshot_instructions;
+  bin::AppSnapshot* app_snapshot = NULL;
+  switch (bin::DartUtils::SniffForMagicNumber(script_uri)) {
+    case bin::DartUtils::kAppJITMagicNumber: {
+      app_snapshot = bin::Snapshot::TryReadAppSnapshot(script_uri);
+      ASSERT(app_snapshot != NULL);
 
-  const uint8_t* ignore_vm_snapshot_data;
-  const uint8_t* ignore_vm_snapshot_instructions;
-  app_snapshot->SetBuffers(
-      &ignore_vm_snapshot_data, &ignore_vm_snapshot_instructions,
-      &isolate_snapshot_data, &isolate_snapshot_instructions);
-
+      const uint8_t* ignore_vm_snapshot_data;
+      const uint8_t* ignore_vm_snapshot_instructions;
+      app_snapshot->SetBuffers(
+          &ignore_vm_snapshot_data, &ignore_vm_snapshot_instructions,
+          &isolate_snapshot_data, &isolate_snapshot_instructions);
+      break;
+    }
+    case bin::DartUtils::kSnapshotMagicNumber: {
+      isolate_run_script_snapshot = true;
+      break;
+    }
+    default:
+      return NULL;
+  }
   bin::IsolateData* isolate_data = new bin::IsolateData(
-      script_uri, package_root, packages_config, NULL /* app_snapshot */);
+      script_uri, package_root, packages_config, app_snapshot);
   Dart_Isolate isolate = Dart_CreateIsolate(
       DART_KERNEL_ISOLATE_NAME, main, isolate_snapshot_data,
       isolate_snapshot_instructions, flags, isolate_data, error);
@@ -167,6 +175,18 @@
 
   Dart_EnterScope();
 
+  if (isolate_run_script_snapshot) {
+    const uint8_t* payload;
+    intptr_t payload_length;
+    void* file = bin::DartUtils::OpenFile(script_uri, false);
+    bin::DartUtils::ReadFile(&payload, &payload_length, file);
+    bin::DartUtils::CloseFile(file);
+
+    bin::DartUtils::SkipSnapshotMagicNumber(&payload, &payload_length);
+    Dart_Handle result = Dart_LoadScriptFromSnapshot(payload, payload_length);
+    CHECK_RESULT(result);
+  }
+
   bin::DartUtils::SetOriginalWorkingDirectory();
   Dart_Handle result = bin::DartUtils::PrepareForScriptLoading(
       false /* is_service_isolate */, false /* trace_loading */);
diff --git a/runtime/bin/snapshot_utils.cc b/runtime/bin/snapshot_utils.cc
index 81b8490..73ca52e 100644
--- a/runtime/bin/snapshot_utils.cc
+++ b/runtime/bin/snapshot_utils.cc
@@ -21,7 +21,6 @@
 extern const char* kIsolateSnapshotInstructionsSymbolName;
 
 static const int64_t kAppSnapshotHeaderSize = 5 * kInt64Size;
-static const int64_t kAppSnapshotMagicNumber = 0xf6f6dcdc;
 static const int64_t kAppSnapshotPageSize = 4 * KB;
 
 class MappedAppSnapshot : public AppSnapshot {
@@ -86,7 +85,9 @@
     file->Release();
     return NULL;
   }
-  if (header[0] != kAppSnapshotMagicNumber) {
+  ASSERT(sizeof(header[0]) == appjit_magic_number.length);
+  if (memcmp(&header[0], appjit_magic_number.bytes,
+             appjit_magic_number.length) != 0) {
     file->Release();
     return NULL;
   }
@@ -287,7 +288,7 @@
     ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n", filename);
   }
 
-  file->WriteFully(&kAppSnapshotMagicNumber, sizeof(kAppSnapshotMagicNumber));
+  file->WriteFully(appjit_magic_number.bytes, appjit_magic_number.length);
   WriteInt64(file, vm_data_size);
   WriteInt64(file, vm_instructions_size);
   WriteInt64(file, isolate_data_size);
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 2177843..2dfdefa 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -1549,15 +1549,15 @@
 
   void add(List<int> bytes) => _sink.add(bytes);
 
-  Future<Socket> addStream(Stream<List<int>> stream) {
+  Future addStream(Stream<List<int>> stream) {
     return _sink.addStream(stream);
   }
 
-  Future<Socket> flush() => _sink.flush();
+  Future flush() => _sink.flush();
 
-  Future<Socket> close() => _sink.close();
+  Future close() => _sink.close();
 
-  Future<Socket> get done => _sink.done;
+  Future get done => _sink.done;
 
   void destroy() {
     // Destroy can always be called to get rid of a socket.
diff --git a/runtime/lib/function.cc b/runtime/lib/function.cc
index 89bca1d..0a50260 100644
--- a/runtime/lib/function.cc
+++ b/runtime/lib/function.cc
@@ -80,13 +80,15 @@
       TypeArguments::Handle(zone, receiver.function_type_arguments());
   const Function& function = Function::Handle(zone, receiver.function());
   const Context& context = Context::Handle(zone, receiver.context());
-  Context& cloned_context =
-      Context::Handle(zone, Context::New(context.num_variables()));
-  cloned_context.set_parent(Context::Handle(zone, context.parent()));
-  Object& instance = Object::Handle(zone);
-  for (int i = 0; i < context.num_variables(); i++) {
-    instance = context.At(i);
-    cloned_context.SetAt(i, instance);
+  Context& cloned_context = Context::Handle(zone);
+  if (!context.IsNull()) {
+    cloned_context = Context::New(context.num_variables());
+    cloned_context.set_parent(Context::Handle(zone, context.parent()));
+    Object& instance = Object::Handle(zone);
+    for (int i = 0; i < context.num_variables(); i++) {
+      instance = context.At(i);
+      cloned_context.SetAt(i, instance);
+    }
   }
   return Closure::New(instantiator_type_arguments, function_type_arguments,
                       function, cloned_context);
diff --git a/runtime/lib/integers_patch.dart b/runtime/lib/integers_patch.dart
index e2610e9..c7116c7 100644
--- a/runtime/lib/integers_patch.dart
+++ b/runtime/lib/integers_patch.dart
@@ -159,6 +159,17 @@
         if (result >= positiveOverflowLimit) {
           if ((result > positiveOverflowLimit) ||
               (smi > _int64OverflowLimits[tableIndex + 2])) {
+            // Although the unsigned overflow limits do not depend on the
+            // platform, the multiplier and block size, which are used to
+            // compute it, do.
+            int X = is64Bit ? 1 : 0;
+            if (radix == 16 &&
+                !(result >= _int64UnsignedOverflowLimits[X] &&
+                    (result > _int64UnsignedOverflowLimits[X] ||
+                        smi > _int64UnsignedSmiOverflowLimits[X])) &&
+                blockEnd + blockSize > end) {
+              return (result * multiplier) + smi;
+            }
             return null;
           }
         } else if (result <= negativeOverflowLimit) {
@@ -246,6 +257,12 @@
   static const _maxInt64 = 0x7fffffffffffffff;
   static const _minInt64 = -_maxInt64 - 1;
 
+  static const _int64UnsignedOverflowLimits = const [0xfffffffff, 0xf];
+  static const _int64UnsignedSmiOverflowLimits = const [
+    0xfffffff,
+    0xfffffffffffffff
+  ];
+
   /// In the `--limit-ints-to-64-bits` mode calculation of the expression
   ///
   ///   result = (result * multiplier) + (sign * smi)
diff --git a/runtime/lib/internal_patch.dart b/runtime/lib/internal_patch.dart
index f6bc981..b9fb751 100644
--- a/runtime/lib/internal_patch.dart
+++ b/runtime/lib/internal_patch.dart
@@ -26,8 +26,11 @@
 
 @patch
 Object extractTypeArguments<T>(T instance, Function extract) {
-  // TODO(31371): Implement this.
-  throw new UnimplementedError();
+  // TODO(31371): Implement this correctly for Dart 2.0.
+  // In Dart 1.0, instantiating the generic with dynamic (which this does),
+  // gives you an object that can be used anywhere a more specific type is
+  // expected, so this works for now.
+  return extract();
 }
 
 class VMLibraryHooks {
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index f98b1f8..539ac4b 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -2843,12 +2843,18 @@
     // Coerce absence to false.
     valueAsStringIsTruncated = map['valueAsStringIsTruncated'] == true;
     closureFunction = map['closureFunction'];
-    closureContext = map['closureContext'];
     name = map['name'];
     length = map['length'];
     pattern = map['pattern'];
     typeClass = map['typeClass'];
 
+    final context = map['closureContext'];
+    if (context is Context) {
+      closureContext = context;
+    } else if (context != null) {
+      assert(context is Instance && context.isNull);
+    }
+
     if (mapIsRef) {
       return;
     }
diff --git a/runtime/observatory/tests/service/contexts_test.dart b/runtime/observatory/tests/service/contexts_test.dart
index d6c7f89..a5fc6eb 100644
--- a/runtime/observatory/tests/service/contexts_test.dart
+++ b/runtime/observatory/tests/service/contexts_test.dart
@@ -55,11 +55,7 @@
         return field.load().then((_) {
           return field.staticValue.load().then((Instance block) {
             expect(block.isClosure, isTrue);
-            expect(block.closureContext.isContext, isTrue);
-            expect(block.closureContext.length, equals(0));
-            return block.closureContext.load().then((Context ctxt) {
-              expect(ctxt.parentContext, isNull);
-            });
+            expect(block.closureContext, isNull);
           });
         });
       }),
@@ -75,11 +71,7 @@
               expect(ctxt.variables.single.value.asValue.isString, isTrue);
               expect(ctxt.variables.single.value.asValue.valueAsString,
                   equals('I could be copied into the block'));
-              expect(ctxt.parentContext.isContext, isTrue);
-              expect(ctxt.parentContext.length, equals(0));
-              return ctxt.parentContext.load().then((Context outerCtxt) {
-                expect(outerCtxt.parentContext, isNull);
-              });
+              expect(ctxt.parentContext, isNull);
             });
           });
         });
@@ -95,11 +87,7 @@
               expect(ctxt.variables.single.value.asValue.isInt, isTrue);
               expect(ctxt.variables.single.value.asValue.valueAsString,
                   equals('43'));
-              expect(ctxt.parentContext.isContext, isTrue);
-              expect(ctxt.parentContext.length, equals(0));
-              return ctxt.parentContext.load().then((Context outerCtxt) {
-                expect(outerCtxt.parentContext, isNull);
-              });
+              expect(ctxt.parentContext, isNull);
             });
           });
         });
@@ -122,13 +110,7 @@
                 expect(outerCtxt.variables.single.value.asValue.isInt, isTrue);
                 expect(outerCtxt.variables.single.value.asValue.valueAsString,
                     equals('421'));
-                expect(outerCtxt.parentContext.isContext, isTrue);
-                expect(outerCtxt.parentContext.length, equals(0));
-                return outerCtxt.parentContext
-                    .load()
-                    .then((Context outerCtxt2) {
-                  expect(outerCtxt2.parentContext, isNull);
-                });
+                expect(outerCtxt.parentContext, isNull);
               });
             });
           });
diff --git a/runtime/observatory/tests/service/service.status b/runtime/observatory/tests/service/service.status
index e8d35c6..15f20e2 100644
--- a/runtime/observatory/tests/service/service.status
+++ b/runtime/observatory/tests/service/service.status
@@ -61,9 +61,32 @@
 dev_fs_http_put_weird_char_test: Skip # Windows disallows carriage returns in paths
 dev_fs_weird_char_test: Skip # Windows disallows question mark in paths
 
+# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
+# are to be triaged.  Isolate tests are skipped on purpose due to the usage of
+# batch mode.
+[ $arch == simdbc64 && $compiler == dartk ]
+coverage_optimized_function_test: Crash # Please triage
+rewind_optimized_out_test: RuntimeError # Please triage
+rewind_test: RuntimeError # Please triage
+
 [ $builder_tag == strong && $compiler == dart2analyzer ]
 *: Skip # Issue 28649
 
+# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
+# are to be triaged.  Isolate tests are skipped on purpose due to the usage of
+# batch mode.
+[ $compiler == dartk && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
+coverage_leaf_function_test: RuntimeError # Please triage.
+coverage_optimized_function_test: RuntimeError # Please triage.
+dev_fs_spawn_test: RuntimeError # Please triage.
+developer_service_get_isolate_id_test: RuntimeError # Please triage.
+get_object_rpc_test: RuntimeError # Please triage.
+get_source_report_test: RuntimeError # Please triage.
+issue_30555_test: RuntimeError # Please triage.
+library_dependency_test: RuntimeError # Please triage.
+reload_sources_test: Timeout, Skip # Please triage.
+set_name_rpc_test: RuntimeError # Please triage.
+
 [ $compiler == none && $runtime == vm && $system == fuchsia ]
 *: Skip # Not yet triaged.
 
diff --git a/runtime/platform/growable_array.h b/runtime/platform/growable_array.h
index b399cd9..28e04f6 100644
--- a/runtime/platform/growable_array.h
+++ b/runtime/platform/growable_array.h
@@ -59,6 +59,17 @@
     return data_[index];
   }
 
+  void FillWith(const T& value, intptr_t start, intptr_t length) {
+    ASSERT(start >= 0);
+    ASSERT(length >= 0);
+    ASSERT(start <= length_);
+
+    Resize(start + length);
+    for (intptr_t i = 0; i < length; ++i) {
+      data_[start + i] = value;
+    }
+  }
+
   const T& At(intptr_t index) const { return operator[](index); }
 
   T& Last() const {
diff --git a/runtime/runtime_args.gni b/runtime/runtime_args.gni
index 26213ca..44c705f 100644
--- a/runtime/runtime_args.gni
+++ b/runtime/runtime_args.gni
@@ -47,4 +47,9 @@
   # Whether to link the standalone VM against tcmalloc. The standalone build of
   # the VM enables this only for Linux builds.
   dart_use_tcmalloc = false
+
+  # Controls the kind of core snapshot linked into the standalone VM. Using a
+  # core-jit snapshot breaks the ability to change various flags that affect
+  # code generation.
+  dart_core_snapshot_kind = "core"
 }
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index aca128cd..9a6a62e 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -122,6 +122,28 @@
 cc/Profiler_TrivialRecordAllocation: Skip
 cc/Profiler_TypedArrayAllocation: Skip
 
+# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
+# are to be triaged.  Isolate tests are skipped on purpose due to the usage of
+# batch mode.
+[ $arch == simarm && $compiler == dartk ]
+cc/IsolateReload_ExportedLibModified: Fail # Please triage.
+cc/IsolateReload_ImportedLibModified: Fail # Please triage.
+cc/IsolateReload_ImportedMixinFunction: Fail # Please triage.
+cc/IsolateReload_LibraryHide: Fail # Please triage.
+cc/IsolateReload_LibraryShow: Fail # Please triage.
+cc/IsolateReload_MainLibModified: Fail # Please triage.
+cc/IsolateReload_NoLibsModified: Fail # Please triage.
+cc/IsolateReload_PrefixImportedLibModified: Fail # Please triage.
+
+# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
+# are to be triaged.  Isolate tests are skipped on purpose due to the usage of
+# batch mode.
+[ $arch == simdbc64 && $compiler == dartk ]
+cc/*: Pass, Crash # Please triage (flaky crashes in kernel-isolate?).
+dart/regress29620_test: RuntimeError # Please triage.
+dart/regress30853_test: Crash # Please triage.
+dart/truncating_ints_test: RuntimeError # Please triage.
+
 [ $arch == x64 && $system == windows ]
 cc/Profiler_BinaryOperatorSourcePositionOptimized: Pass, Fail # Issue 31137
 cc/Profiler_ClosureAllocation: Pass, Fail # Issue 31137
@@ -141,6 +163,12 @@
 cc/InjectNativeFields3: Crash
 cc/Service_TokenStream: Crash
 
+# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
+# are to be triaged.  Isolate tests are skipped on purpose due to the usage of
+# batch mode.
+[ $compiler == dartk && $mode == debug && ($arch == simarm || $arch == simarm64) ]
+cc/StackTraceMallocHookLengthTest: Fail # Please triage.
+
 [ $compiler == dartk && $mode == release && $runtime == vm ]
 cc/InjectNativeFields1: Fail
 cc/InjectNativeFields3: Fail
@@ -321,6 +349,15 @@
 dart/optimized_stacktrace_line_and_column_test: CompileTimeError # Issue 31586
 dart/optimized_stacktrace_line_test: CompileTimeError # Issue 31586
 
+# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
+# are to be triaged.  Isolate tests are skipped on purpose due to the usage of
+# batch mode.
+[ $compiler == dartk && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
+dart/data_uri_spawn_test: Skip # Please triage.
+dart/snapshot_version_test: RuntimeError # Please triage.
+dart/spawn_infinite_loop_test: Crash # Please triage.
+dart/truncating_ints_test: CompileTimeError # Please triage.
+
 [ $compiler == dartkp && ($runtime == dart_precompiled || $runtime == vm) ]
 dart/data_uri_import_test/base64: CompileTimeError
 dart/data_uri_import_test/nocharset: CompileTimeError
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 50d5082..ef3c299 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -1871,10 +1871,10 @@
     objects_.Add(pool);
 
     intptr_t length = pool->ptr()->length_;
-
+    uint8_t* entry_types = pool->ptr()->entry_types();
     for (intptr_t i = 0; i < length; i++) {
       ObjectPool::EntryType entry_type =
-          static_cast<ObjectPool::EntryType>(pool->ptr()->entry_types()[i]);
+          static_cast<ObjectPool::EntryType>(entry_types[i]);
       if (entry_type == ObjectPool::kTaggedObject) {
         s->Push(pool->ptr()->data()[i].raw_obj_);
       }
@@ -1899,9 +1899,10 @@
       RawObjectPool* pool = objects_[i];
       intptr_t length = pool->ptr()->length_;
       s->Write<int32_t>(length);
+      uint8_t* entry_types = pool->ptr()->entry_types();
       for (intptr_t j = 0; j < length; j++) {
         ObjectPool::EntryType entry_type =
-            static_cast<ObjectPool::EntryType>(pool->ptr()->entry_types()[j]);
+            static_cast<ObjectPool::EntryType>(entry_types[j]);
         s->Write<int8_t>(entry_type);
         RawObjectPool::Entry& entry = pool->ptr()->data()[j];
         switch (entry_type) {
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index ec9f50a..b07b481 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -417,6 +417,7 @@
       // can be used. Also ensures lookup of entry points won't miss functions
       // because their class hasn't been finalized yet.
       FinalizeAllClasses();
+      ASSERT(Error::Handle(Z, T->sticky_error()).IsNull());
 
       ClassFinalizer::SortClasses();
       TypeRangeCache trc(this, T, I->class_table()->NumCids());
@@ -424,6 +425,7 @@
 
       // Precompile static initializers to compute result type information.
       PrecompileStaticInitializers();
+      ASSERT(Error::Handle(Z, T->sticky_error()).IsNull());
 
       // Precompile constructors to compute type information for final fields.
       ClassFinalizer::ClearAllCode();
@@ -526,6 +528,9 @@
 }
 
 static void CompileStaticInitializerIgnoreErrors(const Field& field) {
+  ASSERT(Error::Handle(Thread::Current()->zone(),
+                       Thread::Current()->sticky_error())
+             .IsNull());
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
     const Function& initializer =
@@ -538,7 +543,11 @@
   } else {
     // Ignore compile-time errors here. If the field is actually used,
     // the error will be reported later during Iterate().
+    Thread::Current()->clear_sticky_error();
   }
+  ASSERT(Error::Handle(Thread::Current()->zone(),
+                       Thread::Current()->sticky_error())
+             .IsNull());
 }
 
 void Precompiler::PrecompileStaticInitializers() {
@@ -1419,6 +1428,7 @@
   Thread* thread = Thread::Current();
   StackZone stack_zone(thread);
   Zone* zone = stack_zone.GetZone();
+  ASSERT(Error::Handle(zone, thread->sticky_error()).IsNull());
 
   ParsedFunction* parsed_function;
   // Check if this field is coming from the Kernel binary.
@@ -1433,7 +1443,12 @@
   PrecompileParsedFunctionHelper helper(/* precompiler = */ NULL,
                                         parsed_function,
                                         /* optimized = */ true);
-  helper.Compile(&pipeline);
+  if (!helper.Compile(&pipeline)) {
+    Error& error = Error::Handle(zone, thread->sticky_error());
+    ASSERT(!error.IsNull());
+    Jump(error);
+    UNREACHABLE();
+  }
 
   if (compute_type && field.is_final()) {
     intptr_t result_cid = pipeline.result_type().ToCid();
@@ -1454,6 +1469,8 @@
     Disassembler::DisassembleCode(parsed_function->function(), code,
                                   /* optimized = */ true);
   }
+
+  ASSERT(Error::Handle(zone, thread->sticky_error()).IsNull());
   return parsed_function->function().raw();
 }
 
diff --git a/runtime/vm/compiler/assembler/assembler_dbc.cc b/runtime/vm/compiler/assembler/assembler_dbc.cc
index 8da5481..e52eaa8 100644
--- a/runtime/vm/compiler/assembler/assembler_dbc.cc
+++ b/runtime/vm/compiler/assembler/assembler_dbc.cc
@@ -35,6 +35,7 @@
 #define PARAMS_A_D uintptr_t ra, uintptr_t rd
 #define PARAMS_D uintptr_t rd
 #define PARAMS_A_B_C uintptr_t ra, uintptr_t rb, uintptr_t rc
+#define PARAMS_A_B_Y uintptr_t ra, uintptr_t rb, intptr_t ry
 #define PARAMS_A uintptr_t ra
 #define PARAMS_T intptr_t x
 #define PARAMS_A_X uintptr_t ra, intptr_t x
@@ -44,6 +45,7 @@
 #define ENCODE_A_D , ra, rd
 #define ENCODE_D , 0, rd
 #define ENCODE_A_B_C , ra, rb, rc
+#define ENCODE_A_B_Y , ra, rb, ry
 #define ENCODE_A , ra, 0
 #define ENCODE_T , x
 #define ENCODE_A_X , ra, x
@@ -53,6 +55,7 @@
 #define FENCODE_A_D Encode
 #define FENCODE_D Encode
 #define FENCODE_A_B_C Encode
+#define FENCODE_A_B_Y Encode
 #define FENCODE_A Encode
 #define FENCODE_T EncodeSigned
 #define FENCODE_A_X EncodeSigned
diff --git a/runtime/vm/compiler/assembler/assembler_dbc.h b/runtime/vm/compiler/assembler/assembler_dbc.h
index 612459c..794ec1b 100644
--- a/runtime/vm/compiler/assembler/assembler_dbc.h
+++ b/runtime/vm/compiler/assembler/assembler_dbc.h
@@ -130,6 +130,7 @@
 #define PARAMS_A_D uintptr_t ra, uintptr_t rd
 #define PARAMS_D uintptr_t rd
 #define PARAMS_A_B_C uintptr_t ra, uintptr_t rb, uintptr_t rc
+#define PARAMS_A_B_Y uintptr_t ra, uintptr_t rb, intptr_t ry
 #define PARAMS_A uintptr_t ra
 #define PARAMS_X intptr_t x
 #define PARAMS_T intptr_t x
@@ -141,6 +142,7 @@
 #undef PARAMS_A_D
 #undef PARAMS_D
 #undef PARAMS_A_B_C
+#undef PARAMS_A_B_Y
 #undef PARAMS_A
 #undef PARAMS_X
 #undef PARAMS_T
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.h b/runtime/vm/compiler/assembler/assembler_ia32.h
index 15be8b8..8af4c60 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.h
+++ b/runtime/vm/compiler/assembler/assembler_ia32.h
@@ -12,6 +12,7 @@
 #include "platform/assert.h"
 #include "platform/utils.h"
 #include "vm/constants_ia32.h"
+#include "vm/constants_x86.h"
 
 namespace dart {
 
diff --git a/runtime/vm/compiler/assembler/assembler_ia32_test.cc b/runtime/vm/compiler/assembler/assembler_ia32_test.cc
index bd15c82..b3aac9c 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_ia32_test.cc
@@ -1492,7 +1492,7 @@
       "mov eax,0x........\n"
       "movd xmm1,eax\n"
       "shufps xmm1,xmm1 [0]\n"
-      "cmpps xmm0,xmm1 [0]\n"
+      "cmpps xmm0,xmm1 [eq]\n"
       "push eax\n"
       "movss [esp],xmm0\n"
       "fld_s [esp]\n"
@@ -1523,7 +1523,7 @@
       "mov eax,0x........\n"
       "movd xmm1,eax\n"
       "shufps xmm1,xmm1 [0]\n"
-      "cmpps xmm0,xmm1 [4]\n"
+      "cmpps xmm0,xmm1 [neq]\n"
       "push eax\n"
       "movss [esp],xmm0\n"
       "fld_s [esp]\n"
@@ -1554,7 +1554,7 @@
       "mov eax,0x........\n"
       "movd xmm1,eax\n"
       "shufps xmm1,xmm1 [0]\n"
-      "cmpps xmm0,xmm1 [1]\n"
+      "cmpps xmm0,xmm1 [lt]\n"
       "push eax\n"
       "movss [esp],xmm0\n"
       "fld_s [esp]\n"
@@ -1585,7 +1585,7 @@
       "mov eax,0x........\n"
       "movd xmm1,eax\n"
       "shufps xmm1,xmm1 [0]\n"
-      "cmpps xmm0,xmm1 [2]\n"
+      "cmpps xmm0,xmm1 [le]\n"
       "push eax\n"
       "movss [esp],xmm0\n"
       "fld_s [esp]\n"
@@ -1616,7 +1616,7 @@
       "mov eax,0x........\n"
       "movd xmm1,eax\n"
       "shufps xmm1,xmm1 [0]\n"
-      "cmpps xmm0,xmm1 [5]\n"
+      "cmpps xmm0,xmm1 [nlt]\n"
       "push eax\n"
       "movss [esp],xmm0\n"
       "fld_s [esp]\n"
@@ -1647,7 +1647,7 @@
       "mov eax,0x........\n"
       "movd xmm1,eax\n"
       "shufps xmm1,xmm1 [0]\n"
-      "cmpps xmm0,xmm1 [6]\n"
+      "cmpps xmm0,xmm1 [nle]\n"
       "push eax\n"
       "movss [esp],xmm0\n"
       "fld_s [esp]\n"
@@ -2632,7 +2632,7 @@
   EXPECT_FLOAT_EQ(9.0f, res, 0.000001f);
   EXPECT_DISASSEMBLY(
       "movups xmm1,[rip+0x.......]\n"
-      "cvtsd2ss xmm0,xmm1\n"
+      "cvtps2pd xmm0,xmm1\n"
       "push eax\n"
       "push eax\n"
       "movsd [esp],xmm0\n"
@@ -3277,7 +3277,7 @@
       "mov eax,0x........\n"
       "push eax\n"
       "movsd xmm0,[esp]\n"
-      "(null) xmm1,xmm0\n"
+      "cvtsd2ss xmm1,xmm0\n"
       "movss [esp],xmm1\n"
       "fld_s [esp]\n"
       "pop eax\n"
@@ -3531,6 +3531,37 @@
       "ret\n");
 }
 
+ASSEMBLER_TEST_GENERATE(XmmAlu, assembler) {
+  // Test the disassembler.
+  __ addss(XMM0, XMM0);
+  __ addsd(XMM0, XMM0);
+  __ addps(XMM0, XMM0);
+  __ addpd(XMM0, XMM0);
+  __ cvtss2sd(XMM0, XMM0);
+  __ cvtsd2ss(XMM0, XMM0);
+  __ cvtps2pd(XMM0, XMM0);
+  __ cvtpd2ps(XMM0, XMM0);
+  __ movl(EAX, Immediate(0));
+  __ ret();
+}
+
+ASSEMBLER_TEST_RUN(XmmAlu, test) {
+  typedef intptr_t (*XmmAluTest)();
+  intptr_t res = reinterpret_cast<XmmAluTest>(test->entry())();
+  EXPECT_EQ(res, 0);
+  EXPECT_DISASSEMBLY(
+      "addss xmm0,xmm0\n"
+      "addsd xmm0,xmm0\n"
+      "addps xmm0,xmm0\n"
+      "addpd xmm0,xmm0\n"
+      "cvtss2sd xmm0,xmm0\n"
+      "cvtsd2ss xmm0,xmm0\n"
+      "cvtps2pd xmm0,xmm0\n"
+      "cvtpd2ps xmm0,xmm0\n"
+      "mov eax,0\n"
+      "ret\n");
+}
+
 ASSEMBLER_TEST_GENERATE(FloatNegate, assembler) {
   __ movss(XMM0, Address(ESP, kWordSize));
   __ FloatNegate(XMM0);
@@ -4616,7 +4647,7 @@
       "mov esi,[esp+0x10]\n"
       "mov edi,[esp+0x14]\n"
       "mov ecx,[esp+0x18]\n"
-      "rep movs\n"
+      "rep movsb\n"
       "pop ecx\n"
       "pop edi\n"
       "pop esi\n"
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index e85cc85..74dae8e 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -36,21 +36,6 @@
   memset(reinterpret_cast<void*>(data), Instr::kBreakPointInstruction, length);
 }
 
-void Assembler::call(Register reg) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(reg);
-  EmitOperandREX(2, operand, REX_NONE);
-  EmitUint8(0xFF);
-  EmitOperand(2, operand);
-}
-
-void Assembler::call(const Address& address) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(2, address, REX_NONE);
-  EmitUint8(0xFF);
-  EmitOperand(2, address);
-}
-
 void Assembler::call(Label* label) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   static const int kSize = 5;
@@ -121,13 +106,6 @@
   EmitUint8(0x50 | (reg & 7));
 }
 
-void Assembler::pushq(const Address& address) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(6, address, REX_NONE);
-  EmitUint8(0xFF);
-  EmitOperand(6, address);
-}
-
 void Assembler::pushq(const Immediate& imm) {
   if (imm.is_int8()) {
     AssemblerBuffer::EnsureCapacity ensured(&buffer_);
@@ -158,13 +136,6 @@
   EmitUint8(0x58 | (reg & 7));
 }
 
-void Assembler::popq(const Address& address) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(0, address, REX_NONE);
-  EmitUint8(0x8F);
-  EmitOperand(0, address);
-}
-
 void Assembler::setcc(Condition condition, ByteRegister dst) {
   ASSERT(dst != kNoByteRegister);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
@@ -176,12 +147,58 @@
   EmitUint8(0xC0 + (dst & 0x07));
 }
 
-void Assembler::movl(Register dst, Register src) {
+void Assembler::EmitQ(int reg,
+                      const Address& address,
+                      int opcode,
+                      int prefix2,
+                      int prefix1) {
+  ASSERT(reg <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(src);
-  EmitOperandREX(dst, operand, REX_NONE);
-  EmitUint8(0x8B);
-  EmitOperand(dst & 7, operand);
+  if (prefix1 >= 0) {
+    EmitUint8(prefix1);
+  }
+  EmitOperandREX(reg, address, REX_W);
+  if (prefix2 >= 0) {
+    EmitUint8(prefix2);
+  }
+  EmitUint8(opcode);
+  EmitOperand(reg & 7, address);
+}
+
+void Assembler::EmitL(int reg,
+                      const Address& address,
+                      int opcode,
+                      int prefix2,
+                      int prefix1) {
+  ASSERT(reg <= XMM15);
+  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  if (prefix1 >= 0) {
+    EmitUint8(prefix1);
+  }
+  EmitOperandREX(reg, address, REX_NONE);
+  if (prefix2 >= 0) {
+    EmitUint8(prefix2);
+  }
+  EmitUint8(opcode);
+  EmitOperand(reg & 7, address);
+}
+
+void Assembler::EmitW(Register reg,
+                      const Address& address,
+                      int opcode,
+                      int prefix2,
+                      int prefix1) {
+  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  if (prefix1 >= 0) {
+    EmitUint8(prefix1);
+  }
+  EmitOperandSizeOverride();
+  EmitOperandREX(reg, address, REX_NONE);
+  if (prefix2 >= 0) {
+    EmitUint8(prefix2);
+  }
+  EmitUint8(opcode);
+  EmitOperand(reg & 7, address);
 }
 
 void Assembler::movl(Register dst, const Immediate& imm) {
@@ -194,66 +211,11 @@
   EmitImmediate(imm);
 }
 
-void Assembler::movl(Register dst, const Address& src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(dst, src, REX_NONE);
-  EmitUint8(0x8B);
-  EmitOperand(dst & 7, src);
-}
-
-void Assembler::movl(const Address& dst, Register src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(src, dst, REX_NONE);
-  EmitUint8(0x89);
-  EmitOperand(src & 7, dst);
-}
-
 void Assembler::movl(const Address& dst, const Immediate& imm) {
   movl(TMP, imm);
   movl(dst, TMP);
 }
 
-void Assembler::movzxb(Register dst, Register src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(src);
-  EmitOperandREX(dst, operand, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0xB6);
-  EmitOperand(dst & 7, operand);
-}
-
-void Assembler::movzxb(Register dst, const Address& src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(dst, src, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0xB6);
-  EmitOperand(dst & 7, src);
-}
-
-void Assembler::movsxb(Register dst, Register src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(src);
-  EmitOperandREX(dst, operand, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0xBE);
-  EmitOperand(dst & 7, operand);
-}
-
-void Assembler::movsxb(Register dst, const Address& src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(dst, src, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0xBE);
-  EmitOperand(dst & 7, src);
-}
-
-void Assembler::movb(Register dst, const Address& src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(dst, src, REX_NONE);
-  EmitUint8(0x8A);
-  EmitOperand(dst & 7, src);
-}
-
 void Assembler::movb(const Address& dst, const Immediate& imm) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitOperandREX(0, dst, REX_NONE);
@@ -263,59 +225,10 @@
   EmitUint8(imm.value() & 0xFF);
 }
 
-void Assembler::movb(const Address& dst, Register src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(src, dst, REX_NONE);
-  EmitUint8(0x88);
-  EmitOperand(src & 7, dst);
-}
-
-void Assembler::movzxw(Register dst, Register src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(src);
-  EmitOperandREX(dst, operand, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0xB7);
-  EmitOperand(dst & 7, operand);
-}
-
-void Assembler::movzxw(Register dst, const Address& src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(dst, src, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0xB7);
-  EmitOperand(dst & 7, src);
-}
-
-void Assembler::movsxw(Register dst, Register src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(src);
-  EmitOperandREX(dst, operand, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0xBF);
-  EmitOperand(dst & 7, operand);
-}
-
-void Assembler::movsxw(Register dst, const Address& src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(dst, src, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0xBF);
-  EmitOperand(dst & 7, src);
-}
-
 void Assembler::movw(Register dst, const Address& src) {
   FATAL("Use movzxw or movsxw instead.");
 }
 
-void Assembler::movw(const Address& dst, Register src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandSizeOverride();
-  EmitOperandREX(src, dst, REX_NONE);
-  EmitUint8(0x89);
-  EmitOperand(src & 7, dst);
-}
-
 void Assembler::movw(const Address& dst, const Immediate& imm) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitOperandSizeOverride();
@@ -349,38 +262,12 @@
   }
 }
 
-// Use 0x89 encoding (instead of 0x8B encoding), which is expected by gdb64
-// older than 7.3.1-gg5 when disassembling a function's prologue (movq rbp, rsp)
-// for proper unwinding of Dart frames (use --generate_gdb_symbols and -O0).
-void Assembler::movq(Register dst, Register src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(dst);
-  EmitOperandREX(src, operand, REX_W);
-  EmitUint8(0x89);
-  EmitOperand(src & 7, operand);
-}
-
-void Assembler::movq(Register dst, const Address& src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(dst, src, REX_W);
-  EmitUint8(0x8B);
-  EmitOperand(dst & 7, src);
-}
-
-void Assembler::movq(const Address& dst, Register src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(src, dst, REX_W);
-  EmitUint8(0x89);
-  EmitOperand(src & 7, dst);
-}
-
 void Assembler::movq(const Address& dst, const Immediate& imm) {
   if (imm.is_int32()) {
     AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-    Operand operand(dst);
-    EmitOperandREX(0, operand, REX_W);
+    EmitOperandREX(0, dst, REX_W);
     EmitUint8(0xC7);
-    EmitOperand(0, operand);
+    EmitOperand(0, dst);
     EmitImmediate(imm);
   } else {
     movq(TMP, imm);
@@ -388,516 +275,101 @@
   }
 }
 
-void Assembler::movsxd(Register dst, Register src) {
+void Assembler::EmitSimple(int opcode, int opcode2) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(src);
-  EmitOperandREX(dst, operand, REX_W);
-  EmitUint8(0x63);
-  EmitOperand(dst & 7, operand);
+  EmitUint8(opcode);
+  if (opcode2 != -1) {
+    EmitUint8(opcode2);
+  }
 }
 
-void Assembler::movsxd(Register dst, const Address& src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(dst, src, REX_W);
-  EmitUint8(0x63);
-  EmitOperand(dst & 7, src);
-}
-
-void Assembler::rep_movsb() {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xF3);
-  EmitUint8(0xA4);
-}
-
-void Assembler::leaq(Register dst, const Address& src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(dst, src, REX_W);
-  EmitUint8(0x8D);
-  EmitOperand(dst & 7, src);
-}
-
-void Assembler::cmovnoq(Register dst, Register src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(src);
-  EmitOperandREX(dst, operand, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0x41);
-  EmitOperand(dst & 7, operand);
-}
-
-void Assembler::cmoveq(Register dst, Register src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(src);
-  EmitOperandREX(dst, operand, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0x44);
-  EmitOperand(dst & 7, operand);
-}
-
-void Assembler::cmovgeq(Register dst, Register src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(src);
-  EmitOperandREX(dst, operand, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0x4D);
-  EmitOperand(dst & 7, operand);
-}
-
-void Assembler::cmovlessq(Register dst, Register src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(src);
-  EmitOperandREX(dst, operand, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0x4C);
-  EmitOperand(dst & 7, operand);
-}
-
-void Assembler::movss(XmmRegister dst, const Address& src) {
-  ASSERT(dst <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xF3);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x10);
-  EmitOperand(dst & 7, src);
-}
-
-void Assembler::movss(const Address& dst, XmmRegister src) {
-  ASSERT(src <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xF3);
-  EmitREX_RB(src, dst);
-  EmitUint8(0x0F);
-  EmitUint8(0x11);
-  EmitOperand(src & 7, dst);
-}
-
-void Assembler::movss(XmmRegister dst, XmmRegister src) {
+void Assembler::EmitQ(int dst, int src, int opcode, int prefix2, int prefix1) {
   ASSERT(src <= XMM15);
   ASSERT(dst <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xF3);
-  EmitREX_RB(src, dst);
-  EmitUint8(0x0F);
-  EmitUint8(0x11);
-  EmitXmmRegisterOperand(src & 7, dst);
+  if (prefix1 >= 0) {
+    EmitUint8(prefix1);
+  }
+  EmitRegRegRex(dst, src, REX_W);
+  if (prefix2 >= 0) {
+    EmitUint8(prefix2);
+  }
+  EmitUint8(opcode);
+  EmitRegisterOperand(dst & 7, src);
 }
 
-void Assembler::movd(XmmRegister dst, Register src) {
-  ASSERT(dst <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0x66);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x6E);
-  EmitOperand(dst & 7, Operand(src));
-}
-
-void Assembler::movd(Register dst, XmmRegister src) {
-  ASSERT(src <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0x66);
-  EmitREX_RB(src, dst);
-  EmitUint8(0x0F);
-  EmitUint8(0x7E);
-  EmitOperand(src & 7, Operand(dst));
-}
-
-void Assembler::movq(Register dst, XmmRegister src) {
-  ASSERT(src <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0x66);
-  EmitREX_RB(src, dst, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0x7E);
-  EmitOperand(src & 7, Operand(dst));
-}
-
-void Assembler::addss(XmmRegister dst, XmmRegister src) {
+void Assembler::EmitL(int dst, int src, int opcode, int prefix2, int prefix1) {
   ASSERT(src <= XMM15);
   ASSERT(dst <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xF3);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x58);
-  EmitXmmRegisterOperand(dst & 7, src);
+  if (prefix1 >= 0) {
+    EmitUint8(prefix1);
+  }
+  EmitRegRegRex(dst, src);
+  if (prefix2 >= 0) {
+    EmitUint8(prefix2);
+  }
+  EmitUint8(opcode);
+  EmitRegisterOperand(dst & 7, src);
 }
 
-void Assembler::subss(XmmRegister dst, XmmRegister src) {
-  ASSERT(src <= XMM15);
-  ASSERT(dst <= XMM15);
+void Assembler::EmitW(Register dst,
+                      Register src,
+                      int opcode,
+                      int prefix2,
+                      int prefix1) {
+  ASSERT(src <= R15);
+  ASSERT(dst <= R15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xF3);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x5C);
-  EmitXmmRegisterOperand(dst & 7, src);
+  if (prefix1 >= 0) {
+    EmitUint8(prefix1);
+  }
+  EmitOperandSizeOverride();
+  EmitRegRegRex(dst, src);
+  if (prefix2 >= 0) {
+    EmitUint8(prefix2);
+  }
+  EmitUint8(opcode);
+  EmitRegisterOperand(dst & 7, src);
 }
 
-void Assembler::mulss(XmmRegister dst, XmmRegister src) {
-  ASSERT(src <= XMM15);
-  ASSERT(dst <= XMM15);
+#define UNARY_XMM_WITH_CONSTANT(name, constant, op)                            \
+  void Assembler::name(XmmRegister dst, XmmRegister src) {                     \
+    movq(TMP, Address(THR, Thread::constant##_address_offset()));              \
+    if (dst == src) {                                                          \
+      op(dst, Address(TMP, 0));                                                \
+    } else {                                                                   \
+      movups(dst, Address(TMP, 0));                                            \
+      op(dst, src);                                                            \
+    }                                                                          \
+  }
+
+// TODO(erikcorry): For the case where dst != src, we could construct these
+// with pcmpeqw xmm0,xmm0 followed by left and right shifts.  This would avoid
+// memory traffic.
+// { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
+UNARY_XMM_WITH_CONSTANT(notps, float_not, xorps)
+// { 0x80000000, 0x80000000, 0x80000000, 0x80000000 }
+UNARY_XMM_WITH_CONSTANT(negateps, float_negate, xorps)
+// { 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF }
+UNARY_XMM_WITH_CONSTANT(absps, float_absolute, andps)
+// { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000 }
+UNARY_XMM_WITH_CONSTANT(zerowps, float_zerow, andps)
+// { 0x8000000000000000LL, 0x8000000000000000LL }
+UNARY_XMM_WITH_CONSTANT(negatepd, double_negate, xorpd)
+// { 0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL }
+UNARY_XMM_WITH_CONSTANT(abspd, double_abs, andpd)
+// {0x8000000000000000LL, 0x8000000000000000LL}
+UNARY_XMM_WITH_CONSTANT(DoubleNegate, double_negate, xorpd)
+// {0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL}
+UNARY_XMM_WITH_CONSTANT(DoubleAbs, double_abs, andpd)
+
+#undef UNARY_XMM_WITH_CONSTANT
+
+void Assembler::CmpPS(XmmRegister dst, XmmRegister src, int condition) {
+  EmitL(dst, src, 0xC2, 0x0F);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xF3);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x59);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::divss(XmmRegister dst, XmmRegister src) {
-  ASSERT(src <= XMM15);
-  ASSERT(dst <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xF3);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x5E);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::movsd(XmmRegister dst, const Address& src) {
-  ASSERT(dst <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xF2);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x10);
-  EmitOperand(dst & 7, src);
-}
-
-void Assembler::movsd(const Address& dst, XmmRegister src) {
-  ASSERT(src <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xF2);
-  EmitREX_RB(src, dst);
-  EmitUint8(0x0F);
-  EmitUint8(0x11);
-  EmitOperand(src & 7, dst);
-}
-
-void Assembler::movsd(XmmRegister dst, XmmRegister src) {
-  ASSERT(src <= XMM15);
-  ASSERT(dst <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xF2);
-  EmitREX_RB(src, dst);
-  EmitUint8(0x0F);
-  EmitUint8(0x11);
-  EmitXmmRegisterOperand(src & 7, dst);
-}
-
-void Assembler::movaps(XmmRegister dst, XmmRegister src) {
-  ASSERT(src <= XMM15);
-  ASSERT(dst <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x28);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::movups(XmmRegister dst, const Address& src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x10);
-  EmitOperand(dst & 7, src);
-}
-
-void Assembler::movups(const Address& dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(src, dst);
-  EmitUint8(0x0F);
-  EmitUint8(0x11);
-  EmitOperand(src & 7, dst);
-}
-
-void Assembler::addsd(XmmRegister dst, XmmRegister src) {
-  ASSERT(src <= XMM15);
-  ASSERT(dst <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xF2);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x58);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::subsd(XmmRegister dst, XmmRegister src) {
-  ASSERT(src <= XMM15);
-  ASSERT(dst <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xF2);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x5C);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::mulsd(XmmRegister dst, XmmRegister src) {
-  ASSERT(src <= XMM15);
-  ASSERT(dst <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xF2);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x59);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::divsd(XmmRegister dst, XmmRegister src) {
-  ASSERT(src <= XMM15);
-  ASSERT(dst <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xF2);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x5E);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::addpl(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0x66);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0xFE);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::subpl(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0x66);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0xFA);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::addps(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x58);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::subps(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x5C);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::divps(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x5E);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::mulps(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x59);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::minps(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x5D);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::maxps(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x5F);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::andps(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x54);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::andps(XmmRegister dst, const Address& src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x54);
-  EmitOperand(dst & 7, src);
-}
-
-void Assembler::orps(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x56);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::notps(XmmRegister dst) {
-  // { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
-  movq(TMP, Address(THR, Thread::float_not_address_offset()));
-  xorps(dst, Address(TMP, 0));
-}
-
-void Assembler::negateps(XmmRegister dst) {
-  // { 0x80000000, 0x80000000, 0x80000000, 0x80000000 }
-  movq(TMP, Address(THR, Thread::float_negate_address_offset()));
-  xorps(dst, Address(TMP, 0));
-}
-
-void Assembler::absps(XmmRegister dst) {
-  // { 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF }
-  movq(TMP, Address(THR, Thread::float_absolute_address_offset()));
-  andps(dst, Address(TMP, 0));
-}
-
-void Assembler::zerowps(XmmRegister dst) {
-  // { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000 }
-  movq(TMP, Address(THR, Thread::float_zerow_address_offset()));
-  andps(dst, Address(TMP, 0));
-}
-
-void Assembler::cmppseq(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0xC2);
-  EmitXmmRegisterOperand(dst & 7, src);
-  EmitUint8(0x0);
-}
-
-void Assembler::cmppsneq(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0xC2);
-  EmitXmmRegisterOperand(dst & 7, src);
-  EmitUint8(0x4);
-}
-
-void Assembler::cmppslt(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0xC2);
-  EmitXmmRegisterOperand(dst & 7, src);
-  EmitUint8(0x1);
-}
-
-void Assembler::cmppsle(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0xC2);
-  EmitXmmRegisterOperand(dst & 7, src);
-  EmitUint8(0x2);
-}
-
-void Assembler::cmppsnlt(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0xC2);
-  EmitXmmRegisterOperand(dst & 7, src);
-  EmitUint8(0x5);
-}
-
-void Assembler::cmppsnle(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0xC2);
-  EmitXmmRegisterOperand(dst & 7, src);
-  EmitUint8(0x6);
-}
-
-void Assembler::sqrtps(XmmRegister dst) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, dst);
-  EmitUint8(0x0F);
-  EmitUint8(0x51);
-  EmitXmmRegisterOperand(dst & 7, dst);
-}
-
-void Assembler::rsqrtps(XmmRegister dst) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, dst);
-  EmitUint8(0x0F);
-  EmitUint8(0x52);
-  EmitXmmRegisterOperand(dst & 7, dst);
-}
-
-void Assembler::reciprocalps(XmmRegister dst) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, dst);
-  EmitUint8(0x0F);
-  EmitUint8(0x53);
-  EmitXmmRegisterOperand(dst & 7, dst);
-}
-
-void Assembler::movhlps(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x12);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::movlhps(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x16);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::unpcklps(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x14);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::unpckhps(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x15);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::unpcklpd(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0x66);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x14);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::unpckhpd(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0x66);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x15);
-  EmitXmmRegisterOperand(dst & 7, src);
+  EmitUint8(condition);
 }
 
 void Assembler::set1ps(XmmRegister dst, Register tmp1, const Immediate& imm) {
@@ -910,299 +382,29 @@
 }
 
 void Assembler::shufps(XmmRegister dst, XmmRegister src, const Immediate& imm) {
+  EmitL(dst, src, 0xC6, 0x0F);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0xC6);
-  EmitXmmRegisterOperand(dst & 7, src);
   ASSERT(imm.is_uint8());
   EmitUint8(imm.value());
 }
 
-void Assembler::addpd(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  ASSERT(src <= XMM15);
-  ASSERT(dst <= XMM15);
-  EmitUint8(0x66);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x58);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::negatepd(XmmRegister dst) {
-  // { 0x8000000000000000LL, 0x8000000000000000LL }
-  movq(TMP, Address(THR, Thread::double_negate_address_offset()));
-  xorpd(dst, Address(TMP, 0));
-}
-
-void Assembler::subpd(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  ASSERT(src <= XMM15);
-  ASSERT(dst <= XMM15);
-  EmitUint8(0x66);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x5C);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::mulpd(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  ASSERT(src <= XMM15);
-  ASSERT(dst <= XMM15);
-  EmitUint8(0x66);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x59);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::divpd(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  ASSERT(src <= XMM15);
-  ASSERT(dst <= XMM15);
-  EmitUint8(0x66);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x5E);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::abspd(XmmRegister dst) {
-  // { 0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL }
-  movq(TMP, Address(THR, Thread::double_abs_address_offset()));
-  andpd(dst, Address(TMP, 0));
-}
-
-void Assembler::minpd(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  ASSERT(src <= XMM15);
-  ASSERT(dst <= XMM15);
-  EmitUint8(0x66);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x5D);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::maxpd(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  ASSERT(src <= XMM15);
-  ASSERT(dst <= XMM15);
-  EmitUint8(0x66);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x5F);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::sqrtpd(XmmRegister dst) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  ASSERT(dst <= XMM15);
-  EmitUint8(0x66);
-  EmitREX_RB(dst, dst);
-  EmitUint8(0x0F);
-  EmitUint8(0x51);
-  EmitXmmRegisterOperand(dst & 7, dst);
-}
-
-void Assembler::cvtps2pd(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  ASSERT(src <= XMM15);
-  ASSERT(dst <= XMM15);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x5A);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::cvtpd2ps(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  ASSERT(src <= XMM15);
-  ASSERT(dst <= XMM15);
-  EmitUint8(0x66);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x5A);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
 void Assembler::shufpd(XmmRegister dst, XmmRegister src, const Immediate& imm) {
+  EmitL(dst, src, 0xC6, 0x0F, 0x66);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0x66);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0xC6);
-  EmitXmmRegisterOperand(dst & 7, src);
   ASSERT(imm.is_uint8());
   EmitUint8(imm.value());
 }
 
-void Assembler::comisd(XmmRegister a, XmmRegister b) {
-  ASSERT(a <= XMM15);
-  ASSERT(b <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0x66);
-  EmitREX_RB(a, b);
-  EmitUint8(0x0F);
-  EmitUint8(0x2F);
-  EmitXmmRegisterOperand(a & 7, b);
-}
-
-void Assembler::movmskpd(Register dst, XmmRegister src) {
-  ASSERT(src <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0x66);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x50);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::movmskps(Register dst, XmmRegister src) {
-  ASSERT(src <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x50);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::sqrtsd(XmmRegister dst, XmmRegister src) {
-  ASSERT(dst <= XMM15);
-  ASSERT(src <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xF2);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x51);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::xorpd(XmmRegister dst, const Address& src) {
-  ASSERT(dst <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0x66);
-  EmitOperandREX(dst, src, REX_NONE);
-  EmitUint8(0x0F);
-  EmitUint8(0x57);
-  EmitOperand(dst & 7, src);
-}
-
-void Assembler::xorpd(XmmRegister dst, XmmRegister src) {
-  ASSERT(dst <= XMM15);
-  ASSERT(src <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0x66);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x57);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::xorps(XmmRegister dst, const Address& src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x57);
-  EmitOperand(dst & 7, src);
-}
-
-void Assembler::xorps(XmmRegister dst, XmmRegister src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x57);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::andpd(XmmRegister dst, const Address& src) {
-  ASSERT(dst <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0x66);
-  EmitOperandREX(dst, src, REX_NONE);
-  EmitUint8(0x0F);
-  EmitUint8(0x54);
-  EmitOperand(dst & 7, src);
-}
-
-void Assembler::cvtsi2sdq(XmmRegister dst, Register src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  ASSERT(dst <= XMM15);
-  Operand operand(src);
-  EmitUint8(0xF2);
-  EmitOperandREX(dst, operand, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0x2A);
-  EmitOperand(dst & 7, operand);
-}
-
-void Assembler::cvtsi2sdl(XmmRegister dst, Register src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  ASSERT(dst <= XMM15);
-  Operand operand(src);
-  EmitUint8(0xF2);
-  EmitOperandREX(dst, operand, REX_NONE);
-  EmitUint8(0x0F);
-  EmitUint8(0x2A);
-  EmitOperand(dst & 7, operand);
-}
-
-void Assembler::cvttsd2siq(Register dst, XmmRegister src) {
-  ASSERT(src <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xF2);
-  Operand operand(dst);
-  EmitREX_RB(dst, src, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0x2C);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::cvtss2sd(XmmRegister dst, XmmRegister src) {
-  ASSERT(src <= XMM15);
-  ASSERT(dst <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xF3);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x5A);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::cvtsd2ss(XmmRegister dst, XmmRegister src) {
-  ASSERT(src <= XMM15);
-  ASSERT(dst <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xF2);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0x5A);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
-void Assembler::pxor(XmmRegister dst, XmmRegister src) {
-  ASSERT(src <= XMM15);
-  ASSERT(dst <= XMM15);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0x66);
-  EmitREX_RB(dst, src);
-  EmitUint8(0x0F);
-  EmitUint8(0xEF);
-  EmitXmmRegisterOperand(dst & 7, src);
-}
-
 void Assembler::roundsd(XmmRegister dst, XmmRegister src, RoundingMode mode) {
   ASSERT(src <= XMM15);
   ASSERT(dst <= XMM15);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0x66);
-  EmitREX_RB(dst, src);
+  EmitRegRegRex(dst, src);
   EmitUint8(0x0F);
   EmitUint8(0x3A);
   EmitUint8(0x0B);
-  EmitXmmRegisterOperand(dst & 7, src);
+  EmitRegisterOperand(dst & 7, src);
   // Mask precision exeption.
   EmitUint8(static_cast<uint8_t>(mode) | 0x8);
 }
@@ -1219,64 +421,9 @@
   EmitOperand(3, dst);
 }
 
-void Assembler::fincstp() {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xD9);
-  EmitUint8(0xF7);
-}
-
 void Assembler::ffree(intptr_t value) {
   ASSERT(value < 7);
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xDD);
-  EmitUint8(0xC0 + value);
-}
-
-void Assembler::fsin() {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xD9);
-  EmitUint8(0xFE);
-}
-
-void Assembler::fcos() {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xD9);
-  EmitUint8(0xFF);
-}
-
-void Assembler::xchgl(Register dst, Register src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(src);
-  EmitOperandREX(dst, operand, REX_NONE);
-  EmitUint8(0x87);
-  EmitOperand(dst & 7, operand);
-}
-
-void Assembler::xchgq(Register dst, Register src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(src);
-  EmitOperandREX(dst, operand, REX_W);
-  EmitUint8(0x87);
-  EmitOperand(dst & 7, operand);
-}
-
-void Assembler::cmpb(const Address& address, const Immediate& imm) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(7, address, REX_NONE);
-  EmitUint8(0x80);
-  EmitOperand(7, address);
-  ASSERT(imm.is_int8());
-  EmitUint8(imm.value() & 0xFF);
-}
-
-void Assembler::cmpw(const Address& address, const Immediate& imm) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandSizeOverride();
-  EmitOperandREX(7, address, REX_NONE);
-  EmitUint8(0x81);
-  EmitOperand(7, address);
-  EmitUint8(imm.value() & 0xFF);
-  EmitUint8((imm.value() >> 8) & 0xFF);
+  EmitSimple(0xDD, 0xC0 + value);
 }
 
 void Assembler::CompareImmediate(Register reg, const Immediate& imm) {
@@ -1298,14 +445,6 @@
   }
 }
 
-void Assembler::testl(Register reg1, Register reg2) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(reg2);
-  EmitOperandREX(reg1, operand, REX_NONE);
-  EmitUint8(0x85);
-  EmitOperand(reg1 & 7, operand);
-}
-
 void Assembler::testb(const Address& address, const Immediate& imm) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitOperandREX(0, address, REX_NONE);
@@ -1315,14 +454,6 @@
   EmitUint8(imm.value() & 0xFF);
 }
 
-void Assembler::testq(Register reg1, Register reg2) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(reg2);
-  EmitOperandREX(reg1, operand, REX_W);
-  EmitUint8(0x85);
-  EmitOperand(reg1 & 7, operand);
-}
-
 void Assembler::testq(Register reg, const Immediate& imm) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   if (imm.is_uint8()) {
@@ -1372,50 +503,38 @@
   }
 }
 
-void Assembler::Alu(int bytes, uint8_t opcode, Register dst, Register src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(src);
-  if (bytes == 2) {
-    EmitOperandSizeOverride();
-  }
-  EmitOperandREX(dst, operand, bytes == 8 ? REX_W : REX_NONE);
-  ASSERT((opcode & 7) == 3);
-  EmitUint8(opcode);
-  EmitOperand(dst & 7, operand);
-}
-
 void Assembler::AluL(uint8_t modrm_opcode, Register dst, const Immediate& imm) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitRegisterREX(dst, REX_NONE);
   EmitComplex(modrm_opcode, Operand(dst), imm);
 }
 
-void Assembler::Alu(int bytes,
-                    uint8_t opcode,
-                    Register dst,
-                    const Address& src) {
+void Assembler::AluB(uint8_t modrm_opcode,
+                     const Address& dst,
+                     const Immediate& imm) {
+  ASSERT(imm.is_uint8() || imm.is_int8());
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  if (bytes == 2) {
-    EmitOperandSizeOverride();
-  }
-  EmitOperandREX(dst, src, bytes == 8 ? REX_W : REX_NONE);
-  ASSERT((opcode & 7) == 3);
-  EmitUint8(opcode);
-  EmitOperand(dst & 7, src);
+  EmitOperandREX(modrm_opcode, dst, REX_NONE);
+  EmitUint8(0x80);
+  EmitOperand(modrm_opcode, dst);
+  EmitUint8(imm.value() & 0xFF);
 }
 
-void Assembler::Alu(int bytes,
-                    uint8_t opcode,
-                    const Address& dst,
-                    Register src) {
+void Assembler::AluW(uint8_t modrm_opcode,
+                     const Address& dst,
+                     const Immediate& imm) {
+  ASSERT(imm.is_int16() || imm.is_uint16());
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  if (bytes == 2) {
-    EmitOperandSizeOverride();
+  EmitOperandSizeOverride();
+  EmitOperandREX(modrm_opcode, dst, REX_NONE);
+  if (imm.is_int8()) {
+    EmitSignExtendedInt8(modrm_opcode, dst, imm);
+  } else {
+    EmitUint8(0x81);
+    EmitOperand(modrm_opcode, dst);
+    EmitUint8(imm.value() & 0xFF);
+    EmitUint8((imm.value() >> 8) & 0xFF);
   }
-  EmitOperandREX(src, dst, bytes == 8 ? REX_W : REX_NONE);
-  ASSERT((opcode & 7) == 1);
-  EmitUint8(opcode);
-  EmitOperand(src & 7, dst);
 }
 
 void Assembler::AluL(uint8_t modrm_opcode,
@@ -1423,15 +542,15 @@
                      const Immediate& imm) {
   ASSERT(imm.is_int32());
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(dst);
-  EmitOperandREX(modrm_opcode, operand, REX_NONE);
-  EmitComplex(modrm_opcode, operand, imm);
+  EmitOperandREX(modrm_opcode, dst, REX_NONE);
+  EmitComplex(modrm_opcode, dst, imm);
 }
 
 void Assembler::AluQ(uint8_t modrm_opcode,
                      uint8_t opcode,
                      Register dst,
                      const Immediate& imm) {
+  Operand operand(dst);
   if (modrm_opcode == 4 && imm.is_uint32()) {
     // We can use andl for andq.
     AssemblerBuffer::EnsureCapacity ensured(&buffer_);
@@ -1439,27 +558,24 @@
     // Would like to use EmitComplex here, but it doesn't like uint32
     // immediates.
     if (imm.is_int8()) {
-      // Use sign-extended 8-bit immediate.
-      EmitUint8(0x83);
-      EmitOperand(modrm_opcode, Operand(dst));
-      EmitUint8(imm.value() & 0xFF);
+      EmitSignExtendedInt8(modrm_opcode, operand, imm);
     } else {
       if (dst == RAX) {
         EmitUint8(0x25);
       } else {
         EmitUint8(0x81);
-        EmitOperand(modrm_opcode, Operand(dst));
+        EmitOperand(modrm_opcode, operand);
       }
       EmitUInt32(imm.value());
     }
   } else if (imm.is_int32()) {
     AssemblerBuffer::EnsureCapacity ensured(&buffer_);
     EmitRegisterREX(dst, REX_W);
-    EmitComplex(modrm_opcode, Operand(dst), imm);
+    EmitComplex(modrm_opcode, operand, imm);
   } else {
     ASSERT(dst != TMP);
     movq(TMP, imm);
-    Alu(8, opcode, dst, TMP);
+    EmitQ(dst, TMP, opcode);
   }
 }
 
@@ -1470,10 +586,10 @@
   if (imm.is_int32()) {
     AssemblerBuffer::EnsureCapacity ensured(&buffer_);
     EmitOperandREX(modrm_opcode, dst, REX_W);
-    EmitComplex(modrm_opcode, Operand(dst), imm);
+    EmitComplex(modrm_opcode, dst, imm);
   } else {
     movq(TMP, imm);
-    Alu(8, opcode, dst, TMP);
+    EmitQ(TMP, dst, opcode);
   }
 }
 
@@ -1507,52 +623,40 @@
   }
 }
 
-void Assembler::cdq() {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0x99);
-}
-
 void Assembler::cqo() {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitRegisterREX(RAX, REX_W);
   EmitUint8(0x99);
 }
 
-void Assembler::idivl(Register reg) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitRegisterREX(reg, REX_NONE);
-  EmitUint8(0xF7);
-  EmitOperand(7, Operand(reg));
-}
-
-void Assembler::divl(Register reg) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitRegisterREX(reg, REX_NONE);
-  EmitUint8(0xF7);
-  EmitOperand(6, Operand(reg));
-}
-
-void Assembler::idivq(Register reg) {
+void Assembler::EmitUnaryQ(Register reg, int opcode, int modrm_code) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitRegisterREX(reg, REX_W);
-  EmitUint8(0xF7);
-  EmitOperand(7, Operand(reg));
+  EmitUint8(opcode);
+  EmitOperand(modrm_code, Operand(reg));
 }
 
-void Assembler::divq(Register reg) {
+void Assembler::EmitUnaryL(Register reg, int opcode, int modrm_code) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitRegisterREX(reg, REX_W);
-  EmitUint8(0xF7);
-  EmitOperand(6, Operand(reg));
+  EmitRegisterREX(reg, REX_NONE);
+  EmitUint8(opcode);
+  EmitOperand(modrm_code, Operand(reg));
 }
 
-void Assembler::imull(Register dst, Register src) {
+void Assembler::EmitUnaryQ(const Address& address, int opcode, int modrm_code) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(src);
-  EmitOperandREX(dst, operand, REX_NONE);
-  EmitUint8(0x0F);
-  EmitUint8(0xAF);
-  EmitOperand(dst & 7, Operand(src));
+  Operand operand(address);
+  EmitOperandREX(modrm_code, operand, REX_W);
+  EmitUint8(opcode);
+  EmitOperand(modrm_code, operand);
+}
+
+void Assembler::EmitUnaryL(const Address& address, int opcode, int modrm_code) {
+  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  Operand operand(address);
+  EmitOperandREX(modrm_code, operand, REX_NONE);
+  EmitUint8(opcode);
+  EmitOperand(modrm_code, operand);
 }
 
 void Assembler::imull(Register reg, const Immediate& imm) {
@@ -1564,22 +668,6 @@
   EmitImmediate(imm);
 }
 
-void Assembler::mull(Register reg) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitRegisterREX(reg, REX_NONE);
-  EmitUint8(0xF7);
-  EmitOperand(4, Operand(reg));
-}
-
-void Assembler::imulq(Register dst, Register src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(src);
-  EmitOperandREX(dst, operand, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0xAF);
-  EmitOperand(dst & 7, operand);
-}
-
 void Assembler::imulq(Register reg, const Immediate& imm) {
   if (imm.is_int32()) {
     AssemblerBuffer::EnsureCapacity ensured(&buffer_);
@@ -1605,21 +693,6 @@
   }
 }
 
-void Assembler::imulq(Register dst, const Address& address) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(dst, address, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0xAF);
-  EmitOperand(dst & 7, address);
-}
-
-void Assembler::mulq(Register reg) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitRegisterREX(reg, REX_W);
-  EmitUint8(0xF7);
-  EmitOperand(4, Operand(reg));
-}
-
 void Assembler::shll(Register reg, const Immediate& imm) {
   EmitGenericShift(false, 4, reg, imm);
 }
@@ -1645,13 +718,9 @@
 }
 
 void Assembler::shldl(Register dst, Register src, const Immediate& imm) {
+  EmitL(src, dst, 0xA4, 0x0F);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   ASSERT(imm.is_int8());
-  Operand operand(dst);
-  EmitOperandREX(src, operand, REX_NONE);
-  EmitUint8(0x0F);
-  EmitUint8(0xA4);
-  EmitOperand(src & 7, operand);
   EmitUint8(imm.value() & 0xFF);
 }
 
@@ -1680,130 +749,12 @@
 }
 
 void Assembler::shldq(Register dst, Register src, const Immediate& imm) {
+  EmitQ(src, dst, 0xA4, 0x0F);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   ASSERT(imm.is_int8());
-  Operand operand(dst);
-  EmitOperandREX(src, operand, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0xA4);
-  EmitOperand(src & 7, operand);
   EmitUint8(imm.value() & 0xFF);
 }
 
-void Assembler::shldq(Register dst, Register src, Register shifter) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  ASSERT(shifter == RCX);
-  Operand operand(dst);
-  EmitOperandREX(src, operand, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0xA5);
-  EmitOperand(src & 7, operand);
-}
-
-void Assembler::shrdq(Register dst, Register src, Register shifter) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  ASSERT(shifter == RCX);
-  Operand operand(dst);
-  EmitOperandREX(src, operand, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0xAD);
-  EmitOperand(src & 7, operand);
-}
-
-void Assembler::incl(const Address& address) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(address);
-  EmitOperandREX(0, operand, REX_NONE);
-  EmitUint8(0xFF);
-  EmitOperand(0, operand);
-}
-
-void Assembler::decl(const Address& address) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(address);
-  EmitOperandREX(1, operand, REX_NONE);
-  EmitUint8(0xFF);
-  EmitOperand(1, operand);
-}
-
-void Assembler::incq(Register reg) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(reg);
-  EmitOperandREX(0, operand, REX_W);
-  EmitUint8(0xFF);
-  EmitOperand(0, operand);
-}
-
-void Assembler::incq(const Address& address) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(address);
-  EmitOperandREX(0, operand, REX_W);
-  EmitUint8(0xFF);
-  EmitOperand(0, operand);
-}
-
-void Assembler::decq(Register reg) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(reg);
-  EmitOperandREX(1, operand, REX_W);
-  EmitUint8(0xFF);
-  EmitOperand(1, operand);
-}
-
-void Assembler::decq(const Address& address) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(address);
-  EmitOperandREX(1, operand, REX_W);
-  EmitUint8(0xFF);
-  EmitOperand(1, operand);
-}
-
-void Assembler::negl(Register reg) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitRegisterREX(reg, REX_NONE);
-  EmitUint8(0xF7);
-  EmitOperand(3, Operand(reg));
-}
-
-void Assembler::negq(Register reg) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitRegisterREX(reg, REX_W);
-  EmitUint8(0xF7);
-  EmitOperand(3, Operand(reg));
-}
-
-void Assembler::notl(Register reg) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitRegisterREX(reg, REX_NONE);
-  EmitUint8(0xF7);
-  EmitUint8(0xD0 | (reg & 7));
-}
-
-void Assembler::notq(Register reg) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitRegisterREX(reg, REX_W);
-  EmitUint8(0xF7);
-  EmitUint8(0xD0 | (reg & 7));
-}
-
-void Assembler::bsrq(Register dst, Register src) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(src);
-  EmitOperandREX(dst, operand, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0xBD);
-  EmitOperand(dst & 7, operand);
-}
-
-void Assembler::btq(Register base, Register offset) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(base);
-  EmitOperandREX(offset, operand, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0xA3);
-  EmitOperand(offset & 7, operand);
-}
-
 void Assembler::btq(Register base, int bit) {
   ASSERT(bit >= 0 && bit < 64);
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
@@ -1824,16 +775,6 @@
   EmitUint8(0x00);
 }
 
-void Assembler::leave() {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xC9);
-}
-
-void Assembler::ret() {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xC3);
-}
-
 void Assembler::nop(int size) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   // There are nops up to size 15, but for now just provide up to size 8.
@@ -1896,16 +837,6 @@
   }
 }
 
-void Assembler::int3() {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xCC);
-}
-
-void Assembler::hlt() {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xF4);
-}
-
 void Assembler::j(Condition condition, Label* label, bool near) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   if (label->IsBound()) {
@@ -1941,21 +872,6 @@
   Bind(&no_jump);
 }
 
-void Assembler::jmp(Register reg) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  Operand operand(reg);
-  EmitOperandREX(4, operand, REX_NONE);
-  EmitUint8(0xFF);
-  EmitOperand(4, operand);
-}
-
-void Assembler::jmp(const Address& dst) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(4, dst, REX_NONE);
-  EmitUint8(0xFF);
-  EmitOperand(4, dst);
-}
-
 void Assembler::jmp(Label* label, bool near) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   if (label->IsBound()) {
@@ -2009,33 +925,6 @@
   jmp(TMP);
 }
 
-void Assembler::lock() {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0xF0);
-}
-
-void Assembler::cmpxchgl(const Address& address, Register reg) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(reg, address, REX_NONE);
-  EmitUint8(0x0F);
-  EmitUint8(0xB1);
-  EmitOperand(reg & 7, address);
-}
-
-void Assembler::cmpxchgq(const Address& address, Register reg) {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitOperandREX(reg, address, REX_W);
-  EmitUint8(0x0F);
-  EmitUint8(0xB1);
-  EmitOperand(reg & 7, address);
-}
-
-void Assembler::cpuid() {
-  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-  EmitUint8(0x0F);
-  EmitUint8(0xA2);
-}
-
 void Assembler::CompareRegisters(Register a, Register b) {
   cmpq(a, b);
 }
@@ -2398,18 +1287,6 @@
   addq(dest, inc_imm);
 }
 
-void Assembler::DoubleNegate(XmmRegister d) {
-  // {0x8000000000000000LL, 0x8000000000000000LL}
-  movq(TMP, Address(THR, Thread::double_negate_address_offset()));
-  xorpd(d, Address(TMP, 0));
-}
-
-void Assembler::DoubleAbs(XmmRegister reg) {
-  // {0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL}
-  movq(TMP, Address(THR, Thread::double_abs_address_offset()));
-  andpd(reg, Address(TMP, 0));
-}
-
 void Assembler::Stop(const char* message, bool fixed_length_encoding) {
   int64_t message_address = reinterpret_cast<int64_t>(message);
   if (FLAG_print_stop_message) {
@@ -2880,9 +1757,9 @@
   }
 }
 
-void Assembler::EmitXmmRegisterOperand(int rm, XmmRegister xmm_reg) {
+void Assembler::EmitRegisterOperand(int rm, int reg) {
   Operand operand;
-  operand.SetModRM(3, static_cast<Register>(xmm_reg));
+  operand.SetModRM(3, static_cast<Register>(reg));
   EmitOperand(rm, operand);
 }
 
@@ -2894,16 +1771,21 @@
   }
 }
 
+void Assembler::EmitSignExtendedInt8(int rm,
+                                     const Operand& operand,
+                                     const Immediate& immediate) {
+  EmitUint8(0x83);
+  EmitOperand(rm, operand);
+  EmitUint8(immediate.value() & 0xFF);
+}
+
 void Assembler::EmitComplex(int rm,
                             const Operand& operand,
                             const Immediate& immediate) {
   ASSERT(rm >= 0 && rm < 8);
   ASSERT(immediate.is_int32());
   if (immediate.is_int8()) {
-    // Use sign-extended 8-bit immediate.
-    EmitUint8(0x83);
-    EmitOperand(rm, operand);
-    EmitUint8(immediate.value() & 0xFF);
+    EmitSignExtendedInt8(rm, operand, immediate);
   } else if (operand.IsRegister(RAX)) {
     // Use short form if the destination is rax.
     EmitUint8(0x05 + (rm << 3));
@@ -2966,11 +1848,7 @@
                                  Register shifter) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   ASSERT(shifter == RCX);
-  if (wide) {
-    EmitRegisterREX(operand, REX_W);
-  } else {
-    EmitRegisterREX(operand, REX_NONE);
-  }
+  EmitRegisterREX(operand, wide ? REX_W : REX_NONE);
   EmitUint8(0xD3);
   EmitOperand(rm, Operand(operand));
 }
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index 49f51ae..5a9e9b0 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -12,6 +12,7 @@
 #include "platform/assert.h"
 #include "platform/utils.h"
 #include "vm/constants_x64.h"
+#include "vm/constants_x86.h"
 #include "vm/hash_map.h"
 #include "vm/object.h"
 
@@ -31,6 +32,7 @@
 
   bool is_int8() const { return Utils::IsInt(8, value_); }
   bool is_uint8() const { return Utils::IsUint(8, value_); }
+  bool is_int16() const { return Utils::IsInt(16, value_); }
   bool is_uint16() const { return Utils::IsUint(16, value_); }
   bool is_int32() const { return Utils::IsInt(32, value_); }
   bool is_uint32() const { return Utils::IsUint(32, value_); }
@@ -353,147 +355,222 @@
   /*
    * Emit Machine Instructions.
    */
-  void call(Register reg);
-  void call(const Address& address);
+  void call(Register reg) { EmitUnaryL(reg, 0xFF, 2); }
+  void call(const Address& address) { EmitUnaryL(address, 0xFF, 2); }
   void call(Label* label);
   void call(const ExternalLabel* label);
 
   static const intptr_t kCallExternalLabelSize = 15;
 
   void pushq(Register reg);
-  void pushq(const Address& address);
+  void pushq(const Address& address) { EmitUnaryL(address, 0xFF, 6); }
   void pushq(const Immediate& imm);
   void PushImmediate(const Immediate& imm);
 
   void popq(Register reg);
-  void popq(const Address& address);
+  void popq(const Address& address) { EmitUnaryL(address, 0x8F, 0); }
 
   void setcc(Condition condition, ByteRegister dst);
 
-  void movl(Register dst, Register src);
+// Register-register, register-address and address-register instructions.
+#define RR(width, name, ...)                                                   \
+  void name(Register dst, Register src) { Emit##width(dst, src, __VA_ARGS__); }
+#define RA(width, name, ...)                                                   \
+  void name(Register dst, const Address& src) {                                \
+    Emit##width(dst, src, __VA_ARGS__);                                        \
+  }
+#define AR(width, name, ...)                                                   \
+  void name(const Address& dst, Register src) {                                \
+    Emit##width(src, dst, __VA_ARGS__);                                        \
+  }
+#define REGULAR_INSTRUCTION(name, ...)                                         \
+  RA(W, name##w, __VA_ARGS__)                                                  \
+  RA(L, name##l, __VA_ARGS__)                                                  \
+  RA(Q, name##q, __VA_ARGS__)                                                  \
+  RR(W, name##w, __VA_ARGS__)                                                  \
+  RR(L, name##l, __VA_ARGS__)                                                  \
+  RR(Q, name##q, __VA_ARGS__)
+  REGULAR_INSTRUCTION(test, 0x85)
+  REGULAR_INSTRUCTION(xchg, 0x87)
+  REGULAR_INSTRUCTION(imul, 0xAF, 0x0F)
+  REGULAR_INSTRUCTION(bsr, 0xBD, 0x0F)
+#undef REGULAR_INSTRUCTION
+  RA(Q, movsxd, 0x63)
+  RR(Q, movsxd, 0x63)
+  AR(L, movb, 0x88)
+  AR(L, movl, 0x89)
+  AR(Q, movq, 0x89)
+  AR(W, movw, 0x89)
+  RA(L, movb, 0x8A)
+  RA(L, movl, 0x8B)
+  RA(Q, movq, 0x8B)
+  RR(L, movl, 0x8B)
+  RA(Q, leaq, 0x8D)
+  AR(L, cmpxchgl, 0xB1, 0x0F)
+  AR(Q, cmpxchgq, 0xB1, 0x0F)
+  RA(L, cmpxchgl, 0xB1, 0x0F)
+  RA(Q, cmpxchgq, 0xB1, 0x0F)
+  RR(L, cmpxchgl, 0xB1, 0x0F)
+  RR(Q, cmpxchgq, 0xB1, 0x0F)
+  RA(Q, movzxb, 0xB6, 0x0F)
+  RR(Q, movzxb, 0xB6, 0x0F)
+  RA(Q, movzxw, 0xB7, 0x0F)
+  RR(Q, movzxw, 0xB7, 0x0F)
+  RA(Q, movsxb, 0xBE, 0x0F)
+  RR(Q, movsxb, 0xBE, 0x0F)
+  RA(Q, movsxw, 0xBF, 0x0F)
+  RR(Q, movsxw, 0xBF, 0x0F)
+#define DECLARE_CMOV(name, code)                                               \
+  RR(Q, cmov##name##q, 0x40 + code, 0x0F)                                      \
+  RR(L, cmov##name##l, 0x40 + code, 0x0F)                                      \
+  RA(Q, cmov##name##q, 0x40 + code, 0x0F)                                      \
+  RA(L, cmov##name##l, 0x40 + code, 0x0F)
+  X86_CONDITIONAL_SUFFIXES(DECLARE_CMOV)
+#undef DECLARE_CMOV
+#undef AA
+#undef RA
+#undef AR
+
+#define SIMPLE(name, ...)                                                      \
+  void name() { EmitSimple(__VA_ARGS__); }
+  SIMPLE(cpuid, 0x0F, 0xA2)
+  SIMPLE(fcos, 0xD9, 0xFF)
+  SIMPLE(fincstp, 0xD9, 0xF7)
+  SIMPLE(fsin, 0xD9, 0xFE)
+  SIMPLE(lock, 0xF0)
+  SIMPLE(rep_movsb, 0xF3, 0xA4)
+#undef SIMPLE
+// XmmRegister operations with another register or an address.
+#define XX(width, name, ...)                                                   \
+  void name(XmmRegister dst, XmmRegister src) {                                \
+    Emit##width(dst, src, __VA_ARGS__);                                        \
+  }
+#define XA(width, name, ...)                                                   \
+  void name(XmmRegister dst, const Address& src) {                             \
+    Emit##width(dst, src, __VA_ARGS__);                                        \
+  }
+#define AX(width, name, ...)                                                   \
+  void name(const Address& dst, XmmRegister src) {                             \
+    Emit##width(src, dst, __VA_ARGS__);                                        \
+  }
+  // We could add movupd here, but movups does the same and is shorter.
+  XA(L, movups, 0x10, 0x0F);
+  XA(L, movsd, 0x10, 0x0F, 0xF2)
+  XA(L, movss, 0x10, 0x0F, 0xF3)
+  AX(L, movups, 0x11, 0x0F);
+  AX(L, movsd, 0x11, 0x0F, 0xF2)
+  AX(L, movss, 0x11, 0x0F, 0xF3)
+  XX(L, movhlps, 0x12, 0x0F)
+  XX(L, unpcklps, 0x14, 0x0F)
+  XX(L, unpcklpd, 0x14, 0x0F, 0x66)
+  XX(L, unpckhps, 0x15, 0x0F)
+  XX(L, unpckhpd, 0x15, 0x0F, 0x66)
+  XX(L, movlhps, 0x16, 0x0F)
+  XX(L, movaps, 0x28, 0x0F)
+  XX(L, comisd, 0x2F, 0x0F, 0x66)
+#define DECLARE_XMM(name, code)                                                \
+  XX(L, name##ps, 0x50 + code, 0x0F)                                           \
+  XA(L, name##ps, 0x50 + code, 0x0F)                                           \
+  AX(L, name##ps, 0x50 + code, 0x0F)                                           \
+  XX(L, name##pd, 0x50 + code, 0x0F, 0x66)                                     \
+  XA(L, name##pd, 0x50 + code, 0x0F, 0x66)                                     \
+  AX(L, name##pd, 0x50 + code, 0x0F, 0x66)                                     \
+  XX(L, name##sd, 0x50 + code, 0x0F, 0xF2)                                     \
+  XA(L, name##sd, 0x50 + code, 0x0F, 0xF2)                                     \
+  AX(L, name##sd, 0x50 + code, 0x0F, 0xF2)                                     \
+  XX(L, name##ss, 0x50 + code, 0x0F, 0xF3)                                     \
+  XA(L, name##ss, 0x50 + code, 0x0F, 0xF3)                                     \
+  AX(L, name##ss, 0x50 + code, 0x0F, 0xF3)
+  XMM_ALU_CODES(DECLARE_XMM)
+#undef DECLARE_XMM
+  XX(L, cvtps2pd, 0x5A, 0x0F)
+  XX(L, cvtpd2ps, 0x5A, 0x0F, 0x66)
+  XX(L, cvtsd2ss, 0x5A, 0x0F, 0xF2)
+  XX(L, cvtss2sd, 0x5A, 0x0F, 0xF3)
+  XX(L, pxor, 0xEF, 0x0F, 0x66)
+  XX(L, subpl, 0xFA, 0x0F, 0x66)
+  XX(L, addpl, 0xFE, 0x0F, 0x66)
+#undef XX
+#undef AX
+#undef XA
+
+#define DECLARE_CMPPS(name, code)                                              \
+  void cmpps##name(XmmRegister dst, XmmRegister src) {                         \
+    EmitL(dst, src, 0xC2, 0x0F);                                               \
+    AssemblerBuffer::EnsureCapacity ensured(&buffer_);                         \
+    EmitUint8(code);                                                           \
+  }
+  XMM_CONDITIONAL_CODES(DECLARE_CMPPS)
+#undef DECLARE_CMPPS
+
+#define DECLARE_SIMPLE(name, opcode)                                           \
+  void name() { EmitSimple(opcode); }
+  X86_ZERO_OPERAND_1_BYTE_INSTRUCTIONS(DECLARE_SIMPLE)
+#undef DECLARE_SIMPLE
+
   void movl(Register dst, const Immediate& imm);
-  void movl(Register dst, const Address& src);
-  void movl(const Address& dst, Register src);
   void movl(const Address& dst, const Immediate& imm);
 
-  void movzxb(Register dst, Register src);
-  void movzxb(Register dst, const Address& src);
-  void movsxb(Register dst, Register src);
-  void movsxb(Register dst, const Address& src);
-  void movb(Register dst, const Address& src);
-  void movb(const Address& dst, Register src);
   void movb(const Address& dst, const Immediate& imm);
 
-  void movzxw(Register dst, Register src);
-  void movzxw(Register dst, const Address& src);
-  void movsxw(Register dst, Register src);
-  void movsxw(Register dst, const Address& src);
   void movw(Register dst, const Address& src);
-  void movw(const Address& dst, Register src);
   void movw(const Address& dst, const Immediate& imm);
 
   void movq(Register dst, const Immediate& imm);
-  void movq(Register dst, Register src);
-  void movq(Register dst, const Address& src);
-  void movq(const Address& dst, Register src);
   void movq(const Address& dst, const Immediate& imm);
-  void movq(Register dst, XmmRegister src);
 
-  void movsxd(Register dst, Register src);
-  void movsxd(Register dst, const Address& src);
+  // Destination and source are reversed for some reason.
+  void movq(Register dst, XmmRegister src) {
+    EmitQ(src, dst, 0x7E, 0x0F, 0x66);
+  }
+  void movl(Register dst, XmmRegister src) {
+    EmitL(src, dst, 0x7E, 0x0F, 0x66);
+  }
+  void movss(XmmRegister dst, XmmRegister src) {
+    EmitL(src, dst, 0x11, 0x0F, 0xF3);
+  }
+  void movsd(XmmRegister dst, XmmRegister src) {
+    EmitL(src, dst, 0x11, 0x0F, 0xF2);
+  }
 
-  void rep_movsb();
+  // Use the reversed operand order and the 0x89 bytecode instead of the
+  // obvious 0x88 encoding for this some, because it is expected by gdb64 older
+  // than 7.3.1-gg5 when disassembling a function's prologue (movq rbp, rsp)
+  // for proper unwinding of Dart frames (use --generate_gdb_symbols and -O0).
+  void movq(Register dst, Register src) { EmitQ(src, dst, 0x89); }
 
-  void leaq(Register dst, const Address& src);
+  void movd(XmmRegister dst, Register src) {
+    EmitL(dst, src, 0x6E, 0x0F, 0x66);
+  }
+  void cvtsi2sdq(XmmRegister dst, Register src) {
+    EmitQ(dst, src, 0x2A, 0x0F, 0xF2);
+  }
+  void cvtsi2sdl(XmmRegister dst, Register src) {
+    EmitL(dst, src, 0x2A, 0x0F, 0xF2);
+  }
+  void cvttsd2siq(Register dst, XmmRegister src) {
+    EmitQ(dst, src, 0x2C, 0x0F, 0xF2);
+  }
+  void movmskpd(Register dst, XmmRegister src) {
+    EmitL(dst, src, 0x50, 0x0F, 0x66);
+  }
+  void movmskps(Register dst, XmmRegister src) { EmitL(dst, src, 0x50, 0x0F); }
 
-  void cmovnoq(Register dst, Register src);
-  void cmoveq(Register dst, Register src);
-  void cmovgeq(Register dst, Register src);
-  void cmovlessq(Register dst, Register src);
+  void btl(Register dst, Register src) { EmitL(src, dst, 0xA3, 0x0F); }
+  void btq(Register dst, Register src) { EmitQ(src, dst, 0xA3, 0x0F); }
 
-  void movss(XmmRegister dst, const Address& src);
-  void movss(const Address& dst, XmmRegister src);
-  void movss(XmmRegister dst, XmmRegister src);
-
-  void movd(XmmRegister dst, Register src);
-  void movd(Register dst, XmmRegister src);
-
-  void addss(XmmRegister dst, XmmRegister src);
-  void subss(XmmRegister dst, XmmRegister src);
-  void mulss(XmmRegister dst, XmmRegister src);
-  void divss(XmmRegister dst, XmmRegister src);
-
-  void movsd(XmmRegister dst, const Address& src);
-  void movsd(const Address& dst, XmmRegister src);
-  void movsd(XmmRegister dst, XmmRegister src);
-
-  void movaps(XmmRegister dst, XmmRegister src);
-
-  void movups(const Address& dst, XmmRegister src);
-  void movups(XmmRegister dst, const Address& src);
-
-  void addsd(XmmRegister dst, XmmRegister src);
-  void subsd(XmmRegister dst, XmmRegister src);
-  void mulsd(XmmRegister dst, XmmRegister src);
-  void divsd(XmmRegister dst, XmmRegister src);
-
-  void addpl(XmmRegister dst, XmmRegister src);
-  void subpl(XmmRegister dst, XmmRegister src);
-  void addps(XmmRegister dst, XmmRegister src);
-  void subps(XmmRegister dst, XmmRegister src);
-  void divps(XmmRegister dst, XmmRegister src);
-  void mulps(XmmRegister dst, XmmRegister src);
-  void minps(XmmRegister dst, XmmRegister src);
-  void maxps(XmmRegister dst, XmmRegister src);
-  void andps(XmmRegister dst, XmmRegister src);
-  void andps(XmmRegister dst, const Address& src);
-  void orps(XmmRegister dst, XmmRegister src);
-  void notps(XmmRegister dst);
-  void negateps(XmmRegister dst);
-  void absps(XmmRegister dst);
-  void zerowps(XmmRegister dst);
-  void cmppseq(XmmRegister dst, XmmRegister src);
-  void cmppsneq(XmmRegister dst, XmmRegister src);
-  void cmppslt(XmmRegister dst, XmmRegister src);
-  void cmppsle(XmmRegister dst, XmmRegister src);
-  void cmppsnlt(XmmRegister dst, XmmRegister src);
-  void cmppsnle(XmmRegister dst, XmmRegister src);
-  void sqrtps(XmmRegister dst);
-  void rsqrtps(XmmRegister dst);
-  void reciprocalps(XmmRegister dst);
-  void movhlps(XmmRegister dst, XmmRegister src);
-  void movlhps(XmmRegister dst, XmmRegister src);
-  void unpcklps(XmmRegister dst, XmmRegister src);
-  void unpckhps(XmmRegister dst, XmmRegister src);
-  void unpcklpd(XmmRegister dst, XmmRegister src);
-  void unpckhpd(XmmRegister dst, XmmRegister src);
+  void notps(XmmRegister dst, XmmRegister src);
+  void negateps(XmmRegister dst, XmmRegister src);
+  void absps(XmmRegister dst, XmmRegister src);
+  void zerowps(XmmRegister dst, XmmRegister src);
 
   void set1ps(XmmRegister dst, Register tmp, const Immediate& imm);
   void shufps(XmmRegister dst, XmmRegister src, const Immediate& mask);
 
-  void addpd(XmmRegister dst, XmmRegister src);
-  void negatepd(XmmRegister dst);
-  void subpd(XmmRegister dst, XmmRegister src);
-  void mulpd(XmmRegister dst, XmmRegister src);
-  void divpd(XmmRegister dst, XmmRegister src);
-  void abspd(XmmRegister dst);
-  void minpd(XmmRegister dst, XmmRegister src);
-  void maxpd(XmmRegister dst, XmmRegister src);
-  void sqrtpd(XmmRegister dst);
-  void cvtps2pd(XmmRegister dst, XmmRegister src);
-  void cvtpd2ps(XmmRegister dst, XmmRegister src);
+  void negatepd(XmmRegister dst, XmmRegister src);
+  void abspd(XmmRegister dst, XmmRegister src);
   void shufpd(XmmRegister dst, XmmRegister src, const Immediate& mask);
 
-  void comisd(XmmRegister a, XmmRegister b);
-  void cvtsi2sdq(XmmRegister a, Register b);
-  void cvtsi2sdl(XmmRegister a, Register b);
-  void cvttsd2siq(Register dst, XmmRegister src);
-
-  void cvtss2sd(XmmRegister dst, XmmRegister src);
-  void cvtsd2ss(XmmRegister dst, XmmRegister src);
-
-  void pxor(XmmRegister dst, XmmRegister src);
-
   enum RoundingMode {
     kRoundToNearest = 0x0,
     kRoundDown = 0x1,
@@ -502,20 +579,12 @@
   };
   void roundsd(XmmRegister dst, XmmRegister src, RoundingMode mode);
 
-  void xchgl(Register dst, Register src);
-  void xchgq(Register dst, Register src);
-
-  void cmpb(const Address& address, const Immediate& imm);
-  void cmpw(const Address& address, const Immediate& imm);
-
   void CompareImmediate(Register reg, const Immediate& imm);
   void CompareImmediate(const Address& address, const Immediate& imm);
 
-  void testl(Register reg1, Register reg2);
   void testl(Register reg, const Immediate& imm) { testq(reg, imm); }
   void testb(const Address& address, const Immediate& imm);
 
-  void testq(Register reg1, Register reg2);
   void testq(Register reg, const Immediate& imm);
   void TestImmediate(Register dst, const Immediate& imm);
 
@@ -523,66 +592,61 @@
   void OrImmediate(Register dst, const Immediate& imm);
   void XorImmediate(Register dst, const Immediate& imm);
 
-// clang-format off
-// Macro for handling common ALU instructions. Arguments to F:
-//   name, opcode, reversed opcode, opcode for the reg field of the modrm byte.
-#define ALU_OPS(F)                                                             \
-  F(and, 0x23, 0x21, 4)                                                        \
-  F(or, 0x0b, 0x09, 1)                                                         \
-  F(xor, 0x33, 0x31, 6)                                                        \
-  F(add, 0x03, 0x01, 0)                                                        \
-  F(adc, 0x13, 0x11, 2)                                                        \
-  F(sub, 0x2b, 0x29, 5)                                                        \
-  F(sbb, 0x1b, 0x19, 3)                                                        \
-  F(cmp, 0x3b, 0x39, 7)
-// clang-format on
-
-#define DECLARE_ALU(op, opcode, opcode2, modrm_opcode)                         \
-  void op##w(Register dst, Register src) { Alu(2, opcode, dst, src); }         \
-  void op##l(Register dst, Register src) { Alu(4, opcode, dst, src); }         \
-  void op##q(Register dst, Register src) { Alu(8, opcode, dst, src); }         \
-  void op##w(Register dst, const Address& src) { Alu(2, opcode, dst, src); }   \
-  void op##l(Register dst, const Address& src) { Alu(4, opcode, dst, src); }   \
-  void op##q(Register dst, const Address& src) { Alu(8, opcode, dst, src); }   \
-  void op##w(const Address& dst, Register src) { Alu(2, opcode2, dst, src); }  \
-  void op##l(const Address& dst, Register src) { Alu(4, opcode2, dst, src); }  \
-  void op##q(const Address& dst, Register src) { Alu(8, opcode2, dst, src); }  \
-  void op##l(Register dst, const Immediate& imm) {                             \
-    AluL(modrm_opcode, dst, imm);                                              \
-  }                                                                            \
-  void op##q(Register dst, const Immediate& imm) {                             \
-    AluQ(modrm_opcode, opcode, dst, imm);                                      \
-  }                                                                            \
-  void op##l(const Address& dst, const Immediate& imm) {                       \
-    AluL(modrm_opcode, dst, imm);                                              \
-  }                                                                            \
-  void op##q(const Address& dst, const Immediate& imm) {                       \
-    AluQ(modrm_opcode, opcode, dst, imm);                                      \
+  void shldq(Register dst, Register src, Register shifter) {
+    ASSERT(shifter == RCX);
+    EmitQ(src, dst, 0xA5, 0x0F);
+  }
+  void shrdq(Register dst, Register src, Register shifter) {
+    ASSERT(shifter == RCX);
+    EmitQ(src, dst, 0xAD, 0x0F);
   }
 
-  ALU_OPS(DECLARE_ALU);
+#define DECLARE_ALU(op, c)                                                     \
+  void op##w(Register dst, Register src) { EmitW(dst, src, c * 8 + 3); }       \
+  void op##l(Register dst, Register src) { EmitL(dst, src, c * 8 + 3); }       \
+  void op##q(Register dst, Register src) { EmitQ(dst, src, c * 8 + 3); }       \
+  void op##w(Register dst, const Address& src) { EmitW(dst, src, c * 8 + 3); } \
+  void op##l(Register dst, const Address& src) { EmitL(dst, src, c * 8 + 3); } \
+  void op##q(Register dst, const Address& src) { EmitQ(dst, src, c * 8 + 3); } \
+  void op##w(const Address& dst, Register src) { EmitW(src, dst, c * 8 + 1); } \
+  void op##l(const Address& dst, Register src) { EmitL(src, dst, c * 8 + 1); } \
+  void op##q(const Address& dst, Register src) { EmitQ(src, dst, c * 8 + 1); } \
+  void op##l(Register dst, const Immediate& imm) { AluL(c, dst, imm); }        \
+  void op##q(Register dst, const Immediate& imm) {                             \
+    AluQ(c, c * 8 + 3, dst, imm);                                              \
+  }                                                                            \
+  void op##b(const Address& dst, const Immediate& imm) { AluB(c, dst, imm); }  \
+  void op##w(const Address& dst, const Immediate& imm) { AluW(c, dst, imm); }  \
+  void op##l(const Address& dst, const Immediate& imm) { AluL(c, dst, imm); }  \
+  void op##q(const Address& dst, const Immediate& imm) {                       \
+    AluQ(c, c * 8 + 3, dst, imm);                                              \
+  }
+
+  X86_ALU_CODES(DECLARE_ALU)
 
 #undef DECLARE_ALU
 #undef ALU_OPS
 
-  void cdq();
   void cqo();
 
-  void idivl(Register reg);
-  void divl(Register reg);
+#define REGULAR_UNARY(name, opcode, modrm)                                     \
+  void name##q(Register reg) { EmitUnaryQ(reg, opcode, modrm); }               \
+  void name##l(Register reg) { EmitUnaryL(reg, opcode, modrm); }               \
+  void name##q(const Address& address) { EmitUnaryQ(address, opcode, modrm); } \
+  void name##l(const Address& address) { EmitUnaryL(address, opcode, modrm); }
+  REGULAR_UNARY(not, 0xF7, 2)
+  REGULAR_UNARY(neg, 0xF7, 3)
+  REGULAR_UNARY(mul, 0xF7, 4)
+  REGULAR_UNARY(div, 0xF7, 6)
+  REGULAR_UNARY(idiv, 0xF7, 7)
+  REGULAR_UNARY(inc, 0xFF, 0)
+  REGULAR_UNARY(dec, 0xFF, 1)
+#undef REGULAR_UNARY
 
-  void idivq(Register reg);
-  void divq(Register reg);
-
-  void imull(Register dst, Register src);
   void imull(Register reg, const Immediate& imm);
-  void mull(Register reg);
 
-  void imulq(Register dst, Register src);
-  void imulq(Register dst, const Address& address);
   void imulq(Register dst, const Immediate& imm);
   void MulImmediate(Register reg, const Immediate& imm);
-  void mulq(Register reg);
 
   void shll(Register reg, const Immediate& imm);
   void shll(Register operand, Register shifter);
@@ -599,75 +663,28 @@
   void sarq(Register reg, const Immediate& imm);
   void sarq(Register operand, Register shifter);
   void shldq(Register dst, Register src, const Immediate& imm);
-  void shldq(Register dst, Register src, Register shifter);
-  void shrdq(Register dst, Register src, Register shifter);
 
-  void incl(const Address& address);
-  void decl(const Address& address);
-
-  void incq(Register reg);
-  void incq(const Address& address);
-  void decq(Register reg);
-  void decq(const Address& address);
-
-  void negl(Register reg);
-  void negq(Register reg);
-  void notl(Register reg);
-  void notq(Register reg);
-
-  void bsrq(Register dst, Register src);
-
-  void btq(Register base, Register offset);
   void btq(Register base, int bit);
 
   void enter(const Immediate& imm);
-  void leave();
-  void ret();
-
-  void movmskpd(Register dst, XmmRegister src);
-  void movmskps(Register dst, XmmRegister src);
-
-  void sqrtsd(XmmRegister dst, XmmRegister src);
-
-  void xorpd(XmmRegister dst, const Address& src);
-  void xorpd(XmmRegister dst, XmmRegister src);
-
-  void xorps(XmmRegister dst, const Address& src);
-  void xorps(XmmRegister dst, XmmRegister src);
-
-  void andpd(XmmRegister dst, const Address& src);
 
   void fldl(const Address& src);
   void fstpl(const Address& dst);
 
-  void fincstp();
   void ffree(intptr_t value);
 
-  void fsin();
-  void fcos();
-
   // 'size' indicates size in bytes and must be in the range 1..8.
   void nop(int size = 1);
-  void int3();
-  void hlt();
 
   static uword GetBreakInstructionFiller() { return 0xCCCCCCCCCCCCCCCC; }
 
   void j(Condition condition, Label* label, bool near = kFarJump);
-
-  void jmp(Register reg);
-  void jmp(const Address& address);
+  void jmp(Register reg) { EmitUnaryL(reg, 0xFF, 4); }
+  void jmp(const Address& address) { EmitUnaryL(address, 0xFF, 4); }
   void jmp(Label* label, bool near = kFarJump);
   void jmp(const ExternalLabel* label);
   void jmp(const StubEntry& stub_entry);
 
-  void lock();
-  void cmpxchgl(const Address& address, Register reg);
-
-  void cmpxchgq(const Address& address, Register reg);
-
-  void cpuid();
-
   // Issue memory to memory move through a TMP register.
   // TODO(koda): Assert that these are not used for heap objects.
   void MoveMemoryToMemory(const Address& dst, const Address& src) {
@@ -688,10 +705,7 @@
     xorq(mem2, TMP);
   }
 
-  /*
-   * Macros for High-level operations and implemented on all architectures.
-   */
-
+  // Methods for High-level operations and implemented on all architectures.
   void CompareRegisters(Register a, Register b);
   void BranchIf(Condition condition, Label* label) { j(condition, label); }
 
@@ -700,7 +714,7 @@
   void PushRegister(Register r);
   void PopRegister(Register r);
 
-  // Macros for adding/subtracting an immediate value that may be loaded from
+  // Methods for adding/subtracting an immediate value that may be loaded from
   // the constant pool.
   // TODO(koda): Assert that these are not used for heap objects.
   void AddImmediate(Register reg, const Immediate& imm);
@@ -760,10 +774,8 @@
   // Increments a Smi field. Leaves flags in same state as an 'addq'.
   void IncrementSmiField(const Address& dest, int64_t increment);
 
-  void DoubleNegate(XmmRegister d);
-  void FloatNegate(XmmRegister f);
-
-  void DoubleAbs(XmmRegister reg);
+  void DoubleNegate(XmmRegister dst, XmmRegister src);
+  void DoubleAbs(XmmRegister dst, XmmRegister src);
 
   void LockCmpxchgq(const Address& address, Register reg) {
     lock();
@@ -796,9 +808,7 @@
   // if platform ABI requires that. Does not restore RSP after the call itself.
   void CallCFunction(Register reg);
 
-  /*
-   * Loading and comparing classes of objects.
-   */
+  // Loading and comparing classes of objects.
   void LoadClassId(Register result, Register object);
 
   void LoadClassById(Register result, Register class_id);
@@ -816,9 +826,7 @@
   // Value in the register object is untagged optimistically.
   void SmiUntagOrCheckClass(Register object, intptr_t class_id, Label* smi);
 
-  /*
-   * Misc. functionality.
-   */
+  // Misc. functionality.
   void SmiTag(Register reg) { addq(reg, reg); }
 
   void SmiUntag(Register reg) { sarq(reg, Immediate(kSmiTagSize)); }
@@ -1010,10 +1018,9 @@
   void LoadObjectHelper(Register dst, const Object& obj, bool is_unique);
   void LoadWordFromPoolOffset(Register dst, int32_t offset);
 
-  void Alu(int bytes, uint8_t opcode, Register dst, Register src);
-  void Alu(int bytes, uint8_t opcode, Register dst, const Address& src);
-  void Alu(int bytes, uint8_t opcode, const Address& dst, Register src);
   void AluL(uint8_t modrm_opcode, Register dst, const Immediate& imm);
+  void AluB(uint8_t modrm_opcode, const Address& dst, const Immediate& imm);
+  void AluW(uint8_t modrm_opcode, const Address& dst, const Immediate& imm);
   void AluL(uint8_t modrm_opcode, const Address& dst, const Immediate& imm);
   void AluQ(uint8_t modrm_opcode,
             uint8_t opcode,
@@ -1024,6 +1031,37 @@
             const Address& dst,
             const Immediate& imm);
 
+  void EmitSimple(int opcode, int opcode2 = -1);
+  void EmitUnaryQ(Register reg, int opcode, int modrm_code);
+  void EmitUnaryL(Register reg, int opcode, int modrm_code);
+  void EmitUnaryQ(const Address& address, int opcode, int modrm_code);
+  void EmitUnaryL(const Address& address, int opcode, int modrm_code);
+  // The prefixes are in reverse order due to the rules of default arguments in
+  // C++.
+  void EmitQ(int reg,
+             const Address& address,
+             int opcode,
+             int prefix2 = -1,
+             int prefix1 = -1);
+  void EmitL(int reg,
+             const Address& address,
+             int opcode,
+             int prefix2 = -1,
+             int prefix1 = -1);
+  void EmitW(Register reg,
+             const Address& address,
+             int opcode,
+             int prefix2 = -1,
+             int prefix1 = -1);
+  void EmitQ(int dst, int src, int opcode, int prefix2 = -1, int prefix1 = -1);
+  void EmitL(int dst, int src, int opcode, int prefix2 = -1, int prefix1 = -1);
+  void EmitW(Register dst,
+             Register src,
+             int opcode,
+             int prefix2 = -1,
+             int prefix1 = -1);
+  void CmpPS(XmmRegister dst, XmmRegister src, int condition);
+
   inline void EmitUint8(uint8_t value);
   inline void EmitInt32(int32_t value);
   inline void EmitUInt32(uint32_t value);
@@ -1033,24 +1071,16 @@
                               uint8_t rex,
                               bool force_emit = false);
   inline void EmitOperandREX(int rm, const Operand& operand, uint8_t rex);
-  inline void EmitXmmRegisterOperand(int rm, XmmRegister reg);
+  inline void EmitRegisterOperand(int rm, int reg);
   inline void EmitFixup(AssemblerFixup* fixup);
   inline void EmitOperandSizeOverride();
-  inline void EmitREX_RB(XmmRegister reg,
-                         XmmRegister base,
-                         uint8_t rex = REX_NONE);
-  inline void EmitREX_RB(XmmRegister reg,
-                         const Operand& operand,
-                         uint8_t rex = REX_NONE);
-  inline void EmitREX_RB(XmmRegister reg,
-                         Register base,
-                         uint8_t rex = REX_NONE);
-  inline void EmitREX_RB(Register reg,
-                         XmmRegister base,
-                         uint8_t rex = REX_NONE);
+  inline void EmitRegRegRex(int reg, int base, uint8_t rex = REX_NONE);
   void EmitOperand(int rm, const Operand& operand);
   void EmitImmediate(const Immediate& imm);
   void EmitComplex(int rm, const Operand& operand, const Immediate& immediate);
+  void EmitSignExtendedInt8(int rm,
+                            const Operand& operand,
+                            const Immediate& immediate);
   void EmitLabel(Label* label, intptr_t instruction_size);
   void EmitLabelLink(Label* label);
   void EmitNearLabelLink(Label* label);
@@ -1092,7 +1122,8 @@
 }
 
 inline void Assembler::EmitRegisterREX(Register reg, uint8_t rex, bool force) {
-  ASSERT(reg != kNoRegister);
+  ASSERT(reg != kNoRegister && reg <= R15);
+  ASSERT(rex == REX_NONE || rex == REX_W);
   rex |= (reg > 7 ? REX_B : REX_NONE);
   if (rex != REX_NONE || force) EmitUint8(REX_PREFIX | rex);
 }
@@ -1104,29 +1135,10 @@
   if (rex != REX_NONE) EmitUint8(REX_PREFIX | rex);
 }
 
-inline void Assembler::EmitREX_RB(XmmRegister reg,
-                                  XmmRegister base,
-                                  uint8_t rex) {
-  if (reg > 7) rex |= REX_R;
-  if (base > 7) rex |= REX_B;
-  if (rex != REX_NONE) EmitUint8(REX_PREFIX | rex);
-}
-
-inline void Assembler::EmitREX_RB(XmmRegister reg,
-                                  const Operand& operand,
-                                  uint8_t rex) {
-  if (reg > 7) rex |= REX_R;
-  rex |= operand.rex();
-  if (rex != REX_NONE) EmitUint8(REX_PREFIX | rex);
-}
-
-inline void Assembler::EmitREX_RB(XmmRegister reg, Register base, uint8_t rex) {
-  if (reg > 7) rex |= REX_R;
-  if (base > 7) rex |= REX_B;
-  if (rex != REX_NONE) EmitUint8(REX_PREFIX | rex);
-}
-
-inline void Assembler::EmitREX_RB(Register reg, XmmRegister base, uint8_t rex) {
+inline void Assembler::EmitRegRegRex(int reg, int base, uint8_t rex) {
+  ASSERT(reg != kNoRegister && reg <= R15);
+  ASSERT(base != kNoRegister && base <= R15);
+  ASSERT(rex == REX_NONE || rex == REX_W);
   if (reg > 7) rex |= REX_R;
   if (base > 7) rex |= REX_B;
   if (rex != REX_NONE) EmitUint8(REX_PREFIX | rex);
diff --git a/runtime/vm/compiler/assembler/assembler_x64_test.cc b/runtime/vm/compiler/assembler/assembler_x64_test.cc
index b8109d3..73ec3b7 100644
--- a/runtime/vm/compiler/assembler/assembler_x64_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64_test.cc
@@ -959,7 +959,7 @@
   EXPECT_DISASSEMBLY(
       "movl rax,-0x........\n"
       "movl rdx,0x7b\n"
-      "cdql\n"
+      "cdq\n"
       "movl rcx,0x2a\n"
       "idivl (rax,rdx),rcx\n"
       "ret\n");
@@ -1004,7 +1004,7 @@
   EXPECT_DISASSEMBLY(
       "movq rax,0x................\n"
       "movl rdx,0x7b\n"
-      "cdqq\n"
+      "cqo\n"
       "movl rcx,0x2a\n"
       "idivq (rax,rdx),rcx\n"
       "ret\n");
@@ -1204,6 +1204,60 @@
       "ret\n");
 }
 
+ASSEMBLER_TEST_GENERATE(WordOps, assembler) {
+  __ movq(RAX, Immediate(0x0102030405060708));
+  __ pushq(RAX);
+  __ addw(Address(RSP, 0), Immediate(-0x201));
+  __ subw(Address(RSP, 2), Immediate(0x201));
+  __ xorw(Address(RSP, 4), Immediate(0x201));
+  __ andw(Address(RSP, 6), Immediate(0x301));
+  __ andw(Address(RSP, 0), Immediate(-1));
+  __ popq(RAX);
+  __ ret();
+}
+
+ASSEMBLER_TEST_RUN(WordOps, test) {
+  typedef int64_t (*WordOps)();
+  EXPECT_EQ(0x0100010503050507, reinterpret_cast<WordOps>(test->entry())());
+  EXPECT_DISASSEMBLY(
+      "movq rax,0x................\n"
+      "push rax\n"
+      "addw [rsp],0x....\n"
+      "subw [rsp+0x2],0x...\n"
+      "xorw [rsp+0x4],0x...\n"
+      "andw [rsp+0x6],0x...\n"
+      "andw [rsp],-1\n"
+      "pop rax\n"
+      "ret\n");
+}
+
+ASSEMBLER_TEST_GENERATE(ByteOps, assembler) {
+  __ movq(RAX, Immediate(0x0102030405060708));
+  __ pushq(RAX);
+  __ addb(Address(RSP, 0), Immediate(0xff));
+  __ subb(Address(RSP, 2), Immediate(1));
+  __ xorb(Address(RSP, 4), Immediate(1));
+  __ andb(Address(RSP, 6), Immediate(1));
+  __ andb(Address(RSP, 0), Immediate(-1));
+  __ popq(RAX);
+  __ ret();
+}
+
+ASSEMBLER_TEST_RUN(ByteOps, test) {
+  typedef int64_t (*ByteOps)();
+  EXPECT_EQ(0x0100030505050707, reinterpret_cast<ByteOps>(test->entry())());
+  EXPECT_DISASSEMBLY(
+      "movq rax,0x................\n"
+      "push rax\n"
+      "addb [rsp],-1\n"
+      "subb [rsp+0x2],1\n"
+      "xorb [rsp+0x4],1\n"
+      "andb [rsp+0x6],1\n"
+      "andb [rsp],-1\n"
+      "pop rax\n"
+      "ret\n");
+}
+
 ASSEMBLER_TEST_GENERATE(MoveWordRex, assembler) {
   __ pushq(Immediate(0));
   __ movq(R8, RSP);
@@ -3161,7 +3215,7 @@
   EnterTestFrame(assembler);
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM10, Address(RAX, 0));
-  __ negatepd(XMM10);
+  __ negatepd(XMM10, XMM10);
   __ movaps(XMM0, XMM10);
   LeaveTestFrame(assembler);
   __ ret();
@@ -3191,8 +3245,7 @@
   EnterTestFrame(assembler);
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM10, Address(RAX, 0));
-  __ abspd(XMM10);
-  __ movaps(XMM0, XMM10);
+  __ abspd(XMM0, XMM10);
   LeaveTestFrame(assembler);
   __ ret();
 }
@@ -3203,8 +3256,8 @@
   EXPECT_DISASSEMBLY_NOT_WINDOWS_ENDS_WITH(
       "movups xmm10,[rax]\n"
       "movq r11,[thr+0x...]\n"
-      "andpd xmm10,[r11]\n"
-      "movaps xmm0,xmm10\n"
+      "movups xmm0,[r11]\n"
+      "andpd xmm0,xmm10\n"
       "pop thr\n"
       "pop pp\n"
       "pop r12\n"
@@ -3278,7 +3331,7 @@
   } constant0 = {16.0, 2.0};
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM10, Address(RAX, 0));
-  __ sqrtpd(XMM10);
+  __ sqrtpd(XMM10, XMM10);
   __ movaps(XMM0, XMM10);
   __ ret();
 }
@@ -3423,7 +3476,7 @@
   EXPECT_FLOAT_EQ(9.0f, res, 0.000001f);
   EXPECT_DISASSEMBLY_ENDS_WITH(
       "movups xmm11,[rax]\n"
-      "cvtsd2ss xmm10,xmm11\n"
+      "cvtps2pd xmm10,xmm11\n"
       "movaps xmm0,xmm10\n"
       "ret\n");
 }
@@ -3604,9 +3657,9 @@
   __ shufps(XMM0, XMM0, Immediate(0x0));
 
   __ movaps(XMM11, XMM0);                  // Copy XMM0
-  __ reciprocalps(XMM11);                  // 0.25
-  __ sqrtps(XMM11);                        // 0.5
-  __ rsqrtps(XMM0);                        // ~0.5
+  __ rcpps(XMM11, XMM11);                  // 0.25
+  __ sqrtps(XMM11, XMM11);                 // 0.5
+  __ rsqrtps(XMM0, XMM0);                  // ~0.5
   __ subps(XMM0, XMM11);                   // ~0.0
   __ shufps(XMM0, XMM0, Immediate(0x00));  // Copy second lane into all 4 lanes.
   __ ret();
@@ -3650,13 +3703,44 @@
       "movl rax,0x........\n"
       "movd xmm1,rax\n"
       "shufps xmm1,xmm1 [0]\n"
-      "cmpps xmm0,xmm1 [0]\n"
+      "cmpps xmm0,xmm1 [eq]\n"
       "push rax\n"
       "movss [rsp],xmm0\n"
       "pop rax\n"
       "ret\n");
 }
 
+ASSEMBLER_TEST_GENERATE(XmmAlu, assembler) {
+  // Test the disassembler.
+  __ addss(XMM0, XMM0);
+  __ addsd(XMM0, XMM0);
+  __ addps(XMM0, XMM0);
+  __ addpd(XMM0, XMM0);
+  __ cvtss2sd(XMM0, XMM0);
+  __ cvtsd2ss(XMM0, XMM0);
+  __ cvtps2pd(XMM0, XMM0);
+  __ cvtpd2ps(XMM0, XMM0);
+  __ movl(RAX, Immediate(0));
+  __ ret();
+}
+
+ASSEMBLER_TEST_RUN(XmmAlu, test) {
+  typedef intptr_t (*XmmAluTest)();
+  intptr_t res = reinterpret_cast<XmmAluTest>(test->entry())();
+  EXPECT_EQ(res, 0);
+  EXPECT_DISASSEMBLY(
+      "addss xmm0,xmm0\n"
+      "addsd xmm0,xmm0\n"
+      "addps xmm0,xmm0\n"
+      "addpd xmm0,xmm0\n"
+      "cvtss2sd xmm0,xmm0\n"
+      "cvtsd2ss xmm0,xmm0\n"
+      "cvtps2pd xmm0,xmm0\n"
+      "cvtpd2ps xmm0,xmm0\n"
+      "movl rax,0\n"
+      "ret\n");
+}
+
 ASSEMBLER_TEST_GENERATE(PackedCompareNEQ, assembler) {
   __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f)));
   __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f)));
@@ -3678,7 +3762,7 @@
       "movl rax,0x........\n"
       "movd xmm1,rax\n"
       "shufps xmm1,xmm1 [0]\n"
-      "cmpps xmm0,xmm1 [4]\n"
+      "cmpps xmm0,xmm1 [neq]\n"
       "push rax\n"
       "movss [rsp],xmm0\n"
       "pop rax\n"
@@ -3706,7 +3790,7 @@
       "movl rax,0x........\n"
       "movd xmm1,rax\n"
       "shufps xmm1,xmm1 [0]\n"
-      "cmpps xmm0,xmm1 [1]\n"
+      "cmpps xmm0,xmm1 [lt]\n"
       "push rax\n"
       "movss [rsp],xmm0\n"
       "pop rax\n"
@@ -3734,7 +3818,7 @@
       "movl rax,0x........\n"
       "movd xmm1,rax\n"
       "shufps xmm1,xmm1 [0]\n"
-      "cmpps xmm0,xmm1 [2]\n"
+      "cmpps xmm0,xmm1 [le]\n"
       "push rax\n"
       "movss [rsp],xmm0\n"
       "pop rax\n"
@@ -3762,7 +3846,7 @@
       "movl rax,0x........\n"
       "movd xmm1,rax\n"
       "shufps xmm1,xmm1 [0]\n"
-      "cmpps xmm0,xmm1 [5]\n"
+      "cmpps xmm0,xmm1 [nlt]\n"
       "push rax\n"
       "movss [rsp],xmm0\n"
       "pop rax\n"
@@ -3790,7 +3874,7 @@
       "movl rax,0x........\n"
       "movd xmm1,rax\n"
       "shufps xmm1,xmm1 [0]\n"
-      "cmpps xmm0,xmm1 [6]\n"
+      "cmpps xmm0,xmm1 [nle]\n"
       "push rax\n"
       "movss [rsp],xmm0\n"
       "pop rax\n"
@@ -3802,7 +3886,7 @@
   __ movl(RAX, Immediate(bit_cast<int32_t, float>(12.3f)));
   __ movd(XMM0, RAX);
   __ shufps(XMM0, XMM0, Immediate(0x0));
-  __ negateps(XMM0);
+  __ negateps(XMM0, XMM0);
   __ shufps(XMM0, XMM0, Immediate(0xAA));  // Copy third lane into all 4 lanes.
   LeaveTestFrame(assembler);
   __ ret();
@@ -3839,7 +3923,7 @@
   __ movl(RAX, Immediate(bit_cast<int32_t, float>(-15.3f)));
   __ movd(XMM0, RAX);
   __ shufps(XMM0, XMM0, Immediate(0x0));
-  __ absps(XMM0);
+  __ absps(XMM0, XMM0);
   __ shufps(XMM0, XMM0, Immediate(0xAA));  // Copy third lane into all 4 lanes.
   LeaveTestFrame(assembler);
   __ ret();
@@ -3874,7 +3958,7 @@
 ASSEMBLER_TEST_GENERATE(PackedSetWZero, assembler) {
   EnterTestFrame(assembler);
   __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(12.3f)));
-  __ zerowps(XMM0);
+  __ zerowps(XMM0, XMM0);
   __ shufps(XMM0, XMM0, Immediate(0xFF));  // Copy the W lane which is now 0.0.
   LeaveTestFrame(assembler);
   __ ret();
@@ -4032,8 +4116,7 @@
   EnterTestFrame(assembler);
   __ LoadImmediate(RAX, Immediate(reinterpret_cast<intptr_t>(&constant1)));
   __ movups(XMM9, Address(RAX, 0));
-  __ notps(XMM9);
-  __ movaps(XMM0, XMM9);
+  __ notps(XMM0, XMM9);
   __ pushq(RAX);
   __ movss(Address(RSP, 0), XMM0);
   __ popq(RAX);
@@ -4047,8 +4130,8 @@
   EXPECT_DISASSEMBLY_NOT_WINDOWS_ENDS_WITH(
       "movups xmm9,[rax]\n"
       "movq r11,[thr+0x...]\n"
-      "xorps xmm9,[r11]\n"
-      "movaps xmm0,xmm9\n"
+      "movups xmm0,[r11]\n"
+      "xorps xmm0,xmm9\n"
       "push rax\n"
       "movss [rsp],xmm0\n"
       "pop rax\n"
@@ -5036,12 +5119,11 @@
 #if defined(HOST_OS_WINDOWS)
   // First argument is code object, second argument is thread. MSVC passes
   // third argument in XMM2.
-  __ DoubleAbs(XMM2);
-  __ movaps(XMM0, XMM2);
+  __ DoubleAbs(XMM0, XMM2);
 #else
   // SysV ABI allocates integral and double registers for arguments
   // independently.
-  __ DoubleAbs(XMM0);
+  __ DoubleAbs(XMM0, XMM0);
 #endif
   LeaveTestFrame(assembler);
   __ ret();
@@ -5221,7 +5303,7 @@
       "movq rsi,[rsp+0x10]\n"
       "movq rdi,[rsp+0x8]\n"
       "movq rcx,[rsp]\n"
-      "rep movsl\n"
+      "rep movsb\n"
       "pop rax\n"
       "pop rax\n"
       "pop rax\n"
@@ -5234,7 +5316,7 @@
   __ cmpq(CallingConventions::kArg1Reg, CallingConventions::kArg2Reg);
   __ movq(RDX, Immediate(1));   // Greater equal.
   __ movq(RCX, Immediate(-1));  // Less
-  __ cmovlessq(RAX, RCX);
+  __ cmovlq(RAX, RCX);
   __ cmovgeq(RAX, RDX);
   __ ret();
 }
diff --git a/runtime/vm/compiler/assembler/disassembler_dbc.cc b/runtime/vm/compiler/assembler/disassembler_dbc.cc
index 1047cc0..7947d9f 100644
--- a/runtime/vm/compiler/assembler/disassembler_dbc.cc
+++ b/runtime/vm/compiler/assembler/disassembler_dbc.cc
@@ -178,6 +178,21 @@
   Apply(&buf, &size, pc, op3, c, "");
 }
 
+static void FormatA_B_Y(char* buf,
+                        intptr_t size,
+                        uword pc,
+                        uint32_t op,
+                        Fmt op1,
+                        Fmt op2,
+                        Fmt op3) {
+  const int32_t a = (op >> 8) & 0xFF;
+  const int32_t b = (op >> 16) & 0xFF;
+  const int32_t y = static_cast<int8_t>((op >> 24) & 0xFF);
+  Apply(&buf, &size, pc, op1, a, ", ");
+  Apply(&buf, &size, pc, op2, b, ", ");
+  Apply(&buf, &size, pc, op3, y, "");
+}
+
 #define BYTECODE_FORMATTER(name, encoding, op1, op2, op3)                      \
   static void Format##name(char* buf, intptr_t size, uword pc, uint32_t op) {  \
     Format##encoding(buf, size, pc, op, Fmt##op1, Fmt##op2, Fmt##op3);         \
diff --git a/runtime/vm/compiler/assembler/disassembler_x86.cc b/runtime/vm/compiler/assembler/disassembler_x86.cc
index 0ad5603..459eb4c 100644
--- a/runtime/vm/compiler/assembler/disassembler_x86.cc
+++ b/runtime/vm/compiler/assembler/disassembler_x86.cc
@@ -41,40 +41,13 @@
   const char* mnem;
 };
 
+#define ALU_ENTRY(name, code)                                                  \
+  {code * 8 + 0, BYTE_OPER_REG_OP_ORDER, #name},                               \
+      {code * 8 + 1, OPER_REG_OP_ORDER, #name},                                \
+      {code * 8 + 2, BYTE_REG_OPER_OP_ORDER, #name},                           \
+      {code * 8 + 3, REG_OPER_OP_ORDER, #name},
 static const ByteMnemonic two_operands_instr[] = {
-    {0x00, BYTE_OPER_REG_OP_ORDER, "add"},
-    {0x01, OPER_REG_OP_ORDER, "add"},
-    {0x02, BYTE_REG_OPER_OP_ORDER, "add"},
-    {0x03, REG_OPER_OP_ORDER, "add"},
-    {0x08, BYTE_OPER_REG_OP_ORDER, "or"},
-    {0x09, OPER_REG_OP_ORDER, "or"},
-    {0x0A, BYTE_REG_OPER_OP_ORDER, "or"},
-    {0x0B, REG_OPER_OP_ORDER, "or"},
-    {0x10, BYTE_OPER_REG_OP_ORDER, "adc"},
-    {0x11, OPER_REG_OP_ORDER, "adc"},
-    {0x12, BYTE_REG_OPER_OP_ORDER, "adc"},
-    {0x13, REG_OPER_OP_ORDER, "adc"},
-    {0x18, BYTE_OPER_REG_OP_ORDER, "sbb"},
-    {0x19, OPER_REG_OP_ORDER, "sbb"},
-    {0x1A, BYTE_REG_OPER_OP_ORDER, "sbb"},
-    {0x1B, REG_OPER_OP_ORDER, "sbb"},
-    {0x20, BYTE_OPER_REG_OP_ORDER, "and"},
-    {0x21, OPER_REG_OP_ORDER, "and"},
-    {0x22, BYTE_REG_OPER_OP_ORDER, "and"},
-    {0x23, REG_OPER_OP_ORDER, "and"},
-    {0x28, BYTE_OPER_REG_OP_ORDER, "sub"},
-    {0x29, OPER_REG_OP_ORDER, "sub"},
-    {0x2A, BYTE_REG_OPER_OP_ORDER, "sub"},
-    {0x2B, REG_OPER_OP_ORDER, "sub"},
-    {0x30, BYTE_OPER_REG_OP_ORDER, "xor"},
-    {0x31, OPER_REG_OP_ORDER, "xor"},
-    {0x32, BYTE_REG_OPER_OP_ORDER, "xor"},
-    {0x33, REG_OPER_OP_ORDER, "xor"},
-    {0x38, BYTE_OPER_REG_OP_ORDER, "cmp"},
-    {0x39, OPER_REG_OP_ORDER, "cmp"},
-    {0x3A, BYTE_REG_OPER_OP_ORDER, "cmp"},
-    {0x3B, REG_OPER_OP_ORDER, "cmp"},
-    {0x63, REG_OPER_OP_ORDER, "movsxd"},
+    X86_ALU_CODES(ALU_ENTRY){0x63, REG_OPER_OP_ORDER, "movsxd"},
     {0x84, BYTE_REG_OPER_OP_ORDER, "test"},
     {0x85, REG_OPER_OP_ORDER, "test"},
     {0x86, BYTE_REG_OPER_OP_ORDER, "xchg"},
@@ -86,31 +59,29 @@
     {0x8D, REG_OPER_OP_ORDER, "lea"},
     {-1, UNSET_OP_ORDER, ""}};
 
+#define ZERO_OPERAND_ENTRY(name, opcode) {opcode, UNSET_OP_ORDER, #name},
 static const ByteMnemonic zero_operands_instr[] = {
-    {0xC3, UNSET_OP_ORDER, "ret"},   {0xC9, UNSET_OP_ORDER, "leave"},
-    {0xF4, UNSET_OP_ORDER, "hlt"},   {0xFC, UNSET_OP_ORDER, "cld"},
-    {0xCC, UNSET_OP_ORDER, "int3"},  {0x60, UNSET_OP_ORDER, "pushad"},
-    {0x61, UNSET_OP_ORDER, "popad"}, {0x9C, UNSET_OP_ORDER, "pushfd"},
-    {0x9D, UNSET_OP_ORDER, "popfd"}, {0x9E, UNSET_OP_ORDER, "sahf"},
-    {0x99, UNSET_OP_ORDER, "cdq"},   {0x9B, UNSET_OP_ORDER, "fwait"},
-    {0xA4, UNSET_OP_ORDER, "movs"},  {0xA5, UNSET_OP_ORDER, "movs"},
-    {0xA6, UNSET_OP_ORDER, "cmps"},  {0xA7, UNSET_OP_ORDER, "cmps"},
-    {-1, UNSET_OP_ORDER, ""}};
+    X86_ZERO_OPERAND_1_BYTE_INSTRUCTIONS(ZERO_OPERAND_ENTRY){-1, UNSET_OP_ORDER,
+                                                             ""}};
 
 static const ByteMnemonic call_jump_instr[] = {{0xE8, UNSET_OP_ORDER, "call"},
                                                {0xE9, UNSET_OP_ORDER, "jmp"},
                                                {-1, UNSET_OP_ORDER, ""}};
 
+#define SHORT_IMMEDIATE_ENTRY(name, code) {code * 8 + 5, UNSET_OP_ORDER, #name},
 static const ByteMnemonic short_immediate_instr[] = {
-    {0x05, UNSET_OP_ORDER, "add"}, {0x0D, UNSET_OP_ORDER, "or"},
-    {0x15, UNSET_OP_ORDER, "adc"}, {0x1D, UNSET_OP_ORDER, "sbb"},
-    {0x25, UNSET_OP_ORDER, "and"}, {0x2D, UNSET_OP_ORDER, "sub"},
-    {0x35, UNSET_OP_ORDER, "xor"}, {0x3D, UNSET_OP_ORDER, "cmp"},
-    {-1, UNSET_OP_ORDER, ""}};
+    X86_ALU_CODES(SHORT_IMMEDIATE_ENTRY){-1, UNSET_OP_ORDER, ""}};
 
 static const char* const conditional_code_suffix[] = {
-    "o", "no", "c",  "nc", "z", "nz", "na", "a",
-    "s", "ns", "pe", "po", "l", "ge", "le", "g"};
+#define STRINGIFY(name, number) #name,
+    X86_CONDITIONAL_SUFFIXES(STRINGIFY)
+#undef STRINGIFY
+};
+
+#define STRINGIFY_NAME(name, code) #name,
+static const char* const xmm_conditional_code_suffix[] = {
+    XMM_CONDITIONAL_CODES(STRINGIFY_NAME)};
+#undef STRINGIFY_NAME
 
 enum InstructionType {
   NO_INSTR,
@@ -133,6 +104,18 @@
   REPEQ_PREFIX = REP_PREFIX
 };
 
+struct XmmMnemonic {
+  const char* ps_name;
+  const char* pd_name;
+  const char* ss_name;
+  const char* sd_name;
+};
+
+#define XMM_INSTRUCTION_ENTRY(name, code)                                      \
+  {#name "ps", #name "pd", #name "ss", #name "sd"},
+static const XmmMnemonic xmm_instructions[] = {
+    XMM_ALU_CODES(XMM_INSTRUCTION_ENTRY)};
+
 struct InstructionDesc {
   const char* mnem;
   InstructionType type;
@@ -605,7 +588,7 @@
 // Returns number of bytes used by machine instruction, including *data byte.
 // Writes immediate instructions to 'tmp_buffer_'.
 int DisassemblerX64::PrintImmediateOp(uint8_t* data) {
-  bool byte_size_immediate = (*data & 0x02) != 0;
+  bool byte_size_immediate = (*data & 0x03) != 1;
   uint8_t modrm = *(data + 1);
   int mod, regop, rm;
   get_modrm(modrm, &mod, &regop, &rm);
@@ -1153,13 +1136,11 @@
           // REP.
           Print("rep ");
         }
-        // TODO(srdjan): Should we enable printing of REX.W?
-        // if (rex_w()) Print("REX.W ");
-        Print("%s%s", idesc.mnem, operand_size_code());
-      } else if (current == 0xC3 || current == 0xCC) {
-        Print("%s", idesc.mnem);  // ret and int3 don't need a size specifier.
+        Print("%s", idesc.mnem);
+      } else if (current == 0x99 && rex_w()) {
+        Print("cqo");  // Cdql is called cdq and cdqq is called cqo.
       } else {
-        Print("%s%s", idesc.mnem, operand_size_code());
+        Print("%s", idesc.mnem);
       }
       (*data)++;
       break;
@@ -1347,16 +1328,14 @@
         current += PrintRightXMMOperand(current);
       } else {
         const char* mnemonic = "?";
-        if (opcode == 0x14) {
+        if (opcode == 0x5A) {
+          mnemonic = "cvtpd2ps";
+        } else if (0x51 <= opcode && opcode <= 0x5F) {
+          mnemonic = xmm_instructions[opcode & 0xF].pd_name;
+        } else if (opcode == 0x14) {
           mnemonic = "unpcklpd";
         } else if (opcode == 0x15) {
           mnemonic = "unpckhpd";
-        } else if (opcode == 0x54) {
-          mnemonic = "andpd";
-        } else if (opcode == 0x56) {
-          mnemonic = "orpd";
-        } else if (opcode == 0x57) {
-          mnemonic = "xorpd";
         } else if (opcode == 0x2E) {
           mnemonic = "ucomisd";
         } else if (opcode == 0x2F) {
@@ -1365,22 +1344,6 @@
           mnemonic = "paddd";
         } else if (opcode == 0xFA) {
           mnemonic = "psubd";
-        } else if (opcode == 0x58) {
-          mnemonic = "addpd";
-        } else if (opcode == 0x5C) {
-          mnemonic = "subpd";
-        } else if (opcode == 0x59) {
-          mnemonic = "mulpd";
-        } else if (opcode == 0x5E) {
-          mnemonic = "divpd";
-        } else if (opcode == 0x5D) {
-          mnemonic = "minpd";
-        } else if (opcode == 0x5F) {
-          mnemonic = "maxpd";
-        } else if (opcode == 0x51) {
-          mnemonic = "sqrtpd";
-        } else if (opcode == 0x5A) {
-          mnemonic = "cvtpd2ps";
         } else if (opcode == 0xEF) {
           mnemonic = "pxor";
         } else {
@@ -1424,10 +1387,12 @@
       get_modrm(*current, &mod, &regop, &rm);
       Print("cvtsd2si%s %s,", operand_size_code(), NameOfCPURegister(regop));
       current += PrintRightXMMOperand(current);
-    } else if ((opcode & 0xF8) == 0x58 || opcode == 0x51) {
-      // XMM arithmetic. Mnemonic was retrieved at the start of this function.
+    } else if (0x51 <= opcode && opcode <= 0x5F) {
+      // XMM arithmetic. Get the F2 0F prefix version of the mnemonic.
       int mod, regop, rm;
       get_modrm(*current, &mod, &regop, &rm);
+      const char* mnemonic =
+          opcode == 0x5A ? "cvtsd2ss" : xmm_instructions[opcode & 0xF].sd_name;
       Print("%s %s,", mnemonic, NameOfXMMRegister(regop));
       current += PrintRightXMMOperand(current);
     } else {
@@ -1463,17 +1428,10 @@
             NameOfCPURegister(regop));
       current += PrintRightXMMOperand(current);
     } else if (0x51 <= opcode && opcode <= 0x5F) {
-      static const char* mnemonics[] = {"sqrtss", "rsqrtss",  "rcpss", NULL,
-                                        NULL,     NULL,       NULL,    "addss",
-                                        "mulss",  "cvtss2sd", NULL,    "subss",
-                                        "minss",  "divss",    "maxss"};
       int mod, regop, rm;
       get_modrm(*current, &mod, &regop, &rm);
-      const char* mnemonic = mnemonics[opcode - 0x51];
-      if (mnemonic == NULL) {
-        UnimplementedInstruction();
-        mnemonic = "UNIMPLEMENTED";
-      }
+      const char* mnemonic =
+          opcode == 0x5A ? "cvtss2sd" : xmm_instructions[opcode & 0xF].ss_name;
       Print("%s %s,", mnemonic, NameOfXMMRegister(regop));
       current += PrintRightXMMOperand(current);
     } else if (opcode == 0x7E) {
@@ -1553,18 +1511,10 @@
     Print("%s %s,", mnemonic, NameOfXMMRegister(regop));
     current += PrintRightXMMOperand(current);
   } else if (0x51 <= opcode && opcode <= 0x5F) {
-    // ...ps xmm, xmm/m128
-    static const char* mnemonics[] = {"sqrtps", "rsqrtps",  "rcpps", "andps",
-                                      NULL,     "orps",     "xorps", "addps",
-                                      "mulps",  "cvtsd2ss", NULL,    "subps",
-                                      "minps",  "divps",    "maxps"};
-    const char* mnemonic = mnemonics[opcode - 0x51];
-    if (mnemonic == NULL) {
-      UnimplementedInstruction();
-      mnemonic = "???";
-    }
     int mod, regop, rm;
     get_modrm(*current, &mod, &regop, &rm);
+    const char* mnemonic =
+        opcode == 0x5A ? "cvtps2pd" : xmm_instructions[opcode & 0xF].ps_name;
     Print("%s %s,", mnemonic, NameOfXMMRegister(regop));
     current += PrintRightXMMOperand(current);
   } else if (opcode == 0xC2 || opcode == 0xC6) {
@@ -1572,12 +1522,14 @@
     get_modrm(*current, &mod, &regop, &rm);
     if (opcode == 0xC2) {
       Print("cmpps %s,", NameOfXMMRegister(regop));
+      current += PrintRightXMMOperand(current);
+      Print(" [%s]", xmm_conditional_code_suffix[*current]);
     } else {
       ASSERT(opcode == 0xC6);
       Print("shufps %s,", NameOfXMMRegister(regop));
+      current += PrintRightXMMOperand(current);
+      Print(" [%x]", *current);
     }
-    current += PrintRightXMMOperand(current);
-    Print(" [%x]", *current);
     current++;
   } else if ((opcode & 0xF0) == 0x80) {
     // Jcc: Conditional jump (branch).
@@ -1625,12 +1577,10 @@
 // The argument is the second byte of the two-byte opcode.
 // Returns NULL if the instruction is not handled here.
 const char* DisassemblerX64::TwoByteMnemonic(uint8_t opcode) {
-  if (0x51 <= opcode && opcode <= 0x5F) {
-    static const char* mnemonics[] = {"sqrtsd", "rsqrtsd", "rcpsd", NULL,
-                                      NULL,     NULL,      NULL,    "addsd",
-                                      "mulsd",  NULL,      NULL,    "subsd",
-                                      "minsd",  "divsd",   "maxsd"};
-    return mnemonics[opcode - 0x51];
+  if (opcode == 0x5A) {
+    return "cvtps2pd";
+  } else if (0x51 <= opcode && opcode <= 0x5F) {
+    return xmm_instructions[opcode & 0xF].ps_name;
   }
   if (0xA2 <= opcode && opcode <= 0xBF) {
     static const char* mnemonics[] = {
@@ -1759,11 +1709,8 @@
       } break;
 
       case 0x80: {
-        data++;
-        Print("cmpb ");
-        data += PrintRightByteOperand(data);
-        Print(",");
-        data += PrintImmediate(data, BYTE_SIZE);
+        byte_size_operand_ = true;
+        data += PrintImmediateOp(data);
       } break;
 
       case 0x88:  // 8bit, fall through
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index 5b3efa4..5195eba 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -229,6 +229,8 @@
 
 void ConstantPropagator::VisitCheckSmi(CheckSmiInstr* instr) {}
 
+void ConstantPropagator::VisitTailCall(TailCallInstr* instr) {}
+
 void ConstantPropagator::VisitCheckNull(CheckNullInstr* instr) {}
 
 void ConstantPropagator::VisitGenericCheckBound(GenericCheckBoundInstr* instr) {
@@ -630,6 +632,15 @@
   SetValue(instr, non_constant_);
 }
 
+void ConstantPropagator::VisitLoadIndexedUnsafe(LoadIndexedUnsafeInstr* instr) {
+  SetValue(instr, non_constant_);
+}
+
+void ConstantPropagator::VisitStoreIndexedUnsafe(
+    StoreIndexedUnsafeInstr* instr) {
+  SetValue(instr, non_constant_);
+}
+
 void ConstantPropagator::VisitStoreIndexed(StoreIndexedInstr* instr) {
   SetValue(instr, instr->value()->definition()->constant_value());
 }
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index d532101..b718238 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -33,8 +33,9 @@
       current_ssa_temp_index_(0),
       max_block_id_(max_block_id),
       parsed_function_(parsed_function),
-      num_copied_params_(parsed_function.num_copied_params()),
-      num_non_copied_params_(parsed_function.num_non_copied_params()),
+      num_direct_parameters_(parsed_function.function().HasOptionalParameters()
+                                 ? 0
+                                 : parsed_function.function().NumParameters()),
       graph_entry_(graph_entry),
       preorder_(),
       postorder_(),
@@ -42,7 +43,6 @@
       optimized_block_order_(),
       constant_null_(NULL),
       constant_dead_(NULL),
-      constant_empty_context_(NULL),
       licm_allowed_(true),
       prologue_info_(prologue_info),
       loop_headers_(NULL),
@@ -611,7 +611,7 @@
   explicit VariableLivenessAnalysis(FlowGraph* flow_graph)
       : LivenessAnalysis(flow_graph->variable_count(), flow_graph->postorder()),
         flow_graph_(flow_graph),
-        num_non_copied_params_(flow_graph->num_non_copied_params()),
+        num_direct_parameters_(flow_graph->num_direct_parameters()),
         assigned_vars_() {}
 
   // For every block (in preorder) compute and return set of variables that
@@ -656,7 +656,7 @@
       return false;
     }
     if (store->is_last()) {
-      const intptr_t index = store->local().BitIndexIn(num_non_copied_params_);
+      const intptr_t index = store->local().BitIndexIn(num_direct_parameters_);
       return GetLiveOutSet(block)->Contains(index);
     }
 
@@ -669,7 +669,7 @@
     if (load->local().Equals(*flow_graph_->CurrentContextVar())) {
       return false;
     }
-    const intptr_t index = load->local().BitIndexIn(num_non_copied_params_);
+    const intptr_t index = load->local().BitIndexIn(num_direct_parameters_);
     return load->is_last() && !GetLiveOutSet(block)->Contains(index);
   }
 
@@ -677,7 +677,7 @@
   virtual void ComputeInitialSets();
 
   const FlowGraph* flow_graph_;
-  const intptr_t num_non_copied_params_;
+  const intptr_t num_direct_parameters_;
   GrowableArray<BitVector*> assigned_vars_;
 };
 
@@ -709,7 +709,7 @@
 
       LoadLocalInstr* load = current->AsLoadLocal();
       if (load != NULL) {
-        const intptr_t index = load->local().BitIndexIn(num_non_copied_params_);
+        const intptr_t index = load->local().BitIndexIn(num_direct_parameters_);
         if (index >= live_in->length()) continue;  // Skip tmp_locals.
         live_in->Add(index);
         if (!last_loads->Contains(index)) {
@@ -722,7 +722,7 @@
       StoreLocalInstr* store = current->AsStoreLocal();
       if (store != NULL) {
         const intptr_t index =
-            store->local().BitIndexIn(num_non_copied_params_);
+            store->local().BitIndexIn(num_direct_parameters_);
         if (index >= live_in->length()) continue;  // Skip tmp_locals.
         if (kill->Contains(index)) {
           if (!live_in->Contains(index)) {
@@ -946,13 +946,9 @@
                        ZoneGrowableArray<Definition*>* inlining_parameters) {
   GraphEntryInstr* entry = graph_entry();
 
-  // Initial renaming environment.
-  GrowableArray<Definition*> env(variable_count());
-
   // Add global constants to the initial definitions.
   constant_null_ = GetConstant(Object::ZoneHandle());
   constant_dead_ = GetConstant(Symbols::OptimizedOut());
-  constant_empty_context_ = GetConstant(Object::empty_context());
 
   // Check if inlining_parameters include a type argument vector parameter.
   const intptr_t inlined_type_args_param =
@@ -961,66 +957,73 @@
           ? 1
           : 0;
 
-  // Add parameters to the initial definitions and renaming environment.
-  if (inlining_parameters != NULL) {
-    // Use known parameters.
-    ASSERT(inlined_type_args_param + parameter_count() ==
-           inlining_parameters->length());
-    for (intptr_t i = 0; i < parameter_count(); ++i) {
-      // If inlined_type_args_param == 1, then (*inlining_parameters)[0]
-      // is the passed-in type args. We do not add it to env[0] but to
-      // env[parameter_count()] below.
-      Definition* defn = (*inlining_parameters)[inlined_type_args_param + i];
-      AllocateSSAIndexes(defn);
-      AddToInitialDefinitions(defn);
-      env.Add(defn);
-    }
-  } else {
-    // Create new parameters.  For functions compiled for OSR, the locals
-    // are unknown and so treated like parameters.
-    intptr_t count = IsCompiledForOsr() ? variable_count() : parameter_count();
-    for (intptr_t i = 0; i < count; ++i) {
+  // Initial renaming environment.
+  GrowableArray<Definition*> env(variable_count());
+  {
+    const intptr_t parameter_count =
+        IsCompiledForOsr() ? variable_count() : num_direct_parameters_;
+    for (intptr_t i = 0; i < parameter_count; i++) {
       ParameterInstr* param = new (zone()) ParameterInstr(i, entry);
-      param->set_ssa_temp_index(alloc_ssa_temp_index());  // New SSA temp.
+      param->set_ssa_temp_index(alloc_ssa_temp_index());
       AddToInitialDefinitions(param);
       env.Add(param);
     }
+    ASSERT(env.length() == parameter_count);
+
+    // Fill in all local variables with `null` (for osr the stack locals have
+    // already been been handled above).
+    if (!IsCompiledForOsr()) {
+      ASSERT(env.length() == num_direct_parameters_);
+      env.FillWith(constant_null(), num_direct_parameters_, num_stack_locals());
+    }
   }
 
-  // Initialize all locals in the renaming environment  For OSR, the locals have
-  // already been handled as parameters.
-  if (!IsCompiledForOsr()) {
-    intptr_t i = parameter_count();
-    if (isolate()->reify_generic_functions() && function().IsGeneric()) {
-      // The first local is the slot holding the copied passed-in type args.
-      // TODO(regis): Do we need the SpecialParameterInstr if the type_args_var
-      // is not needed? Add an assert for now:
-      ASSERT(parsed_function().function_type_arguments() != NULL);
-      Definition* defn;
-      if (inlining_parameters == NULL) {
-        defn = new SpecialParameterInstr(SpecialParameterInstr::kTypeArgs,
-                                         Thread::kNoDeoptId);
-      } else {
-        defn = (*inlining_parameters)[0];
+  // Override the entries in the renaming environment which are special (i.e.
+  // inlining arguments, type parameter, args descriptor, context, ...)
+  {
+    // Replace parameter slots with inlining definitions coming in.
+    if (inlining_parameters != NULL) {
+      for (intptr_t i = 0; i < function().NumParameters(); ++i) {
+        Definition* defn = (*inlining_parameters)[inlined_type_args_param + i];
+        AllocateSSAIndexes(defn);
+        AddToInitialDefinitions(defn);
+
+        intptr_t index = parsed_function_.RawParameterVariable(i)->BitIndexIn(
+            num_direct_parameters_);
+        env[index] = defn;
       }
-      AllocateSSAIndexes(defn);
-      AddToInitialDefinitions(defn);
-      env.Add(defn);
-      ++i;
     }
-    for (; i < variable_count(); ++i) {
-      if (i == CurrentContextEnvIndex()) {
-        if (function().IsClosureFunction()) {
-          SpecialParameterInstr* context = new SpecialParameterInstr(
-              SpecialParameterInstr::kContext, Thread::kNoDeoptId);
-          context->set_ssa_temp_index(alloc_ssa_temp_index());  // New SSA temp.
-          AddToInitialDefinitions(context);
-          env.Add(context);
+
+    if (!IsCompiledForOsr()) {
+      const bool reify_generic_argument =
+          function().IsGeneric() && isolate()->reify_generic_functions();
+
+      // Replace the type arguments slot with a special parameter.
+      if (reify_generic_argument) {
+        ASSERT(parsed_function().function_type_arguments() != NULL);
+
+        Definition* defn;
+        if (inlining_parameters == NULL) {
+          // Note: If we are not inlining, then the prologue builder will
+          // take care of checking that we got the correct reified type
+          // arguments.  This includes checking the argument descriptor in order
+          // to even find out if the parameter was passed or not.
+          defn = constant_dead();
         } else {
-          env.Add(constant_empty_context());
+          defn = (*inlining_parameters)[0];
         }
-      } else {
-        env.Add(constant_null());
+        AllocateSSAIndexes(defn);
+        AddToInitialDefinitions(defn);
+        env[RawTypeArgumentEnvIndex()] = defn;
+      }
+
+      // Replace the argument descriptor slot with a special parameter.
+      if (parsed_function().has_arg_desc_var()) {
+        Definition* defn = new SpecialParameterInstr(
+            SpecialParameterInstr::kArgDescriptor, Thread::kNoDeoptId);
+        AllocateSSAIndexes(defn);
+        AddToInitialDefinitions(defn);
+        env[ArgumentDescriptorEnvIndex()] = defn;
       }
     }
   }
@@ -1029,7 +1032,7 @@
     // Functions with try-catch have a fixed area of stack slots reserved
     // so that all local variables are stored at a known location when
     // on entry to the catch.
-    entry->set_fixed_slot_count(num_stack_locals() + num_copied_params());
+    entry->set_fixed_slot_count(num_stack_locals());
   }
   RenameRecursive(entry, &env, live_phis, variable_liveness);
 }
@@ -1037,7 +1040,7 @@
 void FlowGraph::AttachEnvironment(Instruction* instr,
                                   GrowableArray<Definition*>* env) {
   Environment* deopt_env =
-      Environment::From(zone(), *env, num_non_copied_params_, parsed_function_);
+      Environment::From(zone(), *env, num_direct_parameters_, parsed_function_);
   if (instr->IsClosureCall()) {
     deopt_env =
         deopt_env->DeepCopy(zone(), deopt_env->Length() - instr->InputCount());
@@ -1151,7 +1154,7 @@
         Definition* result = NULL;
         if (store != NULL) {
           // Update renaming environment.
-          intptr_t index = store->local().BitIndexIn(num_non_copied_params_);
+          intptr_t index = store->local().BitIndexIn(num_direct_parameters_);
           result = store->value()->definition();
 
           if (!FLAG_prune_dead_locals ||
@@ -1164,7 +1167,7 @@
           // The graph construction ensures we do not have an unused LoadLocal
           // computation.
           ASSERT(definition->HasTemp());
-          intptr_t index = load->local().BitIndexIn(num_non_copied_params_);
+          intptr_t index = load->local().BitIndexIn(num_direct_parameters_);
           result = (*env)[index];
 
           PhiInstr* phi = result->AsPhi();
@@ -1181,7 +1184,7 @@
           // Record captured parameters so that they can be skipped when
           // emitting sync code inside optimized try-blocks.
           if (load->local().is_captured_parameter()) {
-            intptr_t index = load->local().BitIndexIn(num_non_copied_params_);
+            intptr_t index = load->local().BitIndexIn(num_direct_parameters_);
             captured_parameters_->Add(index);
           }
 
diff --git a/runtime/vm/compiler/backend/flow_graph.h b/runtime/vm/compiler/backend/flow_graph.h
index c32baaa..a98c65c 100644
--- a/runtime/vm/compiler/backend/flow_graph.h
+++ b/runtime/vm/compiler/backend/flow_graph.h
@@ -77,12 +77,12 @@
   // The first blockid used for prologue building.  This information can be used
   // by the inliner for budget calculations: The prologue code falls away when
   // inlining, so we should not include it in the budget.
-  const intptr_t min_block_id;
+  intptr_t min_block_id;
 
   // The last blockid used for prologue building.  This information can be used
   // by the inliner for budget calculations: The prologue code falls away when
   // inlining, so we should not include it in the budget.
-  const intptr_t max_block_id;
+  intptr_t max_block_id;
 
   PrologueInfo(intptr_t min, intptr_t max)
       : min_block_id(min), max_block_id(max) {}
@@ -103,17 +103,26 @@
   // Function properties.
   const ParsedFunction& parsed_function() const { return parsed_function_; }
   const Function& function() const { return parsed_function_.function(); }
-  intptr_t parameter_count() const {
-    return num_copied_params_ + num_non_copied_params_;
-  }
+
+  // The number of directly accessable parameters (above the frame pointer).
+  // All other parameters can only be indirectly loaded via metadata found in
+  // the arguments descriptor.
+  intptr_t num_direct_parameters() const { return num_direct_parameters_; }
+
+  // The number of variables (or boxes) which code can load from / store to.
+  // The SSA renaming will insert phi's for them (and only them - i.e. there
+  // will be no phi insertion for [LocalVariable]s pointing to the expression
+  // stack!).
   intptr_t variable_count() const {
-    return parameter_count() + parsed_function_.num_stack_locals();
+    return num_direct_parameters_ + parsed_function_.num_stack_locals();
   }
+
+  // The number of variables (or boxes) inside the functions frame - meaning
+  // below the frame pointer.  This does not include the expression stack.
   intptr_t num_stack_locals() const {
     return parsed_function_.num_stack_locals();
   }
-  intptr_t num_copied_params() const { return num_copied_params_; }
-  intptr_t num_non_copied_params() const { return num_non_copied_params_; }
+
   bool IsIrregexpFunction() const { return function().IsIrregexpFunction(); }
 
   LocalVariable* CurrentContextVar() const {
@@ -122,7 +131,16 @@
 
   intptr_t CurrentContextEnvIndex() const {
     return parsed_function().current_context_var()->BitIndexIn(
-        num_non_copied_params_);
+        num_direct_parameters_);
+  }
+
+  intptr_t RawTypeArgumentEnvIndex() const {
+    return parsed_function().RawTypeArgumentsVariable()->BitIndexIn(
+        num_direct_parameters_);
+  }
+
+  intptr_t ArgumentDescriptorEnvIndex() const {
+    return parsed_function().arg_desc_var()->BitIndexIn(num_direct_parameters_);
   }
 
   // Flow graph orders.
@@ -181,10 +199,6 @@
 
   ConstantInstr* constant_dead() const { return constant_dead_; }
 
-  ConstantInstr* constant_empty_context() const {
-    return constant_empty_context_;
-  }
-
   intptr_t alloc_ssa_temp_index() { return current_ssa_temp_index_++; }
 
   void AllocateSSAIndexes(Definition* def) {
@@ -410,8 +424,7 @@
 
   // Flow graph fields.
   const ParsedFunction& parsed_function_;
-  const intptr_t num_copied_params_;
-  const intptr_t num_non_copied_params_;
+  intptr_t num_direct_parameters_;
   GraphEntryInstr* graph_entry_;
   GrowableArray<BlockEntryInstr*> preorder_;
   GrowableArray<BlockEntryInstr*> postorder_;
@@ -419,7 +432,6 @@
   GrowableArray<BlockEntryInstr*> optimized_block_order_;
   ConstantInstr* constant_null_;
   ConstantInstr* constant_dead_;
-  ConstantInstr* constant_empty_context_;
 
   bool licm_allowed_;
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index dd82dd7..94bd1ae 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -212,6 +212,7 @@
       }
     }
   }
+
   if (!is_optimizing()) {
     // Initialize edge counter array.
     const intptr_t num_counters = flow_graph_.preorder().length();
@@ -337,13 +338,14 @@
     catch_entry_state_maps_builder_->NewMapping(assembler()->CodeSize());
     // Parameters first.
     intptr_t i = 0;
-    const intptr_t num_non_copied_params = flow_graph().num_non_copied_params();
-    for (; i < num_non_copied_params; ++i) {
+
+    const intptr_t num_direct_parameters = flow_graph().num_direct_parameters();
+    for (; i < num_direct_parameters; ++i) {
       // Don't sync captured parameters. They are not in the environment.
       if (flow_graph().captured_parameters()->Contains(i)) continue;
       if ((*idefs)[i]->IsConstant()) continue;  // Common constants.
       Location src = env->LocationAt(i);
-      intptr_t dest_index = i - num_non_copied_params;
+      intptr_t dest_index = i - num_direct_parameters;
       if (!src.IsStackSlot()) {
         ASSERT(src.IsConstant());
         // Skip dead locations.
@@ -362,7 +364,7 @@
     }
 
     // Process locals. Skip exception_var and stacktrace_var.
-    intptr_t local_base = kFirstLocalSlotFromFp + num_non_copied_params;
+    intptr_t local_base = kFirstLocalSlotFromFp + num_direct_parameters;
     intptr_t ex_idx = local_base - catch_block->exception_var().index();
     intptr_t st_idx = local_base - catch_block->stacktrace_var().index();
     for (; i < flow_graph().variable_count(); ++i) {
@@ -372,7 +374,7 @@
       if ((*idefs)[i]->IsConstant()) continue;  // Common constants.
       Location src = env->LocationAt(i);
       if (src.IsInvalid()) continue;
-      intptr_t dest_index = i - num_non_copied_params;
+      intptr_t dest_index = i - num_direct_parameters;
       if (!src.IsStackSlot()) {
         ASSERT(src.IsConstant());
         // Skip dead locations.
@@ -542,8 +544,7 @@
   if (is_optimizing_) {
     return flow_graph_.graph_entry()->spill_slot_count();
   } else {
-    return parsed_function_.num_stack_locals() +
-           parsed_function_.num_copied_params();
+    return parsed_function_.num_stack_locals();
   }
 }
 
@@ -1269,20 +1270,24 @@
     Register reg = kNoRegister;
     if (loc.IsRegister()) {
       reg = loc.reg();
-    } else if (loc.IsUnallocated() || loc.IsConstant()) {
-      ASSERT(loc.IsConstant() ||
-             ((loc.policy() == Location::kRequiresRegister) ||
-              (loc.policy() == Location::kWritableRegister) ||
-              (loc.policy() == Location::kAny)));
+    } else if (loc.IsUnallocated()) {
+      ASSERT((loc.policy() == Location::kRequiresRegister) ||
+             (loc.policy() == Location::kWritableRegister) ||
+             (loc.policy() == Location::kPrefersRegister) ||
+             (loc.policy() == Location::kAny));
       reg = AllocateFreeRegister(blocked_registers);
       locs->set_in(i, Location::RegisterLocation(reg));
     }
-    ASSERT(reg != kNoRegister);
+    ASSERT(reg != kNoRegister || loc.IsConstant());
 
     // Inputs are consumed from the simulated frame. In case of a call argument
     // we leave it until the call instruction.
     if (should_pop) {
-      assembler()->PopRegister(reg);
+      if (loc.IsConstant()) {
+        assembler()->Drop(1);
+      } else {
+        assembler()->PopRegister(reg);
+      }
     }
   }
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index e2370c0..ecc8c5e 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -717,9 +717,6 @@
       Label* is_not_instance_lbl);
 
   void GenerateBoolToJump(Register bool_reg, Label* is_true, Label* is_false);
-
-  void CheckTypeArgsLen(bool expect_type_args, Label* wrong_num_arguments);
-  void CopyParameters(bool expect_type_args, bool check_arguments);
 #endif  // !defined(TARGET_ARCH_DBC)
 
   void GenerateInlinedGetter(intptr_t offset);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index 324b9ca..234e125 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -701,253 +701,6 @@
   }
 }
 
-// Input parameters:
-//   R4: arguments descriptor array.
-void FlowGraphCompiler::CheckTypeArgsLen(bool expect_type_args,
-                                         Label* wrong_num_arguments) {
-  __ Comment("Check type args len");
-  const Function& function = parsed_function().function();
-  Label correct_type_args_len;
-  // Type args are always optional, so length can always be zero.
-  // If expect_type_args, a non-zero length must match the declaration length.
-  __ ldr(R6, FieldAddress(R4, ArgumentsDescriptor::type_args_len_offset()));
-  if (isolate()->strong()) {
-    __ AndImmediate(
-        R6, R6,
-        Smi::RawValue(ArgumentsDescriptor::TypeArgsLenField::mask_in_place()));
-  }
-  __ CompareImmediate(R6, Smi::RawValue(0));
-  if (expect_type_args) {
-    __ CompareImmediate(R6, Smi::RawValue(function.NumTypeParameters()), NE);
-  }
-  __ b(wrong_num_arguments, NE);
-  __ Bind(&correct_type_args_len);
-}
-
-// Input parameters:
-//   R4: arguments descriptor array.
-void FlowGraphCompiler::CopyParameters(bool expect_type_args,
-                                       bool check_arguments) {
-  Label wrong_num_arguments;
-  if (check_arguments) {
-    CheckTypeArgsLen(expect_type_args, &wrong_num_arguments);
-  }
-  __ Comment("Copy parameters");
-  const Function& function = parsed_function().function();
-  LocalScope* scope = parsed_function().node_sequence()->scope();
-  const int num_fixed_params = function.num_fixed_parameters();
-  const int num_opt_pos_params = function.NumOptionalPositionalParameters();
-  const int num_opt_named_params = function.NumOptionalNamedParameters();
-  const int num_params =
-      num_fixed_params + num_opt_pos_params + num_opt_named_params;
-  ASSERT(function.NumParameters() == num_params);
-  ASSERT(parsed_function().first_parameter_index() == kFirstLocalSlotFromFp);
-
-  // Check that min_num_pos_args <= num_pos_args <= max_num_pos_args,
-  // where num_pos_args is the number of positional arguments passed in.
-  const int min_num_pos_args = num_fixed_params;
-  const int max_num_pos_args = num_fixed_params + num_opt_pos_params;
-
-  __ ldr(R6, FieldAddress(R4, ArgumentsDescriptor::positional_count_offset()));
-
-  if (isolate()->strong()) {
-    __ AndImmediate(
-        R6, R6,
-        Smi::RawValue(
-            ArgumentsDescriptor::PositionalCountField::mask_in_place()));
-  }
-
-  // Check that min_num_pos_args <= num_pos_args.
-  __ CompareImmediate(R6, Smi::RawValue(min_num_pos_args));
-  __ b(&wrong_num_arguments, LT);
-  // Check that num_pos_args <= max_num_pos_args.
-  __ CompareImmediate(R6, Smi::RawValue(max_num_pos_args));
-  __ b(&wrong_num_arguments, GT);
-
-  // Copy positional arguments.
-  // Argument i passed at fp[kParamEndSlotFromFp + num_args - i] is copied
-  // to fp[kFirstLocalSlotFromFp - i].
-
-  __ ldr(NOTFP, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
-  // Since NOTFP and R6 are Smi, use LSL 1 instead of LSL 2.
-  // Let NOTFP point to the last passed positional argument, i.e. to
-  // fp[kParamEndSlotFromFp + num_args - (num_pos_args - 1)].
-  __ sub(NOTFP, NOTFP, Operand(R6));
-  __ add(NOTFP, FP, Operand(NOTFP, LSL, 1));
-  __ add(NOTFP, NOTFP, Operand((kParamEndSlotFromFp + 1) * kWordSize));
-
-  // Let R8 point to the last copied positional argument, i.e. to
-  // fp[kFirstLocalSlotFromFp - (num_pos_args - 1)].
-  __ AddImmediate(R8, FP, (kFirstLocalSlotFromFp + 1) * kWordSize);
-  __ sub(R8, R8, Operand(R6, LSL, 1));  // R6 is a Smi.
-  __ SmiUntag(R6);
-  Label loop, loop_condition;
-  __ b(&loop_condition);
-  // We do not use the final allocation index of the variable here, i.e.
-  // scope->VariableAt(i)->index(), because captured variables still need
-  // to be copied to the context that is not yet allocated.
-  const Address argument_addr(NOTFP, R6, LSL, 2);
-  const Address copy_addr(R8, R6, LSL, 2);
-  __ Bind(&loop);
-  __ ldr(IP, argument_addr);
-  __ str(IP, copy_addr);
-  __ Bind(&loop_condition);
-  __ subs(R6, R6, Operand(1));
-  __ b(&loop, PL);
-
-  // Copy or initialize optional named arguments.
-  Label all_arguments_processed;
-#ifdef DEBUG
-  const bool check_correct_named_args = true;
-#else
-  const bool check_correct_named_args = check_arguments;
-#endif
-  if (num_opt_named_params > 0) {
-    // Start by alphabetically sorting the names of the optional parameters.
-    LocalVariable** opt_param = new LocalVariable*[num_opt_named_params];
-    int* opt_param_position = new int[num_opt_named_params];
-    for (int pos = num_fixed_params; pos < num_params; pos++) {
-      LocalVariable* parameter = scope->VariableAt(pos);
-      const String& opt_param_name = parameter->name();
-      int i = pos - num_fixed_params;
-      while (--i >= 0) {
-        LocalVariable* param_i = opt_param[i];
-        const intptr_t result = opt_param_name.CompareTo(param_i->name());
-        ASSERT(result != 0);
-        if (result > 0) break;
-        opt_param[i + 1] = opt_param[i];
-        opt_param_position[i + 1] = opt_param_position[i];
-      }
-      opt_param[i + 1] = parameter;
-      opt_param_position[i + 1] = pos;
-    }
-    // Generate code handling each optional parameter in alphabetical order.
-    __ ldr(NOTFP, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
-    // Let NOTFP point to the first passed argument, i.e. to
-    // fp[kParamEndSlotFromFp + num_args - 0]; num_args (NOTFP) is Smi.
-    __ add(NOTFP, FP, Operand(NOTFP, LSL, 1));
-    __ AddImmediate(NOTFP, NOTFP, kParamEndSlotFromFp * kWordSize);
-    // Let R8 point to the entry of the first named argument.
-    __ add(R8, R4,
-           Operand(ArgumentsDescriptor::first_named_entry_offset() -
-                   kHeapObjectTag));
-    for (int i = 0; i < num_opt_named_params; i++) {
-      Label load_default_value, assign_optional_parameter;
-      const int param_pos = opt_param_position[i];
-      // Check if this named parameter was passed in.
-      // Load R9 with the name of the argument.
-      __ ldr(R9, Address(R8, ArgumentsDescriptor::name_offset()));
-      ASSERT(opt_param[i]->name().IsSymbol());
-      __ CompareObject(R9, opt_param[i]->name());
-      __ b(&load_default_value, NE);
-      // Load R9 with passed-in argument at provided arg_pos, i.e. at
-      // fp[kParamEndSlotFromFp + num_args - arg_pos].
-      __ ldr(R9, Address(R8, ArgumentsDescriptor::position_offset()));
-      if (isolate()->strong()) {
-        __ AndImmediate(
-            R9, R9,
-            Smi::RawValue(
-                ArgumentsDescriptor::PositionalCountField::mask_in_place()));
-      }
-      // R9 is arg_pos as Smi.
-      // Point to next named entry.
-      __ add(R8, R8, Operand(ArgumentsDescriptor::named_entry_size()));
-      __ rsb(R9, R9, Operand(0));
-      Address argument_addr(NOTFP, R9, LSL, 1);  // R9 is a negative Smi.
-      __ ldr(R9, argument_addr);
-      __ b(&assign_optional_parameter);
-      __ Bind(&load_default_value);
-      // Load R9 with default argument.
-      const Instance& value = parsed_function().DefaultParameterValueAt(
-          param_pos - num_fixed_params);
-      __ LoadObject(R9, value);
-      __ Bind(&assign_optional_parameter);
-      // Assign R9 to fp[kFirstLocalSlotFromFp - param_pos].
-      // We do not use the final allocation index of the variable here, i.e.
-      // scope->VariableAt(i)->index(), because captured variables still need
-      // to be copied to the context that is not yet allocated.
-      const intptr_t computed_param_pos = kFirstLocalSlotFromFp - param_pos;
-      const Address param_addr(FP, computed_param_pos * kWordSize);
-      __ str(R9, param_addr);
-    }
-    delete[] opt_param;
-    delete[] opt_param_position;
-    if (check_correct_named_args) {
-      // Check that R8 now points to the null terminator in the arguments
-      // descriptor.
-      __ ldr(R9, Address(R8, 0));
-      __ CompareObject(R9, Object::null_object());
-      __ b(&all_arguments_processed, EQ);
-    }
-  } else {
-    ASSERT(num_opt_pos_params > 0);
-    __ ldr(R6,
-           FieldAddress(R4, ArgumentsDescriptor::positional_count_offset()));
-    __ SmiUntag(R6);
-    if (isolate()->strong()) {
-      __ AndImmediate(
-          R6, R6, ArgumentsDescriptor::PositionalCountField::mask_in_place());
-    }
-    for (int i = 0; i < num_opt_pos_params; i++) {
-      Label next_parameter;
-      // Handle this optional positional parameter only if k or fewer positional
-      // arguments have been passed, where k is param_pos, the position of this
-      // optional parameter in the formal parameter list.
-      const int param_pos = num_fixed_params + i;
-      __ CompareImmediate(R6, param_pos);
-      __ b(&next_parameter, GT);
-      // Load R9 with default argument.
-      const Object& value = parsed_function().DefaultParameterValueAt(i);
-      __ LoadObject(R9, value);
-      // Assign R9 to fp[kFirstLocalSlotFromFp - param_pos].
-      // We do not use the final allocation index of the variable here, i.e.
-      // scope->VariableAt(i)->index(), because captured variables still need
-      // to be copied to the context that is not yet allocated.
-      const intptr_t computed_param_pos = kFirstLocalSlotFromFp - param_pos;
-      const Address param_addr(FP, computed_param_pos * kWordSize);
-      __ str(R9, param_addr);
-      __ Bind(&next_parameter);
-    }
-    if (check_correct_named_args) {
-      __ ldr(NOTFP, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
-      __ SmiUntag(NOTFP);
-      // Check that R6 equals NOTFP, i.e. no named arguments passed.
-      __ cmp(R6, Operand(NOTFP));
-      __ b(&all_arguments_processed, EQ);
-    }
-  }
-
-  __ Bind(&wrong_num_arguments);
-  if (check_arguments) {
-    __ LeaveDartFrame(kKeepCalleePP);  // The arguments are still on the stack.
-    __ Branch(*StubCode::CallClosureNoSuchMethod_entry());
-    // The noSuchMethod call may return to the caller, but not here.
-  } else if (check_correct_named_args) {
-    __ Stop("Wrong arguments");
-  }
-
-  __ Bind(&all_arguments_processed);
-  // Nullify originally passed arguments only after they have been copied and
-  // checked, otherwise noSuchMethod would not see their original values.
-  // This step can be skipped in case we decide that formal parameters are
-  // implicitly final, since garbage collecting the unmodified value is not
-  // an issue anymore.
-
-  // R4 : arguments descriptor array.
-  __ ldr(R6, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
-  __ SmiUntag(R6);
-  __ add(NOTFP, FP, Operand((kParamEndSlotFromFp + 1) * kWordSize));
-  const Address original_argument_addr(NOTFP, R6, LSL, 2);
-  __ LoadObject(IP, Object::null_object());
-  Label null_args_loop, null_args_loop_condition;
-  __ b(&null_args_loop_condition);
-  __ Bind(&null_args_loop);
-  __ str(IP, original_argument_addr);
-  __ Bind(&null_args_loop_condition);
-  __ subs(R6, R6, Operand(1));
-  __ b(&null_args_loop, PL);
-}
-
 void FlowGraphCompiler::GenerateInlinedGetter(intptr_t offset) {
   // LR: return address.
   // SP: receiver.
@@ -998,8 +751,7 @@
   }
   __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
-    intptr_t extra_slots = StackSize() - flow_graph().num_stack_locals() -
-                           flow_graph().num_copied_params();
+    intptr_t extra_slots = StackSize() - flow_graph().num_stack_locals();
     ASSERT(extra_slots >= 0);
     __ EnterOsrFrame(extra_slots * kWordSize);
   } else {
@@ -1017,9 +769,8 @@
 //   R4: arguments descriptor array.
 void FlowGraphCompiler::CompileGraph() {
   InitCompiler();
-  const Function& function = parsed_function().function();
-
 #ifdef DART_PRECOMPILER
+  const Function& function = parsed_function().function();
   if (function.IsDynamicFunction()) {
     __ MonomorphicCheckedEntry();
   }
@@ -1033,117 +784,27 @@
   EmitFrameEntry();
   ASSERT(assembler()->constant_pool_allowed());
 
-  const int num_fixed_params = function.num_fixed_parameters();
-  const int num_copied_params = parsed_function().num_copied_params();
-  const int num_locals = parsed_function().num_stack_locals();
-
-  // The prolog of OSR functions is never executed, hence greatly simplified.
-  const bool expect_type_args = isolate()->reify_generic_functions() &&
-                                function.IsGeneric() &&
-                                !flow_graph().IsCompiledForOsr();
-
-  const bool check_arguments =
-      (function.IsClosureFunction() || function.IsConvertedClosureFunction()) &&
-      !flow_graph().IsCompiledForOsr();
-
-  // We check the number of passed arguments when we have to copy them due to
-  // the presence of optional parameters.
-  // No such checking code is generated if only fixed parameters are declared,
-  // unless we are in debug mode or unless we are compiling a closure.
-  if (num_copied_params == 0) {
-    if (check_arguments) {
-      Label correct_num_arguments, wrong_num_arguments;
-      CheckTypeArgsLen(expect_type_args, &wrong_num_arguments);
-      __ Comment("Check argument count");
-      // Check that exactly num_fixed arguments are passed in.
-      __ ldr(R0, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
-      __ CompareImmediate(R0, Smi::RawValue(num_fixed_params));
-      __ b(&wrong_num_arguments, NE);
-      __ ldr(R1,
-             FieldAddress(R4, ArgumentsDescriptor::positional_count_offset()));
-      if (isolate()->strong()) {
-        __ AndImmediate(
-            R1, R1,
-            Smi::RawValue(
-                ArgumentsDescriptor::PositionalCountField::mask_in_place()));
-      }
-      __ cmp(R0, Operand(R1));
-      __ b(&correct_num_arguments, EQ);
-      __ Bind(&wrong_num_arguments);
-      ASSERT(assembler()->constant_pool_allowed());
-      __ LeaveDartFrame(kKeepCalleePP);  // Arguments are still on the stack.
-      __ Branch(*StubCode::CallClosureNoSuchMethod_entry());
-      // The noSuchMethod call may return to the caller, but not here.
-      __ Bind(&correct_num_arguments);
-    }
-  } else if (!flow_graph().IsCompiledForOsr()) {
-    CopyParameters(expect_type_args, check_arguments);
-  }
-
-  if (function.IsClosureFunction() && !flow_graph().IsCompiledForOsr()) {
-    // Load context from the closure object (first argument).
-    LocalScope* scope = parsed_function().node_sequence()->scope();
-    LocalVariable* closure_parameter = scope->VariableAt(0);
-    __ ldr(CTX, Address(FP, closure_parameter->index() * kWordSize));
-    __ ldr(CTX, FieldAddress(CTX, Closure::context_offset()));
-  }
-
-  // In unoptimized code, initialize (non-argument) stack allocated slots to
-  // null.
+  // In unoptimized code, initialize (non-argument) stack allocated slots.
   if (!is_optimizing()) {
-    ASSERT(num_locals > 0);  // There is always at least context_var.
+    const int num_locals = parsed_function().num_stack_locals();
+
+    intptr_t args_desc_index = -1;
+    if (parsed_function().has_arg_desc_var()) {
+      args_desc_index =
+          -(parsed_function().arg_desc_var()->index() - kFirstLocalSlotFromFp);
+    }
+
     __ Comment("Initialize spill slots");
-    const intptr_t slot_base = parsed_function().first_stack_local_index();
-    const intptr_t context_index =
-        parsed_function().current_context_var()->index();
-    if (num_locals > 1) {
+    if (num_locals > 1 || (num_locals == 1 && args_desc_index == -1)) {
       __ LoadObject(R0, Object::null_object());
     }
     for (intptr_t i = 0; i < num_locals; ++i) {
-      // Subtract index i (locals lie at lower addresses than FP).
-      if (((slot_base - i) == context_index)) {
-        if (function.IsClosureFunction()) {
-          __ StoreToOffset(kWord, CTX, FP, (slot_base - i) * kWordSize);
-        } else {
-          __ LoadObject(R1, Object::empty_context());
-          __ StoreToOffset(kWord, R1, FP, (slot_base - i) * kWordSize);
-        }
-      } else {
-        ASSERT(num_locals > 1);
-        __ StoreToOffset(kWord, R0, FP, (slot_base - i) * kWordSize);
-      }
+      Register value_reg = i == args_desc_index ? ARGS_DESC_REG : R0;
+      __ StoreToOffset(kWord, value_reg, FP,
+                       (kFirstLocalSlotFromFp - i) * kWordSize);
     }
   }
 
-  // Copy passed-in type argument vector if the function is generic.
-  if (expect_type_args) {
-    __ Comment("Copy passed-in type args");
-    Label store_type_args, ok;
-    __ ldr(R0, FieldAddress(R4, ArgumentsDescriptor::type_args_len_offset()));
-    __ CompareImmediate(R0, Smi::RawValue(0));
-    if (is_optimizing()) {
-      // Initialize type_args to null if none passed in.
-      __ LoadObject(R0, Object::null_object(), EQ);
-      __ b(&store_type_args, EQ);
-    } else {
-      __ b(&ok, EQ);  // Already initialized to null.
-    }
-    // Load the passed type args vector in R0 from
-    // fp[kParamEndSlotFromFp + num_args + 1]; num_args (R1) is Smi.
-    __ ldr(R1, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
-    __ add(R1, FP, Operand(R1, LSL, 1));
-    __ ldr(R0, Address(R1, (kParamEndSlotFromFp + 1) * kWordSize));
-    // Store R0 into the stack slot reserved for the function type arguments.
-    // If the function type arguments variable is captured, a copy will happen
-    // after the context is allocated.
-    const intptr_t slot_base = parsed_function().first_stack_local_index();
-    ASSERT(parsed_function().function_type_arguments()->is_captured() ||
-           parsed_function().function_type_arguments()->index() == slot_base);
-    __ Bind(&store_type_args);
-    __ str(R0, Address(FP, slot_base * kWordSize));
-    __ Bind(&ok);
-  }
-
   EndCodeSourceRange(TokenPosition::kDartCodePrologue);
   VisitBlocks();
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index 552e3e0..1bbed6c 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -678,254 +678,6 @@
   }
 }
 
-// Input parameters:
-//   R4: arguments descriptor array.
-void FlowGraphCompiler::CheckTypeArgsLen(bool expect_type_args,
-                                         Label* wrong_num_arguments) {
-  __ Comment("Check type args len");
-  const Function& function = parsed_function().function();
-  Label correct_type_args_len;
-  // Type args are always optional, so length can always be zero.
-  // If expect_type_args, a non-zero length must match the declaration length.
-  __ LoadFieldFromOffset(R8, R4, ArgumentsDescriptor::type_args_len_offset());
-  if (isolate()->strong()) {
-    __ AndImmediate(
-        R8, R8,
-        Smi::RawValue(ArgumentsDescriptor::TypeArgsLenField::mask_in_place()));
-  }
-  __ CompareImmediate(R8, Smi::RawValue(0));
-  if (expect_type_args) {
-    __ b(&correct_type_args_len, EQ);
-    __ CompareImmediate(R8, Smi::RawValue(function.NumTypeParameters()));
-  }
-  __ b(wrong_num_arguments, NE);
-  __ Bind(&correct_type_args_len);
-}
-
-// Input parameters:
-//   R4: arguments descriptor array.
-void FlowGraphCompiler::CopyParameters(bool expect_type_args,
-                                       bool check_arguments) {
-  Label wrong_num_arguments;
-  if (check_arguments) {
-    CheckTypeArgsLen(expect_type_args, &wrong_num_arguments);
-  }
-  __ Comment("Copy parameters");
-  const Function& function = parsed_function().function();
-  LocalScope* scope = parsed_function().node_sequence()->scope();
-  const int num_fixed_params = function.num_fixed_parameters();
-  const int num_opt_pos_params = function.NumOptionalPositionalParameters();
-  const int num_opt_named_params = function.NumOptionalNamedParameters();
-  const int num_params =
-      num_fixed_params + num_opt_pos_params + num_opt_named_params;
-  ASSERT(function.NumParameters() == num_params);
-  ASSERT(parsed_function().first_parameter_index() == kFirstLocalSlotFromFp);
-
-  // Check that min_num_pos_args <= num_pos_args <= max_num_pos_args,
-  // where num_pos_args is the number of positional arguments passed in.
-  const int min_num_pos_args = num_fixed_params;
-  const int max_num_pos_args = num_fixed_params + num_opt_pos_params;
-
-  __ LoadFieldFromOffset(R8, R4,
-                         ArgumentsDescriptor::positional_count_offset());
-
-  if (isolate()->strong()) {
-    __ AndImmediate(
-        R8, R8,
-        Smi::RawValue(
-            ArgumentsDescriptor::PositionalCountField::mask_in_place()));
-  }
-
-  // Check that min_num_pos_args <= num_pos_args.
-  __ CompareImmediate(R8, Smi::RawValue(min_num_pos_args));
-  __ b(&wrong_num_arguments, LT);
-  // Check that num_pos_args <= max_num_pos_args.
-  __ CompareImmediate(R8, Smi::RawValue(max_num_pos_args));
-  __ b(&wrong_num_arguments, GT);
-
-  // Copy positional arguments.
-  // Argument i passed at fp[kParamEndSlotFromFp + num_args - i] is copied
-  // to fp[kFirstLocalSlotFromFp - i].
-
-  __ LoadFieldFromOffset(R7, R4, ArgumentsDescriptor::count_offset());
-  // Since R7 and R8 are Smi, use LSL 2 instead of LSL 3.
-  // Let R7 point to the last passed positional argument, i.e. to
-  // fp[kParamEndSlotFromFp + num_args - (num_pos_args - 1)].
-  __ sub(R7, R7, Operand(R8));
-  __ add(R7, FP, Operand(R7, LSL, 2));
-  __ add(R7, R7, Operand((kParamEndSlotFromFp + 1) * kWordSize));
-
-  // Let R6 point to the last copied positional argument, i.e. to
-  // fp[kFirstLocalSlotFromFp - (num_pos_args - 1)].
-  __ AddImmediate(R6, FP, (kFirstLocalSlotFromFp + 1) * kWordSize);
-  __ sub(R6, R6, Operand(R8, LSL, 2));  // R8 is a Smi.
-  __ SmiUntag(R8);
-  Label loop, loop_condition;
-  __ b(&loop_condition);
-  // We do not use the final allocation index of the variable here, i.e.
-  // scope->VariableAt(i)->index(), because captured variables still need
-  // to be copied to the context that is not yet allocated.
-  const Address argument_addr(R7, R8, UXTX, Address::Scaled);
-  const Address copy_addr(R6, R8, UXTX, Address::Scaled);
-  __ Bind(&loop);
-  __ ldr(TMP, argument_addr);
-  __ str(TMP, copy_addr);
-  __ Bind(&loop_condition);
-  __ subs(R8, R8, Operand(1));
-  __ b(&loop, PL);
-
-  // Copy or initialize optional named arguments.
-  Label all_arguments_processed;
-#ifdef DEBUG
-  const bool check_correct_named_args = true;
-#else
-  const bool check_correct_named_args = check_arguments;
-#endif
-  if (num_opt_named_params > 0) {
-    // Start by alphabetically sorting the names of the optional parameters.
-    LocalVariable** opt_param = new LocalVariable*[num_opt_named_params];
-    int* opt_param_position = new int[num_opt_named_params];
-    for (int pos = num_fixed_params; pos < num_params; pos++) {
-      LocalVariable* parameter = scope->VariableAt(pos);
-      const String& opt_param_name = parameter->name();
-      int i = pos - num_fixed_params;
-      while (--i >= 0) {
-        LocalVariable* param_i = opt_param[i];
-        const intptr_t result = opt_param_name.CompareTo(param_i->name());
-        ASSERT(result != 0);
-        if (result > 0) break;
-        opt_param[i + 1] = opt_param[i];
-        opt_param_position[i + 1] = opt_param_position[i];
-      }
-      opt_param[i + 1] = parameter;
-      opt_param_position[i + 1] = pos;
-    }
-    // Generate code handling each optional parameter in alphabetical order.
-    __ LoadFieldFromOffset(R7, R4, ArgumentsDescriptor::count_offset());
-    // Let R7 point to the first passed argument, i.e. to
-    // fp[kParamEndSlotFromFp + num_args - 0]; num_args (R7) is Smi.
-    __ add(R7, FP, Operand(R7, LSL, 2));
-    __ AddImmediate(R7, kParamEndSlotFromFp * kWordSize);
-    // Let R6 point to the entry of the first named argument.
-    __ add(R6, R4,
-           Operand(ArgumentsDescriptor::first_named_entry_offset() -
-                   kHeapObjectTag));
-    for (int i = 0; i < num_opt_named_params; i++) {
-      Label load_default_value, assign_optional_parameter;
-      const int param_pos = opt_param_position[i];
-      // Check if this named parameter was passed in.
-      // Load R5 with the name of the argument.
-      __ LoadFromOffset(R5, R6, ArgumentsDescriptor::name_offset());
-      ASSERT(opt_param[i]->name().IsSymbol());
-      __ CompareObject(R5, opt_param[i]->name());
-      __ b(&load_default_value, NE);
-      // Load R5 with passed-in argument at provided arg_pos, i.e. at
-      // fp[kParamEndSlotFromFp + num_args - arg_pos].
-      __ LoadFromOffset(R5, R6, ArgumentsDescriptor::position_offset());
-      if (isolate()->strong()) {
-        __ AndImmediate(
-            R5, R5,
-            Smi::RawValue(
-                ArgumentsDescriptor::PositionalCountField::mask_in_place()));
-      }
-      // R5 is arg_pos as Smi.
-      // Point to next named entry.
-      __ add(R6, R6, Operand(ArgumentsDescriptor::named_entry_size()));
-      // Negate and untag R5 so we can use in scaled address mode.
-      __ subs(R5, ZR, Operand(R5, ASR, 1));
-      Address argument_addr(R7, R5, UXTX, Address::Scaled);  // R5 is untagged.
-      __ ldr(R5, argument_addr);
-      __ b(&assign_optional_parameter);
-      __ Bind(&load_default_value);
-      // Load R5 with default argument.
-      const Instance& value = parsed_function().DefaultParameterValueAt(
-          param_pos - num_fixed_params);
-      __ LoadObject(R5, value);
-      __ Bind(&assign_optional_parameter);
-      // Assign R5 to fp[kFirstLocalSlotFromFp - param_pos].
-      // We do not use the final allocation index of the variable here, i.e.
-      // scope->VariableAt(i)->index(), because captured variables still need
-      // to be copied to the context that is not yet allocated.
-      const intptr_t computed_param_pos = kFirstLocalSlotFromFp - param_pos;
-      __ StoreToOffset(R5, FP, computed_param_pos * kWordSize);
-    }
-    delete[] opt_param;
-    delete[] opt_param_position;
-    if (check_correct_named_args) {
-      // Check that R6 now points to the null terminator in the arguments
-      // descriptor.
-      __ ldr(R5, Address(R6));
-      __ CompareObject(R5, Object::null_object());
-      __ b(&all_arguments_processed, EQ);
-    }
-  } else {
-    ASSERT(num_opt_pos_params > 0);
-    __ LoadFieldFromOffset(R8, R4,
-                           ArgumentsDescriptor::positional_count_offset());
-    __ SmiUntag(R8);
-    if (isolate()->strong()) {
-      __ AndImmediate(
-          R8, R8, ArgumentsDescriptor::PositionalCountField::mask_in_place());
-    }
-    for (int i = 0; i < num_opt_pos_params; i++) {
-      Label next_parameter;
-      // Handle this optional positional parameter only if k or fewer positional
-      // arguments have been passed, where k is param_pos, the position of this
-      // optional parameter in the formal parameter list.
-      const int param_pos = num_fixed_params + i;
-      __ CompareImmediate(R8, param_pos);
-      __ b(&next_parameter, GT);
-      // Load R5 with default argument.
-      const Object& value = parsed_function().DefaultParameterValueAt(i);
-      __ LoadObject(R5, value);
-      // Assign R5 to fp[kFirstLocalSlotFromFp - param_pos].
-      // We do not use the final allocation index of the variable here, i.e.
-      // scope->VariableAt(i)->index(), because captured variables still need
-      // to be copied to the context that is not yet allocated.
-      const intptr_t computed_param_pos = kFirstLocalSlotFromFp - param_pos;
-      __ StoreToOffset(R5, FP, computed_param_pos * kWordSize);
-      __ Bind(&next_parameter);
-    }
-    if (check_correct_named_args) {
-      __ LoadFieldFromOffset(R7, R4, ArgumentsDescriptor::count_offset());
-      __ SmiUntag(R7);
-      // Check that R8 equals R7, i.e. no named arguments passed.
-      __ CompareRegisters(R8, R7);
-      __ b(&all_arguments_processed, EQ);
-    }
-  }
-
-  __ Bind(&wrong_num_arguments);
-  if (check_arguments) {
-    __ LeaveDartFrame(kKeepCalleePP);  // The arguments are still on the stack.
-    __ BranchPatchable(*StubCode::CallClosureNoSuchMethod_entry());
-    // The noSuchMethod call may return to the caller, but not here.
-  } else if (check_correct_named_args) {
-    __ Stop("Wrong arguments");
-  }
-
-  __ Bind(&all_arguments_processed);
-  // Nullify originally passed arguments only after they have been copied and
-  // checked, otherwise noSuchMethod would not see their original values.
-  // This step can be skipped in case we decide that formal parameters are
-  // implicitly final, since garbage collecting the unmodified value is not
-  // an issue anymore.
-
-  // R4 : arguments descriptor array.
-  __ LoadFieldFromOffset(R8, R4, ArgumentsDescriptor::count_offset());
-  __ SmiUntag(R8);
-  __ add(R7, FP, Operand((kParamEndSlotFromFp + 1) * kWordSize));
-  const Address original_argument_addr(R7, R8, UXTX, Address::Scaled);
-  __ LoadObject(TMP, Object::null_object());
-  Label null_args_loop, null_args_loop_condition;
-  __ b(&null_args_loop_condition);
-  __ Bind(&null_args_loop);
-  __ str(TMP, original_argument_addr);
-  __ Bind(&null_args_loop_condition);
-  __ subs(R8, R8, Operand(1));
-  __ b(&null_args_loop, PL);
-}
-
 void FlowGraphCompiler::GenerateInlinedGetter(intptr_t offset) {
   // LR: return address.
   // SP: receiver.
@@ -982,8 +734,7 @@
   }
   __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
-    intptr_t extra_slots = StackSize() - flow_graph().num_stack_locals() -
-                           flow_graph().num_copied_params();
+    intptr_t extra_slots = StackSize() - flow_graph().num_stack_locals();
     ASSERT(extra_slots >= 0);
     __ EnterOsrFrame(extra_slots * kWordSize, new_pp);
   } else {
@@ -1001,9 +752,8 @@
 //   R4: arguments descriptor array.
 void FlowGraphCompiler::CompileGraph() {
   InitCompiler();
-  const Function& function = parsed_function().function();
-
 #ifdef DART_PRECOMPILER
+  const Function& function = parsed_function().function();
   if (function.IsDynamicFunction()) {
     __ MonomorphicCheckedEntry();
   }
@@ -1017,116 +767,26 @@
   EmitFrameEntry();
   ASSERT(assembler()->constant_pool_allowed());
 
-  const int num_fixed_params = function.num_fixed_parameters();
-  const int num_copied_params = parsed_function().num_copied_params();
-  const int num_locals = parsed_function().num_stack_locals();
-
-  // The prolog of OSR functions is never executed, hence greatly simplified.
-  const bool expect_type_args = isolate()->reify_generic_functions() &&
-                                function.IsGeneric() &&
-                                !flow_graph().IsCompiledForOsr();
-
-  const bool check_arguments =
-      (function.IsClosureFunction() || function.IsConvertedClosureFunction()) &&
-      !flow_graph().IsCompiledForOsr();
-
-  // We check the number of passed arguments when we have to copy them due to
-  // the presence of optional parameters.
-  // No such checking code is generated if only fixed parameters are declared,
-  // unless we are in debug mode or unless we are compiling a closure.
-  if (num_copied_params == 0) {
-    if (check_arguments) {
-      Label correct_num_arguments, wrong_num_arguments;
-      CheckTypeArgsLen(expect_type_args, &wrong_num_arguments);
-      __ Comment("Check argument count");
-      // Check that exactly num_fixed arguments are passed in.
-      __ LoadFieldFromOffset(R0, R4, ArgumentsDescriptor::count_offset());
-      __ CompareImmediate(R0, Smi::RawValue(num_fixed_params));
-      __ b(&wrong_num_arguments, NE);
-      __ LoadFieldFromOffset(R1, R4,
-                             ArgumentsDescriptor::positional_count_offset());
-      if (isolate()->strong()) {
-        __ AndImmediate(
-            R1, R1,
-            Smi::RawValue(
-                ArgumentsDescriptor::PositionalCountField::mask_in_place()));
-      }
-      __ CompareRegisters(R0, R1);
-      __ b(&correct_num_arguments, EQ);
-      __ Bind(&wrong_num_arguments);
-      __ LeaveDartFrame(kKeepCalleePP);  // Arguments are still on the stack.
-      __ BranchPatchable(*StubCode::CallClosureNoSuchMethod_entry());
-      // The noSuchMethod call may return to the caller, but not here.
-      __ Bind(&correct_num_arguments);
-    }
-  } else if (!flow_graph().IsCompiledForOsr()) {
-    CopyParameters(expect_type_args, check_arguments);
-  }
-
-  if (function.IsClosureFunction() && !flow_graph().IsCompiledForOsr()) {
-    // Load context from the closure object (first argument).
-    LocalScope* scope = parsed_function().node_sequence()->scope();
-    LocalVariable* closure_parameter = scope->VariableAt(0);
-    __ ldr(CTX, Address(FP, closure_parameter->index() * kWordSize));
-    __ ldr(CTX, FieldAddress(CTX, Closure::context_offset()));
-  }
-
-  // In unoptimized code, initialize (non-argument) stack allocated slots to
-  // null.
+  // In unoptimized code, initialize (non-argument) stack allocated slots.
   if (!is_optimizing()) {
-    ASSERT(num_locals > 0);  // There is always at least context_var.
+    const int num_locals = parsed_function().num_stack_locals();
+
+    intptr_t args_desc_index = -1;
+    if (parsed_function().has_arg_desc_var()) {
+      args_desc_index =
+          -(parsed_function().arg_desc_var()->index() - kFirstLocalSlotFromFp);
+    }
+
     __ Comment("Initialize spill slots");
-    const intptr_t slot_base = parsed_function().first_stack_local_index();
-    const intptr_t context_index =
-        parsed_function().current_context_var()->index();
-    if (num_locals > 1) {
+    if (num_locals > 1 || (num_locals == 1 && args_desc_index == -1)) {
       __ LoadObject(R0, Object::null_object());
     }
     for (intptr_t i = 0; i < num_locals; ++i) {
-      // Subtract index i (locals lie at lower addresses than FP).
-      if (((slot_base - i) == context_index)) {
-        if (function.IsClosureFunction()) {
-          __ StoreToOffset(CTX, FP, (slot_base - i) * kWordSize);
-        } else {
-          __ LoadObject(R1, Object::empty_context());
-          __ StoreToOffset(R1, FP, (slot_base - i) * kWordSize);
-        }
-      } else {
-        ASSERT(num_locals > 1);
-        __ StoreToOffset(R0, FP, (slot_base - i) * kWordSize);
-      }
+      Register value_reg = i == args_desc_index ? ARGS_DESC_REG : R0;
+      __ StoreToOffset(value_reg, FP, (kFirstLocalSlotFromFp - i) * kWordSize);
     }
   }
 
-  // Copy passed-in type argument vector if the function is generic.
-  if (expect_type_args) {
-    __ Comment("Copy passed-in type args");
-    Label store_type_args, ok;
-    __ LoadFieldFromOffset(R0, R4, ArgumentsDescriptor::type_args_len_offset());
-    __ CompareImmediate(R0, Smi::RawValue(0));
-    if (is_optimizing()) {
-      // Initialize type_args to null if none passed in.
-      __ LoadObject(R0, Object::null_object());
-      __ b(&store_type_args, EQ);
-    } else {
-      __ b(&ok, EQ);  // Already initialized to null.
-    }
-    // Load the passed type args vector in R0 from
-    // fp[kParamEndSlotFromFp + num_args + 1]; num_args (R1) is Smi.
-    __ LoadFieldFromOffset(R1, R4, ArgumentsDescriptor::count_offset());
-    __ add(R1, FP, Operand(R1, LSL, 2));
-    __ LoadFromOffset(R0, R1, (kParamEndSlotFromFp + 1) * kWordSize);
-    // Store R0 into the stack slot reserved for the function type arguments.
-    // If the function type arguments variable is captured, a copy will happen
-    // after the context is allocated.
-    const intptr_t slot_base = parsed_function().first_stack_local_index();
-    ASSERT(parsed_function().function_type_arguments()->is_captured() ||
-           parsed_function().function_type_arguments()->index() == slot_base);
-    __ Bind(&store_type_args);
-    __ StoreToOffset(R0, FP, slot_base * kWordSize);
-    __ Bind(&ok);
-  }
-
   EndCodeSourceRange(TokenPosition::kDartCodePrologue);
   VisitBlocks();
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc b/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc
index ed8e75d..e11a330 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc
@@ -308,122 +308,29 @@
 void FlowGraphCompiler::EmitFrameEntry() {
   const Function& function = parsed_function().function();
   const intptr_t num_fixed_params = function.num_fixed_parameters();
-  const int num_opt_pos_params = function.NumOptionalPositionalParameters();
-  const int num_opt_named_params = function.NumOptionalNamedParameters();
-  const int num_params =
-      num_fixed_params + num_opt_pos_params + num_opt_named_params;
-  const bool has_optional_params =
-      (num_opt_pos_params != 0) || (num_opt_named_params != 0);
   const int num_locals = parsed_function().num_stack_locals();
-  const intptr_t context_index =
-      -parsed_function().current_context_var()->index() - 1;
 
   if (CanOptimizeFunction() && function.IsOptimizable() &&
       (!is_optimizing() || may_reoptimize())) {
     __ HotCheck(!is_optimizing(), GetOptimizationThreshold());
   }
 
-  if (has_optional_params) {
-    __ EntryOptional(num_fixed_params, num_opt_pos_params,
-                     num_opt_named_params);
-  } else if (!is_optimizing()) {
-    __ Entry(num_fixed_params, num_locals, context_index);
-  } else {
+  if (is_optimizing()) {
     __ EntryOptimized(num_fixed_params,
                       flow_graph_.graph_entry()->spill_slot_count());
+  } else {
+    __ Entry(num_locals);
   }
 
-  if (num_opt_named_params != 0) {
-    LocalScope* scope = parsed_function().node_sequence()->scope();
-
-    // Start by alphabetically sorting the names of the optional parameters.
-    LocalVariable** opt_param =
-        zone()->Alloc<LocalVariable*>(num_opt_named_params);
-    int* opt_param_position = zone()->Alloc<int>(num_opt_named_params);
-    for (int pos = num_fixed_params; pos < num_params; pos++) {
-      LocalVariable* parameter = scope->VariableAt(pos);
-      const String& opt_param_name = parameter->name();
-      int i = pos - num_fixed_params;
-      while (--i >= 0) {
-        LocalVariable* param_i = opt_param[i];
-        const intptr_t result = opt_param_name.CompareTo(param_i->name());
-        ASSERT(result != 0);
-        if (result > 0) break;
-        opt_param[i + 1] = opt_param[i];
-        opt_param_position[i + 1] = opt_param_position[i];
-      }
-      opt_param[i + 1] = parameter;
-      opt_param_position[i + 1] = pos;
-    }
-
-    for (intptr_t i = 0; i < num_opt_named_params; i++) {
-      const int param_pos = opt_param_position[i];
-      const Instance& value = parsed_function().DefaultParameterValueAt(
-          param_pos - num_fixed_params);
-      __ LoadConstant(param_pos, opt_param[i]->name());
-      __ LoadConstant(param_pos, value);
-    }
-  } else if (num_opt_pos_params != 0) {
-    for (intptr_t i = 0; i < num_opt_pos_params; i++) {
-      const Object& value = parsed_function().DefaultParameterValueAt(i);
-      __ LoadConstant(num_fixed_params + i, value);
-    }
-  }
-
-  if (has_optional_params) {
-    if (!is_optimizing()) {
-      ASSERT(num_locals > 0);  // There is always at least context_var.
-      __ Frame(num_locals);    // Reserve space for locals.
-    } else if (flow_graph_.graph_entry()->spill_slot_count() >
-               flow_graph_.num_copied_params()) {
-      __ Frame(flow_graph_.graph_entry()->spill_slot_count() -
-               flow_graph_.num_copied_params());
-    }
-  }
-
-  const bool expect_type_arguments =
-      isolate()->reify_generic_functions() && function.IsGeneric();
-  if (function.IsClosureFunction()) {
-    // In optimized mode the register allocator expects CurrentContext in the
-    // flow_graph_.num_copied_params() register at function entry, unless that
-    // register is used for function type arguments, either as their
-    // permanent location or as their temporary location when captured.
-    // In that case, the next register holds CurrentContext.
-    // (see FlowGraphAllocator::ProcessInitialDefinition)
-    Register context_reg =
-        is_optimizing()
-            ? (expect_type_arguments ? flow_graph_.num_copied_params() + 1
-                                     : flow_graph_.num_copied_params())
-            : context_index;
-    LocalScope* scope = parsed_function().node_sequence()->scope();
-    LocalVariable* local = scope->VariableAt(0);  // Closure instance receiver.
-
-    Register closure_reg;
-    if (local->index() > 0) {
-      __ Move(context_reg, -local->index());
-      closure_reg = context_reg;
-    } else {
-      closure_reg = -local->index() - 1;
-    }
-    __ LoadField(context_reg, closure_reg,
-                 Closure::context_offset() / kWordSize);
-  } else if (has_optional_params && !is_optimizing()) {
-    __ LoadConstant(context_index, Object::empty_context());
-  }
-
-  if (isolate()->reify_generic_functions()) {
-    // Check for a passed type argument vector if the function is generic, or
-    // check that none is passed if not generic and not already checked during
-    // resolution.
-    const bool check_arguments =
-        (function.IsClosureFunction() || function.IsConvertedClosureFunction());
-    if ((expect_type_arguments || check_arguments) &&
-        !flow_graph().IsCompiledForOsr()) {
-      ASSERT(!expect_type_arguments ||
-             (-parsed_function().first_stack_local_index() - 1 ==
-              flow_graph_.num_copied_params()));
-      __ CheckFunctionTypeArgs(function.NumTypeParameters(),
-                               flow_graph_.num_copied_params());
+  if (!is_optimizing()) {
+    if (parsed_function().has_arg_desc_var()) {
+      // TODO(kustermann): If dbc simulator put the args_desc_ into the
+      // _special_regs, we could replace these 3 with the MoveSpecial bytecode.
+      const intptr_t args_desc_index =
+          -(parsed_function().arg_desc_var()->index() - kFirstLocalSlotFromFp);
+      __ LoadArgDescriptor();
+      __ StoreLocal(args_desc_index);
+      __ Drop(1);
     }
   }
 }
@@ -450,10 +357,13 @@
 }
 
 intptr_t FlowGraphCompiler::CatchEntryRegForVariable(const LocalVariable& var) {
+  const Function& function = parsed_function().function();
+  const intptr_t num_non_copied_params =
+      function.HasOptionalParameters() ? 0 : function.NumParameters();
+
   ASSERT(is_optimizing());
   ASSERT(var.index() <= 0);
-  return kNumberOfCpuRegisters -
-         (flow_graph().num_non_copied_params() - var.index());
+  return kNumberOfCpuRegisters - (num_non_copied_params - var.index());
 }
 
 #undef __
@@ -470,6 +380,9 @@
     __ Move(destination.reg(), -kParamEndSlotFromFp + source.stack_index());
   } else if (source.IsRegister() && destination.IsRegister()) {
     __ Move(destination.reg(), source.reg());
+  } else if (source.IsArgsDescRegister()) {
+    ASSERT(destination.IsRegister());
+    __ LoadArgDescriptorOpt(destination.reg());
   } else if (source.IsConstant() && destination.IsRegister()) {
     if (source.constant_instruction()->representation() == kUnboxedDouble) {
       const Register result = destination.reg();
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
index 358c587..56c93d4 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
@@ -713,258 +713,6 @@
   }
 }
 
-// Input parameters:
-//   EDX: arguments descriptor array.
-void FlowGraphCompiler::CheckTypeArgsLen(bool expect_type_args,
-                                         Label* wrong_num_arguments) {
-  __ Comment("Check type args len");
-  const Function& function = parsed_function().function();
-  Label correct_type_args_len;
-  if (expect_type_args) {
-    // Type args are always optional, so length can always be zero.
-    // If expect_type_args, a non-zero length must match the declaration length.
-    __ movl(EAX,
-            FieldAddress(EDX, ArgumentsDescriptor::type_args_len_offset()));
-    if (isolate()->strong()) {
-      __ andl(EAX,
-              Immediate(Smi::RawValue(
-                  ArgumentsDescriptor::TypeArgsLenField::mask_in_place())));
-    }
-    __ cmpl(EAX, Immediate(Smi::RawValue(0)));
-    __ j(EQUAL, &correct_type_args_len, Assembler::kNearJump);
-    __ cmpl(EAX, Immediate(Smi::RawValue(function.NumTypeParameters())));
-  } else {
-    __ cmpl(FieldAddress(EDX, ArgumentsDescriptor::type_args_len_offset()),
-            Immediate(Smi::RawValue(0)));
-  }
-  __ j(NOT_EQUAL, wrong_num_arguments);
-  __ Bind(&correct_type_args_len);
-}
-
-// Input parameters:
-//   EDX: arguments descriptor array.
-void FlowGraphCompiler::CopyParameters(bool expect_type_args,
-                                       bool check_arguments) {
-  Label wrong_num_arguments;
-  if (check_arguments) {
-    CheckTypeArgsLen(expect_type_args, &wrong_num_arguments);
-  }
-  __ Comment("Copy parameters");
-  const Function& function = parsed_function().function();
-  LocalScope* scope = parsed_function().node_sequence()->scope();
-  const int num_fixed_params = function.num_fixed_parameters();
-  const int num_opt_pos_params = function.NumOptionalPositionalParameters();
-  const int num_opt_named_params = function.NumOptionalNamedParameters();
-  const int num_params =
-      num_fixed_params + num_opt_pos_params + num_opt_named_params;
-  ASSERT(function.NumParameters() == num_params);
-  ASSERT(parsed_function().first_parameter_index() == kFirstLocalSlotFromFp);
-
-  // Check that min_num_pos_args <= num_pos_args <= max_num_pos_args,
-  // where num_pos_args is the number of positional arguments passed in.
-  const int min_num_pos_args = num_fixed_params;
-  const int max_num_pos_args = num_fixed_params + num_opt_pos_params;
-
-  __ movl(ECX,
-          FieldAddress(EDX, ArgumentsDescriptor::positional_count_offset()));
-
-  if (isolate()->strong()) {
-    __ andl(ECX,
-            Immediate(Smi::RawValue(
-                ArgumentsDescriptor::PositionalCountField::mask_in_place())));
-  }
-
-  // Check that min_num_pos_args <= num_pos_args.
-  __ cmpl(ECX, Immediate(Smi::RawValue(min_num_pos_args)));
-  __ j(LESS, &wrong_num_arguments);
-  // Check that num_pos_args <= max_num_pos_args.
-  __ cmpl(ECX, Immediate(Smi::RawValue(max_num_pos_args)));
-  __ j(GREATER, &wrong_num_arguments);
-
-  // Copy positional arguments.
-  // Argument i passed at fp[kParamEndSlotFromFp + num_args - i] is copied
-  // to fp[kFirstLocalSlotFromFp - i].
-
-  __ movl(EBX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
-  // Since EBX and ECX are Smi, use TIMES_2 instead of TIMES_4.
-  // Let EBX point to the last passed positional argument, i.e. to
-  // fp[kParamEndSlotFromFp + num_args - (num_pos_args - 1)].
-  __ subl(EBX, ECX);
-  __ leal(EBX,
-          Address(EBP, EBX, TIMES_2, (kParamEndSlotFromFp + 1) * kWordSize));
-
-  // Let EDI point to the last copied positional argument, i.e. to
-  // fp[kFirstLocalSlotFromFp - (num_pos_args - 1)].
-  __ leal(EDI, Address(EBP, (kFirstLocalSlotFromFp + 1) * kWordSize));
-  __ subl(EDI, ECX);  // ECX is a Smi, subtract twice for TIMES_4 scaling.
-  __ subl(EDI, ECX);
-  __ SmiUntag(ECX);
-  Label loop, loop_condition;
-  __ jmp(&loop_condition, Assembler::kNearJump);
-  // We do not use the final allocation index of the variable here, i.e.
-  // scope->VariableAt(i)->index(), because captured variables still need
-  // to be copied to the context that is not yet allocated.
-  const Address argument_addr(EBX, ECX, TIMES_4, 0);
-  const Address copy_addr(EDI, ECX, TIMES_4, 0);
-  __ Bind(&loop);
-  __ movl(EAX, argument_addr);
-  __ movl(copy_addr, EAX);
-  __ Bind(&loop_condition);
-  __ decl(ECX);
-  __ j(POSITIVE, &loop, Assembler::kNearJump);
-
-  // Copy or initialize optional named arguments.
-  const Immediate& raw_null =
-      Immediate(reinterpret_cast<intptr_t>(Object::null()));
-  Label all_arguments_processed;
-#ifdef DEBUG
-  const bool check_correct_named_args = true;
-#else
-  const bool check_correct_named_args = check_arguments;
-#endif
-  if (num_opt_named_params > 0) {
-    // Start by alphabetically sorting the names of the optional parameters.
-    LocalVariable** opt_param = new LocalVariable*[num_opt_named_params];
-    int* opt_param_position = new int[num_opt_named_params];
-    for (int pos = num_fixed_params; pos < num_params; pos++) {
-      LocalVariable* parameter = scope->VariableAt(pos);
-      const String& opt_param_name = parameter->name();
-      int i = pos - num_fixed_params;
-      while (--i >= 0) {
-        LocalVariable* param_i = opt_param[i];
-        const intptr_t result = opt_param_name.CompareTo(param_i->name());
-        ASSERT(result != 0);
-        if (result > 0) break;
-        opt_param[i + 1] = opt_param[i];
-        opt_param_position[i + 1] = opt_param_position[i];
-      }
-      opt_param[i + 1] = parameter;
-      opt_param_position[i + 1] = pos;
-    }
-    // Generate code handling each optional parameter in alphabetical order.
-    __ movl(EBX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
-    // Let EBX point to the first passed argument, i.e. to
-    // fp[kParamEndSlotFromFp + num_args - 0]; num_args (EBX) is Smi.
-    __ leal(EBX, Address(EBP, EBX, TIMES_2, kParamEndSlotFromFp * kWordSize));
-    // Let EDI point to the entry of the first named argument.
-    __ leal(EDI,
-            FieldAddress(EDX, ArgumentsDescriptor::first_named_entry_offset()));
-    for (int i = 0; i < num_opt_named_params; i++) {
-      Label load_default_value, assign_optional_parameter;
-      const int param_pos = opt_param_position[i];
-      // Check if this named parameter was passed in.
-      // Load EAX with the name of the argument.
-      __ movl(EAX, Address(EDI, ArgumentsDescriptor::name_offset()));
-      ASSERT(opt_param[i]->name().IsSymbol());
-      __ CompareObject(EAX, opt_param[i]->name());
-      __ j(NOT_EQUAL, &load_default_value, Assembler::kNearJump);
-      // Load EAX with passed-in argument at provided arg_pos, i.e. at
-      // fp[kParamEndSlotFromFp + num_args - arg_pos].
-      __ movl(EAX, Address(EDI, ArgumentsDescriptor::position_offset()));
-      if (isolate()->strong()) {
-        __ andl(
-            EAX,
-            Immediate(Smi::RawValue(
-                ArgumentsDescriptor::PositionalCountField::mask_in_place())));
-      }
-      // EAX is arg_pos as Smi.
-      // Point to next named entry.
-      __ addl(EDI, Immediate(ArgumentsDescriptor::named_entry_size()));
-      __ negl(EAX);
-      Address argument_addr(EBX, EAX, TIMES_2, 0);  // EAX is a negative Smi.
-      __ movl(EAX, argument_addr);
-      __ jmp(&assign_optional_parameter, Assembler::kNearJump);
-      __ Bind(&load_default_value);
-      // Load EAX with default argument.
-      const Instance& value = parsed_function().DefaultParameterValueAt(
-          param_pos - num_fixed_params);
-      __ LoadObject(EAX, value);
-      __ Bind(&assign_optional_parameter);
-      // Assign EAX to fp[kFirstLocalSlotFromFp - param_pos].
-      // We do not use the final allocation index of the variable here, i.e.
-      // scope->VariableAt(i)->index(), because captured variables still need
-      // to be copied to the context that is not yet allocated.
-      const intptr_t computed_param_pos = kFirstLocalSlotFromFp - param_pos;
-      const Address param_addr(EBP, computed_param_pos * kWordSize);
-      __ movl(param_addr, EAX);
-    }
-    delete[] opt_param;
-    delete[] opt_param_position;
-    if (check_correct_named_args) {
-      // Check that EDI now points to the null terminator in the arguments
-      // descriptor.
-      __ cmpl(Address(EDI, 0), raw_null);
-      __ j(EQUAL, &all_arguments_processed, Assembler::kNearJump);
-    }
-  } else {
-    ASSERT(num_opt_pos_params > 0);
-    __ movl(ECX,
-            FieldAddress(EDX, ArgumentsDescriptor::positional_count_offset()));
-    __ SmiUntag(ECX);
-    if (isolate()->strong()) {
-      __ andl(ECX,
-              Immediate(
-                  ArgumentsDescriptor::PositionalCountField::mask_in_place()));
-    }
-    for (int i = 0; i < num_opt_pos_params; i++) {
-      Label next_parameter;
-      // Handle this optional positional parameter only if k or fewer positional
-      // arguments have been passed, where k is param_pos, the position of this
-      // optional parameter in the formal parameter list.
-      const int param_pos = num_fixed_params + i;
-      __ cmpl(ECX, Immediate(param_pos));
-      __ j(GREATER, &next_parameter, Assembler::kNearJump);
-      // Load EAX with default argument.
-      const Object& value = parsed_function().DefaultParameterValueAt(i);
-      __ LoadObject(EAX, value);
-      // Assign EAX to fp[kFirstLocalSlotFromFp - param_pos].
-      // We do not use the final allocation index of the variable here, i.e.
-      // scope->VariableAt(i)->index(), because captured variables still need
-      // to be copied to the context that is not yet allocated.
-      const intptr_t computed_param_pos = kFirstLocalSlotFromFp - param_pos;
-      const Address param_addr(EBP, computed_param_pos * kWordSize);
-      __ movl(param_addr, EAX);
-      __ Bind(&next_parameter);
-    }
-    if (check_correct_named_args) {
-      __ movl(EBX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
-      __ SmiUntag(EBX);
-      // Check that ECX equals EBX, i.e. no named arguments passed.
-      __ cmpl(ECX, EBX);
-      __ j(EQUAL, &all_arguments_processed, Assembler::kNearJump);
-    }
-  }
-
-  __ Bind(&wrong_num_arguments);
-  if (check_arguments) {
-    __ LeaveFrame();  // The arguments are still on the stack.
-    __ Jmp(*StubCode::CallClosureNoSuchMethod_entry());
-    // The noSuchMethod call may return to the caller, but not here.
-  } else if (check_correct_named_args) {
-    __ Stop("Wrong arguments");
-  }
-
-  __ Bind(&all_arguments_processed);
-  // Nullify originally passed arguments only after they have been copied and
-  // checked, otherwise noSuchMethod would not see their original values.
-  // This step can be skipped in case we decide that formal parameters are
-  // implicitly final, since garbage collecting the unmodified value is not
-  // an issue anymore.
-
-  // EDX : arguments descriptor array.
-  __ movl(ECX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
-  __ SmiUntag(ECX);
-  Label null_args_loop, null_args_loop_condition;
-  __ jmp(&null_args_loop_condition, Assembler::kNearJump);
-  const Address original_argument_addr(EBP, ECX, TIMES_4,
-                                       (kParamEndSlotFromFp + 1) * kWordSize);
-  __ Bind(&null_args_loop);
-  __ movl(original_argument_addr, raw_null);
-  __ Bind(&null_args_loop_condition);
-  __ decl(ECX);
-  __ j(POSITIVE, &null_args_loop, Assembler::kNearJump);
-}
-
 void FlowGraphCompiler::GenerateInlinedGetter(intptr_t offset) {
   // TOS: return address.
   // +1 : receiver.
@@ -1012,8 +760,7 @@
   }
   __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
-    intptr_t extra_slots = StackSize() - flow_graph().num_stack_locals() -
-                           flow_graph().num_copied_params();
+    intptr_t extra_slots = StackSize() - flow_graph().num_stack_locals();
     ASSERT(extra_slots >= 0);
     __ EnterOsrFrame(extra_slots * kWordSize);
   } else {
@@ -1032,139 +779,28 @@
 
   EmitFrameEntry();
 
-  const Function& function = parsed_function().function();
-
-  const int num_fixed_params = function.num_fixed_parameters();
-  const int num_copied_params = parsed_function().num_copied_params();
-  const int num_locals = parsed_function().num_stack_locals();
-
-  // The prolog of OSR functions is never executed, hence greatly simplified.
-  const bool expect_type_args = isolate()->reify_generic_functions() &&
-                                function.IsGeneric() &&
-                                !flow_graph().IsCompiledForOsr();
-
-  const bool check_arguments =
-      (function.IsClosureFunction() || function.IsConvertedClosureFunction()) &&
-      !flow_graph().IsCompiledForOsr();
-
-  // We check the number of passed arguments when we have to copy them due to
-  // the presence of optional parameters.
-  // No such checking code is generated if only fixed parameters are declared,
-  // unless we are in debug mode or unless we are compiling a closure.
-  if (num_copied_params == 0) {
-    if (check_arguments) {
-      Label correct_num_arguments, wrong_num_arguments;
-      CheckTypeArgsLen(expect_type_args, &wrong_num_arguments);
-      __ Comment("Check argument count");
-      // Check that exactly num_fixed arguments are passed in.
-      __ movl(EAX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
-      __ cmpl(EAX, Immediate(Smi::RawValue(num_fixed_params)));
-      __ j(NOT_EQUAL, &wrong_num_arguments, Assembler::kNearJump);
-
-      if (isolate()->strong()) {
-        __ movl(ECX, FieldAddress(
-                         EDX, ArgumentsDescriptor::positional_count_offset()));
-        __ andl(
-            ECX,
-            Immediate(Smi::RawValue(
-                ArgumentsDescriptor::PositionalCountField::mask_in_place())));
-        __ cmpl(EAX, ECX);
-      } else {
-        __ cmpl(EAX, FieldAddress(
-                         EDX, ArgumentsDescriptor::positional_count_offset()));
-      }
-
-      __ j(EQUAL, &correct_num_arguments, Assembler::kNearJump);
-
-      __ Bind(&wrong_num_arguments);
-      __ LeaveFrame();  // The arguments are still on the stack.
-      __ Jmp(*StubCode::CallClosureNoSuchMethod_entry());
-      // The noSuchMethod call may return to the caller, but not here.
-      __ Bind(&correct_num_arguments);
-    }
-  } else if (!flow_graph().IsCompiledForOsr()) {
-    CopyParameters(expect_type_args, check_arguments);
-  }
-
-  if (function.IsClosureFunction() && !flow_graph().IsCompiledForOsr()) {
-    // Load context from the closure object (first argument).
-    LocalScope* scope = parsed_function().node_sequence()->scope();
-    LocalVariable* closure_parameter = scope->VariableAt(0);
-    // TODO(fschneider): Don't load context for optimized functions that
-    // don't use it.
-    __ movl(CTX, Address(EBP, closure_parameter->index() * kWordSize));
-    __ movl(CTX, FieldAddress(CTX, Closure::context_offset()));
-#ifdef DEBUG
-    Label ok;
-    __ LoadClassId(EBX, CTX);
-    __ cmpl(EBX, Immediate(kContextCid));
-    __ j(EQUAL, &ok, Assembler::kNearJump);
-    __ Stop("Incorrect context at entry");
-    __ Bind(&ok);
-#endif
-  }
-
-  // In unoptimized code, initialize (non-argument) stack allocated slots to
-  // null.
+  // In unoptimized code, initialize (non-argument) stack allocated slots.
   if (!is_optimizing()) {
-    ASSERT(num_locals > 0);  // There is always at least context_var.
+    const int num_locals = parsed_function().num_stack_locals();
+
+    intptr_t args_desc_index = -1;
+    if (parsed_function().has_arg_desc_var()) {
+      args_desc_index =
+          -(parsed_function().arg_desc_var()->index() - kFirstLocalSlotFromFp);
+    }
+
     __ Comment("Initialize spill slots");
-    const intptr_t slot_base = parsed_function().first_stack_local_index();
-    const intptr_t context_index =
-        parsed_function().current_context_var()->index();
-    if (num_locals > 1) {
+    if (num_locals > 1 || args_desc_index != 0) {
       const Immediate& raw_null =
           Immediate(reinterpret_cast<intptr_t>(Object::null()));
       __ movl(EAX, raw_null);
     }
     for (intptr_t i = 0; i < num_locals; ++i) {
-      // Subtract index i (locals lie at lower addresses than EBP).
-      if (((slot_base - i) == context_index)) {
-        if (function.IsClosureFunction()) {
-          __ movl(Address(EBP, (slot_base - i) * kWordSize), CTX);
-        } else {
-          const Immediate& raw_empty_context = Immediate(
-              reinterpret_cast<intptr_t>(Object::empty_context().raw()));
-          __ movl(Address(EBP, (slot_base - i) * kWordSize), raw_empty_context);
-        }
-      } else {
-        ASSERT(num_locals > 1);
-        __ movl(Address(EBP, (slot_base - i) * kWordSize), EAX);
-      }
+      Register value_reg = i == args_desc_index ? ARGS_DESC_REG : EAX;
+      __ movl(Address(EBP, (kFirstLocalSlotFromFp - i) * kWordSize), value_reg);
     }
   }
 
-  // Copy passed-in type argument vector if the function is generic.
-  if (expect_type_args) {
-    __ Comment("Copy passed-in type args");
-    Label store_type_args, ok;
-    __ cmpl(FieldAddress(EDX, ArgumentsDescriptor::type_args_len_offset()),
-            Immediate(Smi::RawValue(0)));
-    if (is_optimizing()) {
-      // Initialize type_args to null if none passed in.
-      const Immediate& raw_null =
-          Immediate(reinterpret_cast<intptr_t>(Object::null()));
-      __ movl(EAX, raw_null);
-      __ j(EQUAL, &store_type_args, Assembler::kNearJump);
-    } else {
-      __ j(EQUAL, &ok, Assembler::kNearJump);  // Already initialized to null.
-    }
-    // Load the passed type args vector in EAX from
-    // fp[kParamEndSlotFromFp + num_args + 1]; num_args (EBX) is Smi.
-    __ movl(EBX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
-    __ movl(EAX,
-            Address(EBP, EBX, TIMES_2, (kParamEndSlotFromFp + 1) * kWordSize));
-    // Store EAX into the stack slot reserved for the function type arguments.
-    // If the function type arguments variable is captured, a copy will happen
-    // after the context is allocated.
-    const intptr_t slot_base = parsed_function().first_stack_local_index();
-    ASSERT(parsed_function().function_type_arguments()->is_captured() ||
-           parsed_function().function_type_arguments()->index() == slot_base);
-    __ Bind(&store_type_args);
-    __ movl(Address(EBP, slot_base * kWordSize), EAX);
-    __ Bind(&ok);
-  }
-
   EndCodeSourceRange(TokenPosition::kDartCodePrologue);
   ASSERT(!block_order().is_empty());
   VisitBlocks();
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index 76a51aa..ffa97bd 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -704,264 +704,6 @@
   }
 }
 
-// Input parameters:
-//   R10: arguments descriptor array.
-void FlowGraphCompiler::CheckTypeArgsLen(bool expect_type_args,
-                                         Label* wrong_num_arguments) {
-  __ Comment("Check type args len");
-  const Function& function = parsed_function().function();
-  Label correct_type_args_len;
-  if (expect_type_args) {
-    // Type args are always optional, so length can always be zero.
-    // If expect_type_args, a non-zero length must match the declaration length.
-    __ movq(RAX,
-            FieldAddress(R10, ArgumentsDescriptor::type_args_len_offset()));
-    if (isolate()->strong()) {
-      __ andq(RAX,
-              Immediate(Smi::RawValue(
-                  ArgumentsDescriptor::TypeArgsLenField::mask_in_place())));
-    }
-    __ CompareImmediate(RAX, Immediate(Smi::RawValue(0)));
-    __ j(EQUAL, &correct_type_args_len, Assembler::kNearJump);
-    __ CompareImmediate(RAX,
-                        Immediate(Smi::RawValue(function.NumTypeParameters())));
-  } else {
-    __ cmpq(FieldAddress(R10, ArgumentsDescriptor::type_args_len_offset()),
-            Immediate(Smi::RawValue(0)));
-  }
-  __ j(NOT_EQUAL, wrong_num_arguments);
-  __ Bind(&correct_type_args_len);
-}
-
-// Input parameters:
-//   R10: arguments descriptor array.
-void FlowGraphCompiler::CopyParameters(bool expect_type_args,
-                                       bool check_arguments) {
-  Label wrong_num_arguments;
-  if (check_arguments) {
-    CheckTypeArgsLen(expect_type_args, &wrong_num_arguments);
-  }
-  __ Comment("Copy parameters");
-  const Function& function = parsed_function().function();
-  LocalScope* scope = parsed_function().node_sequence()->scope();
-  const int num_fixed_params = function.num_fixed_parameters();
-  const int num_opt_pos_params = function.NumOptionalPositionalParameters();
-  const int num_opt_named_params = function.NumOptionalNamedParameters();
-  const int num_params =
-      num_fixed_params + num_opt_pos_params + num_opt_named_params;
-  ASSERT(function.NumParameters() == num_params);
-  ASSERT(parsed_function().first_parameter_index() == kFirstLocalSlotFromFp);
-
-  // Check that min_num_pos_args <= num_pos_args <= max_num_pos_args,
-  // where num_pos_args is the number of positional arguments passed in.
-  const int min_num_pos_args = num_fixed_params;
-  const int max_num_pos_args = num_fixed_params + num_opt_pos_params;
-
-  __ movq(RCX,
-          FieldAddress(R10, ArgumentsDescriptor::positional_count_offset()));
-
-  if (isolate()->strong()) {
-    __ andq(RCX,
-            Immediate(Smi::RawValue(
-                ArgumentsDescriptor::PositionalCountField::mask_in_place())));
-  }
-
-  // Check that min_num_pos_args <= num_pos_args.
-  __ CompareImmediate(RCX, Immediate(Smi::RawValue(min_num_pos_args)));
-  __ j(LESS, &wrong_num_arguments);
-  // Check that num_pos_args <= max_num_pos_args.
-  __ CompareImmediate(RCX, Immediate(Smi::RawValue(max_num_pos_args)));
-  __ j(GREATER, &wrong_num_arguments);
-
-  // Copy positional arguments.
-  // Argument i passed at fp[kParamEndSlotFromFp + num_args - i] is copied
-  // to fp[kFirstLocalSlotFromFp - i].
-
-  __ movq(RBX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
-  // Since RBX and RCX are Smi, use TIMES_4 instead of TIMES_8.
-  // Let RBX point to the last passed positional argument, i.e. to
-  // fp[kParamEndSlotFromFp + num_args - (num_pos_args - 1)].
-  __ subq(RBX, RCX);
-  __ leaq(RBX,
-          Address(RBP, RBX, TIMES_4, (kParamEndSlotFromFp + 1) * kWordSize));
-
-  // Let RDI point to the last copied positional argument, i.e. to
-  // fp[kFirstLocalSlotFromFp - (num_pos_args - 1)].
-  __ SmiUntag(RCX);
-  __ movq(RAX, RCX);
-  __ negq(RAX);
-  // -num_pos_args is in RAX.
-  __ leaq(RDI,
-          Address(RBP, RAX, TIMES_8, (kFirstLocalSlotFromFp + 1) * kWordSize));
-  Label loop, loop_condition;
-  __ jmp(&loop_condition, Assembler::kNearJump);
-  // We do not use the final allocation index of the variable here, i.e.
-  // scope->VariableAt(i)->index(), because captured variables still need
-  // to be copied to the context that is not yet allocated.
-  const Address argument_addr(RBX, RCX, TIMES_8, 0);
-  const Address copy_addr(RDI, RCX, TIMES_8, 0);
-  __ Bind(&loop);
-  __ movq(RAX, argument_addr);
-  __ movq(copy_addr, RAX);
-  __ Bind(&loop_condition);
-  __ decq(RCX);
-  __ j(POSITIVE, &loop, Assembler::kNearJump);
-
-  // Copy or initialize optional named arguments.
-  Label all_arguments_processed;
-#ifdef DEBUG
-  const bool check_correct_named_args = true;
-#else
-  const bool check_correct_named_args = check_arguments;
-#endif
-  if (num_opt_named_params > 0) {
-    // Start by alphabetically sorting the names of the optional parameters.
-    LocalVariable** opt_param = new LocalVariable*[num_opt_named_params];
-    int* opt_param_position = new int[num_opt_named_params];
-    for (int pos = num_fixed_params; pos < num_params; pos++) {
-      LocalVariable* parameter = scope->VariableAt(pos);
-      const String& opt_param_name = parameter->name();
-      int i = pos - num_fixed_params;
-      while (--i >= 0) {
-        LocalVariable* param_i = opt_param[i];
-        const intptr_t result = opt_param_name.CompareTo(param_i->name());
-        ASSERT(result != 0);
-        if (result > 0) break;
-        opt_param[i + 1] = opt_param[i];
-        opt_param_position[i + 1] = opt_param_position[i];
-      }
-      opt_param[i + 1] = parameter;
-      opt_param_position[i + 1] = pos;
-    }
-    // Generate code handling each optional parameter in alphabetical order.
-    __ movq(RBX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
-    // Let RBX point to the first passed argument, i.e. to
-    // fp[kParamEndSlotFromFp + num_args]; num_args (RBX) is Smi.
-    __ leaq(RBX, Address(RBP, RBX, TIMES_4, kParamEndSlotFromFp * kWordSize));
-    // Let RDI point to the entry of the first named argument.
-    __ leaq(RDI,
-            FieldAddress(R10, ArgumentsDescriptor::first_named_entry_offset()));
-    for (int i = 0; i < num_opt_named_params; i++) {
-      Label load_default_value, assign_optional_parameter;
-      const int param_pos = opt_param_position[i];
-      // Check if this named parameter was passed in.
-      // Load RAX with the name of the argument.
-      __ movq(RAX, Address(RDI, ArgumentsDescriptor::name_offset()));
-      ASSERT(opt_param[i]->name().IsSymbol());
-      __ CompareObject(RAX, opt_param[i]->name());
-      __ j(NOT_EQUAL, &load_default_value, Assembler::kNearJump);
-      // Load RAX with passed-in argument at provided arg_pos, i.e. at
-      // fp[kParamEndSlotFromFp + num_args - arg_pos].
-      __ movq(RAX, Address(RDI, ArgumentsDescriptor::position_offset()));
-      if (isolate()->strong()) {
-        __ andq(
-            RAX,
-            Immediate(Smi::RawValue(
-                ArgumentsDescriptor::PositionalCountField::mask_in_place())));
-      }
-      // RAX is arg_pos as Smi.
-      // Point to next named entry.
-      __ AddImmediate(RDI, Immediate(ArgumentsDescriptor::named_entry_size()));
-      __ negq(RAX);
-      Address argument_addr(RBX, RAX, TIMES_4, 0);  // RAX is a negative Smi.
-      __ movq(RAX, argument_addr);
-      __ jmp(&assign_optional_parameter, Assembler::kNearJump);
-      __ Bind(&load_default_value);
-      // Load RAX with default argument.
-      const Instance& value = parsed_function().DefaultParameterValueAt(
-          param_pos - num_fixed_params);
-      __ LoadObject(RAX, value);
-      __ Bind(&assign_optional_parameter);
-      // Assign RAX to fp[kFirstLocalSlotFromFp - param_pos].
-      // We do not use the final allocation index of the variable here, i.e.
-      // scope->VariableAt(i)->index(), because captured variables still need
-      // to be copied to the context that is not yet allocated.
-      const intptr_t computed_param_pos = kFirstLocalSlotFromFp - param_pos;
-      const Address param_addr(RBP, computed_param_pos * kWordSize);
-      __ movq(param_addr, RAX);
-    }
-    delete[] opt_param;
-    delete[] opt_param_position;
-    if (check_correct_named_args) {
-      // Check that RDI now points to the null terminator in the arguments
-      // descriptor.
-      __ LoadObject(TMP, Object::null_object());
-      __ cmpq(Address(RDI, 0), TMP);
-      __ j(EQUAL, &all_arguments_processed, Assembler::kNearJump);
-    }
-  } else {
-    ASSERT(num_opt_pos_params > 0);
-    __ movq(RCX,
-            FieldAddress(R10, ArgumentsDescriptor::positional_count_offset()));
-
-    __ SmiUntag(RCX);
-
-    if (isolate()->strong()) {
-      __ andq(RCX,
-              Immediate(
-                  ArgumentsDescriptor::PositionalCountField::mask_in_place()));
-    }
-
-    for (int i = 0; i < num_opt_pos_params; i++) {
-      Label next_parameter;
-      // Handle this optional positional parameter only if k or fewer positional
-      // arguments have been passed, where k is param_pos, the position of this
-      // optional parameter in the formal parameter list.
-      const int param_pos = num_fixed_params + i;
-      __ CompareImmediate(RCX, Immediate(param_pos));
-      __ j(GREATER, &next_parameter, Assembler::kNearJump);
-      // Load RAX with default argument.
-      const Object& value = parsed_function().DefaultParameterValueAt(i);
-      __ LoadObject(RAX, value);
-      // Assign RAX to fp[kFirstLocalSlotFromFp - param_pos].
-      // We do not use the final allocation index of the variable here, i.e.
-      // scope->VariableAt(i)->index(), because captured variables still need
-      // to be copied to the context that is not yet allocated.
-      const intptr_t computed_param_pos = kFirstLocalSlotFromFp - param_pos;
-      const Address param_addr(RBP, computed_param_pos * kWordSize);
-      __ movq(param_addr, RAX);
-      __ Bind(&next_parameter);
-    }
-    if (check_correct_named_args) {
-      __ movq(RBX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
-      __ SmiUntag(RBX);
-      // Check that RCX equals RBX, i.e. no named arguments passed.
-      __ cmpq(RCX, RBX);
-      __ j(EQUAL, &all_arguments_processed, Assembler::kNearJump);
-    }
-  }
-
-  __ Bind(&wrong_num_arguments);
-  if (check_arguments) {
-    __ LeaveDartFrame(kKeepCalleePP);  // The arguments are still on the stack.
-    __ Jmp(*StubCode::CallClosureNoSuchMethod_entry());
-    // The noSuchMethod call may return to the caller, but not here.
-  } else if (check_correct_named_args) {
-    __ Stop("Wrong arguments");
-  }
-
-  __ Bind(&all_arguments_processed);
-  // Nullify originally passed arguments only after they have been copied and
-  // checked, otherwise noSuchMethod would not see their original values.
-  // This step can be skipped in case we decide that formal parameters are
-  // implicitly final, since garbage collecting the unmodified value is not
-  // an issue anymore.
-
-  // R10 : arguments descriptor array.
-  __ movq(RCX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
-  __ SmiUntag(RCX);
-  __ LoadObject(R12, Object::null_object());
-  Label null_args_loop, null_args_loop_condition;
-  __ jmp(&null_args_loop_condition, Assembler::kNearJump);
-  const Address original_argument_addr(RBP, RCX, TIMES_8,
-                                       (kParamEndSlotFromFp + 1) * kWordSize);
-  __ Bind(&null_args_loop);
-  __ movq(original_argument_addr, R12);
-  __ Bind(&null_args_loop_condition);
-  __ decq(RCX);
-  __ j(POSITIVE, &null_args_loop, Assembler::kNearJump);
-}
-
 void FlowGraphCompiler::GenerateInlinedGetter(intptr_t offset) {
   // TOS: return address.
   // +1 : receiver.
@@ -989,8 +731,7 @@
 // needs to be updated to match.
 void FlowGraphCompiler::EmitFrameEntry() {
   if (flow_graph().IsCompiledForOsr()) {
-    intptr_t extra_slots = StackSize() - flow_graph().num_stack_locals() -
-                           flow_graph().num_copied_params();
+    intptr_t extra_slots = StackSize() - flow_graph().num_stack_locals();
     ASSERT(extra_slots >= 0);
     __ EnterOsrFrame(extra_slots * kWordSize);
   } else {
@@ -1023,9 +764,8 @@
 
 void FlowGraphCompiler::CompileGraph() {
   InitCompiler();
-  const Function& function = parsed_function().function();
-
 #ifdef DART_PRECOMPILER
+  const Function& function = parsed_function().function();
   if (function.IsDynamicFunction()) {
     __ MonomorphicCheckedEntry();
   }
@@ -1039,130 +779,26 @@
   EmitFrameEntry();
   ASSERT(assembler()->constant_pool_allowed());
 
-  const int num_fixed_params = function.num_fixed_parameters();
-  const int num_copied_params = parsed_function().num_copied_params();
-  const int num_locals = parsed_function().num_stack_locals();
-
-  // The prolog of OSR functions is never executed, hence greatly simplified.
-  const bool expect_type_args = isolate()->reify_generic_functions() &&
-                                function.IsGeneric() &&
-                                !flow_graph().IsCompiledForOsr();
-
-  const bool check_arguments =
-      (function.IsClosureFunction() || function.IsConvertedClosureFunction()) &&
-      !flow_graph().IsCompiledForOsr();
-
-  // We check the number of passed arguments when we have to copy them due to
-  // the presence of optional parameters.
-  // No such checking code is generated if only fixed parameters are declared,
-  // unless we are in debug mode or unless we are compiling a closure.
-  if (num_copied_params == 0) {
-    if (check_arguments) {
-      Label correct_num_arguments, wrong_num_arguments;
-      CheckTypeArgsLen(expect_type_args, &wrong_num_arguments);
-      __ Comment("Check argument count");
-      // Check that exactly num_fixed arguments are passed in.
-      __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
-      __ CompareImmediate(RAX, Immediate(Smi::RawValue(num_fixed_params)));
-      __ j(NOT_EQUAL, &wrong_num_arguments, Assembler::kNearJump);
-
-      if (isolate()->strong()) {
-        __ movq(RCX, FieldAddress(
-                         R10, ArgumentsDescriptor::positional_count_offset()));
-        __ andq(
-            RCX,
-            Immediate(Smi::RawValue(
-                ArgumentsDescriptor::PositionalCountField::mask_in_place())));
-        __ cmpq(RAX, RCX);
-      } else {
-        __ cmpq(RAX, FieldAddress(
-                         R10, ArgumentsDescriptor::positional_count_offset()));
-      }
-
-      __ j(EQUAL, &correct_num_arguments, Assembler::kNearJump);
-
-      __ Bind(&wrong_num_arguments);
-      __ LeaveDartFrame(kKeepCalleePP);  // Leave arguments on the stack.
-      __ Jmp(*StubCode::CallClosureNoSuchMethod_entry());
-      // The noSuchMethod call may return to the caller, but not here.
-      __ Bind(&correct_num_arguments);
-    }
-  } else if (!flow_graph().IsCompiledForOsr()) {
-    CopyParameters(expect_type_args, check_arguments);
-  }
-
-  if (function.IsClosureFunction() && !flow_graph().IsCompiledForOsr()) {
-    // Load context from the closure object (first argument).
-    LocalScope* scope = parsed_function().node_sequence()->scope();
-    LocalVariable* closure_parameter = scope->VariableAt(0);
-    __ movq(CTX, Address(RBP, closure_parameter->index() * kWordSize));
-    __ movq(CTX, FieldAddress(CTX, Closure::context_offset()));
-#ifdef DEBUG
-    Label ok;
-    __ LoadClassId(RAX, CTX);
-    __ cmpq(RAX, Immediate(kContextCid));
-    __ j(EQUAL, &ok, Assembler::kNearJump);
-    __ Stop("Incorrect context at entry");
-    __ Bind(&ok);
-#endif
-  }
-
-  // In unoptimized code, initialize (non-argument) stack allocated slots to
-  // null.
+  // In unoptimized code, initialize (non-argument) stack allocated slots.
   if (!is_optimizing()) {
-    ASSERT(num_locals > 0);  // There is always at least context_var.
+    const int num_locals = parsed_function().num_stack_locals();
+
+    intptr_t args_desc_index = -1;
+    if (parsed_function().has_arg_desc_var()) {
+      args_desc_index =
+          -(parsed_function().arg_desc_var()->index() - kFirstLocalSlotFromFp);
+    }
+
     __ Comment("Initialize spill slots");
-    const intptr_t slot_base = parsed_function().first_stack_local_index();
-    const intptr_t context_index =
-        parsed_function().current_context_var()->index();
-    if (num_locals > 1) {
+    if (num_locals > 1 || (num_locals == 1 && args_desc_index == -1)) {
       __ LoadObject(RAX, Object::null_object());
     }
     for (intptr_t i = 0; i < num_locals; ++i) {
-      // Subtract index i (locals lie at lower addresses than RBP).
-      if (((slot_base - i) == context_index)) {
-        if (function.IsClosureFunction()) {
-          __ movq(Address(RBP, (slot_base - i) * kWordSize), CTX);
-        } else {
-          __ StoreObject(Address(RBP, (slot_base - i) * kWordSize),
-                         Object::empty_context());
-        }
-      } else {
-        ASSERT(num_locals > 1);
-        __ movq(Address(RBP, (slot_base - i) * kWordSize), RAX);
-      }
+      Register value_reg = i == args_desc_index ? ARGS_DESC_REG : RAX;
+      __ movq(Address(RBP, (kFirstLocalSlotFromFp - i) * kWordSize), value_reg);
     }
   }
 
-  // Copy passed-in type argument vector if the function is generic.
-  if (expect_type_args) {
-    __ Comment("Copy passed-in type args");
-    Label store_type_args, ok;
-    __ cmpq(FieldAddress(R10, ArgumentsDescriptor::type_args_len_offset()),
-            Immediate(Smi::RawValue(0)));
-    if (is_optimizing()) {
-      // Initialize type_args to null if none passed in.
-      __ LoadObject(RAX, Object::null_object());
-      __ j(EQUAL, &store_type_args, Assembler::kNearJump);
-    } else {
-      __ j(EQUAL, &ok, Assembler::kNearJump);  // Already initialized to null.
-    }
-    // Load the passed type args vector in RAX from
-    // fp[kParamEndSlotFromFp + num_args + 1]; num_args (RBX) is Smi.
-    __ movq(RBX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
-    __ movq(RAX,
-            Address(RBP, RBX, TIMES_4, (kParamEndSlotFromFp + 1) * kWordSize));
-    // Store RAX into the stack slot reserved for the function type arguments.
-    // If the function type arguments variable is captured, a copy will happen
-    // after the context is allocated.
-    const intptr_t slot_base = parsed_function().first_stack_local_index();
-    ASSERT(parsed_function().function_type_arguments()->is_captured() ||
-           parsed_function().function_type_arguments()->index() == slot_base);
-    __ Bind(&store_type_args);
-    __ movq(Address(RBP, slot_base * kWordSize), RAX);
-    __ Bind(&ok);
-  }
-
   EndCodeSourceRange(TokenPosition::kDartCodePrologue);
   ASSERT(!block_order().is_empty());
   VisitBlocks();
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 7fd0104..8fc4b58 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -372,6 +372,9 @@
   M(Phi)                                                                       \
   M(Redefinition)                                                              \
   M(Parameter)                                                                 \
+  M(LoadIndexedUnsafe)                                                         \
+  M(StoreIndexedUnsafe)                                                        \
+  M(TailCall)                                                                  \
   M(ParallelMove)                                                              \
   M(PushArgument)                                                              \
   M(Return)                                                                    \
@@ -2031,6 +2034,148 @@
   DISALLOW_COPY_AND_ASSIGN(ParameterInstr);
 };
 
+// Stores a tagged pointer to a slot accessable from a fixed register.  It has
+// the form:
+//
+//     base_reg[index + #constant] = value
+//
+//   Input 0: A tagged Smi [index]
+//   Input 1: A tagged pointer [value]
+//   offset:  A signed constant offset which fits into 8 bits
+//
+// Currently this instruction uses pinpoints the register to be FP.
+//
+// This lowlevel instruction is non-inlinable since it makes assumptons about
+// the frame.  This is asserted via `inliner.cc::CalleeGraphValidator`.
+class StoreIndexedUnsafeInstr : public TemplateDefinition<2, NoThrow> {
+ public:
+  StoreIndexedUnsafeInstr(Value* index, Value* value, intptr_t offset)
+      : offset_(offset) {
+    SetInputAt(kIndexPos, index);
+    SetInputAt(kValuePos, value);
+  }
+
+  enum { kIndexPos = 0, kValuePos = 1 };
+
+  DECLARE_INSTRUCTION(StoreIndexedUnsafe)
+
+  virtual Representation RequiredInputRepresentation(intptr_t index) const {
+    ASSERT(index == kIndexPos || index == kValuePos);
+    return kTagged;
+  }
+  virtual bool ComputeCanDeoptimize() const { return false; }
+  virtual bool HasUnknownSideEffects() const { return false; }
+
+  virtual bool AttributesEqual(Instruction* other) const {
+    return other->AsStoreIndexedUnsafe()->offset() == offset();
+  }
+
+  Value* index() const { return inputs_[kIndexPos]; }
+  Value* value() const { return inputs_[kValuePos]; }
+  Register base_reg() const { return FPREG; }
+  intptr_t offset() const { return offset_; }
+
+  PRINT_OPERANDS_TO_SUPPORT
+
+ private:
+  const intptr_t offset_;
+
+  DISALLOW_COPY_AND_ASSIGN(StoreIndexedUnsafeInstr);
+};
+
+// Loads a tagged pointer from slot accessable from a fixed register.  It has
+// the form:
+//
+//     base_reg[index + #constant]
+//
+//   Input 0: A tagged Smi [index]
+//   offset:  A signed constant offset which fits into 8 bits
+//
+// Currently this instruction uses pinpoints the register to be FP.
+//
+// This lowlevel instruction is non-inlinable since it makes assumptons about
+// the frame.  This is asserted via `inliner.cc::CalleeGraphValidator`.
+class LoadIndexedUnsafeInstr : public TemplateDefinition<1, NoThrow> {
+ public:
+  LoadIndexedUnsafeInstr(Value* index, intptr_t offset) : offset_(offset) {
+    SetInputAt(0, index);
+  }
+
+  DECLARE_INSTRUCTION(LoadIndexedUnsafe)
+
+  virtual Representation RequiredInputRepresentation(intptr_t index) const {
+    ASSERT(index == 0);
+    return kTagged;
+  }
+  virtual Representation representation() const { return kTagged; }
+  virtual bool ComputeCanDeoptimize() const { return false; }
+  virtual bool HasUnknownSideEffects() const { return false; }
+
+  virtual bool AttributesEqual(Instruction* other) const {
+    return other->AsLoadIndexedUnsafe()->offset() == offset();
+  }
+
+  Value* index() const { return InputAt(0); }
+  Register base_reg() const { return FPREG; }
+  intptr_t offset() const { return offset_; }
+
+  PRINT_OPERANDS_TO_SUPPORT
+
+ private:
+  const intptr_t offset_;
+
+  DISALLOW_COPY_AND_ASSIGN(LoadIndexedUnsafeInstr);
+};
+
+// Unwinds the current frame and taill calls a target.
+//
+// The return address saved by the original caller of this frame will be in it's
+// usual location (stack or LR).  The arguments descriptor supplied by the
+// original caller will be put into ARGS_DESC_REG.
+//
+// This lowlevel instruction is non-inlinable since it makes assumptons about
+// the frame.  This is asserted via `inliner.cc::CalleeGraphValidator`.
+class TailCallInstr : public Instruction {
+ public:
+  TailCallInstr(const Code& code, Value* arg_desc)
+      : code_(code), arg_desc_(NULL) {
+    SetInputAt(0, arg_desc);
+  }
+
+  DECLARE_INSTRUCTION(TailCall)
+
+  const Code& code() const { return code_; }
+
+  virtual intptr_t InputCount() const { return 1; }
+  virtual Value* InputAt(intptr_t i) const {
+    ASSERT(i == 0);
+    return arg_desc_;
+  }
+  virtual void RawSetInputAt(intptr_t i, Value* value) {
+    ASSERT(i == 0);
+    arg_desc_ = value;
+  }
+
+  // Two tailcalls can be canonicalized into one instruction if both have the
+  // same destination.
+  virtual bool AllowsCSE() const { return true; }
+  virtual bool AttributesEqual(Instruction* other) const {
+    return &other->AsTailCall()->code() == &code();
+  }
+
+  // Since no code after this instruction will be executed, there will be no
+  // side-effects for the following code.
+  virtual bool HasUnknownSideEffects() const { return false; }
+  virtual bool MayThrow() const { return true; }
+  virtual bool ComputeCanDeoptimize() const { return false; }
+
+  PRINT_OPERANDS_TO_SUPPORT
+
+ private:
+  const Code& code_;
+  Value* arg_desc_;
+};
+
 class PushArgumentInstr : public TemplateDefinition<1, NoThrow> {
  public:
   explicit PushArgumentInstr(Value* value) { SetInputAt(0, value); }
@@ -2745,11 +2890,12 @@
   DISALLOW_COPY_AND_ASSIGN(AssertBooleanInstr);
 };
 
-// Denotes a special parameter, currently either the context of a closure
-// or the type arguments of a generic function.
+// Denotes a special parameter, currently either the context of a closure,
+// the type arguments of a generic function or an arguments descriptor.
 class SpecialParameterInstr : public TemplateDefinition<0, NoThrow> {
  public:
-  enum SpecialParameterKind { kContext, kTypeArgs };
+  enum SpecialParameterKind { kContext, kTypeArgs, kArgDescriptor };
+
   SpecialParameterInstr(SpecialParameterKind kind, intptr_t deopt_id)
       : TemplateDefinition(deopt_id), kind_(kind) {}
 
@@ -2765,6 +2911,23 @@
   }
   SpecialParameterKind kind() const { return kind_; }
 
+  const char* ToCString() const;
+
+  PRINT_OPERANDS_TO_SUPPORT
+
+  static const char* KindToCString(SpecialParameterKind kind) {
+    switch (kind) {
+      case kContext:
+        return "kContext";
+      case kTypeArgs:
+        return "kTypeArgs";
+      case kArgDescriptor:
+        return "kArgDescriptor";
+    }
+    UNREACHABLE();
+    return NULL;
+  }
+
  private:
   const SpecialParameterKind kind_;
   DISALLOW_COPY_AND_ASSIGN(SpecialParameterInstr);
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index f8312ed..4b77db1 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -37,6 +37,42 @@
   return result;
 }
 
+DEFINE_BACKEND(LoadIndexedUnsafe, (Register out, Register index)) {
+  ASSERT(instr->RequiredInputRepresentation(0) == kTagged);  // It is a Smi.
+  __ add(out, instr->base_reg(), Operand(index, LSL, 1));
+  __ ldr(out, Address(out, instr->offset()));
+
+  ASSERT(kSmiTag == 0);
+  ASSERT(kSmiTagSize == 1);
+}
+
+DEFINE_BACKEND(StoreIndexedUnsafe,
+               (NoLocation, Register index, Register value)) {
+  ASSERT(instr->RequiredInputRepresentation(
+             StoreIndexedUnsafeInstr::kIndexPos) == kTagged);  // It is a Smi.
+  __ add(TMP, instr->base_reg(), Operand(index, LSL, 1));
+  __ str(value, Address(TMP, instr->offset()));
+
+  ASSERT(kSmiTag == 0);
+  ASSERT(kSmiTagSize == 1);
+}
+
+DEFINE_BACKEND(TailCall,
+               (NoLocation,
+                Fixed<Register, ARGS_DESC_REG>,
+                Temp<Register> temp)) {
+  __ LoadObject(CODE_REG, instr->code());
+  __ LeaveDartFrame();  // The arguments are still on the stack.
+  __ ldr(temp, FieldAddress(CODE_REG, Code::entry_point_offset()));
+  __ bx(temp);
+
+  // Even though the TailCallInstr will be the last instruction in a basic
+  // block, the flow graph compiler will emit native code for other blocks after
+  // the one containing this instruction and needs to be able to use the pool.
+  // (The `LeaveDartFrame` above disables usages of the pool.)
+  __ set_constant_pool_allowed(true);
+}
+
 LocationSummary* PushArgumentInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 2a4e365..15d8cf1 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -36,6 +36,42 @@
   return result;
 }
 
+DEFINE_BACKEND(LoadIndexedUnsafe, (Register out, Register index)) {
+  ASSERT(instr->RequiredInputRepresentation(0) == kTagged);  // It is a Smi.
+  __ add(out, instr->base_reg(), Operand(index, LSL, 2));
+  __ ldr(out, Address(out, instr->offset()));
+
+  ASSERT(kSmiTag == 0);
+  ASSERT(kSmiTagSize == 1);
+}
+
+DEFINE_BACKEND(StoreIndexedUnsafe,
+               (NoLocation, Register index, Register value)) {
+  ASSERT(instr->RequiredInputRepresentation(
+             StoreIndexedUnsafeInstr::kIndexPos) == kTagged);  // It is a Smi.
+  __ add(TMP, instr->base_reg(), Operand(index, LSL, 2));
+  __ ldr(value, Address(TMP, instr->offset()));
+
+  ASSERT(kSmiTag == 0);
+  ASSERT(kSmiTagSize == 1);
+}
+
+DEFINE_BACKEND(TailCall,
+               (NoLocation,
+                Fixed<Register, ARGS_DESC_REG>,
+                Temp<Register> temp)) {
+  __ LoadObject(CODE_REG, instr->code());
+  __ LeaveDartFrame();  // The arguments are still on the stack.
+  __ ldr(temp, FieldAddress(CODE_REG, Code::entry_point_offset()));
+  __ br(temp);
+
+  // Even though the TailCallInstr will be the last instruction in a basic
+  // block, the flow graph compiler will emit native code for other blocks after
+  // the one containing this instruction and needs to be able to use the pool.
+  // (The `LeaveDartFrame` above disables usages of the pool.)
+  __ set_constant_pool_allowed(true);
+}
+
 LocationSummary* PushArgumentInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
diff --git a/runtime/vm/compiler/backend/il_dbc.cc b/runtime/vm/compiler/backend/il_dbc.cc
index 6e8d459..68024e0 100644
--- a/runtime/vm/compiler/backend/il_dbc.cc
+++ b/runtime/vm/compiler/backend/il_dbc.cc
@@ -253,6 +253,52 @@
   __ PopLocal(locs()->out(0).reg());
 }
 
+EMIT_NATIVE_CODE(LoadIndexedUnsafe, 1, Location::RegisterLocation(0)) {
+  ASSERT(base_reg() == FPREG);
+  ASSERT(Utils::IsInt(8, offset_));
+
+  ASSERT(offset_ % kWordSize == 0);
+  const intptr_t slot_offset = offset_ / kWordSize;
+  ASSERT(-128 <= slot_offset && slot_offset < 128);
+
+  if (compiler->is_optimizing()) {
+    const Register index = locs()->in(0).reg();
+    const Register result = locs()->out(0).reg();
+    __ LoadFpRelativeSlotOpt(result, index, slot_offset);
+  } else {
+    __ LoadFpRelativeSlot(slot_offset);
+  }
+}
+
+EMIT_NATIVE_CODE(StoreIndexedUnsafe, 2, Location::RegisterLocation(0)) {
+  ASSERT(base_reg() == FPREG);
+  ASSERT(Utils::IsInt(8, offset_));
+
+  if (compiler->is_optimizing()) {
+    const Register index = locs()->in(kIndexPos).reg();
+    const Register value = locs()->in(kValuePos).reg();
+    __ StoreFpRelativeSlotOpt(value, index, offset_ / kWordSize);
+  } else {
+    __ StoreFpRelativeSlot(offset_ / kWordSize);
+  }
+}
+
+EMIT_NATIVE_CODE(TailCall,
+                 1,
+                 Location::NoLocation(),
+                 LocationSummary::kNoCall,
+                 1) {
+  if (compiler->is_optimizing()) {
+    const Register arg_desc = locs()->in(0).reg();
+    const Register temp = locs()->temp(0).reg();
+    __ LoadConstant(temp, code());
+    __ TailCallOpt(arg_desc, temp);
+  } else {
+    __ PushConstant(code());
+    __ TailCall();
+  }
+}
+
 EMIT_NATIVE_CODE(Stop, 0) {
   __ Stop(message());
 }
@@ -751,110 +797,123 @@
                  Location::RequiresRegister(),
                  LocationSummary::kNoCall,
                  1) {
-  ASSERT(compiler->is_optimizing());
-  const Register array = locs()->in(0).reg();
-  const Register index = locs()->in(1).reg();
-  const Register temp = locs()->temp(0).reg();
-  const Register result = locs()->out(0).reg();
-  switch (class_id()) {
-    case kArrayCid:
-    case kImmutableArrayCid:
-      __ LoadIndexed(result, array, index);
-      break;
-    case kTypedDataUint8ArrayCid:
-    case kTypedDataUint8ClampedArrayCid:
-    case kExternalOneByteStringCid:
-    case kExternalTypedDataUint8ArrayCid:
-    case kExternalTypedDataUint8ClampedArrayCid:
-      ASSERT(index_scale() == 1);
-      if (IsExternal()) {
-        __ LoadIndexedExternalUint8(result, array, index);
-      } else {
-        __ LoadIndexedUint8(result, array, index);
-      }
-      break;
-    case kTypedDataInt8ArrayCid:
-      ASSERT(index_scale() == 1);
-      if (IsExternal()) {
-        __ LoadIndexedExternalInt8(result, array, index);
-      } else {
-        __ LoadIndexedInt8(result, array, index);
-      }
-      break;
-    case kOneByteStringCid:
-      ASSERT(index_scale() == 1);
-      __ LoadIndexedOneByteString(result, array, index);
-      break;
-    case kTwoByteStringCid:
-      if (index_scale() != 2) {
-        // TODO(zra): Fix-up index.
+  if (compiler->is_optimizing()) {
+    ASSERT(compiler->is_optimizing());
+    const Register array = locs()->in(0).reg();
+    const Register index = locs()->in(1).reg();
+    const Register temp = locs()->temp(0).reg();
+    const Register result = locs()->out(0).reg();
+    switch (class_id()) {
+      case kArrayCid:
+      case kImmutableArrayCid:
+        __ LoadIndexed(result, array, index);
+        break;
+      case kTypedDataUint8ArrayCid:
+      case kTypedDataUint8ClampedArrayCid:
+      case kExternalOneByteStringCid:
+      case kExternalTypedDataUint8ArrayCid:
+      case kExternalTypedDataUint8ClampedArrayCid:
+        ASSERT(index_scale() == 1);
+        if (IsExternal()) {
+          __ LoadIndexedExternalUint8(result, array, index);
+        } else {
+          __ LoadIndexedUint8(result, array, index);
+        }
+        break;
+      case kTypedDataInt8ArrayCid:
+        ASSERT(index_scale() == 1);
+        if (IsExternal()) {
+          __ LoadIndexedExternalInt8(result, array, index);
+        } else {
+          __ LoadIndexedInt8(result, array, index);
+        }
+        break;
+      case kOneByteStringCid:
+        ASSERT(index_scale() == 1);
+        __ LoadIndexedOneByteString(result, array, index);
+        break;
+      case kTwoByteStringCid:
+        if (index_scale() != 2) {
+          // TODO(zra): Fix-up index.
+          Unsupported(compiler);
+          UNREACHABLE();
+        }
+        if (IsExternal()) {
+          Unsupported(compiler);
+          UNREACHABLE();
+        }
+        __ LoadIndexedTwoByteString(result, array, index);
+        break;
+      case kTypedDataInt32ArrayCid:
+        ASSERT(representation() == kUnboxedInt32);
+        if (IsExternal()) {
+          Unsupported(compiler);
+          UNREACHABLE();
+        }
+        if (index_scale() == 1) {
+          __ LoadIndexedInt32(result, array, index);
+        } else {
+          __ ShlImm(temp, index, Utils::ShiftForPowerOfTwo(index_scale()));
+          __ LoadIndexedInt32(result, array, temp);
+        }
+        break;
+      case kTypedDataUint32ArrayCid:
+        ASSERT(representation() == kUnboxedUint32);
+        if (IsExternal()) {
+          Unsupported(compiler);
+          UNREACHABLE();
+        }
+        if (index_scale() == 1) {
+          __ LoadIndexedUint32(result, array, index);
+        } else {
+          __ ShlImm(temp, index, Utils::ShiftForPowerOfTwo(index_scale()));
+          __ LoadIndexedUint32(result, array, temp);
+        }
+        break;
+      case kTypedDataFloat32ArrayCid:
+        if (IsExternal()) {
+          Unsupported(compiler);
+          UNREACHABLE();
+        }
+        if (index_scale() == 1) {
+          __ LoadIndexedFloat32(result, array, index);
+        } else if (index_scale() == 4) {
+          __ LoadIndexed4Float32(result, array, index);
+        } else {
+          __ ShlImm(temp, index, Utils::ShiftForPowerOfTwo(index_scale()));
+          __ LoadIndexedFloat32(result, array, temp);
+        }
+        break;
+      case kTypedDataFloat64ArrayCid:
+        if (IsExternal()) {
+          Unsupported(compiler);
+          UNREACHABLE();
+        }
+        if (index_scale() == 1) {
+          __ LoadIndexedFloat64(result, array, index);
+        } else if (index_scale() == 8) {
+          __ LoadIndexed8Float64(result, array, index);
+        } else {
+          __ ShlImm(temp, index, Utils::ShiftForPowerOfTwo(index_scale()));
+          __ LoadIndexedFloat64(result, array, temp);
+        }
+        break;
+      default:
         Unsupported(compiler);
         UNREACHABLE();
-      }
-      if (IsExternal()) {
+        break;
+    }
+  } else {
+    switch (class_id()) {
+      case kArrayCid:
+      case kImmutableArrayCid:
+        __ LoadIndexedTOS();
+        break;
+      default:
         Unsupported(compiler);
         UNREACHABLE();
-      }
-      __ LoadIndexedTwoByteString(result, array, index);
-      break;
-    case kTypedDataInt32ArrayCid:
-      ASSERT(representation() == kUnboxedInt32);
-      if (IsExternal()) {
-        Unsupported(compiler);
-        UNREACHABLE();
-      }
-      if (index_scale() == 1) {
-        __ LoadIndexedInt32(result, array, index);
-      } else {
-        __ ShlImm(temp, index, Utils::ShiftForPowerOfTwo(index_scale()));
-        __ LoadIndexedInt32(result, array, temp);
-      }
-      break;
-    case kTypedDataUint32ArrayCid:
-      ASSERT(representation() == kUnboxedUint32);
-      if (IsExternal()) {
-        Unsupported(compiler);
-        UNREACHABLE();
-      }
-      if (index_scale() == 1) {
-        __ LoadIndexedUint32(result, array, index);
-      } else {
-        __ ShlImm(temp, index, Utils::ShiftForPowerOfTwo(index_scale()));
-        __ LoadIndexedUint32(result, array, temp);
-      }
-      break;
-    case kTypedDataFloat32ArrayCid:
-      if (IsExternal()) {
-        Unsupported(compiler);
-        UNREACHABLE();
-      }
-      if (index_scale() == 1) {
-        __ LoadIndexedFloat32(result, array, index);
-      } else if (index_scale() == 4) {
-        __ LoadIndexed4Float32(result, array, index);
-      } else {
-        __ ShlImm(temp, index, Utils::ShiftForPowerOfTwo(index_scale()));
-        __ LoadIndexedFloat32(result, array, temp);
-      }
-      break;
-    case kTypedDataFloat64ArrayCid:
-      if (IsExternal()) {
-        Unsupported(compiler);
-        UNREACHABLE();
-      }
-      if (index_scale() == 1) {
-        __ LoadIndexedFloat64(result, array, index);
-      } else if (index_scale() == 8) {
-        __ LoadIndexed8Float64(result, array, index);
-      } else {
-        __ ShlImm(temp, index, Utils::ShiftForPowerOfTwo(index_scale()));
-        __ LoadIndexedFloat64(result, array, temp);
-      }
-      break;
-    default:
-      Unsupported(compiler);
-      UNREACHABLE();
-      break;
+        break;
+    }
   }
 }
 
@@ -1481,59 +1540,75 @@
 }
 
 EMIT_NATIVE_CODE(BinarySmiOp, 2, Location::RequiresRegister()) {
-  const Register left = locs()->in(0).reg();
-  const Register right = locs()->in(1).reg();
-  const Register out = locs()->out(0).reg();
-  const bool can_deopt = CanDeoptimize();
-  bool needs_nop = false;
-  switch (op_kind()) {
-    case Token::kADD:
-      __ Add(out, left, right);
-      needs_nop = true;
-      break;
-    case Token::kSUB:
-      __ Sub(out, left, right);
-      needs_nop = true;
-      break;
-    case Token::kMUL:
-      __ Mul(out, left, right);
-      needs_nop = true;
-      break;
-    case Token::kTRUNCDIV:
-      ASSERT(can_deopt);
-      __ Div(out, left, right);
-      break;
-    case Token::kBIT_AND:
-      ASSERT(!can_deopt);
-      __ BitAnd(out, left, right);
-      break;
-    case Token::kBIT_OR:
-      ASSERT(!can_deopt);
-      __ BitOr(out, left, right);
-      break;
-    case Token::kBIT_XOR:
-      ASSERT(!can_deopt);
-      __ BitXor(out, left, right);
-      break;
-    case Token::kMOD:
-      __ Mod(out, left, right);
-      needs_nop = true;
-      break;
-    case Token::kSHR:
-      __ Shr(out, left, right);
-      needs_nop = true;
-      break;
-    case Token::kSHL:
-      __ Shl(out, left, right);
-      needs_nop = true;
-      break;
-    default:
-      UNREACHABLE();
-  }
-  if (can_deopt) {
-    compiler->EmitDeopt(deopt_id(), ICData::kDeoptBinarySmiOp);
-  } else if (needs_nop) {
-    __ Nop(0);
+  if (compiler->is_optimizing()) {
+    const Register left = locs()->in(0).reg();
+    const Register right = locs()->in(1).reg();
+    const Register out = locs()->out(0).reg();
+    const bool can_deopt = CanDeoptimize();
+    bool needs_nop = false;
+    switch (op_kind()) {
+      case Token::kADD:
+        __ Add(out, left, right);
+        needs_nop = true;
+        break;
+      case Token::kSUB:
+        __ Sub(out, left, right);
+        needs_nop = true;
+        break;
+      case Token::kMUL:
+        __ Mul(out, left, right);
+        needs_nop = true;
+        break;
+      case Token::kTRUNCDIV:
+        ASSERT(can_deopt);
+        __ Div(out, left, right);
+        break;
+      case Token::kBIT_AND:
+        ASSERT(!can_deopt);
+        __ BitAnd(out, left, right);
+        break;
+      case Token::kBIT_OR:
+        ASSERT(!can_deopt);
+        __ BitOr(out, left, right);
+        break;
+      case Token::kBIT_XOR:
+        ASSERT(!can_deopt);
+        __ BitXor(out, left, right);
+        break;
+      case Token::kMOD:
+        __ Mod(out, left, right);
+        needs_nop = true;
+        break;
+      case Token::kSHR:
+        __ Shr(out, left, right);
+        needs_nop = true;
+        break;
+      case Token::kSHL:
+        __ Shl(out, left, right);
+        needs_nop = true;
+        break;
+      default:
+        UNREACHABLE();
+    }
+    if (can_deopt) {
+      compiler->EmitDeopt(deopt_id(), ICData::kDeoptBinarySmiOp);
+    } else if (needs_nop) {
+      __ Nop(0);
+    }
+  } else {
+    switch (op_kind()) {
+      case Token::kADD:
+        __ SmiAddTOS();
+        break;
+      case Token::kSUB:
+        __ SmiSubTOS();
+        break;
+      case Token::kMUL:
+        __ SmiMulTOS();
+        break;
+      default:
+        UNIMPLEMENTED();
+    }
   }
 }
 
@@ -1851,8 +1926,6 @@
                                      LocationSummary* locs,
                                      Token::Kind kind,
                                      BranchLabels labels) {
-  const Register left = locs->in(0).reg();
-  const Register right = locs->in(1).reg();
   Token::Kind comparison = kind;
   Condition condition = NEXT_IS_TRUE;
   if (labels.fall_through != labels.false_label) {
@@ -1864,8 +1937,36 @@
     condition = NEXT_IS_FALSE;
     comparison = FlipCondition(kind);
   }
-  __ Emit(Bytecode::Encode(OpcodeForSmiCondition(comparison), left, right));
-  return condition;
+  if (compiler->is_optimizing()) {
+    const Register left = locs->in(0).reg();
+    const Register right = locs->in(1).reg();
+    __ Emit(Bytecode::Encode(OpcodeForSmiCondition(comparison), left, right));
+    return condition;
+  } else {
+    switch (kind) {
+      case Token::kEQ:
+        __ IfEqStrictTOS();
+        break;
+      case Token::kNE:
+        __ IfNeStrictTOS();
+        break;
+      case Token::kLT:
+        __ IfSmiLtTOS();
+        break;
+      case Token::kLTE:
+        __ IfSmiLeTOS();
+        break;
+      case Token::kGT:
+        __ IfSmiGtTOS();
+        break;
+      case Token::kGTE:
+        __ IfSmiGeTOS();
+        break;
+      default:
+        UNIMPLEMENTED();
+    }
+    return condition;
+  }
 }
 
 static Condition EmitDoubleComparisonOp(FlowGraphCompiler* compiler,
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index 2514db4..b839563 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -37,6 +37,34 @@
   return result;
 }
 
+DEFINE_BACKEND(LoadIndexedUnsafe, (Register out, Register index)) {
+  ASSERT(instr->RequiredInputRepresentation(0) == kTagged);  // It is a Smi.
+  __ movl(out, Address(instr->base_reg(), index, TIMES_2, instr->offset()));
+
+  ASSERT(kSmiTag == 0);
+  ASSERT(kSmiTagSize == 1);
+}
+
+DEFINE_BACKEND(StoreIndexedUnsafe,
+               (NoLocation, Register index, Register value)) {
+  ASSERT(instr->RequiredInputRepresentation(
+             StoreIndexedUnsafeInstr::kIndexPos) == kTagged);  // It is a Smi.
+  __ movl(Address(instr->base_reg(), index, TIMES_2, instr->offset()), value);
+
+  ASSERT(kSmiTag == 0);
+  ASSERT(kSmiTagSize == 1);
+}
+
+DEFINE_BACKEND(TailCall,
+               (NoLocation,
+                Fixed<Register, ARGS_DESC_REG>,
+                Temp<Register> temp)) {
+  __ LoadObject(CODE_REG, instr->code());
+  __ LeaveFrame();  // The arguments are still on the stack.
+  __ movl(temp, FieldAddress(CODE_REG, Code::entry_point_offset()));
+  __ jmp(temp);
+}
+
 LocationSummary* PushArgumentInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
diff --git a/runtime/vm/compiler/backend/il_printer.cc b/runtime/vm/compiler/backend/il_printer.cc
index c6b06ba..a17f9ea 100644
--- a/runtime/vm/compiler/backend/il_printer.cc
+++ b/runtime/vm/compiler/backend/il_printer.cc
@@ -957,6 +957,17 @@
   f->Print("%" Pd, index());
 }
 
+void SpecialParameterInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("%s", KindToCString(kind()));
+}
+
+const char* SpecialParameterInstr::ToCString() const {
+  char buffer[1024];
+  BufferFormatter bf(buffer, 1024);
+  PrintTo(&bf);
+  return Thread::Current()->zone()->MakeCopyOfString(buffer);
+}
+
 void CheckStackOverflowInstr::PrintOperandsTo(BufferFormatter* f) const {
   if (in_loop()) f->Print("depth %" Pd, loop_depth());
 }
@@ -994,6 +1005,33 @@
   }
 }
 
+void LoadIndexedUnsafeInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("%s[", Assembler::RegisterName(base_reg()));
+  index()->PrintTo(f);
+  f->Print(" + %" Pd "]", offset());
+}
+
+void StoreIndexedUnsafeInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("%s[", Assembler::RegisterName(base_reg()));
+  index()->PrintTo(f);
+  f->Print(" + %" Pd "], ", offset());
+  value()->PrintTo(f);
+}
+
+void TailCallInstr::PrintOperandsTo(BufferFormatter* f) const {
+  const char* name = "<unknown code>";
+  if (code_.IsStubCode()) {
+    name = StubCode::NameOfStub(code_.UncheckedEntryPoint());
+  } else {
+    const Object& owner = Object::Handle(code_.owner());
+    if (owner.IsFunction()) {
+      name = Function::Handle(Function::RawCast(owner.raw()))
+                 .ToFullyQualifiedCString();
+    }
+  }
+  f->Print("%s", name);
+}
+
 void PushArgumentInstr::PrintOperandsTo(BufferFormatter* f) const {
   value()->PrintTo(f);
 }
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index d21ef72..3f4b9f4 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -35,6 +35,36 @@
   return result;
 }
 
+DEFINE_BACKEND(LoadIndexedUnsafe, (Register out, Register index)) {
+  ASSERT(instr->RequiredInputRepresentation(0) == kTagged);  // It is a Smi.
+  __ movq(out, Address(instr->base_reg(), index, TIMES_4, instr->offset()));
+
+  ASSERT(kSmiTag == 0);
+  ASSERT(kSmiTagSize == 1);
+}
+
+DEFINE_BACKEND(StoreIndexedUnsafe,
+               (NoLocation, Register index, Register value)) {
+  ASSERT(instr->RequiredInputRepresentation(
+             StoreIndexedUnsafeInstr::kIndexPos) == kTagged);  // It is a Smi.
+  __ movq(Address(instr->base_reg(), index, TIMES_4, instr->offset()), value);
+
+  ASSERT(kSmiTag == 0);
+  ASSERT(kSmiTagSize == 1);
+}
+
+DEFINE_BACKEND(TailCall, (NoLocation, Fixed<Register, ARGS_DESC_REG>)) {
+  __ LoadObject(CODE_REG, instr->code());
+  __ LeaveDartFrame();  // The arguments are still on the stack.
+  __ jmp(FieldAddress(CODE_REG, Code::entry_point_offset()));
+
+  // Even though the TailCallInstr will be the last instruction in a basic
+  // block, the flow graph compiler will emit native code for other blocks after
+  // the one containing this instruction and needs to be able to use the pool.
+  // (The `LeaveDartFrame` above disables usages of the pool.)
+  __ set_constant_pool_allowed(true);
+}
+
 LocationSummary* PushArgumentInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -3855,17 +3885,16 @@
   SIMD_OP_FLOAT_ARITH(V, Sqrt, sqrt)                                           \
   SIMD_OP_FLOAT_ARITH(V, Negate, negate)                                       \
   SIMD_OP_FLOAT_ARITH(V, Abs, abs)                                             \
-  V(Float32x4Reciprocal, reciprocalps)                                         \
+  V(Float32x4Reciprocal, rcpps)                                                \
   V(Float32x4ReciprocalSqrt, rsqrtps)
 
 DEFINE_EMIT(SimdUnaryOp, (SameAsFirstInput, XmmRegister value)) {
   // TODO(dartbug.com/30949) select better register constraints to avoid
-  // redundant move of input into a different register because all instructions
-  // below support two operand forms.
+  // redundant move of input into a different register.
   switch (instr->kind()) {
 #define EMIT(Name, op)                                                         \
   case SimdOpInstr::k##Name:                                                   \
-    __ op(value);                                                              \
+    __ op(value, value);                                                       \
     break;
     SIMD_OP_SIMPLE_UNARY(EMIT)
 #undef EMIT
@@ -4060,7 +4089,7 @@
   // Copy mask.
   __ movaps(temp, mask);
   // Invert it.
-  __ notps(temp);
+  __ notps(temp, temp);
   // mask = mask & trueValue.
   __ andps(mask, trueValue);
   // temp = temp & falseValue.
@@ -4263,7 +4292,7 @@
 void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   XmmRegister value = locs()->in(0).fpu_reg();
   ASSERT(locs()->out(0).fpu_reg() == value);
-  __ DoubleNegate(value);
+  __ DoubleNegate(value, value);
 }
 
 LocationSummary* MathMinMaxInstr::MakeLocationSummary(Zone* zone,
@@ -4350,7 +4379,7 @@
   if (is_min) {
     __ cmovgeq(result, right);
   } else {
-    __ cmovlessq(result, right);
+    __ cmovlq(result, right);
   }
 }
 
diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc
index faf2759..0e4cb55 100644
--- a/runtime/vm/compiler/backend/inliner.cc
+++ b/runtime/vm/compiler/backend/inliner.cc
@@ -141,6 +141,33 @@
   NamedArgument(String* name, Value* value) : name(name), value(value) {}
 };
 
+// Ensures we only inline callee graphs which are safe.  There are certain
+// instructions which cannot be inlined and we ensure here that we don't do
+// that.
+class CalleeGraphValidator : public AllStatic {
+ public:
+  static void Validate(FlowGraph* callee_graph) {
+#ifdef DEBUG
+    for (BlockIterator block_it = callee_graph->reverse_postorder_iterator();
+         !block_it.Done(); block_it.Advance()) {
+      BlockEntryInstr* entry = block_it.Current();
+
+      for (ForwardInstructionIterator it(entry); !it.Done(); it.Advance()) {
+        Instruction* current = it.Current();
+        if (current->IsBranch()) {
+          current = current->AsBranch()->comparison();
+        }
+        // The following instructions are not safe to inline, since they make
+        // assumptions about the frame layout.
+        ASSERT(!current->IsTailCall());
+        ASSERT(!current->IsLoadIndexedUnsafe());
+        ASSERT(!current->IsStoreIndexedUnsafe());
+      }
+    }
+#endif  // DEBUG
+  }
+};
+
 // Helper to collect information about a callee graph when considering it for
 // inlining.
 class GraphInfoCollector : public ValueObject {
@@ -431,11 +458,13 @@
 
 struct InlinedCallData {
   InlinedCallData(Definition* call,
+                  const Array& arguments_descriptor,
                   intptr_t first_arg_index,  // 1 if type args are passed.
                   GrowableArray<Value*>* arguments,
                   const Function& caller,
                   intptr_t caller_inlining_id)
       : call(call),
+        arguments_descriptor(arguments_descriptor),
         first_arg_index(first_arg_index),
         arguments(arguments),
         callee_graph(NULL),
@@ -445,6 +474,7 @@
         caller_inlining_id(caller_inlining_id) {}
 
   Definition* call;
+  const Array& arguments_descriptor;
   const intptr_t first_arg_index;
   GrowableArray<Value*>* arguments;
   FlowGraph* callee_graph;
@@ -571,29 +601,42 @@
     }
     SpecialParameterInstr* param = (*defns)[i]->AsSpecialParameter();
     if ((param != NULL) && param->HasUses()) {
-      if (param->kind() == SpecialParameterInstr::kContext) {
-        ASSERT(!is_polymorphic);
-        // We do not support polymorphic inlining of closure calls (we did when
-        // there was a class per closure).
-        ASSERT(call_data->call->IsClosureCall());
-        LoadFieldInstr* context_load = new (zone) LoadFieldInstr(
-            new Value((*arguments)[first_arg_index]->definition()),
-            Closure::context_offset(),
-            AbstractType::ZoneHandle(zone, AbstractType::null()),
-            call_data->call->token_pos());
-        context_load->set_is_immutable(true);
-        context_load->set_ssa_temp_index(caller_graph->alloc_ssa_temp_index());
-        context_load->InsertBefore(callee_entry->next());
-        param->ReplaceUsesWith(context_load);
-      } else {
-        ASSERT(param->kind() == SpecialParameterInstr::kTypeArgs);
-        Definition* type_args;
-        if (first_arg_index > 0) {
-          type_args = (*arguments)[0]->definition();
-        } else {
-          type_args = callee_graph->constant_null();
+      switch (param->kind()) {
+        case SpecialParameterInstr::kContext: {
+          ASSERT(!is_polymorphic);
+          // We do not support polymorphic inlining of closure calls.
+          ASSERT(call_data->call->IsClosureCall());
+          LoadFieldInstr* context_load = new (zone) LoadFieldInstr(
+              new Value((*arguments)[first_arg_index]->definition()),
+              Closure::context_offset(),
+              AbstractType::ZoneHandle(zone, AbstractType::null()),
+              call_data->call->token_pos());
+          context_load->set_is_immutable(true);
+          context_load->set_ssa_temp_index(
+              caller_graph->alloc_ssa_temp_index());
+          context_load->InsertBefore(callee_entry->next());
+          param->ReplaceUsesWith(context_load);
+          break;
         }
-        param->ReplaceUsesWith(type_args);
+        case SpecialParameterInstr::kTypeArgs: {
+          Definition* type_args;
+          if (first_arg_index > 0) {
+            type_args = (*arguments)[0]->definition();
+          } else {
+            type_args = caller_graph->constant_null();
+          }
+          param->ReplaceUsesWith(type_args);
+          break;
+        }
+        case SpecialParameterInstr::kArgDescriptor: {
+          param->ReplaceUsesWith(
+              caller_graph->GetConstant(call_data->arguments_descriptor));
+          break;
+        }
+        default: {
+          UNREACHABLE();
+          break;
+        }
       }
     }
   }
@@ -918,6 +961,8 @@
           {
             CSTAT_TIMER_SCOPE(thread(), graphinliner_build_timer);
             callee_graph = builder.BuildGraph();
+
+            CalleeGraphValidator::Validate(callee_graph);
           }
         } else {
           FlowGraphBuilder builder(*parsed_function, *ic_data_array,
@@ -927,6 +972,8 @@
           {
             CSTAT_TIMER_SCOPE(thread(), graphinliner_build_timer);
             callee_graph = builder.BuildGraph();
+
+            CalleeGraphValidator::Validate(callee_graph);
           }
         }
 #ifdef DART_PRECOMPILER
@@ -989,8 +1036,6 @@
         // match.
         ASSERT(arguments->length() ==
                first_actual_param_index + function.NumParameters());
-        ASSERT(param_stubs->length() ==
-               inlined_type_args_param + callee_graph->parameter_count());
 
         // Update try-index of the callee graph.
         BlockEntryInstr* call_block = call_data->call->GetBlock();
@@ -1332,7 +1377,8 @@
         arguments.Add(call->PushArgumentAt(i)->value());
       }
       InlinedCallData call_data(
-          call, call->FirstArgIndex(), &arguments, call_info[call_idx].caller(),
+          call, Array::ZoneHandle(Z, call->GetArgumentsDescriptor()),
+          call->FirstArgIndex(), &arguments, call_info[call_idx].caller(),
           call_info[call_idx].caller_graph->inlining_id());
       if (TryInlining(call->function(), call->argument_names(), &call_data)) {
         InlineCall(&call_data);
@@ -1380,8 +1426,11 @@
       for (int i = 0; i < call->ArgumentCount(); ++i) {
         arguments.Add(call->PushArgumentAt(i)->value());
       }
+      const Array& arguments_descriptor =
+          Array::ZoneHandle(Z, call->GetArgumentsDescriptor());
       InlinedCallData call_data(
-          call, call->FirstArgIndex(), &arguments, call_info[call_idx].caller(),
+          call, arguments_descriptor, call->FirstArgIndex(), &arguments,
+          call_info[call_idx].caller(),
           call_info[call_idx].caller_graph->inlining_id());
       if (TryInlining(target, call->argument_names(), &call_data)) {
         InlineCall(&call_data);
@@ -1637,8 +1686,11 @@
   for (int i = 0; i < call_->ArgumentCount(); ++i) {
     arguments.Add(call_->PushArgumentAt(i)->value());
   }
-  InlinedCallData call_data(call_, call_->instance_call()->FirstArgIndex(),
-                            &arguments, caller_function_, caller_inlining_id_);
+  const Array& arguments_descriptor =
+      Array::ZoneHandle(Z, call_->instance_call()->GetArgumentsDescriptor());
+  InlinedCallData call_data(call_, arguments_descriptor,
+                            call_->instance_call()->FirstArgIndex(), &arguments,
+                            caller_function_, caller_inlining_id_);
   Function& target = Function::ZoneHandle(zone(), target_info.target->raw());
   if (!owner_->TryInlining(target, call_->instance_call()->argument_names(),
                            &call_data)) {
diff --git a/runtime/vm/compiler/backend/linearscan.cc b/runtime/vm/compiler/backend/linearscan.cc
index 357ae25..9abd019 100644
--- a/runtime/vm/compiler/backend/linearscan.cc
+++ b/runtime/vm/compiler/backend/linearscan.cc
@@ -103,7 +103,10 @@
   // TODO(fschneider): Handle saving and restoring these registers when
   // generating intrinsic code.
   if (intrinsic_mode) {
+#if !defined(TARGET_ARCH_DBC)
     blocked_cpu_registers_[ARGS_DESC_REG] = true;
+#endif
+
 #if !defined(TARGET_ARCH_IA32)
     // Need to preserve CODE_REG to be able to store the PC marker
     // and load the pool pointer.
@@ -674,17 +677,12 @@
   intptr_t range_end = range->End();
   if (defn->IsParameter()) {
     ParameterInstr* param = defn->AsParameter();
-    // Assert that copied and non-copied parameters are mutually exclusive.
-    // This might change in the future and, if so, the index will be wrong.
-    ASSERT((flow_graph_.num_copied_params() == 0) ||
-           (flow_graph_.num_non_copied_params() == 0));
     intptr_t slot_index = param->index();
     ASSERT(slot_index >= 0);
     ASSERT((param->base_reg() == FPREG) || (param->base_reg() == SPREG));
     if (param->base_reg() == FPREG) {
-      // Slot index for the leftmost copied parameter is 0.
       // Slot index for the rightmost fixed parameter is -1.
-      slot_index -= flow_graph_.num_non_copied_params();
+      slot_index -= flow_graph_.num_direct_parameters();
     }
 
 #if defined(TARGET_ARCH_DBC)
@@ -701,36 +699,19 @@
     range->set_assigned_location(
         Location::StackSlot(slot_index, param->base_reg()));
     range->set_spill_slot(Location::StackSlot(slot_index, param->base_reg()));
-
   } else if (defn->IsSpecialParameter()) {
     SpecialParameterInstr* param = defn->AsSpecialParameter();
+    ASSERT(param->kind() == SpecialParameterInstr::kArgDescriptor);
     Location loc;
 #if defined(TARGET_ARCH_DBC)
-    intptr_t slot_index = flow_graph_.num_copied_params();
-    if ((param->kind() == SpecialParameterInstr::kContext) &&
-        flow_graph_.isolate()->reify_generic_functions() &&
-        flow_graph_.function().IsGeneric()) {
-      // The first slot is used for function type arguments, either as their
-      // permanent location or as their temporary location when captured.
-      // So use the next one for the context.
-      // (see FlowGraphCompiler::EmitFrameEntry)
-      slot_index++;
-    }
-    loc = Location::RegisterLocation(slot_index);
+    loc = Location::ArgumentsDescriptorLocation();
+    range->set_assigned_location(loc);
 #else
-    if (param->kind() == SpecialParameterInstr::kContext) {
-      loc = Location::RegisterLocation(CTX);
-    } else {
-      ASSERT(param->kind() == SpecialParameterInstr::kTypeArgs);
-      loc = Location::StackSlot(flow_graph_.num_copied_params(), FPREG);
-      range->set_assigned_location(loc);
-      range->set_spill_slot(loc);
-    }
+    loc = Location::RegisterLocation(ARGS_DESC_REG);
+    range->set_assigned_location(loc);
 #endif  // defined(TARGET_ARCH_DBC)
-
     if (loc.IsRegister()) {
       AssignSafepoints(defn, range);
-      range->set_assigned_location(loc);
       if (range->End() > kNormalEntryPos) {
         LiveRange* tail = range->SplitAt(kNormalEntryPos);
         CompleteRange(tail, Location::kRegister);
@@ -3002,9 +2983,8 @@
   // introducing a separate field. It has roughly the same meaning:
   // number of used registers determines how big of a frame to reserve for
   // this function on DBC stack.
-  entry->set_spill_slot_count(Utils::Maximum(
-      (last_used_cpu_register + 1) + (last_used_fpu_register + 1),
-      flow_graph_.num_copied_params()));
+  entry->set_spill_slot_count((last_used_cpu_register + 1) +
+                              (last_used_fpu_register + 1));
 #endif
 
   if (FLAG_print_ssa_liveranges) {
diff --git a/runtime/vm/compiler/backend/locations.cc b/runtime/vm/compiler/backend/locations.cc
index 8c5b869..a01abb2 100644
--- a/runtime/vm/compiler/backend/locations.cc
+++ b/runtime/vm/compiler/backend/locations.cc
@@ -179,6 +179,10 @@
           return "0";
       }
       UNREACHABLE();
+#if TARGET_ARCH_DBC
+    case kArgsDescRegister:
+      return "ArgDesc";
+#endif
     default:
       if (IsConstant()) {
         return "C";
diff --git a/runtime/vm/compiler/backend/locations.h b/runtime/vm/compiler/backend/locations.h
index 9f5c203..2cf9a45 100644
--- a/runtime/vm/compiler/backend/locations.h
+++ b/runtime/vm/compiler/backend/locations.h
@@ -51,8 +51,11 @@
  private:
   enum {
     // Number of bits required to encode Kind value.
-    kBitsForKind = 4,
-    kBitsForPayload = kWordSize * kBitsPerByte - kBitsForKind,
+    kKindBitsPos = 0,
+    kKindBitsSize = 5,
+
+    kPayloadBitsPos = kKindBitsPos + kKindBitsSize,
+    kPayloadBitsSize = kBitsPerWord - kPayloadBitsPos,
   };
 
   static const uword kInvalidLocation = 0;
@@ -94,6 +97,12 @@
     // FpuRegister location represents a fixed fpu register.  Payload contains
     // its code.
     kFpuRegister = 12,
+
+#ifdef TARGET_ARCH_DBC
+    // We use this to signify a special `Location` where the arguments
+    // descriptor can be found on DBC.
+    kArgsDescRegister = 15,
+#endif
   };
 
   Location() : value_(kInvalidLocation) {
@@ -120,6 +129,11 @@
     COMPILE_ASSERT((kFpuRegister & kLocationTagMask) != kConstantTag);
     COMPILE_ASSERT((kFpuRegister & kLocationTagMask) != kPairLocationTag);
 
+#ifdef TARGET_ARCH_DBC
+    COMPILE_ASSERT((kArgsDescRegister & kLocationTagMask) != kConstantTag);
+    COMPILE_ASSERT((kArgsDescRegister & kLocationTagMask) != kPairLocationTag);
+#endif
+
     // Verify tags and tagmask.
     COMPILE_ASSERT((kConstantTag & kLocationTagMask) == kConstantTag);
 
@@ -233,6 +247,14 @@
 
   bool IsFpuRegister() const { return kind() == kFpuRegister; }
 
+#ifdef TARGET_ARCH_DBC
+  static Location ArgumentsDescriptorLocation() {
+    return Location(kArgsDescRegister, 0);
+  }
+
+  bool IsArgsDescRegister() const { return kind() == kArgsDescRegister; }
+#endif
+
   FpuRegister fpu_reg() const {
     ASSERT(IsFpuRegister());
     return static_cast<FpuRegister>(payload());
@@ -356,9 +378,10 @@
 
   uword payload() const { return PayloadField::decode(value_); }
 
-  class KindField : public BitField<uword, Kind, 0, kBitsForKind> {};
+  class KindField : public BitField<uword, Kind, kKindBitsPos, kKindBitsSize> {
+  };
   class PayloadField
-      : public BitField<uword, uword, kBitsForKind, kBitsForPayload> {};
+      : public BitField<uword, uword, kPayloadBitsPos, kPayloadBitsSize> {};
 
   // Layout for kUnallocated locations payload.
   typedef BitField<uword, Policy, 0, 3> PolicyField;
@@ -369,7 +392,7 @@
 #else
   static const intptr_t kBitsForBaseReg = 5;
 #endif
-  static const intptr_t kBitsForStackIndex = kBitsForPayload - kBitsForBaseReg;
+  static const intptr_t kBitsForStackIndex = kPayloadBitsSize - kBitsForBaseReg;
   class StackSlotBaseField
       : public BitField<uword, Register, 0, kBitsForBaseReg> {};
   class StackIndexField
diff --git a/runtime/vm/compiler/backend/locations_helpers.h b/runtime/vm/compiler/backend/locations_helpers.h
index b61abb6..481fbdb 100644
--- a/runtime/vm/compiler/backend/locations_helpers.h
+++ b/runtime/vm/compiler/backend/locations_helpers.h
@@ -78,6 +78,10 @@
 // register and the instruction will produce output in the same register.
 struct SameAsFirstInput {};
 
+// Marker type used to signal that output has NoLocation register
+// constraint.
+struct NoLocation {};
+
 // Marker type used to signal that this input, output or temp needs to
 // be in a fixed register `reg` of type `R` (either Register or FpuRegister).
 template <typename R, R reg>
@@ -211,6 +215,15 @@
   static Location ToConstraint() { return Location::SameAsFirstInput(); }
 };
 
+template <>
+struct LocationTrait<NoLocation> {
+  static const bool kIsTemp = false;  // This is not a temporary.
+
+  static NoLocation Unwrap(const Location& loc) { return NoLocation(); }
+
+  static Location ToConstraint() { return Location::NoLocation(); }
+};
+
 // Auxiliary types and macro helpers to construct lists of types.
 // TODO(vegorov) rewrite this using variadic templates when we enable C++11
 
diff --git a/runtime/vm/compiler/backend/redundancy_elimination.cc b/runtime/vm/compiler/backend/redundancy_elimination.cc
index bc4c019..41ad3f9 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination.cc
@@ -3152,7 +3152,7 @@
   // at the catch-entry with this constant.
   const GrowableArray<CatchBlockEntryInstr*>& catch_entries =
       flow_graph->graph_entry()->catch_entries();
-  intptr_t base = kFirstLocalSlotFromFp + flow_graph->num_non_copied_params();
+
   for (intptr_t catch_idx = 0; catch_idx < catch_entries.length();
        ++catch_idx) {
     CatchBlockEntryInstr* catch_entry = catch_entries[catch_idx];
@@ -3169,11 +3169,13 @@
     // exception_var and stacktrace_var are never constant.  In asynchronous or
     // generator functions they may be context-allocated in which case they are
     // not tracked in the environment anyway.
+
+    const intptr_t parameter_count = flow_graph->num_direct_parameters();
     if (!catch_entry->exception_var().is_captured()) {
-      cdefs[base - catch_entry->exception_var().index()] = NULL;
+      cdefs[catch_entry->exception_var().BitIndexIn(parameter_count)] = NULL;
     }
     if (!catch_entry->stacktrace_var().is_captured()) {
-      cdefs[base - catch_entry->stacktrace_var().index()] = NULL;
+      cdefs[catch_entry->stacktrace_var().BitIndexIn(parameter_count)] = NULL;
     }
 
     for (BlockIterator block_it = flow_graph->reverse_postorder_iterator();
diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc
index 940bf22..18cdd45 100644
--- a/runtime/vm/compiler/backend/type_propagator.cc
+++ b/runtime/vm/compiler/backend/type_propagator.cc
@@ -1021,6 +1021,8 @@
       return CompileType::FromCid(kContextCid);
     case kTypeArgs:
       return CompileType::FromCid(kTypeArgumentsCid);
+    case kArgDescriptor:
+      return CompileType::FromCid(kImmutableArrayCid);
   }
   UNREACHABLE();
   return CompileType::Dynamic();
diff --git a/runtime/vm/compiler/compiler_sources.gni b/runtime/vm/compiler/compiler_sources.gni
index 3000057..3fc13ce 100644
--- a/runtime/vm/compiler/compiler_sources.gni
+++ b/runtime/vm/compiler/compiler_sources.gni
@@ -75,6 +75,8 @@
   "frontend/kernel_binary_flowgraph.h",
   "frontend/kernel_to_il.cc",
   "frontend/kernel_to_il.h",
+  "frontend/prologue_builder.cc",
+  "frontend/prologue_builder.h",
   "intrinsifier.cc",
   "intrinsifier.h",
   "intrinsifier_arm.cc",
diff --git a/runtime/vm/compiler/frontend/flow_graph_builder.cc b/runtime/vm/compiler/frontend/flow_graph_builder.cc
index 73fad65..0b92e55 100644
--- a/runtime/vm/compiler/frontend/flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/flow_graph_builder.cc
@@ -14,6 +14,8 @@
 #include "vm/compiler/backend/flow_graph_compiler.h"
 #include "vm/compiler/backend/il.h"
 #include "vm/compiler/backend/il_printer.h"
+#include "vm/compiler/frontend/kernel_to_il.h"
+#include "vm/compiler/frontend/prologue_builder.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/exceptions.h"
 #include "vm/flags.h"
@@ -302,12 +304,6 @@
     : parsed_function_(parsed_function),
       ic_data_array_(ic_data_array),
       context_level_array_(context_level_array),
-      num_copied_params_(parsed_function.num_copied_params()),
-      // All parameters are copied if any parameter is.
-      num_non_copied_params_(
-          (num_copied_params_ == 0)
-              ? parsed_function.function().num_fixed_parameters()
-              : 0),
       num_stack_locals_(parsed_function.num_stack_locals()),
       exit_collector_(exit_collector),
       last_used_block_id_(0),  // 0 is used for the graph entry.
@@ -2109,8 +2105,7 @@
 
 intptr_t EffectGraphVisitor::GetCurrentTempLocalIndex() const {
   return kFirstLocalSlotFromFp - owner()->num_stack_locals() -
-         owner()->num_copied_params() - owner()->args_pushed() -
-         owner()->temp_count() + 1;
+         owner()->args_pushed() - owner()->temp_count() + 1;
 }
 
 LocalVariable* EffectGraphVisitor::EnterTempLocalScope(Value* value) {
@@ -3326,7 +3321,7 @@
   ZoneGrowableArray<PushArgumentInstr*>& args =
       *new (Z) ZoneGrowableArray<PushArgumentInstr*>(function.NumParameters());
   for (intptr_t i = 0; i < function.NumParameters(); ++i) {
-    LocalVariable* parameter = pf.node_sequence()->scope()->VariableAt(i);
+    LocalVariable* parameter = pf.RawParameterVariable(i);
     Value* value = Bind(new (Z) LoadLocalInstr(*parameter, node->token_pos()));
     args.Add(PushArgument(value));
   }
@@ -3736,37 +3731,26 @@
     if (is_top_level_sequence) {
       ASSERT(scope->context_level() == 1);
       const int num_params = function.NumParameters();
-      int param_frame_index = (num_params == function.num_fixed_parameters())
-                                  ? (kParamEndSlotFromFp + num_params)
-                                  : kFirstLocalSlotFromFp;
-      for (int pos = 0; pos < num_params; param_frame_index--, pos++) {
+      for (int pos = 0; pos < num_params; pos++) {
         const LocalVariable& parameter = *scope->VariableAt(pos);
         ASSERT(parameter.owner() == scope);
         if (parameter.is_captured()) {
-          // Create a temporary local describing the original position.
-          const String& temp_name = Symbols::TempParam();
-          LocalVariable* temp_local =
-              new (Z) LocalVariable(TokenPosition::kNoSource,  // Token index.
-                                    TokenPosition::kNoSource,  // Token index.
-                                    temp_name,
-                                    Object::dynamic_type());  // Type.
-          temp_local->set_index(param_frame_index);
-
-          // Mark this local as captured parameter so that the optimizer
-          // correctly handles these when compiling try-catch: Captured
-          // parameters are not in the stack environment, therefore they
-          // must be skipped when emitting sync-code in try-blocks.
-          temp_local->set_is_captured_parameter(true);
-
+          LocalVariable& raw_parameter =
+              *owner_->parsed_function().RawParameterVariable(pos);
+          ASSERT((function.HasOptionalParameters() &&
+                  raw_parameter.owner() == scope) ||
+                 !(function.HasOptionalParameters() &&
+                   raw_parameter.owner() == NULL));
+          ASSERT(!raw_parameter.is_captured());
           // Copy parameter from local frame to current context.
-          Value* load = Bind(BuildLoadLocal(*temp_local, node->token_pos()));
+          Value* load = Bind(BuildLoadLocal(raw_parameter, node->token_pos()));
           Do(BuildStoreLocal(parameter, load, ST(node->token_pos())));
           // Write NULL to the source location to detect buggy accesses and
           // allow GC of passed value if it gets overwritten by a new value in
           // the function.
           Value* null_constant = Bind(
               new (Z) ConstantInstr(Object::ZoneHandle(Z, Object::null())));
-          Do(BuildStoreLocal(*temp_local, null_constant,
+          Do(BuildStoreLocal(raw_parameter, null_constant,
                              ST(node->token_pos())));
         }
       }
@@ -3784,23 +3768,9 @@
     LocalVariable* parent_type_args_var =
         parsed_function.parent_type_arguments();
     if (type_args_var->is_captured() || (parent_type_args_var != NULL)) {
-      // Create a temporary local describing the original position.
-      const String& temp_name = Symbols::TempParam();
-      LocalVariable* temp_local =
-          new (Z) LocalVariable(TokenPosition::kNoSource,  // Token index.
-                                TokenPosition::kNoSource,  // Token index.
-                                temp_name,
-                                Object::dynamic_type());  // Type.
-      temp_local->set_index(parsed_function.first_stack_local_index());
-
-      // Mark this local as captured parameter so that the optimizer
-      // correctly handles these when compiling try-catch: Captured
-      // parameters are not in the stack environment, therefore they
-      // must be skipped when emitting sync-code in try-blocks.
-      temp_local->set_is_captured_parameter(true);  // TODO(regis): Correct?
-
+      LocalVariable* raw_type_args = parsed_function.RawTypeArgumentsVariable();
       Value* type_args_val =
-          Bind(BuildLoadLocal(*temp_local, node->token_pos()));
+          Bind(BuildLoadLocal(*raw_type_args, node->token_pos()));
       if (parent_type_args_var != NULL) {
         ASSERT(parent_type_args_var->owner() != scope);
         // Call the runtime to concatenate both vectors.
@@ -3828,21 +3798,6 @@
             ICData::kStatic));
       }
       Do(BuildStoreLocal(*type_args_var, type_args_val, ST(node->token_pos())));
-      if (type_args_var->is_captured()) {
-        // Write NULL to the source location to detect buggy accesses and
-        // allow GC of passed value if it gets overwritten by a new value in
-        // the function.
-        Value* null_constant =
-            Bind(new (Z) ConstantInstr(Object::ZoneHandle(Z, Object::null())));
-        Do(BuildStoreLocal(*temp_local, null_constant, ST(node->token_pos())));
-      } else {
-        // Do not write NULL, since the temp is also the final location.
-        ASSERT(temp_local->index() == type_args_var->index());
-      }
-    } else {
-      // The type args slot is the final location. No copy needed.
-      ASSERT(type_args_var->index() ==
-             parsed_function.first_stack_local_index());
     }
   }
 
@@ -4412,11 +4367,22 @@
   }
   TargetEntryInstr* normal_entry = new (Z) TargetEntryInstr(
       AllocateBlockId(), CatchClauseNode::kInvalidTryIndex, GetNextDeoptId());
+
+  // Generate optional positional/named argument copying!
+  const bool compiling_for_osr = osr_id_ != Compiler::kNoOSRDeoptId;
+
+  kernel::PrologueBuilder prologue_builder(
+      &parsed_function_, last_used_block_id_, compiling_for_osr, IsInlining());
+  PrologueInfo prologue_info(-1, -1);
+  BlockEntryInstr* instruction_cursor =
+      prologue_builder.BuildPrologue(normal_entry, &prologue_info);
+  last_used_block_id_ = prologue_builder.last_used_block_id();
+
   graph_entry_ =
       new (Z) GraphEntryInstr(parsed_function(), normal_entry, osr_id_);
   EffectGraphVisitor for_effect(this);
   parsed_function().node_sequence()->Visit(&for_effect);
-  AppendFragment(normal_entry, for_effect);
+  AppendFragment(instruction_cursor, for_effect);
   // Check that the graph is properly terminated.
   ASSERT(!for_effect.is_open());
 
@@ -4428,7 +4394,6 @@
     graph_entry_->RelinkToOsrEntry(Z, last_used_block_id_);
   }
 
-  PrologueInfo prologue_info(-1, -1);
   FlowGraph* graph = new (Z) FlowGraph(parsed_function(), graph_entry_,
                                        last_used_block_id_, prologue_info);
   graph->set_await_token_positions(await_token_positions_);
diff --git a/runtime/vm/compiler/frontend/flow_graph_builder.h b/runtime/vm/compiler/frontend/flow_graph_builder.h
index 5f5f72d..f737103 100644
--- a/runtime/vm/compiler/frontend/flow_graph_builder.h
+++ b/runtime/vm/compiler/frontend/flow_graph_builder.h
@@ -140,8 +140,6 @@
 
   GraphEntryInstr* graph_entry() const { return graph_entry_; }
 
-  intptr_t num_copied_params() const { return num_copied_params_; }
-  intptr_t num_non_copied_params() const { return num_non_copied_params_; }
   intptr_t num_stack_locals() const { return num_stack_locals_; }
 
   bool IsInlining() const { return (exit_collector_ != NULL); }
@@ -187,10 +185,7 @@
   friend class Intrinsifier;
 
   intptr_t parameter_count() const {
-    return num_copied_params_ + num_non_copied_params_;
-  }
-  intptr_t variable_count() const {
-    return parameter_count() + num_stack_locals_;
+    return parsed_function_.function().NumParameters();
   }
 
   const ParsedFunction& parsed_function_;
@@ -198,9 +193,7 @@
   // Contains (deopt_id, context_level) pairs.
   ZoneGrowableArray<intptr_t>* context_level_array_;
 
-  const intptr_t num_copied_params_;
-  const intptr_t num_non_copied_params_;
-  const intptr_t num_stack_locals_;  // Does not include any parameters.
+  const intptr_t num_stack_locals_;
   InlineExitCollector* const exit_collector_;
 
   intptr_t last_used_block_id_;
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 979efd0..86cf18f 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -261,6 +261,12 @@
     case kName:
       builder_->SkipName();  // read name.
       if (++next_read_ == field) return;
+    case kSourceUriIndex:
+      source_uri_index_ = builder_->ReadUInt();  // read source_uri_index.
+      builder_->current_script_id_ = source_uri_index_;
+      builder_->record_token_position(position_);
+      builder_->record_token_position(end_position_);
+      if (++next_read_ == field) return;
     case kAnnotations: {
       annotation_count_ = builder_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < annotation_count_; ++i) {
@@ -777,6 +783,11 @@
     parsed_function_->set_function_type_arguments(type_args_var);
   }
 
+  if (parsed_function_->has_arg_desc_var()) {
+    needs_expr_temp_ = true;
+    scope_->AddVariable(parsed_function_->arg_desc_var());
+  }
+
   LocalVariable* context_var = parsed_function_->current_context_var();
   context_var->set_is_forced_stack();
   scope_->AddVariable(context_var);
@@ -2517,6 +2528,7 @@
 
 Instance& StreamingConstantEvaluator::EvaluateExpression(intptr_t offset,
                                                          bool reset_position) {
+  ASSERT(Error::Handle(Z, H.thread()->sticky_error()).IsNull());
   if (!GetCachedConstant(offset, &result_)) {
     ASSERT(IsAllowedToEvaluate());
     intptr_t original_offset = builder_->ReaderOffset();
@@ -2784,12 +2796,16 @@
   NameIndex target =
       builder_->ReadCanonicalNameReference();  // read target_reference.
 
+  ASSERT(Error::Handle(Z, H.thread()->sticky_error()).IsNull());
+
   if (H.IsField(target)) {
     const Field& field = Field::Handle(Z, H.LookupFieldByKernelField(target));
     if (!field.is_const()) {
       H.ReportError(script_, position, "Not a constant field.");
     }
     if (field.StaticValue() == Object::transition_sentinel().raw()) {
+      builder_->InlineBailout(
+          "kernel::StreamingConstantEvaluator::EvaluateStaticGet::Cyclic");
       H.ReportError(script_, position, "Not a constant expression.");
     } else if (field.StaticValue() == Object::sentinel().raw()) {
       field.SetStaticValue(Object::transition_sentinel());
@@ -3634,6 +3650,7 @@
 
 Fragment StreamingFlowGraphBuilder::BuildFieldInitializer(
     NameIndex canonical_name) {
+  ASSERT(Error::Handle(Z, H.thread()->sticky_error()).IsNull());
   Field& field =
       Field::ZoneHandle(Z, H.LookupFieldByKernelField(canonical_name));
   if (PeekTag() == kNullLiteral) {
@@ -3651,6 +3668,7 @@
 
 Fragment StreamingFlowGraphBuilder::BuildInitializers(
     const Class& parent_class) {
+  ASSERT(Error::Handle(Z, H.thread()->sticky_error()).IsNull());
   Fragment instructions;
 
   // Start by getting the position of the constructors initializer.
@@ -3831,14 +3849,20 @@
 
 FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfImplicitClosureFunction(
     const Function& function) {
+  // The prologue builder needs the default parameter values.
+  SetupDefaultParameterValues();
+
   const Function& target = Function::ZoneHandle(Z, function.parent_function());
 
   TargetEntryInstr* normal_entry = flow_graph_builder_->BuildTargetEntry();
+  PrologueInfo prologue_info(-1, -1);
+  BlockEntryInstr* instruction_cursor =
+      flow_graph_builder_->BuildPrologue(normal_entry, &prologue_info);
+
   flow_graph_builder_->graph_entry_ = new (Z) GraphEntryInstr(
       *parsed_function(), normal_entry, Compiler::kNoOSRDeoptId);
-  SetupDefaultParameterValues();
 
-  Fragment body(normal_entry);
+  Fragment body(instruction_cursor);
   body += flow_graph_builder_->CheckStackOverflowInPrologue();
 
   intptr_t type_args_len = 0;
@@ -3898,32 +3922,24 @@
   // Return the result.
   body += Return(function_node_helper.end_position_);
 
-  PrologueInfo prologue_info(-1, -1);
   return new (Z)
       FlowGraph(*parsed_function(), flow_graph_builder_->graph_entry_,
                 flow_graph_builder_->last_used_block_id_, prologue_info);
 }
 
-LocalVariable* StreamingFlowGraphBuilder::LookupParameterDirect(
-    intptr_t kernel_offset,
-    intptr_t parameter_index) {
-  LocalVariable* var = LookupVariable(kernel_offset);
-  LocalVariable* parameter =
-      new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                            Symbols::TempParam(), var->type());
-  parameter->set_index(parameter_index);
-  if (var->is_captured()) parameter->set_is_captured_parameter(true);
-  return parameter;
-}
-
 FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfFunction(bool constructor) {
+  // The prologue builder needs the default parameter values.
+  SetupDefaultParameterValues();
+
   const Function& dart_function = parsed_function()->function();
   TargetEntryInstr* normal_entry = flow_graph_builder_->BuildTargetEntry();
+  PrologueInfo prologue_info(-1, -1);
+  BlockEntryInstr* instruction_cursor =
+      flow_graph_builder_->BuildPrologue(normal_entry, &prologue_info);
+
   flow_graph_builder_->graph_entry_ = new (Z) GraphEntryInstr(
       *parsed_function(), normal_entry, flow_graph_builder_->osr_id_);
 
-  SetupDefaultParameterValues();
-
   Fragment body;
 
   if (dart_function.IsConvertedClosureFunction()) {
@@ -3991,29 +4007,29 @@
     intptr_t parameter_count = dart_function.NumParameters();
     intptr_t parameter_index = parsed_function()->first_parameter_index();
 
+    const ParsedFunction& pf = *flow_graph_builder_->parsed_function_;
+    const Function& function = pf.function();
+
     for (intptr_t i = 0; i < parameter_count; ++i, --parameter_index) {
       LocalVariable* variable = scope->VariableAt(i);
       if (variable->is_captured()) {
-        // There is no LocalVariable describing the on-stack parameter so
-        // create one directly and use the same type.
-        LocalVariable* parameter = new (Z)
-            LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                          Symbols::TempParam(), variable->type());
-        parameter->set_index(parameter_index);
-        // Mark the stack variable so it will be ignored by the code for
-        // try/catch.
-        parameter->set_is_captured_parameter(true);
+        LocalVariable& raw_parameter = *pf.RawParameterVariable(i);
+        ASSERT((function.HasOptionalParameters() &&
+                raw_parameter.owner() == scope) ||
+               (!function.HasOptionalParameters() &&
+                raw_parameter.owner() == NULL));
+        ASSERT(!raw_parameter.is_captured());
 
         // Copy the parameter from the stack to the context.  Overwrite it
         // with a null constant on the stack so the original value is
         // eligible for garbage collection.
         body += LoadLocal(context);
-        body += LoadLocal(parameter);
+        body += LoadLocal(&raw_parameter);
         body += flow_graph_builder_->StoreInstanceField(
             TokenPosition::kNoSource,
             Context::variable_offset(variable->index()));
         body += NullConstant();
-        body += StoreLocal(TokenPosition::kNoSource, parameter);
+        body += StoreLocal(TokenPosition::kNoSource, &raw_parameter);
         body += Drop();
       }
     }
@@ -4280,7 +4296,7 @@
     flow_graph_builder_->context_depth_ = current_context_depth;
   }
 
-  normal_entry->LinkTo(body.entry);
+  instruction_cursor->LinkTo(body.entry);
 
   GraphEntryInstr* graph_entry = flow_graph_builder_->graph_entry_;
   // When compiling for OSR, use a depth first search to find the OSR
@@ -4291,13 +4307,13 @@
     graph_entry->RelinkToOsrEntry(Z,
                                   flow_graph_builder_->last_used_block_id_ + 1);
   }
-  PrologueInfo prologue_info(-1, -1);
   return new (Z)
       FlowGraph(*parsed_function(), graph_entry,
                 flow_graph_builder_->last_used_block_id_, prologue_info);
 }
 
 FlowGraph* StreamingFlowGraphBuilder::BuildGraph(intptr_t kernel_offset) {
+  ASSERT(Error::Handle(Z, H.thread()->sticky_error()).IsNull());
   const Function& function = parsed_function()->function();
 
   // Setup a [ActiveClassScope] and a [ActiveMemberScope] which will be used
@@ -6010,9 +6026,7 @@
   intptr_t argument_check_bits = 0;
   if (I->strong()) {
     argument_check_bits = ArgumentCheckBitsForSetter(
-        // TODO(sjindel): Change 'Function::null_function()' to
-        // '*interface_target' and fix breakages.
-        Function::null_function(), static_cast<DispatchCategory>(flags & 3));
+        *interface_target, static_cast<DispatchCategory>(flags & 3));
   }
 
   if (direct_call.check_receiver_for_null_) {
@@ -6339,6 +6353,7 @@
 }
 
 Fragment StreamingFlowGraphBuilder::BuildStaticGet(TokenPosition* p) {
+  ASSERT(Error::Handle(Z, H.thread()->sticky_error()).IsNull());
   intptr_t offset = ReaderOffset() - 1;  // Include the tag.
 
   TokenPosition position = ReadPosition();  // read position.
@@ -6509,9 +6524,7 @@
           Utils::SignedNBitMask(strong_checked_type_arguments);
       break;
     case Interface: {
-      // TODO(sjindel): Restore this assertion once '*interface_target'
-      // is passed to this function instead of 'Function::null_function()'.
-      // ASSERT(!interface_target.IsNull() || !I->strong());
+      ASSERT(!interface_target.IsNull() || !I->strong());
       if (interface_target.IsNull()) {
         argument_check_bits =
             Utils::SignedNBitMask(strong_checked_arguments + 1);
@@ -6547,6 +6560,7 @@
         }
       }
 
+      fn_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
       fn_helper.ReadUntilExcluding(FunctionNodeHelper::kPositionalParameters);
       intptr_t num_interface_pos_params = ReadListLength();
       ASSERT(num_interface_pos_params >= positional_argument_count);
@@ -6744,11 +6758,9 @@
   if (I->strong()) {
     ArgumentCheckBitsForInvocation(
         argument_count - 1, type_args_len, positional_argument_count,
-        argument_names,
-        // TODO(sjindel): Change 'Function::null_function()' to
-        // '*interface_target' and fix breakages.
-        Function::null_function(), static_cast<DispatchCategory>(flags & 3),
-        &argument_check_bits, &type_argument_check_bits);
+        argument_names, *interface_target,
+        static_cast<DispatchCategory>(flags & 3), &argument_check_bits,
+        &type_argument_check_bits);
   }
 
   if (!direct_call.target_.IsNull()) {
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 5ca0340..3035c75 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -312,6 +312,7 @@
     kEndPosition,
     kFlags,
     kName,
+    kSourceUriIndex,
     kAnnotations,
     kFunction,
     kInitializers,
@@ -344,6 +345,7 @@
   TokenPosition position_;
   TokenPosition end_position_;
   uint8_t flags_;
+  intptr_t source_uri_index_;
   intptr_t annotation_count_;
 
  private:
@@ -1033,8 +1035,6 @@
   const TypeArguments& PeekArgumentsInstantiatedType(const Class& klass);
   intptr_t PeekArgumentsCount();
 
-  LocalVariable* LookupParameterDirect(intptr_t kernel_offset,
-                                       intptr_t parameter_index);
   LocalVariable* LookupVariable(intptr_t kernel_offset);
   LocalVariable* MakeTemporary();
   RawFunction* LookupMethodByMember(NameIndex target,
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 7f446dd..def0b90 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -7,7 +7,9 @@
 #include "vm/compiler/frontend/kernel_to_il.h"
 
 #include "vm/compiler/backend/il.h"
+#include "vm/compiler/backend/il_printer.h"
 #include "vm/compiler/frontend/kernel_binary_flowgraph.h"
+#include "vm/compiler/frontend/prologue_builder.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/kernel_loader.h"
 #include "vm/longjump.h"
@@ -1272,6 +1274,12 @@
   return instructions;
 }
 
+Fragment BaseFlowGraphBuilder::TailCall(const Code& code) {
+  Fragment instructions;
+  Value* arg_desc = Pop();
+  return Fragment(new (Z) TailCallInstr(code, arg_desc));
+}
+
 Fragment FlowGraphBuilder::RethrowException(TokenPosition position,
                                             int catch_try_index) {
   Fragment instructions;
@@ -1755,7 +1763,7 @@
                             symbol_name, Object::dynamic_type());
   // Set the index relative to the base of the expression stack including
   // outgoing arguments.
-  variable->set_index(parsed_function_->first_stack_local_index() -
+  variable->set_index(kFirstLocalSlotFromFp -
                       parsed_function_->num_stack_locals() -
                       pending_argument_count_ - index);
 
@@ -2008,8 +2016,7 @@
     default: {
       String& name = String::ZoneHandle(Z, function.native_name());
       for (intptr_t i = 0; i < function.NumParameters(); ++i) {
-        body += LoadLocal(
-            parsed_function_->node_sequence()->scope()->VariableAt(i));
+        body += LoadLocal(parsed_function_->RawParameterVariable(i));
         body += PushArgument();
       }
       body += NativeCall(&name, &function);
@@ -2217,6 +2224,20 @@
   return instructions;
 }
 
+BlockEntryInstr* FlowGraphBuilder::BuildPrologue(TargetEntryInstr* normal_entry,
+                                                 PrologueInfo* prologue_info) {
+  const bool compiling_for_osr = IsCompiledForOsr();
+
+  kernel::PrologueBuilder prologue_builder(
+      parsed_function_, last_used_block_id_, compiling_for_osr, IsInlining());
+  BlockEntryInstr* instruction_cursor =
+      prologue_builder.BuildPrologue(normal_entry, prologue_info);
+
+  last_used_block_id_ = prologue_builder.last_used_block_id();
+
+  return instruction_cursor;
+}
+
 FlowGraph* FlowGraphBuilder::BuildGraphOfMethodExtractor(
     const Function& method) {
   // A method extractor is the implicit getter for a method.
@@ -2243,6 +2264,9 @@
   // the arguments descriptor at a call site.
 
   TargetEntryInstr* normal_entry = BuildTargetEntry();
+  PrologueInfo prologue_info(-1, -1);
+  BlockEntryInstr* instruction_cursor =
+      BuildPrologue(normal_entry, &prologue_info);
   graph_entry_ = new (Z)
       GraphEntryInstr(*parsed_function_, normal_entry, Compiler::kNoOSRDeoptId);
 
@@ -2260,7 +2284,7 @@
   }
   parsed_function_->set_default_parameter_values(default_values);
 
-  Fragment body(normal_entry);
+  Fragment body(instruction_cursor);
   body += CheckStackOverflowInPrologue();
 
   // The receiver is the first argument to noSuchMethod, and it is the first
@@ -2347,7 +2371,6 @@
                      /* argument_count = */ 2, ICData::kNSMDispatch);
   body += Return(TokenPosition::kNoSource);
 
-  PrologueInfo prologue_info(-1, -1);
   return new (Z) FlowGraph(*parsed_function_, graph_entry_, last_used_block_id_,
                            prologue_info);
 }
@@ -2390,10 +2413,13 @@
   parsed_function_->set_default_parameter_values(default_values);
 
   TargetEntryInstr* normal_entry = BuildTargetEntry();
+  PrologueInfo prologue_info(-1, -1);
+  BlockEntryInstr* instruction_cursor =
+      BuildPrologue(normal_entry, &prologue_info);
   graph_entry_ = new (Z)
       GraphEntryInstr(*parsed_function_, normal_entry, Compiler::kNoOSRDeoptId);
 
-  Fragment body(normal_entry);
+  Fragment body(instruction_cursor);
   body += CheckStackOverflowInPrologue();
 
   LocalScope* scope = parsed_function_->node_sequence()->scope();
@@ -2448,7 +2474,6 @@
 
   body += Return(TokenPosition::kNoSource);
 
-  PrologueInfo prologue_info(-1, -1);
   return new (Z) FlowGraph(*parsed_function_, graph_entry_, last_used_block_id_,
                            prologue_info);
 }
@@ -2482,6 +2507,43 @@
   return arguments;
 }
 
+Fragment BaseFlowGraphBuilder::SmiRelationalOp(Token::Kind kind) {
+  Value* right = Pop();
+  Value* left = Pop();
+  RelationalOpInstr* instr = new (Z) RelationalOpInstr(
+      TokenPosition::kNoSource, kind, left, right, kSmiCid, GetNextDeoptId());
+  Push(instr);
+  return Fragment(instr);
+}
+
+Fragment BaseFlowGraphBuilder::SmiBinaryOp(Token::Kind kind,
+                                           bool is_truncating) {
+  Value* right = Pop();
+  Value* left = Pop();
+  BinarySmiOpInstr* instr =
+      new (Z) BinarySmiOpInstr(kind, left, right, GetNextDeoptId());
+  if (is_truncating) {
+    instr->mark_truncating();
+  }
+  Push(instr);
+  return Fragment(instr);
+}
+
+Fragment BaseFlowGraphBuilder::LoadFpRelativeSlot(intptr_t offset) {
+  LoadIndexedUnsafeInstr* instr = new (Z) LoadIndexedUnsafeInstr(Pop(), offset);
+  Push(instr);
+  return Fragment(instr);
+}
+
+Fragment BaseFlowGraphBuilder::StoreFpRelativeSlot(intptr_t offset) {
+  Value* value = Pop();
+  Value* index = Pop();
+  StoreIndexedUnsafeInstr* instr =
+      new (Z) StoreIndexedUnsafeInstr(index, value, offset);
+  Push(instr);
+  return Fragment(instr);
+}
+
 RawObject* EvaluateMetadata(const Field& metadata_field) {
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index c3dfe4a..10d4733 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -568,7 +568,10 @@
   Fragment IntConstant(int64_t value);
   Fragment Constant(const Object& value);
   Fragment NullConstant();
+  Fragment SmiRelationalOp(Token::Kind kind);
+  Fragment SmiBinaryOp(Token::Kind op, bool is_truncating = false);
   Fragment LoadFpRelativeSlot(intptr_t offset);
+  Fragment StoreFpRelativeSlot(intptr_t offset);
   Fragment BranchIfTrue(TargetEntryInstr** then_entry,
                         TargetEntryInstr** otherwise_entry,
                         bool negate = false);
@@ -620,6 +623,7 @@
   friend class TryCatchBlock;
   friend class StreamingFlowGraphBuilder;
   friend class FlowGraphBuilder;
+  friend class PrologueBuilder;
 };
 
 class FlowGraphBuilder : public BaseFlowGraphBuilder {
@@ -638,8 +642,7 @@
 
  private:
   BlockEntryInstr* BuildPrologue(TargetEntryInstr* normal_entry,
-                                 intptr_t* min_prologue_block_id,
-                                 intptr_t* max_prologue_block_id);
+                                 PrologueInfo* prologue_info);
 
   FlowGraph* BuildGraphOfMethodExtractor(const Function& method);
   FlowGraph* BuildGraphOfNoSuchMethodDispatcher(const Function& function);
diff --git a/runtime/vm/compiler/frontend/prologue_builder.cc b/runtime/vm/compiler/frontend/prologue_builder.cc
new file mode 100644
index 0000000..38e2f9c
--- /dev/null
+++ b/runtime/vm/compiler/frontend/prologue_builder.cc
@@ -0,0 +1,483 @@
+// 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.
+
+#include "vm/compiler/frontend/prologue_builder.h"
+
+#include "vm/compiler/backend/il.h"
+#include "vm/compiler/backend/il_printer.h"
+#include "vm/compiler/frontend/kernel_binary_flowgraph.h"
+#include "vm/compiler/jit/compiler.h"
+#include "vm/kernel_loader.h"
+#include "vm/longjump.h"
+#include "vm/object_store.h"
+#include "vm/report.h"
+#include "vm/resolver.h"
+#include "vm/stack_frame.h"
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+namespace dart {
+namespace kernel {
+
+#define Z (zone_)
+
+BlockEntryInstr* PrologueBuilder::BuildPrologue(BlockEntryInstr* entry,
+                                                PrologueInfo* prologue_info) {
+  Isolate* isolate = Isolate::Current();
+  const bool strong = isolate->strong();
+
+  // We always have to build the graph, but we only link it sometimes.
+  const bool link = !is_inlining_ && !compiling_for_osr_;
+
+  const intptr_t previous_block_id = last_used_block_id_;
+
+  const bool load_optional_arguments = function_.HasOptionalParameters();
+  const bool expect_type_args =
+      function_.IsGeneric() && isolate->reify_generic_functions();
+  const bool check_arguments =
+      (function_.IsClosureFunction() || function_.IsConvertedClosureFunction());
+
+  Fragment prologue = Fragment(entry);
+  JoinEntryInstr* nsm = NULL;
+  if (load_optional_arguments || check_arguments || expect_type_args) {
+    nsm = BuildThrowNoSuchMethod();
+  }
+  if (check_arguments) {
+    Fragment f = BuildTypeArgumentsLengthCheck(strong, nsm, expect_type_args);
+    if (link) prologue += f;
+  }
+  if (load_optional_arguments) {
+    Fragment f = BuildOptionalParameterHandling(strong, nsm);
+    if (link) prologue += f;
+  } else if (check_arguments) {
+    Fragment f = BuildFixedParameterLengthChecks(strong, nsm);
+    if (link) prologue += f;
+  }
+  if (function_.IsClosureFunction()) {
+    Fragment f = BuildClosureContextHandling();
+    if (!compiling_for_osr_) prologue += f;
+  }
+  if (expect_type_args) {
+    Fragment f = BuildTypeArgumentsHandling(strong);
+    if (link) prologue += f;
+  }
+
+  const bool is_empty_prologue = prologue.entry == prologue.current;
+
+  // Always do this to preserve deoptid numbering.
+  JoinEntryInstr* normal_code = BuildJoinEntry();
+  prologue += Goto(normal_code);
+
+  if (is_empty_prologue) {
+    *prologue_info = PrologueInfo(-1, -1);
+    return entry;
+  } else {
+    *prologue_info =
+        PrologueInfo(previous_block_id, normal_code->block_id() - 1);
+    return normal_code;
+  }
+}
+
+JoinEntryInstr* PrologueBuilder::BuildThrowNoSuchMethod() {
+  JoinEntryInstr* nsm = BuildJoinEntry();
+
+  Fragment failing(nsm);
+  const Code& nsm_handler =
+      Code::ZoneHandle(StubCode::CallClosureNoSuchMethod_entry()->code());
+  failing += LoadArgDescriptor();
+  failing += TailCall(nsm_handler);
+
+  return nsm;
+}
+
+Fragment PrologueBuilder::BuildTypeArgumentsLengthCheck(bool strong,
+                                                        JoinEntryInstr* nsm,
+                                                        bool expect_type_args) {
+  Fragment check_type_args;
+  JoinEntryInstr* done = BuildJoinEntry();
+
+  // Type args are always optional, so length can always be zero.
+  // If expect_type_args, a non-zero length must match the declaration length.
+  TargetEntryInstr *then, *fail;
+  check_type_args += LoadArgDescriptor();
+  check_type_args += LoadField(ArgumentsDescriptor::type_args_len_offset());
+  if (strong) {
+    check_type_args +=
+        IntConstant(ArgumentsDescriptor::TypeArgsLenField::mask());
+    check_type_args += SmiBinaryOp(Token::kBIT_AND, /* truncate= */ true);
+  }
+  if (expect_type_args) {
+    JoinEntryInstr* join2 = BuildJoinEntry();
+
+    LocalVariable* len = MakeTemporary();
+
+    TargetEntryInstr* otherwise;
+    check_type_args += LoadLocal(len);
+    check_type_args += IntConstant(0);
+    check_type_args += BranchIfEqual(&then, &otherwise);
+
+    TargetEntryInstr* then2;
+    Fragment check_len(otherwise);
+    check_len += LoadLocal(len);
+    check_len += IntConstant(function_.NumTypeParameters());
+    check_len += BranchIfEqual(&then2, &fail);
+
+    Fragment(then) + Goto(join2);
+    Fragment(then2) + Goto(join2);
+
+    Fragment(join2) + Drop() + Goto(done);
+    Fragment(fail) + Goto(nsm);
+  } else {
+    check_type_args += IntConstant(0);
+    check_type_args += BranchIfEqual(&then, &fail);
+    Fragment(then) + Goto(done);
+    Fragment(fail) + Goto(nsm);
+  }
+
+  return Fragment(check_type_args.entry, done);
+}
+
+Fragment PrologueBuilder::BuildOptionalParameterHandling(bool strong,
+                                                         JoinEntryInstr* nsm) {
+  Fragment copy_args_prologue;
+  const int num_fixed_params = function_.num_fixed_parameters();
+  const int num_opt_pos_params = function_.NumOptionalPositionalParameters();
+  const int num_opt_named_params = function_.NumOptionalNamedParameters();
+  const int num_params =
+      num_fixed_params + num_opt_pos_params + num_opt_named_params;
+  ASSERT(function_.NumParameters() == num_params);
+
+  // Check that min_num_pos_args <= num_pos_args <= max_num_pos_args,
+  // where num_pos_args is the number of positional arguments passed in.
+  const int min_num_pos_args = num_fixed_params;
+  const int max_num_pos_args = num_fixed_params + num_opt_pos_params;
+
+  copy_args_prologue += LoadArgDescriptor();
+  copy_args_prologue +=
+      LoadField(ArgumentsDescriptor::positional_count_offset());
+  if (strong) {
+    copy_args_prologue +=
+        IntConstant(ArgumentsDescriptor::PositionalCountField::mask());
+    copy_args_prologue += SmiBinaryOp(Token::kBIT_AND, /* truncate= */ true);
+  }
+
+  LocalVariable* positional_count_var = MakeTemporary();
+
+  copy_args_prologue += LoadArgDescriptor();
+  copy_args_prologue += LoadField(ArgumentsDescriptor::count_offset());
+  LocalVariable* count_var = MakeTemporary();
+
+  // Ensure the caller provided at least [min_num_pos_args] arguments.
+  copy_args_prologue += IntConstant(min_num_pos_args);
+  copy_args_prologue += LoadLocal(positional_count_var);
+  copy_args_prologue += SmiRelationalOp(Token::kLTE);
+  TargetEntryInstr *success1, *fail1;
+  copy_args_prologue += BranchIfTrue(&success1, &fail1);
+  copy_args_prologue = Fragment(copy_args_prologue.entry, success1);
+
+  // Ensure the caller provided at most [max_num_pos_args] arguments.
+  copy_args_prologue += LoadLocal(positional_count_var);
+  copy_args_prologue += IntConstant(max_num_pos_args);
+  copy_args_prologue += SmiRelationalOp(Token::kLTE);
+  TargetEntryInstr *success2, *fail2;
+  copy_args_prologue += BranchIfTrue(&success2, &fail2);
+  copy_args_prologue = Fragment(copy_args_prologue.entry, success2);
+
+  // Link up the argument check failing code.
+  Fragment(fail1) + Goto(nsm);
+  Fragment(fail2) + Goto(nsm);
+
+  copy_args_prologue += LoadLocal(count_var);
+  copy_args_prologue += IntConstant(min_num_pos_args);
+  copy_args_prologue += SmiBinaryOp(Token::kSUB, /* truncate= */ true);
+  LocalVariable* optional_count_var = MakeTemporary();
+
+  // Copy mandatory parameters down.
+  intptr_t param = 0;
+  for (; param < num_fixed_params; ++param) {
+    copy_args_prologue += LoadLocal(optional_count_var);
+    copy_args_prologue += LoadFpRelativeSlot(
+        kWordSize * (kParamEndSlotFromFp + num_fixed_params - param));
+    copy_args_prologue +=
+        StoreLocalRaw(TokenPosition::kNoSource, ParameterVariable(param));
+    copy_args_prologue += Drop();
+  }
+
+  // Copy optional parameters down.
+  if (num_opt_pos_params > 0) {
+    JoinEntryInstr* next_missing = NULL;
+    for (intptr_t opt_param = 1; param < num_params; ++param, ++opt_param) {
+      TargetEntryInstr *supplied, *missing;
+      copy_args_prologue += IntConstant(opt_param);
+      copy_args_prologue += LoadLocal(optional_count_var);
+      copy_args_prologue += SmiRelationalOp(Token::kLTE);
+      copy_args_prologue += BranchIfTrue(&supplied, &missing);
+
+      Fragment good(supplied);
+      good += LoadLocal(optional_count_var);
+      good += LoadFpRelativeSlot(
+          kWordSize * (kParamEndSlotFromFp + num_fixed_params - param));
+      good += StoreLocalRaw(TokenPosition::kNoSource, ParameterVariable(param));
+      good += Drop();
+
+      Fragment not_good(missing);
+      if (next_missing != NULL) {
+        not_good += Goto(next_missing);
+        not_good.current = next_missing;
+      }
+      next_missing = BuildJoinEntry();
+      not_good += Constant(DefaultParameterValueAt(opt_param - 1));
+      not_good +=
+          StoreLocalRaw(TokenPosition::kNoSource, ParameterVariable(param));
+      not_good += Drop();
+      not_good += Goto(next_missing);
+
+      copy_args_prologue.current = good.current;
+    }
+    copy_args_prologue += Goto(next_missing /* join good/not_good flows */);
+    copy_args_prologue.current = next_missing;
+
+    // If there are more arguments from the caller we haven't processed, go
+    // NSM.
+    TargetEntryInstr *done, *unknown_named_arg_passed;
+    copy_args_prologue += LoadLocal(positional_count_var);
+    copy_args_prologue += LoadLocal(count_var);
+    copy_args_prologue += BranchIfEqual(&done, &unknown_named_arg_passed);
+    copy_args_prologue.current = done;
+    {
+      Fragment f(unknown_named_arg_passed);
+      f += Goto(nsm);
+    }
+  } else {
+    ASSERT(num_opt_named_params > 0);
+
+    const intptr_t first_name_offset =
+        ArgumentsDescriptor::first_named_entry_offset() - Array::data_offset();
+
+    // Start by alphabetically sorting the names of the optional parameters.
+    LocalVariable** opt_param = new LocalVariable*[num_opt_named_params];
+    int* opt_param_position = new int[num_opt_named_params];
+    SortOptionalNamedParametersInto(opt_param, opt_param_position,
+                                    num_fixed_params, num_params);
+
+    LocalVariable* optional_count_vars_processed =
+        parsed_function_->expression_temp_var();
+    copy_args_prologue += IntConstant(0);
+    copy_args_prologue +=
+        StoreLocalRaw(TokenPosition::kNoSource, optional_count_vars_processed);
+    copy_args_prologue += Drop();
+
+    for (intptr_t i = 0; param < num_params; ++param, ++i) {
+      JoinEntryInstr* join = BuildJoinEntry();
+
+      copy_args_prologue +=
+          IntConstant(ArgumentsDescriptor::named_entry_size() / kWordSize);
+      copy_args_prologue += LoadLocal(optional_count_vars_processed);
+      copy_args_prologue += SmiBinaryOp(Token::kMUL, /* truncate= */ true);
+      LocalVariable* tuple_diff = MakeTemporary();
+
+      // name = arg_desc[names_offset + arg_desc_name_index + nameOffset]
+      copy_args_prologue += LoadArgDescriptor();
+      copy_args_prologue += IntConstant(
+          (first_name_offset + ArgumentsDescriptor::name_offset()) / kWordSize);
+      copy_args_prologue += LoadLocal(tuple_diff);
+      copy_args_prologue += SmiBinaryOp(Token::kADD, /* truncate= */ true);
+      copy_args_prologue += LoadIndexed(/* index_scale = */ kWordSize);
+
+      // first name in sorted list of all names
+      ASSERT(opt_param[i]->name().IsSymbol());
+      copy_args_prologue += Constant(opt_param[i]->name());
+
+      // Compare the two names: Note that the ArgumentDescriptor array always
+      // terminates with a "null" name (i.e. kNullCid), which will prevent us
+      // from running out-of-bounds.
+      TargetEntryInstr *supplied, *missing;
+      copy_args_prologue += BranchIfStrictEqual(&supplied, &missing);
+
+      // Let's load position from arg descriptor (to see which parameter is the
+      // name) and move kEntrySize forward in ArgDescriptopr names array.
+      Fragment good(supplied);
+
+      {
+        // fp[kParamEndSlotFromFp + (count_var - pos)]
+        good += LoadLocal(count_var);
+        {
+          // pos = arg_desc[names_offset + arg_desc_name_index + positionOffset]
+          good += LoadArgDescriptor();
+          good += IntConstant(
+              (first_name_offset + ArgumentsDescriptor::position_offset()) /
+              kWordSize);
+          good += LoadLocal(tuple_diff);
+          good += SmiBinaryOp(Token::kADD, /* truncate= */ true);
+          good += LoadIndexed(/* index_scale = */ kWordSize);
+        }
+        good += SmiBinaryOp(Token::kSUB, /* truncate= */ true);
+        good += LoadFpRelativeSlot(kWordSize * kParamEndSlotFromFp);
+
+        // Copy down.
+        good += StoreLocalRaw(TokenPosition::kNoSource,
+                              ParameterVariable(opt_param_position[i]));
+        good += Drop();
+
+        // Increase processed optional variable count.
+        good += LoadLocal(optional_count_vars_processed);
+        good += IntConstant(1);
+        good += SmiBinaryOp(Token::kADD, /* truncate= */ true);
+        good += StoreLocalRaw(TokenPosition::kNoSource,
+                              optional_count_vars_processed);
+        good += Drop();
+
+        good += Goto(join);
+      }
+
+      // We had no match, let's just load the default constant.
+      Fragment not_good(missing);
+      {
+        not_good += Constant(
+            DefaultParameterValueAt(opt_param_position[i] - num_fixed_params));
+
+        // Copy down with default value.
+        not_good += StoreLocalRaw(TokenPosition::kNoSource,
+                                  ParameterVariable(opt_param_position[i]));
+        not_good += Drop();
+        not_good += Goto(join);
+      }
+
+      copy_args_prologue.current = join;
+      copy_args_prologue += Drop();  // tuple_diff
+    }
+
+    delete[] opt_param;
+    delete[] opt_param_position;
+
+    // If there are more arguments from the caller we haven't processed, go
+    // NSM.
+    TargetEntryInstr *done, *unknown_named_arg_passed;
+    copy_args_prologue += LoadLocal(optional_count_var);
+    copy_args_prologue += LoadLocal(optional_count_vars_processed);
+    copy_args_prologue += BranchIfEqual(&done, &unknown_named_arg_passed);
+    copy_args_prologue.current = done;
+
+    {
+      Fragment f(unknown_named_arg_passed);
+      f += Goto(nsm);
+    }
+  }
+
+  copy_args_prologue += Drop();  // optional_count_var
+  copy_args_prologue += Drop();  // count_var
+  copy_args_prologue += Drop();  // positional_count_var
+
+  return copy_args_prologue;
+}
+
+Fragment PrologueBuilder::BuildFixedParameterLengthChecks(bool strong,
+                                                          JoinEntryInstr* nsm) {
+  Fragment check_args;
+  JoinEntryInstr* done = BuildJoinEntry();
+
+  check_args += LoadArgDescriptor();
+  check_args += LoadField(ArgumentsDescriptor::count_offset());
+  LocalVariable* count = MakeTemporary();
+
+  TargetEntryInstr *then, *fail;
+  check_args += LoadLocal(count);
+  check_args += IntConstant(function_.num_fixed_parameters());
+  check_args += BranchIfEqual(&then, &fail);
+
+  TargetEntryInstr *then2, *fail2;
+  Fragment check_len(then);
+  check_len += LoadArgDescriptor();
+  check_len += LoadField(ArgumentsDescriptor::positional_count_offset());
+  if (strong) {
+    check_len += IntConstant(ArgumentsDescriptor::PositionalCountField::mask());
+    check_len += SmiBinaryOp(Token::kBIT_AND, /* truncate= */ true);
+  }
+  check_len += BranchIfEqual(&then2, &fail2);
+
+  Fragment(fail) + Goto(nsm);
+  Fragment(fail2) + Goto(nsm);
+  Fragment(then2) + Goto(done);
+
+  return Fragment(check_args.entry, done);
+}
+
+Fragment PrologueBuilder::BuildClosureContextHandling() {
+  LocalScope* scope = parsed_function_->node_sequence()->scope();
+  LocalVariable* closure_parameter = scope->VariableAt(0);
+
+  LocalVariable* context = parsed_function_->current_context_var();
+
+  // Load closure.context & store it into the context variable.
+  // (both load/store happen on the copyied-down places).
+  Fragment populate_context;
+  populate_context += LoadLocal(closure_parameter);
+  populate_context += LoadField(Closure::context_offset());
+  populate_context += StoreLocal(TokenPosition::kNoSource, context);
+  populate_context += Drop();
+  return populate_context;
+}
+
+Fragment PrologueBuilder::BuildTypeArgumentsHandling(bool strong) {
+  Fragment populate_args_desc;
+
+  LocalVariable* type_args_var = parsed_function_->RawTypeArgumentsVariable();
+
+  TargetEntryInstr *passed, *not_passed;
+  populate_args_desc += LoadArgDescriptor();
+  populate_args_desc += LoadField(ArgumentsDescriptor::type_args_len_offset());
+  if (strong) {
+    populate_args_desc +=
+        IntConstant(ArgumentsDescriptor::TypeArgsLenField::mask());
+    populate_args_desc += SmiBinaryOp(Token::kBIT_AND, /* truncate= */ true);
+  }
+  populate_args_desc += IntConstant(0);
+  populate_args_desc += BranchIfEqual(&not_passed, &passed);
+
+  JoinEntryInstr* join = BuildJoinEntry();
+
+  Fragment store_type_args(passed);
+  store_type_args += LoadArgDescriptor();
+  store_type_args += LoadField(ArgumentsDescriptor::count_offset());
+  store_type_args += LoadFpRelativeSlot(kWordSize * (1 + kParamEndSlotFromFp));
+  store_type_args += StoreLocal(TokenPosition::kNoSource, type_args_var);
+  store_type_args += Drop();
+  store_type_args += Goto(join);
+
+  Fragment store_null(not_passed);
+  store_null += NullConstant();
+  store_null += StoreLocal(TokenPosition::kNoSource, type_args_var);
+  store_null += Drop();
+  store_null += Goto(join);
+
+  populate_args_desc = Fragment(populate_args_desc.entry, join);
+
+  return populate_args_desc;
+}
+
+void PrologueBuilder::SortOptionalNamedParametersInto(LocalVariable** opt_param,
+                                                      int* opt_param_position,
+                                                      int num_fixed_params,
+                                                      int num_params) {
+  LocalScope* scope = parsed_function_->node_sequence()->scope();
+  for (int pos = num_fixed_params; pos < num_params; pos++) {
+    LocalVariable* parameter = scope->VariableAt(pos);
+    const String& opt_param_name = parameter->name();
+    int i = pos - num_fixed_params;
+    while (--i >= 0) {
+      LocalVariable* param_i = opt_param[i];
+      const intptr_t result = opt_param_name.CompareTo(param_i->name());
+      ASSERT(result != 0);
+      if (result > 0) break;
+      opt_param[i + 1] = opt_param[i];
+      opt_param_position[i + 1] = opt_param_position[i];
+    }
+    opt_param[i + 1] = parameter;
+    opt_param_position[i + 1] = pos;
+  }
+}
+
+}  // namespace kernel
+}  // namespace dart
+
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/compiler/frontend/prologue_builder.h b/runtime/vm/compiler/frontend/prologue_builder.h
new file mode 100644
index 0000000..a77767e
--- /dev/null
+++ b/runtime/vm/compiler/frontend/prologue_builder.h
@@ -0,0 +1,99 @@
+// 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.
+
+#ifndef RUNTIME_VM_COMPILER_FRONTEND_PROLOGUE_BUILDER_H_
+#define RUNTIME_VM_COMPILER_FRONTEND_PROLOGUE_BUILDER_H_
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+
+#include "vm/compiler/frontend/kernel_to_il.h"
+
+namespace dart {
+namespace kernel {
+
+// Responsible for building IR code for prologues of functions.
+//
+// This code handles initialization of local variables which the
+// prologue needs to setup, including initialization of the:
+//
+//    * current context variable, from the passed closure object
+//    * function_type_arguments variable, from the stack above fp
+//    * raw parameter variables, from the stack above fp
+//
+// if needed.
+//
+// Furthermore it performs all necessary checks which could lead into a
+// no-such-method bailout, including check that:
+//
+//    * the number of passed positional arguments is correct
+//    * the names of passed named arguments are correct
+//    * the number of function type arguments is correct
+//
+// if needed.
+//
+// Most of these things are done by interpreting the caller-supplied arguments
+// descriptor.
+class PrologueBuilder : public BaseFlowGraphBuilder {
+ public:
+  PrologueBuilder(const ParsedFunction* parsed_function,
+                  intptr_t last_used_id,
+                  bool compiling_for_osr,
+                  bool is_inlining)
+      : BaseFlowGraphBuilder(parsed_function, last_used_id),
+        compiling_for_osr_(compiling_for_osr),
+        is_inlining_(is_inlining) {}
+
+  BlockEntryInstr* BuildPrologue(BlockEntryInstr* entry,
+                                 PrologueInfo* prologue_info);
+
+  intptr_t last_used_block_id() const { return last_used_block_id_; }
+
+ private:
+  JoinEntryInstr* BuildThrowNoSuchMethod();
+
+  Fragment BuildTypeArgumentsLengthCheck(bool strong,
+                                         JoinEntryInstr* nsm,
+                                         bool expect_type_args);
+
+  Fragment BuildOptionalParameterHandling(bool strong, JoinEntryInstr* nsm);
+
+  Fragment BuildFixedParameterLengthChecks(bool strong, JoinEntryInstr* nsm);
+
+  Fragment BuildClosureContextHandling();
+
+  Fragment BuildTypeArgumentsHandling(bool strong);
+
+  LocalVariable* ParameterVariable(intptr_t index) {
+    return parsed_function_->RawParameterVariable(index);
+  }
+
+  Fragment LoadArgDescriptor() {
+    ASSERT(parsed_function_->has_arg_desc_var());
+    return LoadLocal(parsed_function_->arg_desc_var());
+  }
+
+  const Instance& DefaultParameterValueAt(intptr_t i) {
+    if (parsed_function_->default_parameter_values() != NULL) {
+      return parsed_function_->DefaultParameterValueAt(i);
+    }
+
+    ASSERT(parsed_function_->function().kind() ==
+           RawFunction::kNoSuchMethodDispatcher);
+    return Instance::null_instance();
+  }
+
+  void SortOptionalNamedParametersInto(LocalVariable** opt_param,
+                                       int* opt_param_position,
+                                       int num_fixed_params,
+                                       int num_params);
+
+  bool compiling_for_osr_;
+  bool is_inlining_;
+};
+
+}  // namespace kernel
+}  // namespace dart
+
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+#endif  // RUNTIME_VM_COMPILER_FRONTEND_PROLOGUE_BUILDER_H_
diff --git a/runtime/vm/compiler/intrinsifier.cc b/runtime/vm/compiler/intrinsifier.cc
index 43d52fb..a74987c 100644
--- a/runtime/vm/compiler/intrinsifier.cc
+++ b/runtime/vm/compiler/intrinsifier.cc
@@ -166,6 +166,8 @@
                                    FlowGraphCompiler* compiler) {
 #if !defined(TARGET_ARCH_DBC)
   ASSERT(!parsed_function.function().HasOptionalParameters());
+  PrologueInfo prologue_info(-1, -1);
+
   ZoneGrowableArray<const ICData*>* ic_data_array =
       new ZoneGrowableArray<const ICData*>();
   FlowGraphBuilder builder(parsed_function, *ic_data_array,
@@ -178,7 +180,6 @@
                            Thread::Current()->GetNextDeoptId());
   GraphEntryInstr* graph_entry = new GraphEntryInstr(
       parsed_function, normal_entry, Compiler::kNoOSRDeoptId);
-  PrologueInfo prologue_info(-1, -1);
   FlowGraph* graph =
       new FlowGraph(parsed_function, graph_entry, block_id, prologue_info);
   const Function& function = parsed_function.function();
diff --git a/runtime/vm/constants_dbc.h b/runtime/vm/constants_dbc.h
index d3ab486..4ad1020 100644
--- a/runtime/vm/constants_dbc.h
+++ b/runtime/vm/constants_dbc.h
@@ -73,6 +73,10 @@
 //   +--------+--------+--------+--------+
 //
 //   +--------+--------+--------+--------+
+//   | opcode |    A   |    B   |    Y   | A_B_Y: 2 unsigned 8-bit operands
+//   +--------+--------+--------+--------+        1 signed 8-bit operand
+//
+//   +--------+--------+--------+--------+
 //   | opcode |             T            |   T: signed 24-bit operand
 //   +--------+--------+--------+--------+
 //
@@ -210,6 +214,11 @@
 //    the immediately following instruction is skipped. These instructions
 //    expect their operands to be Smis, but don't check that they are.
 //
+//  - Smi<op>TOS
+//
+//    Performs SP[0] <op> SP[-1], pops operands and pushes result on the stack.
+//    Assumes SP[0] and SP[-1] are both smis and the result is a Smi.
+//
 //  - ShlImm rA, rB, rC
 //
 //    FP[rA] <- FP[rB] << rC. Shifts the Smi in FP[rB] left by rC. rC is
@@ -338,6 +347,12 @@
 //    Skips the next instruction unless FP[rA] <Cond> FP[rD]. Assumes that
 //    FP[rA] and FP[rD] are Smis or unboxed doubles as indicated by <Cond>.
 //
+//  - IfSmi<Cond>TOS
+//
+//    Cond is Lt, Le, Ge, Gt.
+//    Skips the next instruction unless SP[-1] <Cond> SP[-0].
+//    It is expected both SP[-1] and SP[-0] are Smis.
+//
 //  - CreateArrayTOS
 //
 //    Allocate array of length SP[0] with type arguments SP[-1].
@@ -395,6 +410,55 @@
 //
 //    Similar to StoreIndexedUint8 but FP[rA] is an external typed data aray.
 //
+//  - NoSuchMethod
+//
+//    Performs noSuchmethod handling code.
+//
+//  - TailCall
+//
+//    Unwinds the current frame, populates the arguments descriptor register
+//    with SP[-1] and tail calls the code in SP[-0].
+//
+//  - TailCallOpt  rA, rD
+//
+//    Unwinds the current frame, populates the arguments descriptor register
+//    with rA and tail calls the code in rD.
+//
+//  - LoadArgDescriptor
+//
+//    Load the caller-provoided argument descriptor and pushes it onto the
+//    stack.
+//
+//  - LoadArgDescriptorOpt rA
+//
+//    Load the caller-provoided argument descriptor into [rA].
+//
+//  - LoadFpRelativeSlot rD
+//
+//    Loads from FP using the negative index of SP[-0]+rD.
+//    It is assumed that SP[-0] is a Smi.
+//
+//  - LoadFpRelativeSlotOpt  rA, rB, rY
+//
+//    Loads from FP using the negative index of FP[rB]+rY and stores the result
+//    into rA.
+//    It is assumed that rY is a Smi.
+//
+//  - StoreFpRelativeSlot rD
+//
+//    Stores SP[-0] by indexing into FP using the negative index of SP[-1]+rD.
+//    It is assumed that SP[-1] is a Smi.
+//
+//  - StoreFpRelativeSlotOpt  rA, rB, rY
+//
+//    Stores rA by indexing into FP using the the negative index of FP[rB]+rY.
+//    It is assumed that rY is a Smi.
+//
+//  - LoadIndexedTOS
+//
+//    Loads from array SP[-1] at index SP[-0].
+//    It is assumed that SP[-0] is a Smi.
+//
 //  - LoadIndexed rA, rB, rC
 //
 //    Loads from array FP[rB] at index FP[rC] into FP[rA]. No typechecking is
@@ -460,42 +524,15 @@
 //    Throw (Rethrow if A != 0) exception. Exception object and stack object
 //    are taken from TOS.
 //
-//  - Entry A, B, rC
+//  - Entry rD
 //
-//    Function prologue for the function with no optional or named arguments:
-//        A - expected number of positional arguments;
-//        B - number of local slots to reserve;
-//        rC - specifies context register to initialize with empty context.
+//    Function prologue for the function
+//        rD - number of local slots to reserve;
 //
-//  - EntryOptional A, B, C
+//  - EntryOptimized rD
 //
-//    Function prologue for the function with optional or named arguments:
-//        A - expected number of positional arguments;
-//        B - number of optional arguments;
-//        C - number of named arguments;
-//
-//    Only one of B and C can be not 0.
-//
-//    If B is not 0 then EntryOptional bytecode is followed by B LoadConstant
-//    bytecodes specifying default values for optional arguments.
-//
-//    If C is not 0 then EntryOptional is followed by 2 * B LoadConstant
-//    bytecodes.
-//    Bytecode at 2 * i specifies name of the i-th named argument and at
-//    2 * i + 1 default value. rA part of the LoadConstant bytecode specifies
-//    the location of the parameter on the stack. Here named arguments are
-//    sorted alphabetically to enable linear matching similar to how function
-//    prologues are implemented on other architectures.
-//
-//    Note: Unlike Entry bytecode EntryOptional does not setup the frame for
-//    local variables this is done by a separate bytecode Frame.
-//
-//  - EntryOptimized A, D
-//
-//    Function prologue for optimized functions with no optional or named
-//    arguments.
-//        A - expected number of positional arguments;
-//        D - number of local slots to reserve for registers;
+//    Function prologue for optimized functions.
+//        rD - number of local slots to reserve for registers;
 //
 //    Note: reserved slots are not initialized because optimized code
 //    has stack maps attached to call sites.
@@ -730,6 +767,9 @@
   V(EqualTOS,                              0, ___, ___, ___) \
   V(LessThanTOS,                           0, ___, ___, ___) \
   V(GreaterThanTOS,                        0, ___, ___, ___) \
+  V(SmiAddTOS,                             0, ___, ___, ___) \
+  V(SmiSubTOS,                             0, ___, ___, ___) \
+  V(SmiMulTOS,                             0, ___, ___, ___) \
   V(Add,                               A_B_C, reg, reg, reg) \
   V(Sub,                               A_B_C, reg, reg, reg) \
   V(Mul,                               A_B_C, reg, reg, reg) \
@@ -779,6 +819,10 @@
   V(IfEqStrictTOS,                         0, ___, ___, ___) \
   V(IfNeStrictNumTOS,                      0, ___, ___, ___) \
   V(IfEqStrictNumTOS,                      0, ___, ___, ___) \
+  V(IfSmiLtTOS,                            0, ___, ___, ___) \
+  V(IfSmiLeTOS,                            0, ___, ___, ___) \
+  V(IfSmiGeTOS,                            0, ___, ___, ___) \
+  V(IfSmiGtTOS,                            0, ___, ___, ___) \
   V(IfNeStrict,                          A_D, reg, reg, ___) \
   V(IfEqStrict,                          A_D, reg, reg, ___) \
   V(IfLe,                                A_D, reg, reg, ___) \
@@ -815,6 +859,16 @@
   V(StoreIndexed4Float32,              A_B_C, reg, reg, reg) \
   V(StoreIndexedFloat64,               A_B_C, reg, reg, reg) \
   V(StoreIndexed8Float64,              A_B_C, reg, reg, reg) \
+  V(NoSuchMethod,                          0, ___, ___, ___) \
+  V(TailCall,                              0, ___, ___, ___) \
+  V(TailCallOpt,                         A_D, reg, reg, ___) \
+  V(LoadArgDescriptor,                     0, ___, ___, ___) \
+  V(LoadArgDescriptorOpt,                  A, reg, ___, ___) \
+  V(LoadFpRelativeSlot,                    X, reg, ___, ___) \
+  V(LoadFpRelativeSlotOpt,             A_B_Y, reg, reg, reg) \
+  V(StoreFpRelativeSlot,                    X, reg, ___, ___) \
+  V(StoreFpRelativeSlotOpt,             A_B_Y, reg, reg, reg) \
+  V(LoadIndexedTOS,                        0, ___, ___, ___) \
   V(LoadIndexed,                       A_B_C, reg, reg, reg) \
   V(LoadIndexedUint8,                  A_B_C, reg, reg, reg) \
   V(LoadIndexedInt8,                   A_B_C, reg, reg, reg) \
@@ -838,8 +892,7 @@
   V(BooleanNegateTOS,                      0, ___, ___, ___) \
   V(BooleanNegate,                       A_D, reg, reg, ___) \
   V(Throw,                                 A, num, ___, ___) \
-  V(Entry,                             A_B_C, num, num, num) \
-  V(EntryOptional,                     A_B_C, num, num, num) \
+  V(Entry,                                 D, num, ___, ___) \
   V(EntryOptimized,                      A_D, num, num, ___) \
   V(Frame,                                 D, num, ___, ___) \
   V(SetFrame,                              A, num, ___, num) \
@@ -882,6 +935,15 @@
 #undef DECLARE_BYTECODE
   };
 
+  static const char* NameOf(Instr instr) {
+    const char* names[] = {
+#define NAME(name, encoding, op1, op2, op3) #name,
+        BYTECODES_LIST(NAME)
+#undef DECLARE_BYTECODE
+    };
+    return names[DecodeOpcode(instr)];
+  }
+
   static const intptr_t kOpShift = 0;
   static const intptr_t kAShift = 8;
   static const intptr_t kAMask = 0xFF;
@@ -891,6 +953,8 @@
   static const intptr_t kCMask = 0xFF;
   static const intptr_t kDShift = 16;
   static const intptr_t kDMask = 0xFFFF;
+  static const intptr_t kYShift = 24;
+  static const intptr_t kYMask = 0xFF;
 
   static Instr Encode(Opcode op, uintptr_t a, uintptr_t b, uintptr_t c) {
     ASSERT((a & kAMask) == a);
@@ -930,6 +994,10 @@
     return static_cast<Opcode>(bc & 0xFF);
   }
 
+  DART_FORCE_INLINE static bool IsTrap(Instr instr) {
+    return DecodeOpcode(instr) == Bytecode::kTrap;
+  }
+
   DART_FORCE_INLINE static bool IsCallOpcode(Instr instr) {
     switch (DecodeOpcode(instr)) {
       case Bytecode::kStaticCall:
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index 0b95f0c..7b4dd5c 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -92,46 +92,6 @@
   TIMES_HALF_WORD_SIZE = kWordSizeLog2 - 1
 };
 
-enum Condition {
-  OVERFLOW = 0,
-  NO_OVERFLOW = 1,
-  BELOW = 2,
-  ABOVE_EQUAL = 3,
-  EQUAL = 4,
-  NOT_EQUAL = 5,
-  BELOW_EQUAL = 6,
-  ABOVE = 7,
-  SIGN = 8,
-  NOT_SIGN = 9,
-  PARITY_EVEN = 10,
-  PARITY_ODD = 11,
-  LESS = 12,
-  GREATER_EQUAL = 13,
-  LESS_EQUAL = 14,
-  GREATER = 15,
-
-  ZERO = EQUAL,
-  NOT_ZERO = NOT_EQUAL,
-  NEGATIVE = SIGN,
-  POSITIVE = NOT_SIGN,
-  CARRY = BELOW,
-  NOT_CARRY = ABOVE_EQUAL,
-
-  // Platform-independent variants declared for all platforms
-  // EQUAL,
-  // NOT_EQUAL,
-  // LESS,
-  // LESS_EQUAL,
-  // GREATER_EQUAL,
-  // GREATER,
-  UNSIGNED_LESS = BELOW,
-  UNSIGNED_LESS_EQUAL = BELOW_EQUAL,
-  UNSIGNED_GREATER = ABOVE,
-  UNSIGNED_GREATER_EQUAL = ABOVE_EQUAL,
-
-  INVALID_CONDITION = 16
-};
-
 class Instr {
  public:
   static const uint8_t kHltInstruction = 0xF4;
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index 4c7327f..9f9168f 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -136,46 +136,6 @@
   TIMES_HALF_WORD_SIZE = kWordSizeLog2 - 1
 };
 
-enum Condition {
-  OVERFLOW = 0,
-  NO_OVERFLOW = 1,
-  BELOW = 2,
-  ABOVE_EQUAL = 3,
-  EQUAL = 4,
-  NOT_EQUAL = 5,
-  BELOW_EQUAL = 6,
-  ABOVE = 7,
-  SIGN = 8,
-  NOT_SIGN = 9,
-  PARITY_EVEN = 10,
-  PARITY_ODD = 11,
-  LESS = 12,
-  GREATER_EQUAL = 13,
-  LESS_EQUAL = 14,
-  GREATER = 15,
-
-  ZERO = EQUAL,
-  NOT_ZERO = NOT_EQUAL,
-  NEGATIVE = SIGN,
-  POSITIVE = NOT_SIGN,
-  CARRY = BELOW,
-  NOT_CARRY = ABOVE_EQUAL,
-
-  // Platform-independent variants declared for all platforms
-  // EQUAL,
-  // NOT_EQUAL,
-  // LESS,
-  // LESS_EQUAL,
-  // GREATER_EQUAL,
-  // GREATER,
-  UNSIGNED_LESS = BELOW,
-  UNSIGNED_LESS_EQUAL = BELOW_EQUAL,
-  UNSIGNED_GREATER = ABOVE,
-  UNSIGNED_GREATER_EQUAL = ABOVE_EQUAL,
-
-  INVALID_CONDITION = 16
-};
-
 #define R(reg) (1 << (reg))
 
 #if defined(_WIN64)
diff --git a/runtime/vm/constants_x86.h b/runtime/vm/constants_x86.h
new file mode 100644
index 0000000..917c41b
--- /dev/null
+++ b/runtime/vm/constants_x86.h
@@ -0,0 +1,132 @@
+// 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.
+
+#ifndef RUNTIME_VM_CONSTANTS_X86_H_
+#define RUNTIME_VM_CONSTANTS_X86_H_
+
+namespace dart {
+
+enum Condition {
+  OVERFLOW = 0,
+  NO_OVERFLOW = 1,
+  BELOW = 2,
+  ABOVE_EQUAL = 3,
+  EQUAL = 4,
+  NOT_EQUAL = 5,
+  BELOW_EQUAL = 6,
+  ABOVE = 7,
+  SIGN = 8,
+  NOT_SIGN = 9,
+  PARITY_EVEN = 10,
+  PARITY_ODD = 11,
+  LESS = 12,
+  GREATER_EQUAL = 13,
+  LESS_EQUAL = 14,
+  GREATER = 15,
+
+  ZERO = EQUAL,
+  NOT_ZERO = NOT_EQUAL,
+  NEGATIVE = SIGN,
+  POSITIVE = NOT_SIGN,
+  CARRY = BELOW,
+  NOT_CARRY = ABOVE_EQUAL,
+
+  // Platform-independent variants declared for all platforms
+  // EQUAL,
+  // NOT_EQUAL,
+  // LESS,
+  // LESS_EQUAL,
+  // GREATER_EQUAL,
+  // GREATER,
+  UNSIGNED_LESS = BELOW,
+  UNSIGNED_LESS_EQUAL = BELOW_EQUAL,
+  UNSIGNED_GREATER = ABOVE,
+  UNSIGNED_GREATER_EQUAL = ABOVE_EQUAL,
+
+  INVALID_CONDITION = 16
+};
+
+#define X86_ZERO_OPERAND_1_BYTE_INSTRUCTIONS(F)                                \
+  F(ret, 0xC3)                                                                 \
+  F(leave, 0xC9)                                                               \
+  F(hlt, 0xF4)                                                                 \
+  F(cld, 0xFC)                                                                 \
+  F(int3, 0xCC)                                                                \
+  F(pushad, 0x60)                                                              \
+  F(popad, 0x61)                                                               \
+  F(pushfd, 0x9C)                                                              \
+  F(popfd, 0x9D)                                                               \
+  F(sahf, 0x9E)                                                                \
+  F(cdq, 0x99)                                                                 \
+  F(fwait, 0x9B)                                                               \
+  F(movsb, 0xA4)                                                               \
+  F(movsl, 0xA5)                                                               \
+  F(cmpsb, 0xA6)                                                               \
+  F(cmpsl, 0xA7)
+
+// clang-format off
+#define X86_ALU_CODES(F)                                                       \
+  F(and, 4)                                                                    \
+  F(or, 1)                                                                     \
+  F(xor, 6)                                                                    \
+  F(add, 0)                                                                    \
+  F(adc, 2)                                                                    \
+  F(sub, 5)                                                                    \
+  F(sbb, 3)                                                                    \
+  F(cmp, 7)
+
+#define XMM_ALU_CODES(F)                                                       \
+  F(bad0, 0)                                                                   \
+  F(sqrt, 1)                                                                   \
+  F(rsqrt, 2)                                                                  \
+  F(rcp, 3)                                                                    \
+  F(and, 4)                                                                    \
+  F(bad1, 5)                                                                   \
+  F(or, 6)                                                                     \
+  F(xor, 7)                                                                    \
+  F(add, 8)                                                                    \
+  F(mul, 9)                                                                    \
+  F(bad2, 0xA)                                                                 \
+  F(bad3, 0xB)                                                                 \
+  F(sub, 0xC)                                                                  \
+  F(min, 0xD)                                                                  \
+  F(div, 0xE)                                                                  \
+  F(max, 0xF)
+// clang-format on
+
+// Table 3-1, first part
+#define XMM_CONDITIONAL_CODES(F)                                               \
+  F(eq, 0)                                                                     \
+  F(lt, 1)                                                                     \
+  F(le, 2)                                                                     \
+  F(unord, 3)                                                                  \
+  F(neq, 4)                                                                    \
+  F(nlt, 5)                                                                    \
+  F(nle, 6)                                                                    \
+  F(ord, 7)
+
+#define X86_CONDITIONAL_SUFFIXES(F)                                            \
+  F(o, OVERFLOW)                                                               \
+  F(no, NO_OVERFLOW)                                                           \
+  F(c, CARRY)                                                                  \
+  F(nc, NOT_CARRY)                                                             \
+  F(z, ZERO)                                                                   \
+  F(nz, NOT_ZERO)                                                              \
+  F(na, BELOW_EQUAL)                                                           \
+  F(a, ABOVE)                                                                  \
+  F(s, SIGN)                                                                   \
+  F(ns, NOT_SIGN)                                                              \
+  F(pe, PARITY_EVEN)                                                           \
+  F(po, PARITY_ODD)                                                            \
+  F(l, LESS)                                                                   \
+  F(ge, GREATER_EQUAL)                                                         \
+  F(le, LESS_EQUAL)                                                            \
+  F(g, GREATER)                                                                \
+  /* Some alternative names */                                                 \
+  F(e, EQUAL)                                                                  \
+  F(ne, NOT_EQUAL)
+
+}  // namespace dart
+
+#endif  // RUNTIME_VM_CONSTANTS_X86_H_
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index 03bbfba..1f164e7 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -56,6 +56,8 @@
   P(collect_code, bool, true, "Attempt to GC infrequently used code.")         \
   P(collect_dynamic_function_names, bool, true,                                \
     "Collects all dynamic function names to identify unique targets")          \
+  P(compactor_tasks, int, 2,                                                   \
+    "The number of tasks to use for parallel compaction.")                     \
   P(concurrent_sweep, bool, USING_MULTICORE,                                   \
     "Concurrent sweep for old generation.")                                    \
   R(dedup_instructions, true, bool, false,                                     \
diff --git a/runtime/vm/gc_compactor.cc b/runtime/vm/gc_compactor.cc
index 4622d39..c35f86c 100644
--- a/runtime/vm/gc_compactor.cc
+++ b/runtime/vm/gc_compactor.cc
@@ -8,6 +8,7 @@
 #include "vm/globals.h"
 #include "vm/heap.h"
 #include "vm/pages.h"
+#include "vm/thread_barrier.h"
 #include "vm/timeline.h"
 
 namespace dart {
@@ -31,7 +32,7 @@
  public:
   ForwardingBlock() : new_address_(0), live_bitvector_(0) {}
 
-  uword Lookup(uword old_addr) {
+  uword Lookup(uword old_addr) const {
     uword block_offset = old_addr & ~kBlockMask;
     intptr_t first_unit_position = block_offset >> kObjectAlignmentLog2;
     ASSERT(first_unit_position < kBitsPerWord);
@@ -60,6 +61,14 @@
                        << first_unit_position;
   }
 
+  bool IsLive(uword old_addr) const {
+    uword block_offset = old_addr & ~kBlockMask;
+    intptr_t first_unit_position = block_offset >> kObjectAlignmentLog2;
+    ASSERT(first_unit_position < kBitsPerWord);
+    return (live_bitvector_ & (static_cast<uword>(1) << first_unit_position)) !=
+           0;
+  }
+
   // Marks all bits after a given address. This is used to ensure that some
   // objects do not move (classes).
   void MarkAllFrom(uword start_addr) {
@@ -69,6 +78,7 @@
     live_bitvector_ = static_cast<uword>(-1) << first_unit_position;
   }
 
+  uword new_address() const { return new_address_; }
   void set_new_address(uword value) { new_address_ = value; }
 
  private:
@@ -111,65 +121,151 @@
   forwarding_page_ = NULL;
 }
 
+class CompactorTask : public ThreadPool::Task {
+ public:
+  CompactorTask(Isolate* isolate,
+                GCCompactor* compactor,
+                ThreadBarrier* barrier,
+                intptr_t* next_forwarding_task,
+                HeapPage* head,
+                HeapPage** tail,
+                FreeList* freelist)
+      : isolate_(isolate),
+        compactor_(compactor),
+        barrier_(barrier),
+        next_forwarding_task_(next_forwarding_task),
+        head_(head),
+        tail_(tail),
+        freelist_(freelist),
+        free_page_(NULL),
+        free_current_(0),
+        free_end_(0) {}
+
+ private:
+  void Run();
+  void PlanPage(HeapPage* page);
+  void SlidePage(HeapPage* page);
+  uword PlanBlock(uword first_object, ForwardingPage* forwarding_page);
+  uword SlideBlock(uword first_object, ForwardingPage* forwarding_page);
+  void PlanMoveToExactAddress(uword addr);
+  void PlanMoveToContiguousSize(intptr_t size);
+  void SlideFreeUpTo(uword addr);
+
+  Isolate* isolate_;
+  GCCompactor* compactor_;
+  ThreadBarrier* barrier_;
+  intptr_t* next_forwarding_task_;
+  HeapPage* head_;
+  HeapPage** tail_;
+  FreeList* freelist_;
+  HeapPage* free_page_;
+  uword free_current_;
+  uword free_end_;
+
+  DISALLOW_COPY_AND_ASSIGN(CompactorTask);
+};
+
 // Slides live objects down past free gaps, updates pointers and frees empty
 // pages. Keeps cursors pointing to the next free and next live chunks, and
 // repeatedly moves the next live chunk to the next free chunk, one block at a
 // time, keeping blocks from spanning page boundries (see ForwardingBlock). Free
 // space at the end of a page that is too small for the next block is added to
 // the freelist.
-void GCCompactor::CompactBySliding(HeapPage* pages,
-                                   FreeList* freelist,
-                                   Mutex* pages_lock) {
+void GCCompactor::Compact(HeapPage* pages,
+                          FreeList* freelist,
+                          Mutex* pages_lock) {
+  SetupImagePageBoundaries();
+
+  // Divide the heap.
+  // TODO(30978): Try to divide based on live bytes or with work stealing.
+  intptr_t num_pages = 0;
+  for (HeapPage* page = pages; page != NULL; page = page->next()) {
+    num_pages++;
+  }
+
+  intptr_t num_tasks = FLAG_compactor_tasks;
+  RELEASE_ASSERT(num_tasks >= 1);
+  if (num_pages < num_tasks) {
+    num_tasks = num_pages;
+  }
+  HeapPage** heads = new HeapPage*[num_tasks];
+  HeapPage** tails = new HeapPage*[num_tasks];
+
   {
-    TIMELINE_FUNCTION_GC_DURATION(thread(), "SlideObjects");
-    MutexLocker ml(pages_lock);
-
-    free_page_ = pages;
-    free_current_ = free_page_->object_start();
-    free_end_ = free_page_->object_end();
-    freelist_ = freelist;
-
-    HeapPage* live_page = pages;
-    while (live_page != NULL) {
-      SlidePage(live_page);
-      live_page = live_page->next();
+    const intptr_t pages_per_task = num_pages / num_tasks;
+    intptr_t task_index = 0;
+    intptr_t page_index = 0;
+    HeapPage* page = pages;
+    HeapPage* prev = NULL;
+    while (task_index < num_tasks) {
+      if (page_index % pages_per_task == 0) {
+        heads[task_index] = page;
+        tails[task_index] = NULL;
+        if (prev != NULL) {
+          prev->set_next(NULL);
+        }
+        task_index++;
+      }
+      prev = page;
+      page = page->next();
+      page_index++;
     }
-
-    // Add any leftover in the last used page to the freelist. This is required
-    // to make the page walkable during forwarding, etc.
-    intptr_t free_remaining = free_end_ - free_current_;
-    if (free_remaining != 0) {
-      ASSERT(free_remaining >= kObjectAlignment);
-      freelist->FreeLocked(free_current_, free_remaining);
-    }
-
-    // Unlink empty pages so they will not be visited during forwarding.
-    // We cannot deallocate them until forwarding is complete.
-    HeapPage* tail = free_page_;
-    HeapPage* first_unused_page = tail->next();
-    tail->set_next(NULL);
-    heap_->old_space()->pages_tail_ = tail;
-    free_page_ = first_unused_page;
+    ASSERT(page_index <= num_pages);
+    ASSERT(task_index == num_tasks);
   }
 
   {
-    TIMELINE_FUNCTION_GC_DURATION(thread(), "ForwardPointers");
-    ForwardPointersForSliding();
+    ThreadBarrier barrier(num_tasks + 1, heap_->barrier(),
+                          heap_->barrier_done());
+    intptr_t next_forwarding_task = 0;
+
+    for (intptr_t task_index = 0; task_index < num_tasks; task_index++) {
+      Dart::thread_pool()->Run(new CompactorTask(
+          thread()->isolate(), this, &barrier, &next_forwarding_task,
+          heads[task_index], &tails[task_index], freelist));
+    }
+
+    // Plan pages.
+    barrier.Sync();
+    // Slides pages. Forward large pages, new space, etc.
+    barrier.Sync();
+    barrier.Exit();
+  }
+
+  for (intptr_t task_index = 0; task_index < num_tasks; task_index++) {
+    ASSERT(tails[task_index] != NULL);
+  }
+
+  {
+    TIMELINE_FUNCTION_GC_DURATION(thread(), "ForwardStackPointers");
+    ForwardStackPointers();
   }
 
   {
     MutexLocker ml(pages_lock);
 
     // Free empty pages.
-    HeapPage* page = free_page_;
-    while (page != NULL) {
-      HeapPage* next = page->next();
-      heap_->old_space()->IncreaseCapacityInWordsLocked(
-          -(page->memory_->size() >> kWordSizeLog2));
-      page->FreeForwardingPage();
-      page->Deallocate();
-      page = next;
+    for (intptr_t task_index = 0; task_index < num_tasks; task_index++) {
+      HeapPage* page = tails[task_index]->next();
+      while (page != NULL) {
+        HeapPage* next = page->next();
+        heap_->old_space()->IncreaseCapacityInWordsLocked(
+            -(page->memory_->size() >> kWordSizeLog2));
+        page->FreeForwardingPage();
+        page->Deallocate();
+        page = next;
+      }
     }
+
+    // Re-join the heap.
+    for (intptr_t task_index = 0; task_index < num_tasks - 1; task_index++) {
+      tails[task_index]->set_next(heads[task_index + 1]);
+    }
+    tails[num_tasks - 1]->set_next(NULL);
+    heap_->old_space()->pages_tail_ = tails[num_tasks - 1];
+
+    delete[] heads;
+    delete[] tails;
   }
 
   // Free forwarding information from the suriving pages.
@@ -178,27 +274,137 @@
   }
 }
 
-void GCCompactor::SlidePage(HeapPage* page) {
+void CompactorTask::Run() {
+  bool result =
+      Thread::EnterIsolateAsHelper(isolate_, Thread::kCompactorTask, true);
+  ASSERT(result);
+  NOT_IN_PRODUCT(Thread* thread = Thread::Current());
+  {
+    {
+      TIMELINE_FUNCTION_GC_DURATION(thread, "Plan");
+      free_page_ = head_;
+      free_current_ = free_page_->object_start();
+      free_end_ = free_page_->object_end();
+
+      for (HeapPage* page = head_; page != NULL; page = page->next()) {
+        PlanPage(page);
+      }
+    }
+
+    barrier_->Sync();
+
+    {
+      TIMELINE_FUNCTION_GC_DURATION(thread, "Slide");
+      free_page_ = head_;
+      free_current_ = free_page_->object_start();
+      free_end_ = free_page_->object_end();
+
+      for (HeapPage* page = head_; page != NULL; page = page->next()) {
+        SlidePage(page);
+      }
+
+      // Add any leftover in the last used page to the freelist. This is
+      // required to make the page walkable during forwarding, etc.
+      intptr_t free_remaining = free_end_ - free_current_;
+      if (free_remaining != 0) {
+        freelist_->Free(free_current_, free_remaining);
+      }
+
+      ASSERT(free_page_ != NULL);
+      *tail_ = free_page_;  // Last live page.
+    }
+
+    // Heap: Regular pages already visited during sliding. Code and image pages
+    // have no pointers to forward. Visit large pages and new-space.
+
+    bool more_forwarding_tasks = true;
+    while (more_forwarding_tasks) {
+      intptr_t forwarding_task =
+          AtomicOperations::FetchAndIncrement(next_forwarding_task_);
+      switch (forwarding_task) {
+        case 0: {
+          TIMELINE_FUNCTION_GC_DURATION(thread, "ForwardLargePages");
+          for (HeapPage* large_page =
+                   isolate_->heap()->old_space()->large_pages_;
+               large_page != NULL; large_page = large_page->next()) {
+            large_page->VisitObjectPointers(compactor_);
+          }
+          break;
+        }
+        case 1: {
+          TIMELINE_FUNCTION_GC_DURATION(thread, "ForwardNewSpace");
+          isolate_->heap()->new_space()->VisitObjectPointers(compactor_);
+          break;
+        }
+        case 2: {
+          TIMELINE_FUNCTION_GC_DURATION(thread, "ForwardRememberedSet");
+          isolate_->store_buffer()->VisitObjectPointers(compactor_);
+          break;
+        }
+        case 3: {
+          TIMELINE_FUNCTION_GC_DURATION(thread, "ForwardWeakTables");
+          isolate_->heap()->ForwardWeakTables(compactor_);
+          break;
+        }
+        case 4: {
+          TIMELINE_FUNCTION_GC_DURATION(thread, "ForwardWeakHandles");
+          isolate_->VisitWeakPersistentHandles(compactor_);
+          break;
+        }
+#ifndef PRODUCT
+        case 5: {
+          if (FLAG_support_service) {
+            TIMELINE_FUNCTION_GC_DURATION(thread, "ForwardObjectIdRing");
+            isolate_->object_id_ring()->VisitPointers(compactor_);
+          }
+          break;
+        }
+#endif  // !PRODUCT
+        default:
+          more_forwarding_tasks = false;
+      }
+    }
+
+    barrier_->Sync();
+  }
+  Thread::ExitIsolateAsHelper(true);
+
+  // This task is done. Notify the original thread.
+  barrier_->Exit();
+}
+
+void CompactorTask::PlanPage(HeapPage* page) {
   uword current = page->object_start();
   uword end = page->object_end();
 
   ForwardingPage* forwarding_page = page->AllocateForwardingPage();
   while (current < end) {
+    current = PlanBlock(current, forwarding_page);
+  }
+}
+
+void CompactorTask::SlidePage(HeapPage* page) {
+  uword current = page->object_start();
+  uword end = page->object_end();
+
+  ForwardingPage* forwarding_page = page->forwarding_page();
+  while (current < end) {
     current = SlideBlock(current, forwarding_page);
   }
 }
 
-uword GCCompactor::SlideBlock(uword first_object,
-                              ForwardingPage* forwarding_page) {
-  uword start = first_object & kBlockMask;
-  uword end = start + kBlockSize;
+uword CompactorTask::PlanBlock(uword first_object,
+                               ForwardingPage* forwarding_page) {
+  uword block_start = first_object & kBlockMask;
+  uword block_end = block_start + kBlockSize;
   ForwardingBlock* forwarding_block = forwarding_page->BlockFor(first_object);
 
   // 1. Compute bitvector of surviving allocation units in the block.
   bool has_class = false;
   intptr_t block_live_size = 0;
+  intptr_t block_dead_size = 0;
   uword current = first_object;
-  while (current < end) {
+  while (current < block_end) {
     RawObject* obj = RawObject::FromAddr(current);
     intptr_t size = obj->Size();
     if (obj->IsMarked()) {
@@ -209,6 +415,8 @@
       ASSERT(static_cast<intptr_t>(forwarding_block->Lookup(current)) ==
              block_live_size);
       block_live_size += size;
+    } else {
+      block_dead_size += size;
     }
     current += size;
   }
@@ -217,7 +425,7 @@
   if (has_class) {
     // This will waste the space used by dead objects that are before the class
     // object.
-    MoveToExactAddress(first_object);
+    PlanMoveToExactAddress(first_object);
     ASSERT(free_current_ == first_object);
 
     // This is not MarkAll because the first part of a block might
@@ -225,28 +433,36 @@
     // or the page header.
     forwarding_block->MarkAllFrom(first_object);
     ASSERT(forwarding_block->Lookup(first_object) == 0);
-  } else {
-    MoveToContiguousSize(block_live_size);
-  }
-  forwarding_block->set_new_address(free_current_);
 
-  // 3. Move objects in the block.
+    forwarding_block->set_new_address(free_current_);
+    free_current_ += block_live_size + block_dead_size;
+  } else {
+    PlanMoveToContiguousSize(block_live_size);
+    forwarding_block->set_new_address(free_current_);
+    free_current_ += block_live_size;
+  }
+
+  return current;  // First object in the next block
+}
+
+uword CompactorTask::SlideBlock(uword first_object,
+                                ForwardingPage* forwarding_page) {
+  uword block_start = first_object & kBlockMask;
+  uword block_end = block_start + kBlockSize;
+  ForwardingBlock* forwarding_block = forwarding_page->BlockFor(first_object);
+
+  // Add any space wasted at the end of a page or due to class pinning to the
+  // free list.
+  SlideFreeUpTo(forwarding_block->new_address());
+
   uword old_addr = first_object;
-  while (old_addr < end) {
+  while (old_addr < block_end) {
     RawObject* old_obj = RawObject::FromAddr(old_addr);
     intptr_t size = old_obj->Size();
     if (old_obj->IsMarked()) {
-      // Assert the current free page has enough space. This we hold because we
-      // grabbed space for the whole block up front.
-      intptr_t free_remaining = free_end_ - free_current_;
-      ASSERT(free_remaining >= size);
-
-      uword new_addr = free_current_;
-      free_current_ += size;
+      uword new_addr = forwarding_block->Lookup(old_addr);
       RawObject* new_obj = RawObject::FromAddr(new_addr);
 
-      ASSERT(forwarding_page->Lookup(old_addr) == new_addr);
-
       // Fast path for no movement. There's often a large block of objects at
       // the beginning that don't move.
       if (new_addr != old_addr) {
@@ -257,12 +473,15 @@
                 reinterpret_cast<void*>(old_addr), size);
       }
       new_obj->ClearMarkBit();
-    } else {
-      if (has_class) {
-        // Add to free list; note we're not bothering to coalesce here.
-        freelist_->FreeLocked(old_addr, size);
-        free_current_ += size;
-      }
+      new_obj->VisitPointers(compactor_);
+
+      ASSERT(free_current_ == new_addr);
+      free_current_ += size;
+    } else if (forwarding_block->IsLive(old_addr)) {
+      // Gap we're keeping to prevent class movement.
+      ASSERT(free_current_ == old_addr);
+      freelist_->Free(old_addr, size);
+      free_current_ += size;
     }
     old_addr += size;
   }
@@ -270,19 +489,16 @@
   return old_addr;  // First object in the next block.
 }
 
-void GCCompactor::MoveToExactAddress(uword addr) {
-  // Skip space to ensure class objects do not move. Computing the size
-  // of larger objects requires consulting their class, whose old body
-  // might be overwritten during the sliding.
-  // TODO(rmacnak): Keep class sizes off heap or class objects in
-  // non-moving pages.
+void CompactorTask::SlideFreeUpTo(uword addr) {
+  if (free_current_ == addr) return;
 
   // Skip pages until class's page.
+  ASSERT(free_page_ != NULL);
   while (!free_page_->Contains(addr)) {
     intptr_t free_remaining = free_end_ - free_current_;
     if (free_remaining != 0) {
       // Note we aren't bothering to check for a whole page to release.
-      freelist_->FreeLocked(free_current_, free_remaining);
+      freelist_->Free(free_current_, free_remaining);
     }
     // And advance to the next free page.
     free_page_ = free_page_->next();
@@ -290,12 +506,11 @@
     free_current_ = free_page_->object_start();
     free_end_ = free_page_->object_end();
   }
-  ASSERT(free_page_ != NULL);
 
   // Skip within page until class's address.
   intptr_t free_skip = addr - free_current_;
   if (free_skip != 0) {
-    freelist_->FreeLocked(free_current_, free_skip);
+    freelist_->Free(free_current_, free_skip);
     free_current_ += free_skip;
   }
 
@@ -303,17 +518,35 @@
   ASSERT(free_current_ == addr);
 }
 
-void GCCompactor::MoveToContiguousSize(intptr_t size) {
+void CompactorTask::PlanMoveToExactAddress(uword addr) {
+  // Skip space to ensure class objects do not move. Computing the size
+  // of larger objects requires consulting their class, whose old body
+  // might be overwritten during the sliding.
+  // TODO(rmacnak): Keep class sizes off heap or class objects in
+  // non-moving pages.
+
+  // Skip pages until class's page.
+  ASSERT(free_page_ != NULL);
+  while (!free_page_->Contains(addr)) {
+    // And advance to the next free page.
+    free_page_ = free_page_->next();
+    ASSERT(free_page_ != NULL);
+    free_current_ = free_page_->object_start();
+    free_end_ = free_page_->object_end();
+  }
+
+  // Skip within page until class's address.
+  free_current_ = addr;
+}
+
+void CompactorTask::PlanMoveToContiguousSize(intptr_t size) {
   // Move the free cursor to ensure 'size' bytes of contiguous space.
   ASSERT(size <= kPageSize);
 
   // Check if the current free page has enough space.
   intptr_t free_remaining = free_end_ - free_current_;
   if (free_remaining < size) {
-    if (free_remaining != 0) {
-      freelist_->FreeLocked(free_current_, free_remaining);
-    }
-    // And advance to the next free page.
+    // Not enough; advance to the next free page.
     free_page_ = free_page_->next();
     ASSERT(free_page_ != NULL);
     free_current_ = free_page_->object_start();
@@ -323,48 +556,7 @@
   }
 }
 
-DART_FORCE_INLINE
-void GCCompactor::ForwardPointerForSliding(RawObject** ptr) {
-  RawObject* old_target = *ptr;
-  if (old_target->IsSmiOrNewObject()) {
-    return;  // Not moved.
-  }
-
-  uword old_addr = RawObject::ToAddr(old_target);
-  for (intptr_t i = 0; i < kMaxImagePages; i++) {
-    if ((old_addr - image_page_ranges_[i].base) < image_page_ranges_[i].size) {
-      return;  // Not moved (unaligned image page).
-    }
-  }
-
-  HeapPage* page = HeapPage::Of(old_target);
-  ForwardingPage* forwarding_page = page->forwarding_page();
-  if (forwarding_page == NULL) {
-    return;  // Not moved (VM isolate, large page, code page).
-  }
-
-  RawObject* new_target =
-      RawObject::FromAddr(forwarding_page->Lookup(old_addr));
-  *ptr = new_target;
-}
-
-void GCCompactor::VisitPointers(RawObject** first, RawObject** last) {
-  for (RawObject** ptr = first; ptr <= last; ptr++) {
-    ForwardPointerForSliding(ptr);
-  }
-}
-
-void GCCompactor::VisitHandle(uword addr) {
-  FinalizablePersistentHandle* handle =
-      reinterpret_cast<FinalizablePersistentHandle*>(addr);
-  ForwardPointerForSliding(handle->raw_addr());
-}
-
-void GCCompactor::ForwardPointersForSliding() {
-  // N.B.: This pointer visitor is not idempotent. We must take care to visit
-  // each pointer exactly once.
-
-  // Collect image page boundaries.
+void GCCompactor::SetupImagePageBoundaries() {
   for (intptr_t i = 0; i < kMaxImagePages; i++) {
     image_page_ranges_[i].base = 0;
     image_page_ranges_[i].size = 0;
@@ -388,30 +580,52 @@
     image_page = image_page->next();
     next_offset++;
   }
+}
 
-  // Heap pointers.
-  // N.B.: We forward the heap before forwarding the stack. This limits the
-  // amount of following of forwarding pointers needed to get at stack maps.
-  heap_->VisitObjectPointers(this);
-
-  // C++ pointers.
-  isolate()->VisitObjectPointers(this, StackFrameIterator::kDontValidateFrames);
-#ifndef PRODUCT
-  if (FLAG_support_service) {
-    ObjectIdRing* ring = isolate()->object_id_ring();
-    ASSERT(ring != NULL);
-    ring->VisitPointers(this);
+DART_FORCE_INLINE
+void GCCompactor::ForwardPointer(RawObject** ptr) {
+  RawObject* old_target = *ptr;
+  if (old_target->IsSmiOrNewObject()) {
+    return;  // Not moved.
   }
-#endif  // !PRODUCT
 
-  // Weak persistent handles.
-  isolate()->VisitWeakPersistentHandles(this);
+  uword old_addr = RawObject::ToAddr(old_target);
+  for (intptr_t i = 0; i < kMaxImagePages; i++) {
+    if ((old_addr - image_page_ranges_[i].base) < image_page_ranges_[i].size) {
+      return;  // Not moved (unaligned image page).
+    }
+  }
 
-  // Remembered set.
-  isolate()->store_buffer()->VisitObjectPointers(this);
+  HeapPage* page = HeapPage::Of(old_target);
+  ForwardingPage* forwarding_page = page->forwarding_page();
+  if (forwarding_page == NULL) {
+    return;  // Not moved (VM isolate, large page, code page).
+  }
 
-  // Weak tables.
-  heap_->ForwardWeakTables(this);
+  RawObject* new_target =
+      RawObject::FromAddr(forwarding_page->Lookup(old_addr));
+  *ptr = new_target;
+}
+
+// N.B.: This pointer visitor is not idempotent. We must take care to visit
+// each pointer exactly once.
+void GCCompactor::VisitPointers(RawObject** first, RawObject** last) {
+  for (RawObject** ptr = first; ptr <= last; ptr++) {
+    ForwardPointer(ptr);
+  }
+}
+
+void GCCompactor::VisitHandle(uword addr) {
+  FinalizablePersistentHandle* handle =
+      reinterpret_cast<FinalizablePersistentHandle*>(addr);
+  ForwardPointer(handle->raw_addr());
+}
+
+void GCCompactor::ForwardStackPointers() {
+  // N.B.: Heap pointers have already been forwarded. We forward the heap before
+  // forwarding the stack to limit the number of places that need to be aware of
+  // forwarding when reading stack maps.
+  isolate()->VisitObjectPointers(this, StackFrameIterator::kDontValidateFrames);
 }
 
 }  // namespace dart
diff --git a/runtime/vm/gc_compactor.h b/runtime/vm/gc_compactor.h
index ef2a6b0..6fe1f1c 100644
--- a/runtime/vm/gc_compactor.h
+++ b/runtime/vm/gc_compactor.h
@@ -20,8 +20,8 @@
 
 // Implements a sliding compactor.
 class GCCompactor : public ValueObject,
-                    private HandleVisitor,
-                    private ObjectPointerVisitor {
+                    public HandleVisitor,
+                    public ObjectPointerVisitor {
  public:
   GCCompactor(Thread* thread, Heap* heap)
       : HandleVisitor(thread),
@@ -29,26 +29,17 @@
         heap_(heap) {}
   ~GCCompactor() {}
 
-  void CompactBySliding(HeapPage* pages, FreeList* freelist, Mutex* mutex);
+  void Compact(HeapPage* pages, FreeList* freelist, Mutex* mutex);
 
  private:
-  void SlidePage(HeapPage* page);
-  uword SlideBlock(uword first_object, ForwardingPage* forwarding_page);
-  void MoveToExactAddress(uword addr);
-  void MoveToContiguousSize(intptr_t size);
-
-  void ForwardPointersForSliding();
-  void ForwardPointerForSliding(RawObject** ptr);
+  void SetupImagePageBoundaries();
+  void ForwardStackPointers();
+  void ForwardPointer(RawObject** ptr);
   void VisitPointers(RawObject** first, RawObject** last);
   void VisitHandle(uword addr);
 
   Heap* heap_;
 
-  HeapPage* free_page_;
-  uword free_current_;
-  uword free_end_;
-  FreeList* freelist_;
-
   struct ImagePageRange {
     uword base;
     uword size;
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index edc7192..6a1d898 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -19,7 +19,7 @@
 // Keep in sync with package:kernel/lib/binary/tag.dart.
 
 static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
-static const uint32_t kBinaryFormatVersion = 2;
+static const uint32_t kBinaryFormatVersion = 3;
 
 // Keep in sync with package:kernel/lib/binary/tag.dart
 enum Tag {
@@ -79,6 +79,7 @@
   kAwaitExpression = 51,
   kFunctionExpression = 52,
   kLet = 53,
+  kInstantiation = 54,
 
   kPositiveIntLiteral = 55,
   kNegativeIntLiteral = 56,
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 6f453cd..50fa689 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -1334,9 +1334,10 @@
   functions_.Add(&getter);
   getter.set_end_token_pos(field_helper->end_position_);
   getter.set_kernel_offset(field.kernel_offset());
-  getter.set_result_type(AbstractType::Handle(Z, field.type()));
+  const AbstractType& field_type = AbstractType::Handle(Z, field.type());
+  getter.set_result_type(field_type);
   getter.set_is_debuggable(false);
-  SetupFieldAccessorFunction(klass, getter);
+  SetupFieldAccessorFunction(klass, getter, field_type);
 
   if (!field_helper->IsStatic() && !field_helper->IsFinal()) {
     // Only static fields can be const.
@@ -1355,12 +1356,13 @@
     setter.set_kernel_offset(field.kernel_offset());
     setter.set_result_type(Object::void_type());
     setter.set_is_debuggable(false);
-    SetupFieldAccessorFunction(klass, setter);
+    SetupFieldAccessorFunction(klass, setter, field_type);
   }
 }
 
 void KernelLoader::SetupFieldAccessorFunction(const Class& klass,
-                                              const Function& function) {
+                                              const Function& function,
+                                              const AbstractType& field_type) {
   bool is_setter = function.IsImplicitSetterFunction();
   bool is_method = !function.IsStaticFunction();
   intptr_t parameter_count = (is_method ? 1 : 0) + (is_setter ? 1 : 0);
@@ -1379,7 +1381,7 @@
     pos++;
   }
   if (is_setter) {
-    function.SetParameterTypeAt(pos, AbstractType::dynamic_type());
+    function.SetParameterTypeAt(pos, field_type);
     function.SetParameterNameAt(pos, Symbols::Value());
     pos++;
   }
diff --git a/runtime/vm/kernel_loader.h b/runtime/vm/kernel_loader.h
index 7758a58..d49b2d9 100644
--- a/runtime/vm/kernel_loader.h
+++ b/runtime/vm/kernel_loader.h
@@ -219,7 +219,9 @@
                               const Field& field,
                               FieldHelper* field_helper);
 
-  void SetupFieldAccessorFunction(const Class& klass, const Function& function);
+  void SetupFieldAccessorFunction(const Class& klass,
+                                  const Function& function,
+                                  const AbstractType& field_type);
 
   void LoadLibraryImportsAndExports(Library* library);
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 863fd5c..6a3d0f6 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -18590,6 +18590,8 @@
   int64_t value = 0;
   const char* cstr = str.ToCString();
   if (!OS::StringToInt64(cstr, &value)) {
+    // TODO(T31600): Remove overflow checking code when 64-bit ints semantics
+    // are only supported through the Kernel FE.
     if (FLAG_limit_ints_to_64_bits) {
       if (strcmp(cstr, kMaxInt64Plus1) == 0) {
         // Allow MAX_INT64 + 1 integer literal as it can be used as an argument
@@ -18615,6 +18617,8 @@
   int64_t value = 0;
   const char* cstr = str.ToCString();
   if (!OS::StringToInt64(cstr, &value)) {
+    // TODO(T31600): Remove overflow checking code when 64-bit ints semantics
+    // are only supported through the Kernel FE.
     if (FLAG_limit_ints_to_64_bits) {
       if (strcmp(cstr, kMaxInt64Plus1) == 0) {
         // Allow MAX_INT64 + 1 integer literal as it can be used as an argument
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 2629ac8..056a349 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -2544,9 +2544,9 @@
   int next_frame_index = parent_scope->AllocateVariables(
       first_parameter_index, num_parameters, first_frame_index, NULL,
       &found_captured_vars);
-  // Variables a and c are captured, therefore are not allocated in frame.
-  // Variable var_ta, although captured, still requires a slot in frame.
-  EXPECT_EQ(-1, next_frame_index - first_frame_index);  // Indices in frame < 0.
+  // Variables a, c and var_ta are captured, therefore are not allocated in
+  // frame.
+  EXPECT_EQ(0, next_frame_index - first_frame_index);  // Indices in frame < 0.
   const intptr_t parent_scope_context_level = 1;
   EXPECT_EQ(parent_scope_context_level, parent_scope->context_level());
   EXPECT(found_captured_vars);
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index 07d95b9..1587348 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -113,7 +113,8 @@
 }
 
 void HeapPage::VisitObjectPointers(ObjectPointerVisitor* visitor) const {
-  ASSERT(Thread::Current()->IsAtSafepoint());
+  ASSERT(Thread::Current()->IsAtSafepoint() ||
+         (Thread::Current()->task_kind() == Thread::kCompactorTask));
   NoSafepointScope no_safepoint;
   uword obj_addr = object_start();
   uword end_addr = object_end();
@@ -248,11 +249,11 @@
     if (exec_pages_ == NULL) {
       exec_pages_ = page;
     } else {
-      if (FLAG_write_protect_code && !exec_pages_tail_->is_image_page()) {
+      if (FLAG_write_protect_code) {
         exec_pages_tail_->WriteProtect(false);
       }
       exec_pages_tail_->set_next(page);
-      if (FLAG_write_protect_code && !exec_pages_tail_->is_image_page()) {
+      if (FLAG_write_protect_code) {
         exec_pages_tail_->WriteProtect(true);
       }
     }
@@ -826,14 +827,12 @@
     HeapPage* page = exec_pages_;
     while (page != NULL) {
       ASSERT(page->type() == HeapPage::kExecutable);
-      if (!page->is_image_page()) {
-        page->WriteProtect(read_only);
-      }
+      page->WriteProtect(read_only);
       page = page->next();
     }
     page = large_pages_;
     while (page != NULL) {
-      if (page->type() == HeapPage::kExecutable && !page->is_image_page()) {
+      if (page->type() == HeapPage::kExecutable) {
         page->WriteProtect(read_only);
       }
       page = page->next();
@@ -985,14 +984,14 @@
       }
 
       mid3 = OS::GetCurrentMonotonicMicros();
+    }
 
-      if (compact) {
-        Compact(thread);
-      } else if (FLAG_concurrent_sweep) {
-        ConcurrentSweep(isolate);
-      } else {
-        BlockingSweep();
-      }
+    if (compact) {
+      Compact(thread);
+    } else if (FLAG_concurrent_sweep) {
+      ConcurrentSweep(isolate);
+    } else {
+      BlockingSweep();
     }
 
     // Make code pages read-only.
@@ -1051,6 +1050,9 @@
 }
 
 void PageSpace::BlockingSweep() {
+  MutexLocker mld(freelist_[HeapPage::kData].mutex());
+  MutexLocker mle(freelist_[HeapPage::kExecutable].mutex());
+
   // Sweep all regular sized pages now.
   GCSweeper sweeper;
   HeapPage* prev_page = NULL;
@@ -1083,7 +1085,7 @@
 void PageSpace::Compact(Thread* thread) {
   thread->isolate()->set_compaction_in_progress(true);
   GCCompactor compactor(thread, heap_);
-  compactor.CompactBySliding(pages_, &freelist_[HeapPage::kData], pages_lock_);
+  compactor.Compact(pages_, &freelist_[HeapPage::kData], pages_lock_);
   thread->isolate()->set_compaction_in_progress(false);
 
   if (FLAG_verify_after_gc) {
diff --git a/runtime/vm/pages.h b/runtime/vm/pages.h
index 1702aca..6ff35c8 100644
--- a/runtime/vm/pages.h
+++ b/runtime/vm/pages.h
@@ -457,6 +457,7 @@
   friend class PageSpaceController;
   friend class SweeperTask;
   friend class GCCompactor;
+  friend class CompactorTask;
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(PageSpace);
 };
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index a476faa..fe0b255 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -13,6 +13,7 @@
 #include "vm/bootstrap.h"
 #include "vm/class_finalizer.h"
 #include "vm/compiler/aot/precompiler.h"
+#include "vm/compiler/backend/il_printer.h"
 #include "vm/compiler/frontend/kernel_binary_flowgraph.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/compiler_stats.h"
@@ -167,6 +168,52 @@
   return a.raw();
 }
 
+ParsedFunction::ParsedFunction(Thread* thread, const Function& function)
+    : thread_(thread),
+      function_(function),
+      code_(Code::Handle(zone(), function.unoptimized_code())),
+      node_sequence_(NULL),
+      regexp_compile_data_(NULL),
+      instantiator_(NULL),
+      function_type_arguments_(NULL),
+      parent_type_arguments_(NULL),
+      current_context_var_(NULL),
+      arg_desc_var_(NULL),
+      expression_temp_var_(NULL),
+      finally_return_temp_var_(NULL),
+      deferred_prefixes_(new ZoneGrowableArray<const LibraryPrefix*>()),
+      guarded_fields_(new ZoneGrowableArray<const Field*>()),
+      default_parameter_values_(NULL),
+      raw_type_arguments_var_(NULL),
+      first_parameter_index_(0),
+      num_stack_locals_(0),
+      have_seen_await_expr_(false),
+      kernel_scopes_(NULL) {
+  ASSERT(function.IsZoneHandle());
+  // Every function has a local variable for the current context.
+  LocalVariable* temp = new (zone())
+      LocalVariable(function.token_pos(), function.token_pos(),
+                    Symbols::CurrentContextVar(), Object::dynamic_type());
+  current_context_var_ = temp;
+
+  const bool reify_generic_argument =
+      function.IsGeneric() && Isolate::Current()->reify_generic_functions();
+
+  const bool load_optional_arguments = function.HasOptionalParameters();
+
+  const bool check_arguments =
+      (function_.IsClosureFunction() || function_.IsConvertedClosureFunction());
+
+  const bool need_argument_descriptor =
+      load_optional_arguments || check_arguments || reify_generic_argument;
+
+  if (need_argument_descriptor) {
+    arg_desc_var_ = new (zone())
+        LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                      Symbols::ArgDescVar(), Object::dynamic_type());
+  }
+}
+
 void ParsedFunction::AddToGuardedFields(const Field* field) const {
   if ((field->guarded_cid() == kDynamicCid) ||
       (field->guarded_cid() == kIllegalCid)) {
@@ -274,32 +321,97 @@
   const intptr_t num_fixed_params = function().num_fixed_parameters();
   const intptr_t num_opt_params = function().NumOptionalParameters();
   const intptr_t num_params = num_fixed_params + num_opt_params;
-  // Compute start indices to parameters and locals, and the number of
-  // parameters to copy.
-  if (num_opt_params == 0) {
-    // Parameter i will be at fp[kParamEndSlotFromFp + num_params - i] and
-    // local variable j will be at fp[kFirstLocalSlotFromFp - j].
-    first_parameter_index_ = kParamEndSlotFromFp + num_params;
-    first_stack_local_index_ = kFirstLocalSlotFromFp;
-    num_copied_params_ = 0;
-  } else {
-    // Parameter i will be at fp[kFirstLocalSlotFromFp - i] and local variable
-    // j will be at fp[kFirstLocalSlotFromFp - num_params - j].
-    first_parameter_index_ = kFirstLocalSlotFromFp;
-    first_stack_local_index_ = first_parameter_index_ - num_params;
-    num_copied_params_ = num_params;
+
+  // Before we start allocating frame indices to variables, we'll setup the
+  // parameters array, which can be used to access the raw parameters (i.e. not
+  // the potentially variables which are in the context)
+
+  for (intptr_t param = 0; param < function().NumParameters(); ++param) {
+    LocalVariable* raw_parameter = scope->VariableAt(param);
+    if (raw_parameter->is_captured()) {
+      String& tmp = String::ZoneHandle(Z);
+      tmp = Symbols::FromConcat(T, Symbols::OriginalParam(),
+                                raw_parameter->name());
+
+      RELEASE_ASSERT(scope->LocalLookupVariable(tmp) == NULL);
+      raw_parameter = new LocalVariable(raw_parameter->declaration_token_pos(),
+                                        raw_parameter->token_pos(), tmp,
+                                        raw_parameter->type());
+      if (function().HasOptionalParameters()) {
+        bool ok = scope->AddVariable(raw_parameter);
+        ASSERT(ok);
+
+        // Currently our optimizer cannot prove liveness of variables properly
+        // when a function has try/catch.  It therefore makes the conservative
+        // estimate that all [LocalVariable]s in the frame are live and spills
+        // them before call sites (in some shape or form).
+        //
+        // Since we are guaranteed to not need that, we tell the try/catch
+        // spilling mechanism not to care about this variable.
+        raw_parameter->set_is_captured_parameter(true);
+
+      } else {
+        raw_parameter->set_index(kParamEndSlotFromFp +
+                                 function().NumParameters() - param);
+      }
+    }
+    raw_parameters_.Add(raw_parameter);
+  }
+  if (function_type_arguments_ != NULL) {
+    LocalVariable* raw_type_args_parameter = function_type_arguments_;
+    if (function_type_arguments_->is_captured()) {
+      String& tmp = String::ZoneHandle(Z);
+      tmp = Symbols::FromConcat(T, Symbols::OriginalParam(),
+                                function_type_arguments_->name());
+
+      ASSERT(scope->LocalLookupVariable(tmp) == NULL);
+      raw_type_args_parameter =
+          new LocalVariable(raw_type_args_parameter->declaration_token_pos(),
+                            raw_type_args_parameter->token_pos(), tmp,
+                            raw_type_args_parameter->type());
+      bool ok = scope->AddVariable(raw_type_args_parameter);
+      ASSERT(ok);
+    }
+    raw_type_arguments_var_ = raw_type_args_parameter;
+  }
+
+  // The copy parameters implementation will still write to local variables
+  // which we assign indices as with the old CopyParams implementation.
+  intptr_t parameter_frame_index_start;
+  intptr_t reamining_local_variables_start;
+  {
+    // Compute start indices to parameters and locals, and the number of
+    // parameters to copy.
+    if (num_opt_params == 0) {
+      // Parameter i will be at fp[kParamEndSlotFromFp + num_params - i] and
+      // local variable j will be at fp[kFirstLocalSlotFromFp - j].
+      parameter_frame_index_start = first_parameter_index_ =
+          kParamEndSlotFromFp + num_params;
+      reamining_local_variables_start = kFirstLocalSlotFromFp;
+    } else {
+      // Parameter i will be at fp[kFirstLocalSlotFromFp - i] and local variable
+      // j will be at fp[kFirstLocalSlotFromFp - num_params - j].
+      parameter_frame_index_start = first_parameter_index_ =
+          kFirstLocalSlotFromFp;
+      reamining_local_variables_start = first_parameter_index_ - num_params;
+    }
+  }
+
+  if (function_type_arguments_ != NULL && num_opt_params > 0) {
+    reamining_local_variables_start--;
   }
 
   // Allocate parameters and local variables, either in the local frame or
   // in the context(s).
   bool found_captured_variables = false;
   int next_free_frame_index = scope->AllocateVariables(
-      first_parameter_index_, num_params, first_stack_local_index_, NULL,
-      &found_captured_variables);
+      parameter_frame_index_start, num_params,
+      parameter_frame_index_start > 0 ? kFirstLocalSlotFromFp
+                                      : kFirstLocalSlotFromFp - num_params,
+      NULL, &found_captured_variables);
 
   // Frame indices are relative to the frame pointer and are decreasing.
-  ASSERT(next_free_frame_index <= first_stack_local_index_);
-  num_stack_locals_ = first_stack_local_index_ - next_free_frame_index;
+  num_stack_locals_ = -(next_free_frame_index - kFirstLocalSlotFromFp);
 }
 
 struct CatchParamDesc {
@@ -324,8 +436,6 @@
   // Parameter i will be at fp[kParamEndSlotFromFp + num_params - i] and
   // local variable j will be at fp[kFirstLocalSlotFromFp - j].
   first_parameter_index_ = kParamEndSlotFromFp + num_params;
-  first_stack_local_index_ = kFirstLocalSlotFromFp;
-  num_copied_params_ = 0;
 
   // Frame indices are relative to the frame pointer and are decreasing.
   num_stack_locals_ = num_stack_locals;
@@ -1063,6 +1173,7 @@
   }
 #endif  // !PRODUCT
   SequenceNode* node_sequence = NULL;
+
   switch (func.kind()) {
     case RawFunction::kImplicitClosureFunction:
       node_sequence = parser.ParseImplicitClosure(func);
@@ -1454,6 +1565,11 @@
 
   OpenFunctionBlock(func);
 
+  if (parsed_function_->has_arg_desc_var() && FunctionLevel() == 0) {
+    EnsureExpressionTemp();
+    current_block_->scope->AddVariable(parsed_function_->arg_desc_var());
+  }
+
   const Function& parent = Function::Handle(func.parent_function());
   intptr_t type_args_len = 0;  // Length of type args vector passed to parent.
   LocalVariable* type_args_var = NULL;
@@ -1674,6 +1790,11 @@
     ASSERT(FunctionLevel() == 0);
     parsed_function_->set_function_type_arguments(type_args_var);
   }
+
+  if (parsed_function_->has_arg_desc_var() && FunctionLevel() == 0) {
+    EnsureExpressionTemp();
+    current_block_->scope->AddVariable(parsed_function_->arg_desc_var());
+  }
 }
 
 SequenceNode* Parser::ParseNoSuchMethodDispatcher(const Function& func) {
@@ -3249,6 +3370,12 @@
   }
 
   OpenFunctionBlock(func);
+
+  if (parsed_function_->has_arg_desc_var() && FunctionLevel() == 0) {
+    EnsureExpressionTemp();
+    current_block_->scope->AddVariable(parsed_function_->arg_desc_var());
+  }
+
   ParamList params;
   ASSERT(CurrentToken() == Token::kLPAREN);
 
@@ -3421,6 +3548,11 @@
   ASSERT(!func.IsGenerativeConstructor());
   OpenFunctionBlock(func);  // Build local scope for function.
 
+  if (parsed_function_->has_arg_desc_var() && FunctionLevel() == 0) {
+    EnsureExpressionTemp();
+    current_block_->scope->AddVariable(parsed_function_->arg_desc_var());
+  }
+
   if (Isolate::Current()->reify_generic_functions()) {
     // Lookup function type arguments variable in parent function scope, if any.
     if (func.HasGenericParent()) {
@@ -6342,7 +6474,8 @@
   // libraries, including indirectly through exports.
   const String& lib_url = String::Handle(Z, library_.url());
   if (canon_url.StartsWith(Symbols::DartSchemePrivate()) &&
-      !lib_url.StartsWith(Symbols::DartScheme())) {
+      !lib_url.StartsWith(Symbols::DartScheme()) &&
+      !lib_url.StartsWith(Symbols::DartInternalPackage())) {
     ReportError(import_pos, "private library is not accessible");
   }
 
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 14333fb..ad9283e 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -89,35 +89,7 @@
 // The class ParsedFunction holds the result of parsing a function.
 class ParsedFunction : public ZoneAllocated {
  public:
-  ParsedFunction(Thread* thread, const Function& function)
-      : thread_(thread),
-        function_(function),
-        code_(Code::Handle(zone(), function.unoptimized_code())),
-        node_sequence_(NULL),
-        regexp_compile_data_(NULL),
-        instantiator_(NULL),
-        function_type_arguments_(NULL),
-        parent_type_arguments_(NULL),
-        current_context_var_(NULL),
-        expression_temp_var_(NULL),
-        finally_return_temp_var_(NULL),
-        deferred_prefixes_(new ZoneGrowableArray<const LibraryPrefix*>()),
-        guarded_fields_(new ZoneGrowableArray<const Field*>()),
-        default_parameter_values_(NULL),
-        first_parameter_index_(0),
-        first_stack_local_index_(0),
-        num_copied_params_(0),
-        num_stack_locals_(0),
-        have_seen_await_expr_(false),
-        kernel_scopes_(NULL) {
-    ASSERT(function.IsZoneHandle());
-    // Every function has a local variable for the current context.
-    LocalVariable* temp = new (zone())
-        LocalVariable(function.token_pos(), function.token_pos(),
-                      Symbols::CurrentContextVar(), Object::dynamic_type());
-    ASSERT(temp != NULL);
-    current_context_var_ = temp;
-  }
+  ParsedFunction(Thread* thread, const Function& function);
 
   const Function& function() const { return function_; }
   const Code& code() const { return code_; }
@@ -172,6 +144,9 @@
 
   LocalVariable* current_context_var() const { return current_context_var_; }
 
+  bool has_arg_desc_var() const { return arg_desc_var_ != NULL; }
+  LocalVariable* arg_desc_var() const { return arg_desc_var_; }
+
   LocalVariable* expression_temp_var() const {
     ASSERT(has_expression_temp_var());
     return expression_temp_var_;
@@ -208,12 +183,7 @@
   }
 
   int first_parameter_index() const { return first_parameter_index_; }
-  int first_stack_local_index() const { return first_stack_local_index_; }
-  int num_copied_params() const { return num_copied_params_; }
   int num_stack_locals() const { return num_stack_locals_; }
-  int num_non_copied_params() const {
-    return (num_copied_params_ == 0) ? function().num_fixed_parameters() : 0;
-  }
 
   void AllocateVariables();
   void AllocateIrregexpVariables(intptr_t num_stack_locals);
@@ -233,6 +203,14 @@
 
   kernel::ScopeBuildingResult* EnsureKernelScopes();
 
+  LocalVariable* RawTypeArgumentsVariable() const {
+    return raw_type_arguments_var_;
+  }
+
+  LocalVariable* RawParameterVariable(intptr_t i) const {
+    return raw_parameters_[i];
+  }
+
  private:
   Thread* thread_;
   const Function& function_;
@@ -243,15 +221,17 @@
   LocalVariable* function_type_arguments_;
   LocalVariable* parent_type_arguments_;
   LocalVariable* current_context_var_;
+  LocalVariable* arg_desc_var_;
   LocalVariable* expression_temp_var_;
   LocalVariable* finally_return_temp_var_;
   ZoneGrowableArray<const LibraryPrefix*>* deferred_prefixes_;
   ZoneGrowableArray<const Field*>* guarded_fields_;
   ZoneGrowableArray<const Instance*>* default_parameter_values_;
 
+  LocalVariable* raw_type_arguments_var_;
+  ZoneGrowableArray<LocalVariable*> raw_parameters_;
+
   int first_parameter_index_;
-  int first_stack_local_index_;
-  int num_copied_params_;
   int num_stack_locals_;
   bool have_seen_await_expr_;
 
diff --git a/runtime/vm/parser_test.cc b/runtime/vm/parser_test.cc
index 057c38b..02c0854 100644
--- a/runtime/vm/parser_test.cc
+++ b/runtime/vm/parser_test.cc
@@ -261,21 +261,21 @@
   EXPECT_STREQ(
       // function f uses one ctx var at (0); doesn't save ctx.
       "main.f\n"
-      " 0 ContextLevel  level=0   begin=0   end=12\n"
+      " 0 ContextLevel  level=0   begin=0   end=56\n"
       " 1 ContextVar    level=0   begin=14  end=28  name=value\n"
       " 2 StackVar      scope=1   begin=16  end=28  name=param\n"
       " 3 CurrentCtx    scope=0   begin=0   end=0   name=:current_context_var\n"
 
       // Closure call saves current context.
       "_Closure.call\n"
-      " 0 ContextLevel  level=0   begin=0   end=8\n"
+      " 0 ContextLevel  level=0   begin=0   end=12\n"
       " 1 StackVar      scope=1   begin=-1  end=0   name=this\n"
       " 2 CurrentCtx    scope=0   begin=0   end=0   name=:current_context_var\n"
 
       // function main uses one ctx var at (1); saves caller ctx.
       "main\n"
-      " 0 ContextLevel  level=0   begin=0   end=6\n"
-      " 1 ContextLevel  level=1   begin=8   end=16\n"
+      " 0 ContextLevel  level=0   begin=0   end=10\n"
+      " 1 ContextLevel  level=1   begin=12  end=20\n"
       " 2 CurrentCtx    scope=0   begin=0   end=0   name=:current_context_var\n"
       " 3 ContextVar    level=1   begin=10  end=38  name=value\n"
       " 4 StackVar      scope=2   begin=12  end=38  name=f\n",
@@ -302,28 +302,28 @@
       // Innermost function uses captured variable 'value' from middle
       // function.
       "a.b.c\n"
-      " 0 ContextLevel  level=0   begin=0   end=10\n"
+      " 0 ContextLevel  level=0   begin=0   end=54\n"
       " 1 ContextVar    level=0   begin=20  end=30  name=value\n"
       " 2 CurrentCtx    scope=0   begin=0   end=0   name=:current_context_var\n"
 
       // Closure call saves current context.
       "_Closure.call\n"
-      " 0 ContextLevel  level=0   begin=0   end=8\n"
+      " 0 ContextLevel  level=0   begin=0   end=12\n"
       " 1 StackVar      scope=1   begin=-1  end=0   name=this\n"
       " 2 CurrentCtx    scope=0   begin=0   end=0   name=:current_context_var\n"
       // Middle function saves the entry context.  Notice that this
       // happens here and not in the outermost function.  We always
       // save the entry context at the last possible moment.
       "a.b\n"
-      " 0 ContextLevel  level=0   begin=0   end=6\n"
-      " 1 ContextLevel  level=1   begin=8   end=16\n"
+      " 0 ContextLevel  level=0   begin=0   end=50\n"
+      " 1 ContextLevel  level=1   begin=52  end=60\n"
       " 2 CurrentCtx    scope=0   begin=0   end=0   name=:current_context_var\n"
       " 3 ContextVar    level=1   begin=16  end=38  name=value\n"
       " 4 StackVar      scope=2   begin=18  end=38  name=c\n"
 
       // Closure call saves current context.
       "_Closure.call\n"
-      " 0 ContextLevel  level=0   begin=0   end=8\n"
+      " 0 ContextLevel  level=0   begin=0   end=12\n"
       " 1 StackVar      scope=1   begin=-1  end=0   name=this\n"
       " 2 CurrentCtx    scope=0   begin=0   end=0   name=:current_context_var\n"
 
@@ -331,7 +331,7 @@
       // don't save the entry context if the function has no captured
       // variables.
       "a\n"
-      " 0 ContextLevel  level=0   begin=0   end=14\n"
+      " 0 ContextLevel  level=0   begin=0   end=18\n"
       " 1 CurrentCtx    scope=0   begin=0   end=0   name=:current_context_var\n"
       " 2 StackVar      scope=2   begin=6   end=46  name=b\n",
       vars);
@@ -361,14 +361,14 @@
   EXPECT_STREQ(
       // bb captures only value2 from aa.  No others.
       "a.b.aa.bb\n"
-      " 0 ContextLevel  level=0   begin=0   end=10\n"
+      " 0 ContextLevel  level=0   begin=0   end=54\n"
       " 1 ContextVar    level=0   begin=35  end=46  name=value2\n"
       " 2 CurrentCtx    scope=0   begin=0   end=0"
       "   name=:current_context_var\n"
 
       // Closure call saves current context.
       "_Closure.call\n"
-      " 0 ContextLevel  level=0   begin=0   end=8\n"
+      " 0 ContextLevel  level=0   begin=0   end=12\n"
       " 1 StackVar      scope=1   begin=-1  end=0   name=this\n"
       " 2 CurrentCtx    scope=0   begin=0   end=0"
       "   name=:current_context_var\n"
@@ -377,22 +377,22 @@
       // of chaining from b.  This keeps us from holding onto closures
       // that we would never access.
       "a.b.aa\n"
-      " 0 ContextLevel  level=0   begin=0   end=6\n"
-      " 1 ContextLevel  level=1   begin=8   end=16\n"
+      " 0 ContextLevel  level=0   begin=0   end=50\n"
+      " 1 ContextLevel  level=1   begin=52  end=60\n"
       " 2 CurrentCtx    scope=0   begin=0   end=0   name=:current_context_var\n"
       " 3 ContextVar    level=1   begin=30  end=55  name=value2\n"
       " 4 StackVar      scope=2   begin=32  end=55  name=bb\n"
 
       // Closure call saves current context.
       "_Closure.call\n"
-      " 0 ContextLevel  level=0   begin=0   end=8\n"
+      " 0 ContextLevel  level=0   begin=0   end=12\n"
       " 1 StackVar      scope=1   begin=-1  end=0   name=this\n"
       " 2 CurrentCtx    scope=0   begin=0   end=0"
       "   name=:current_context_var\n"
 
       // b captures value1 from a.
       "a.b\n"
-      " 0 ContextLevel  level=0   begin=0   end=16\n"
+      " 0 ContextLevel  level=0   begin=0   end=60\n"
       " 1 ContextVar    level=0   begin=14  end=65  name=value1\n"
       " 2 CurrentCtx    scope=0   begin=0   end=0"
       "   name=:current_context_var\n"
@@ -400,15 +400,15 @@
 
       // Closure call saves current context.
       "_Closure.call\n"
-      " 0 ContextLevel  level=0   begin=0   end=8\n"
+      " 0 ContextLevel  level=0   begin=0   end=12\n"
       " 1 StackVar      scope=1   begin=-1  end=0   name=this\n"
       " 2 CurrentCtx    scope=0   begin=0   end=0"
       "   name=:current_context_var\n"
 
       // a shares value1, saves entry ctx.
       "a\n"
-      " 0 ContextLevel  level=0   begin=0   end=6\n"
-      " 1 ContextLevel  level=1   begin=8   end=16\n"
+      " 0 ContextLevel  level=0   begin=0   end=10\n"
+      " 1 ContextLevel  level=1   begin=12  end=20\n"
       " 2 CurrentCtx    scope=0   begin=0   end=0"
       "   name=:current_context_var\n"
       " 3 ContextVar    level=1   begin=10  end=73  name=value1\n"
@@ -450,24 +450,24 @@
       // This frame saves the entry context instead of chaining.  Good.
       "doIt.<anonymous closure>\n"
       " 0 ContextLevel  level=0   begin=0   end=0\n"
-      " 1 ContextLevel  level=1   begin=4   end=12\n"
+      " 1 ContextLevel  level=1   begin=48  end=56\n"
       " 2 ContextVar    level=1   begin=44  end=67  name=y\n"
       " 3 CurrentCtx    scope=0   begin=0   end=0   name=:current_context_var\n"
 
       // Closure call saves current context.
       "_Closure.call\n"
-      " 0 ContextLevel  level=0   begin=0   end=8\n"
+      " 0 ContextLevel  level=0   begin=0   end=12\n"
       " 1 StackVar      scope=1   begin=-1  end=0   name=this\n"
       " 2 CurrentCtx    scope=0   begin=0   end=0   name=:current_context_var\n"
 
       "X.onX\n"
-      " 0 ContextLevel  level=0   begin=0   end=10\n"
+      " 0 ContextLevel  level=0   begin=0   end=14\n"
       " 1 StackVar      scope=1   begin=-1  end=0   name=this\n"
       " 2 CurrentCtx    scope=0   begin=0   end=0   name=:current_context_var\n"
 
       // No context is saved here since no vars are captured.
       "doIt\n"
-      " 0 ContextLevel  level=0   begin=0   end=18\n"
+      " 0 ContextLevel  level=0   begin=0   end=22\n"
       " 1 CurrentCtx    scope=0   begin=0   end=0   name=:current_context_var\n"
       " 2 StackVar      scope=2   begin=36  end=83  name=x\n",
       vars);
@@ -496,22 +496,22 @@
   EXPECT_STREQ(
       // inner function captures variable value.  That's fine.
       "outer.inner\n"
-      " 0 ContextLevel  level=0   begin=0   end=10\n"
+      " 0 ContextLevel  level=0   begin=0   end=54\n"
       " 1 ContextVar    level=0   begin=34  end=44  name=value\n"
       " 2 CurrentCtx    scope=0   begin=0   end=0   name=:current_context_var\n"
 
       // Closure call saves current context.
       "_Closure.call\n"
-      " 0 ContextLevel  level=0   begin=0   end=8\n"
+      " 0 ContextLevel  level=0   begin=0   end=12\n"
       " 1 StackVar      scope=1   begin=-1  end=0   name=this\n"
       " 2 CurrentCtx    scope=0   begin=0   end=0   name=:current_context_var\n"
 
       // The outer function saves the entry context, even though the
       // captured variable is in a loop.  Good.
       "outer\n"
-      " 0 ContextLevel  level=0   begin=0   end=8\n"
-      " 1 ContextLevel  level=1   begin=10  end=18\n"
-      " 2 ContextLevel  level=0   begin=20  end=34\n"
+      " 0 ContextLevel  level=0   begin=0   end=12\n"
+      " 1 ContextLevel  level=1   begin=14  end=22\n"
+      " 2 ContextLevel  level=0   begin=24  end=38\n"
       " 3 CurrentCtx    scope=0   begin=0   end=0   name=:current_context_var\n"
       " 4 StackVar      scope=3   begin=12  end=53  name=i\n"
       " 5 ContextVar    level=1   begin=29  end=53  name=value\n"
@@ -542,20 +542,20 @@
   char* vars = CaptureVarsAtLine(lib, "a", 10);
   EXPECT_STREQ(
       "a.b.c\n"
-      " 0 ContextLevel  level=0   begin=0   end=12\n"
+      " 0 ContextLevel  level=0   begin=0   end=56\n"
       " 1 ContextVar    level=0   begin=52  end=65  name=x\n"
       " 2 CurrentCtx    scope=0   begin=0   end=0   name=:current_context_var\n"
 
       "_Closure.call\n"
-      " 0 ContextLevel  level=0   begin=0   end=8\n"
+      " 0 ContextLevel  level=0   begin=0   end=12\n"
       " 1 StackVar      scope=1   begin=-1  end=0   name=this\n"
       " 2 CurrentCtx    scope=0   begin=0   end=0   name=:current_context_var\n"
 
       // Doesn't save the entry context.  Chains to parent instead.
       "a.b\n"
-      " 0 ContextLevel  level=0   begin=0   end=6\n"
-      " 1 ContextLevel  level=1   begin=8   end=32\n"
-      " 2 ContextLevel  level=0   begin=34  end=40\n"
+      " 0 ContextLevel  level=0   begin=0   end=50\n"
+      " 1 ContextLevel  level=1   begin=52  end=76\n"
+      " 2 ContextLevel  level=0   begin=78  end=84\n"
       " 3 ContextVar    level=0   begin=12  end=74  name=x\n"
       " 4 CurrentCtx    scope=0   begin=0   end=0   name=:current_context_var\n"
       " 5 StackVar      scope=2   begin=49  end=74  name=c\n"
@@ -563,13 +563,13 @@
       " 7 StackVar      scope=4   begin=34  end=49  name=d\n"
 
       "_Closure.call\n"
-      " 0 ContextLevel  level=0   begin=0   end=8\n"
+      " 0 ContextLevel  level=0   begin=0   end=12\n"
       " 1 StackVar      scope=1   begin=-1  end=0   name=this\n"
       " 2 CurrentCtx    scope=0   begin=0   end=0   name=:current_context_var\n"
 
       "a\n"
-      " 0 ContextLevel  level=0   begin=0   end=6\n"
-      " 1 ContextLevel  level=1   begin=8   end=16\n"
+      " 0 ContextLevel  level=0   begin=0   end=10\n"
+      " 1 ContextLevel  level=1   begin=12  end=20\n"
       " 2 CurrentCtx    scope=0   begin=0   end=0   name=:current_context_var\n"
       " 3 ContextVar    level=1   begin=9   end=82  name=x\n"
       " 4 StackVar      scope=2   begin=11  end=82  name=b\n",
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index e0e03b0..e78d53a 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -528,11 +528,13 @@
 intptr_t RawObjectPool::VisitObjectPoolPointers(RawObjectPool* raw_obj,
                                                 ObjectPointerVisitor* visitor) {
   const intptr_t length = raw_obj->ptr()->length_;
+  RawObjectPool::Entry* entries = raw_obj->ptr()->data();
+  uint8_t* entry_types = raw_obj->ptr()->entry_types();
   for (intptr_t i = 0; i < length; ++i) {
     ObjectPool::EntryType entry_type =
-        static_cast<ObjectPool::EntryType>(raw_obj->ptr()->entry_types()[i]);
+        static_cast<ObjectPool::EntryType>(entry_types[i]);
     if (entry_type == ObjectPool::kTaggedObject) {
-      visitor->VisitPointer(&raw_obj->ptr()->data()[i].raw_obj_);
+      visitor->VisitPointer(&entries[i].raw_obj_);
     }
   }
   return ObjectPool::InstanceSize(length);
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 9278da2..e2bcab8 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -671,7 +671,7 @@
   friend class Serializer;        // GetClassId
   friend class Array;
   friend class Become;  // GetClassId
-  friend class GCCompactor;  // GetClassId
+  friend class CompactorTask;  // GetClassId
   friend class Bigint;
   friend class ByteBuffer;
   friend class CidRewriteVisitor;
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 3a2a1d2..b1c853e 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -1603,6 +1603,7 @@
   // name of the closurized function so that exception contains more
   // relevant information.
   const Function& function = Function::Handle(receiver.function());
+  ASSERT(!function.IsNull());
   const String& original_function_name =
       String::Handle(function.QualifiedUserVisibleName());
   const Object& result = Object::Handle(DartEntry::InvokeNoSuchMethod(
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc
index b61c763..1a16fd4 100644
--- a/runtime/vm/scavenger.cc
+++ b/runtime/vm/scavenger.cc
@@ -802,7 +802,8 @@
 
 void Scavenger::VisitObjectPointers(ObjectPointerVisitor* visitor) const {
   ASSERT(Thread::Current()->IsAtSafepoint() ||
-         (Thread::Current()->task_kind() == Thread::kMarkerTask));
+         (Thread::Current()->task_kind() == Thread::kMarkerTask) ||
+         (Thread::Current()->task_kind() == Thread::kCompactorTask));
   FlushTLS();
   uword cur = FirstObjectStart();
   while (cur < top_) {
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index d0f72d6..4dbb6b6 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -222,17 +222,7 @@
       if (variable->is_captured()) {
         AllocateContextVariable(variable, &context_owner);
         *found_captured_variables = true;
-        if (variable->name().raw() ==
-            Symbols::FunctionTypeArgumentsVar().raw()) {
-          ASSERT(pos == num_parameters);
-          // A captured type args variable has a slot allocated in the frame and
-          // one in the context, where it gets copied to.
-          frame_index--;
-        }
       } else {
-        ASSERT((variable->name().raw() !=
-                Symbols::FunctionTypeArgumentsVar().raw()) ||
-               (pos == num_parameters));
         variable->set_index(frame_index--);
       }
     }
@@ -447,6 +437,7 @@
 
 void LocalScope::CaptureVariable(LocalVariable* variable) {
   ASSERT(variable != NULL);
+
   // The variable must exist in an enclosing scope, not necessarily in this one.
   variable->set_is_captured();
   const int variable_function_level = variable->owner()->function_level();
@@ -651,7 +642,8 @@
       if (variable->is_forced_stack() ||
           (variable->name().raw() == Symbols::StackTraceVar().raw()) ||
           (variable->name().raw() == Symbols::ExceptionVar().raw()) ||
-          (variable->name().raw() == Symbols::SavedTryContextVar().raw())) {
+          (variable->name().raw() == Symbols::SavedTryContextVar().raw()) ||
+          (variable->name().raw() == Symbols::ArgDescVar().raw())) {
         // Don't capture those variables because the VM expects them to be on
         // the stack.
         continue;
@@ -700,8 +692,8 @@
 int LocalVariable::BitIndexIn(intptr_t fixed_parameter_count) const {
   ASSERT(!is_captured());
   // Parameters have positive indexes with the lowest index being
-  // kParamEndSlotFromFp + 1.  Locals and copied parameters have negative
-  // indexes with the lowest (closest to 0) index being kFirstLocalSlotFromFp.
+  // kParamEndSlotFromFp + 1.  Locals have negative indexes with the lowest
+  // (closest to 0) index being kFirstLocalSlotFromFp.
   if (index() > 0) {
     // Shift non-negative indexes so that the lowest one is 0.
     return fixed_parameter_count - (index() - kParamEndSlotFromFp);
diff --git a/runtime/vm/scopes.h b/runtime/vm/scopes.h
index 096b1d2..7ed478e 100644
--- a/runtime/vm/scopes.h
+++ b/runtime/vm/scopes.h
@@ -104,7 +104,7 @@
   // allocated to the frame.
   // var_count is the total number of stack-allocated variables including
   // all parameters.
-  int BitIndexIn(intptr_t var_count) const;
+  int BitIndexIn(intptr_t fixed_parameter_count) const;
 
  private:
   static const int kUninitializedIndex = INT_MIN;
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
index fc2e385e..d7ddb93 100644
--- a/runtime/vm/simulator_dbc.cc
+++ b/runtime/vm/simulator_dbc.cc
@@ -500,7 +500,8 @@
 
 DART_FORCE_INLINE static RawFunction* FrameFunction(RawObject** FP) {
   RawFunction* function = static_cast<RawFunction*>(FP[kFunctionSlotFromFp]);
-  ASSERT(SimulatorHelpers::GetClassId(function) == kFunctionCid);
+  ASSERT(SimulatorHelpers::GetClassId(function) == kFunctionCid ||
+         SimulatorHelpers::GetClassId(function) == kNullCid);
   return function;
 }
 
@@ -932,6 +933,24 @@
   Invoke(thread, call_base, top, pc, FP, SP);
 }
 
+DART_FORCE_INLINE void Simulator::PrepareForTailCall(
+    RawCode* code,
+    RawImmutableArray* args_desc,
+    RawObject** FP,
+    RawObject*** SP,
+    uint32_t** pc) {
+  // Drop all stack locals.
+  *SP = FP - 1;
+
+  // Replace the callee with the new [code].
+  FP[kFunctionSlotFromFp] = Object::null();
+  FP[kPcMarkerSlotFromFp] = code;
+  *pc = reinterpret_cast<uint32_t*>(code->ptr()->entry_point_);
+  pc_ = reinterpret_cast<uword>(pc);  // For the profiler.
+  pp_ = code->ptr()->object_pool_;
+  argdesc_ = args_desc;
+}
+
 // Note: functions below are marked DART_NOINLINE to recover performance on
 // ARM where inlining these functions into the interpreter loop seemed to cause
 // some code quality issues.
@@ -1045,6 +1064,15 @@
   rB = ((op >> Bytecode::kBShift) & Bytecode::kBMask);                         \
   rC = ((op >> Bytecode::kCShift) & Bytecode::kCMask);
 
+#define DECLARE_A_B_Y                                                          \
+  uint16_t rB;                                                                 \
+  int8_t rY;                                                                   \
+  USE(rB);                                                                     \
+  USE(rY)
+#define DECODE_A_B_Y                                                           \
+  rB = ((op >> Bytecode::kBShift) & Bytecode::kBMask);                         \
+  rY = ((op >> Bytecode::kYShift) & Bytecode::kYMask);
+
 #define DECLARE_0
 #define DECODE_0
 
@@ -1308,7 +1336,6 @@
   RawBool* true_value = Bool::True().raw();
   RawBool* false_value = Bool::False().raw();
   RawObject* null_value = Object::null();
-  RawObject* empty_context = Object::empty_context().raw();
 
 #if defined(DEBUG)
   Function& function_h = Function::Handle();
@@ -1319,48 +1346,22 @@
 
   // Bytecode handlers (see constants_dbc.h for bytecode descriptions).
   {
-    BYTECODE(Entry, A_B_C);
-    const uint8_t num_fixed_params = rA;
-    const uint16_t num_locals = rB;
-    const uint16_t context_reg = rC;
+    BYTECODE(Entry, A_D);
+    const uint16_t num_locals = rD;
 
-    // Decode arguments descriptor.
-    const intptr_t pos_count = SimulatorHelpers::ArgDescPosCount(argdesc_);
-
-    // Check that we got the right number of positional parameters.
-    if (pos_count != num_fixed_params) {
-      // Mismatch can only occur if current function is a closure.
-      goto ClosureNoSuchMethod;
+    // Initialize locals with null & set SP.
+    for (intptr_t i = 0; i < num_locals; i++) {
+      FP[i] = null_value;
     }
-
-    // Initialize locals with null and set current context variable to
-    // empty context.
-    {
-      RawObject** L = FP;
-      for (intptr_t i = 0; i < num_locals; i++) {
-        L[i] = null_value;
-      }
-      L[context_reg] = empty_context;
-      SP = FP + num_locals - 1;
-    }
+    SP = FP + num_locals - 1;
 
     DISPATCH();
   }
 
   {
     BYTECODE(EntryOptimized, A_D);
-    const uint8_t num_fixed_params = rA;
     const uint16_t num_registers = rD;
 
-    // Decode arguments descriptor.
-    const intptr_t pos_count = SimulatorHelpers::ArgDescPosCount(argdesc_);
-
-    // Check that we got the right number of positional parameters.
-    if (pos_count != num_fixed_params) {
-      // Mismatch can only occur if current function is a closure.
-      goto ClosureNoSuchMethod;
-    }
-
     // Reserve space for registers used by the optimized code.
     SP = FP + num_registers - 1;
 
@@ -1368,122 +1369,6 @@
   }
 
   {
-    BYTECODE(EntryOptional, A_B_C);
-    const uint16_t num_fixed_params = rA;
-    const uint16_t num_opt_pos_params = rB;
-    const uint16_t num_opt_named_params = rC;
-    const intptr_t min_num_pos_args = num_fixed_params;
-    const intptr_t max_num_pos_args = num_fixed_params + num_opt_pos_params;
-
-    // Decode arguments descriptor.
-    const intptr_t arg_count = SimulatorHelpers::ArgDescArgCount(argdesc_);
-    const intptr_t pos_count = SimulatorHelpers::ArgDescPosCount(argdesc_);
-    const intptr_t named_count = (arg_count - pos_count);
-
-    // Check that got the right number of positional parameters.
-    if ((min_num_pos_args > pos_count) || (pos_count > max_num_pos_args)) {
-      goto ClosureNoSuchMethod;
-    }
-
-    // Copy all passed position arguments.
-    RawObject** first_arg = FrameArguments(FP, arg_count);
-    memmove(FP, first_arg, pos_count * kWordSize);
-
-    if (num_opt_named_params != 0) {
-      // This is a function with named parameters.
-      // Walk the list of named parameters and their
-      // default values encoded as pairs of LoadConstant instructions that
-      // follows the entry point and find matching values via arguments
-      // descriptor.
-      RawObject** argdesc_data = argdesc_->ptr()->data();
-
-      intptr_t i = named_count - 1;           // argument position
-      intptr_t j = num_opt_named_params - 1;  // parameter position
-      while ((j >= 0) && (i >= 0)) {
-        // Fetch formal parameter information: name, default value, target slot.
-        const uint32_t load_name = pc[2 * j];
-        const uint32_t load_value = pc[2 * j + 1];
-        ASSERT(Bytecode::DecodeOpcode(load_name) == Bytecode::kLoadConstant);
-        ASSERT(Bytecode::DecodeOpcode(load_value) == Bytecode::kLoadConstant);
-        const uint8_t reg = Bytecode::DecodeA(load_name);
-        ASSERT(reg == Bytecode::DecodeA(load_value));
-
-        RawString* name = static_cast<RawString*>(
-            LOAD_CONSTANT(Bytecode::DecodeD(load_name)));
-        if (name == argdesc_data[ArgumentsDescriptor::name_index(i)]) {
-          // Parameter was passed. Fetch passed value.
-          const intptr_t arg_index = Smi::Value(static_cast<RawSmi*>(
-              argdesc_data[ArgumentsDescriptor::position_index(i)]));
-          FP[reg] = first_arg[arg_index];
-          i--;  // Consume passed argument.
-        } else {
-          // Parameter was not passed. Fetch default value.
-          FP[reg] = LOAD_CONSTANT(Bytecode::DecodeD(load_value));
-        }
-        j--;  // Next formal parameter.
-      }
-
-      // If we have unprocessed formal parameters then initialize them all
-      // using default values.
-      while (j >= 0) {
-        const uint32_t load_name = pc[2 * j];
-        const uint32_t load_value = pc[2 * j + 1];
-        ASSERT(Bytecode::DecodeOpcode(load_name) == Bytecode::kLoadConstant);
-        ASSERT(Bytecode::DecodeOpcode(load_value) == Bytecode::kLoadConstant);
-        const uint8_t reg = Bytecode::DecodeA(load_name);
-        ASSERT(reg == Bytecode::DecodeA(load_value));
-
-        FP[reg] = LOAD_CONSTANT(Bytecode::DecodeD(load_value));
-        j--;
-      }
-
-      // If we have unprocessed passed arguments that means we have mismatch
-      // between formal parameters and concrete arguments. This can only
-      // occur if the current function is a closure.
-      if (i != -1) {
-        goto ClosureNoSuchMethod;
-      }
-
-      // Skip LoadConstant-s encoding information about named parameters.
-      pc += num_opt_named_params * 2;
-
-      // SP points past copied arguments.
-      SP = FP + num_fixed_params + num_opt_named_params - 1;
-    } else {
-      ASSERT(num_opt_pos_params != 0);
-      if (named_count != 0) {
-        // Function can't have both named and optional positional parameters.
-        // This kind of mismatch can only occur if the current function
-        // is a closure.
-        goto ClosureNoSuchMethod;
-      }
-
-      // Process the list of default values encoded as a sequence of
-      // LoadConstant instructions after EntryOpt bytecode.
-      // Execute only those that correspond to parameters that were not passed.
-      for (intptr_t i = pos_count - num_fixed_params; i < num_opt_pos_params;
-           i++) {
-        const uint32_t load_value = pc[i];
-        ASSERT(Bytecode::DecodeOpcode(load_value) == Bytecode::kLoadConstant);
-#if defined(DEBUG)
-        const uint8_t reg = Bytecode::DecodeA(load_value);
-        ASSERT((num_fixed_params + i) == reg);
-#endif
-        FP[num_fixed_params + i] = LOAD_CONSTANT(Bytecode::DecodeD(load_value));
-      }
-
-      // Skip LoadConstant-s encoding default values for optional positional
-      // parameters.
-      pc += num_opt_pos_params;
-
-      // SP points past the last copied parameter.
-      SP = FP + max_num_pos_args - 1;
-    }
-
-    DISPATCH();
-  }
-
-  {
     BYTECODE(Frame, A_D);
     // Initialize locals with null and increment SP.
     const uint16_t num_locals = rD;
@@ -2083,6 +1968,30 @@
     DISPATCH();
   }
   {
+    BYTECODE(SmiAddTOS, 0);
+    RawSmi* left = Smi::RawCast(SP[-1]);
+    RawSmi* right = Smi::RawCast(SP[-0]);
+    SP--;
+    SP[0] = Smi::New(Smi::Value(left) + Smi::Value(right));
+    DISPATCH();
+  }
+  {
+    BYTECODE(SmiSubTOS, 0);
+    RawSmi* left = Smi::RawCast(SP[-1]);
+    RawSmi* right = Smi::RawCast(SP[-0]);
+    SP--;
+    SP[0] = Smi::New(Smi::Value(left) - Smi::Value(right));
+    DISPATCH();
+  }
+  {
+    BYTECODE(SmiMulTOS, 0);
+    RawSmi* left = Smi::RawCast(SP[-1]);
+    RawSmi* right = Smi::RawCast(SP[-0]);
+    SP--;
+    SP[0] = Smi::New(Smi::Value(left) * Smi::Value(right));
+    DISPATCH();
+  }
+  {
     BYTECODE(Add, A_B_C);
     SMI_OP_CHECK(intptr_t, SignedAddWithOverflow);
     DISPATCH();
@@ -3449,6 +3358,50 @@
   }
 
   {
+    BYTECODE(IfSmiLtTOS, 0);
+    RawSmi* left = Smi::RawCast(SP[-1]);
+    RawSmi* right = Smi::RawCast(SP[-0]);
+    if (!(Smi::Value(left) < Smi::Value(right))) {
+      pc++;
+    }
+    SP -= 2;
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(IfSmiLeTOS, 0);
+    RawSmi* left = Smi::RawCast(SP[-1]);
+    RawSmi* right = Smi::RawCast(SP[-0]);
+    if (!(Smi::Value(left) <= Smi::Value(right))) {
+      pc++;
+    }
+    SP -= 2;
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(IfSmiGeTOS, 0);
+    RawSmi* left = Smi::RawCast(SP[-1]);
+    RawSmi* right = Smi::RawCast(SP[-0]);
+    if (!(Smi::Value(left) >= Smi::Value(right))) {
+      pc++;
+    }
+    SP -= 2;
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(IfSmiGtTOS, 0);
+    RawSmi* left = Smi::RawCast(SP[-1]);
+    RawSmi* right = Smi::RawCast(SP[-0]);
+    if (!(Smi::Value(left) > Smi::Value(right))) {
+      pc++;
+    }
+    SP -= 2;
+    DISPATCH();
+  }
+
+  {
     BYTECODE(IfEqStrict, A_D);
     RawObject* lhs = FP[rA];
     RawObject* rhs = FP[rD];
@@ -3748,6 +3701,89 @@
   }
 
   {
+    BYTECODE(TailCall, 0);
+    RawCode* code = RAW_CAST(Code, SP[-0]);
+    RawImmutableArray* args_desc = RAW_CAST(ImmutableArray, SP[-1]);
+    PrepareForTailCall(code, args_desc, FP, &SP, &pc);
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(TailCallOpt, A_D);
+    RawImmutableArray* args_desc = RAW_CAST(ImmutableArray, FP[rA]);
+    RawCode* code = RAW_CAST(Code, FP[rD]);
+    PrepareForTailCall(code, args_desc, FP, &SP, &pc);
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(LoadArgDescriptor, 0);
+    SP++;
+    SP[0] = argdesc_;
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(LoadArgDescriptorOpt, A);
+    FP[rA] = argdesc_;
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(NoSuchMethod, 0);
+    goto ClosureNoSuchMethod;
+  }
+
+  {
+    BYTECODE(LoadFpRelativeSlot, A_X);
+    RawSmi* index = RAW_CAST(Smi, SP[-0]);
+    const int16_t offset = rD;
+    SP[-0] = FP[-(Smi::Value(index) + offset)];
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(LoadFpRelativeSlotOpt, A_B_Y);
+    RawSmi* index = RAW_CAST(Smi, FP[rB]);
+    const int8_t offset = rY;
+    FP[rA] = FP[-(Smi::Value(index) + offset)];
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(StoreFpRelativeSlot, A_X);
+    RawSmi* index = RAW_CAST(Smi, SP[-1]);
+    const int16_t offset = rD;
+    FP[-(Smi::Value(index) + offset) - 0] = SP[-0];
+    SP--;
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(StoreFpRelativeSlotOpt, A_B_Y);
+    RawSmi* index = RAW_CAST(Smi, FP[rB]);
+    const int8_t offset = rY;
+    FP[-(Smi::Value(index) + offset) - 0] = FP[rA];
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(LoadIndexedTOS, 0);
+    // Currently this instruction is only emitted if it's safe to do.
+    ASSERT(!SP[0]->IsHeapObject());
+    ASSERT(SP[-1]->IsArray() || SP[-1]->IsImmutableArray());
+
+    const intptr_t index_scale = rA;
+    RawSmi* index = RAW_CAST(Smi, SP[-0]);
+    RawArray* array = Array::RawCast(SP[-1]);
+
+    ASSERT(SimulatorHelpers::CheckIndex(index, array->ptr()->length_));
+    SP[-1] = array->ptr()->data()[Smi::Value(index) << index_scale];
+    SP--;
+    DISPATCH();
+  }
+
+  {
     BYTECODE(LoadIndexed, A_B_C);
     RawObject* obj = FP[rB];
     ASSERT(obj->IsArray() || obj->IsImmutableArray());
@@ -3862,7 +3898,7 @@
   ClosureNoSuchMethod:
 #if defined(DEBUG)
     function_h ^= FrameFunction(FP);
-    ASSERT(function_h.IsClosureFunction());
+    ASSERT(function_h.IsNull() || function_h.IsClosureFunction());
 #endif
 
     // Restore caller context as we are going to throw NoSuchMethod.
diff --git a/runtime/vm/simulator_dbc.h b/runtime/vm/simulator_dbc.h
index 06b54f5..c0d0e79 100644
--- a/runtime/vm/simulator_dbc.h
+++ b/runtime/vm/simulator_dbc.h
@@ -21,6 +21,7 @@
 class Code;
 class Array;
 class RawICData;
+class RawImmutableArray;
 class RawArray;
 class RawObjectPool;
 class RawFunction;
@@ -164,6 +165,12 @@
                      RawObject*** SP,
                      bool optimized);
 
+  void PrepareForTailCall(RawCode* code,
+                          RawImmutableArray* args_desc,
+                          RawObject** FP,
+                          RawObject*** SP,
+                          uint32_t** pc);
+
 #if !defined(PRODUCT)
   // Returns true if tracing of executed instructions is enabled.
   bool IsTracingExecution() const;
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index 744e9e2..0ef2edc 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -75,6 +75,7 @@
 #define VM_STUB_CODE_LIST(V)                                                   \
   V(LazyCompile)                                                               \
   V(OptimizeFunction)                                                          \
+  V(CallClosureNoSuchMethod)                                                   \
   V(RunExceptionHandler)                                                       \
   V(DeoptForRewind)                                                            \
   V(FixCallersTarget)                                                          \
diff --git a/runtime/vm/stub_code_dbc.cc b/runtime/vm/stub_code_dbc.cc
index a187deb..4b7157c 100644
--- a/runtime/vm/stub_code_dbc.cc
+++ b/runtime/vm/stub_code_dbc.cc
@@ -33,6 +33,10 @@
   __ Compile();
 }
 
+void StubCode::GenerateCallClosureNoSuchMethodStub(Assembler* assembler) {
+  __ NoSuchMethod();
+}
+
 // Not executed, but used as a stack marker when calling
 // DRT_OptimizeInvokedFunction.
 void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) {
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index d49aa75..5c7f208 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -92,6 +92,7 @@
   V(InterpolateSingle, "_interpolateSingle")                                   \
   V(Iterator, "iterator")                                                      \
   V(NoSuchMethod, "noSuchMethod")                                              \
+  V(ArgDescVar, ":arg_desc")                                                   \
   V(CurrentContextVar, ":current_context_var")                                 \
   V(SavedTryContextVar, ":saved_try_context_var")                              \
   V(ExceptionParameter, ":exception")                                          \
@@ -359,6 +360,7 @@
   V(Index, "index")                                                            \
   V(DartScheme, "dart:")                                                       \
   V(DartSchemePrivate, "dart:_")                                               \
+  V(DartInternalPackage, "package:dart_internal/")                             \
   V(DartNativeWrappers, "dart:nativewrappers")                                 \
   V(DartNativeWrappersLibName, "nativewrappers")                               \
   V(DartCore, "dart:core")                                                     \
@@ -396,6 +398,7 @@
   V(OptimizedOut, "<optimized out>")                                           \
   V(NotInitialized, "<not initialized>")                                       \
   V(NotNamed, "<not named>")                                                   \
+  V(OriginalParam, ":original:")                                               \
   V(TempParam, ":temp_param")                                                  \
   V(_UserTag, "_UserTag")                                                      \
   V(Default, "Default")                                                        \
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 720a9a8..3a8fd38 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -166,9 +166,10 @@
     kUnknownTask = 0x0,
     kMutatorTask = 0x1,
     kCompilerTask = 0x2,
-    kSweeperTask = 0x4,
-    kMarkerTask = 0x8,
-    kLowMemoryTask = 0x10,
+    kMarkerTask = 0x4,
+    kSweeperTask = 0x8,
+    kCompactorTask = 0x10,
+    kLowMemoryTask = 0x20,
   };
   // Converts a TaskKind to its corresponding C-String name.
   static const char* TaskKindToCString(TaskKind kind);
diff --git a/sdk/bin/dartdevk.bat b/sdk/bin/dartdevk.bat
index 980c636..154162a 100644
--- a/sdk/bin/dartdevk.bat
+++ b/sdk/bin/dartdevk.bat
@@ -32,9 +32,9 @@
 rem Remove trailing backslash if there is one
 if %DART_ROOT:~-1%==\ set DART_ROOT=%DART_ROOT:~0,-1%
 
-set DEV_COMPILER=%DART_ROOT%\third_party\pkg\dev_compiler\bin\dartdevk.dart
+set DEV_COMPILER=%DART_ROOT%\pkg\dev_compiler\bin\dartdevk.dart
 
-"%DART%" "--packages=%SDK_DIR%\.packages" %EXTRA_VM_OPTIONS% "%DEV_COMPILER%" %*
+"%DART%" "--packages=%DART_ROOT%\.packages" %EXTRA_VM_OPTIONS% "%DEV_COMPILER%" %*
 
 endlocal
 
diff --git a/sdk/lib/_internal/js_runtime/lib/internal_patch.dart b/sdk/lib/_internal/js_runtime/lib/internal_patch.dart
index 05a9d39..420901d4 100644
--- a/sdk/lib/_internal/js_runtime/lib/internal_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/internal_patch.dart
@@ -48,6 +48,9 @@
 
 @patch
 Object extractTypeArguments<T>(T instance, Function extract) {
-  // TODO(31371): Implement this.
-  throw new UnimplementedError();
+  // TODO(31371): Implement this correctly for Dart 2.0.
+  // In Dart 1.0, instantiating the generic with dynamic (which this does),
+  // gives you an object that can be used anywhere a more specific type is
+  // expected, so this works for now.
+  return extract();
 }
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index ed44d90..a0d0bc8 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -3862,3 +3862,7 @@
 // Hook to register new global object if necessary.
 // This is currently a no-op in dart2js.
 void registerGlobalObject(object) {}
+
+// Hook to register new browser classes.
+// This is currently a no-op in dart2js.
+void applyExtension(name, nativeObject) {}
diff --git a/sdk/lib/core/bigint.dart b/sdk/lib/core/bigint.dart
new file mode 100644
index 0000000..92fe61b
--- /dev/null
+++ b/sdk/lib/core/bigint.dart
@@ -0,0 +1,2490 @@
+// 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.
+
+part of dart.core;
+
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+/*
+ * Copyright (c) 2003-2005  Tom Wu
+ * Copyright (c) 2012 Adam Singer (adam@solvr.io)
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF
+ * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * In addition, the following condition applies:
+ *
+ * All redistributions must retain an intact copy of this copyright notice
+ * and disclaimer.
+ */
+
+/**
+ * An arbitrarily large integer.
+ */
+abstract class BigInt implements Comparable<BigInt> {
+  static final BigInt zero = _BigIntImpl.zero;
+  static final BigInt one = _BigIntImpl.one;
+  static final BigInt two = _BigIntImpl.two;
+
+  /**
+   * Parses [source] as a, possibly signed, integer literal and returns its
+   * value.
+   *
+   * The [source] must be a non-empty sequence of base-[radix] digits,
+   * optionally prefixed with a minus or plus sign ('-' or '+').
+   *
+   * The [radix] must be in the range 2..36. The digits used are
+   * first the decimal digits 0..9, and then the letters 'a'..'z' with
+   * values 10 through 35. Also accepts upper-case letters with the same
+   * values as the lower-case ones.
+   *
+   * If no [radix] is given then it defaults to 10. In this case, the [source]
+   * digits may also start with `0x`, in which case the number is interpreted
+   * as a hexadecimal literal, which effectively means that the `0x` is ignored
+   * and the radix is instead set to 16.
+   *
+   * For any int `n` and radix `r`, it is guaranteed that
+   * `n == int.parse(n.toRadixString(r), radix: r)`.
+   *
+   * Throws a [FormatException] if the [source] is not a valid integer literal,
+   * optionally prefixed by a sign.
+   */
+  static BigInt parse(String source, {int radix}) =>
+      _BigIntImpl.parse(source, radix: radix);
+
+  /// Allocates a big integer from the provided [value] number.
+  factory BigInt.from(num value) = _BigIntImpl.from;
+
+  /**
+   * Returns the absolute value of this integer.
+   *
+   * For any integer `x`, the result is the same as `x < 0 ? -x : x`.
+   */
+  BigInt abs();
+
+  /**
+   * Return the negative value of this integer.
+   *
+   * The result of negating an integer always has the opposite sign, except
+   * for zero, which is its own negation.
+   */
+  BigInt operator -();
+
+  /// Addition operator.
+  BigInt operator +(BigInt other);
+
+  /// Subtraction operator.
+  BigInt operator -(BigInt other);
+
+  /// Multiplication operator.
+  BigInt operator *(BigInt other);
+
+  /// Division operator.
+  double operator /(BigInt other);
+
+  /**
+   * Truncating division operator.
+   *
+   * Performs a truncating integer division, where the remainder is discarded.
+   *
+   * The remainder can be computed using the [remainder] method.
+   *
+   * Examples:
+   * ```
+   * var seven = new BigInt.from(7);
+   * var three = new BigInt.from(3);
+   * seven ~/ three;    // => 2
+   * (-seven) ~/ three; // => -2
+   * seven ~/ -three;   // => -2
+   * seven.remainder(three);    // => 1
+   * (-seven).remainder(three); // => -1
+   * seven.remainder(-three);   // => 1
+   * ```
+   */
+  BigInt operator ~/(BigInt other);
+
+  /**
+   * Euclidean modulo operator.
+   *
+   * Returns the remainder of the Euclidean division. The Euclidean division of
+   * two integers `a` and `b` yields two integers `q` and `r` such that
+   * `a == b * q + r` and `0 <= r < b.abs()`.
+   *
+   * The sign of the returned value `r` is always positive.
+   *
+   * See [remainder] for the remainder of the truncating division.
+   */
+  BigInt operator %(BigInt other);
+
+  /**
+   * Returns the remainder of the truncating division of `this` by [other].
+   *
+   * The result `r` of this operation satisfies:
+   * `this == (this ~/ other) * other + r`.
+   * As a consequence the remainder `r` has the same sign as the divider `this`.
+   */
+  BigInt remainder(BigInt other);
+
+  /**
+   * Shift the bits of this integer to the left by [shiftAmount].
+   *
+   * Shifting to the left makes the number larger, effectively multiplying
+   * the number by `pow(2, shiftIndex)`.
+   *
+   * There is no limit on the size of the result. It may be relevant to
+   * limit intermediate values by using the "and" operator with a suitable
+   * mask.
+   *
+   * It is an error if [shiftAmount] is negative.
+   */
+  BigInt operator <<(int shiftAmount);
+
+  /**
+   * Shift the bits of this integer to the right by [shiftAmount].
+   *
+   * Shifting to the right makes the number smaller and drops the least
+   * significant bits, effectively doing an integer division by
+   *`pow(2, shiftIndex)`.
+   *
+   * It is an error if [shiftAmount] is negative.
+   */
+  BigInt operator >>(int shiftAmount);
+
+  /**
+   * Bit-wise and operator.
+   *
+   * Treating both `this` and [other] as sufficiently large two's component
+   * integers, the result is a number with only the bits set that are set in
+   * both `this` and [other]
+   *
+   * Of both operands are negative, the result is negative, otherwise
+   * the result is non-negative.
+   */
+  BigInt operator &(BigInt other);
+
+  /**
+   * Bit-wise or operator.
+   *
+   * Treating both `this` and [other] as sufficiently large two's component
+   * integers, the result is a number with the bits set that are set in either
+   * of `this` and [other]
+   *
+   * If both operands are non-negative, the result is non-negative,
+   * otherwise the result us negative.
+   */
+  BigInt operator |(BigInt other);
+
+  /**
+   * Bit-wise exclusive-or operator.
+   *
+   * Treating both `this` and [other] as sufficiently large two's component
+   * integers, the result is a number with the bits set that are set in one,
+   * but not both, of `this` and [other]
+   *
+   * If the operands have the same sign, the result is non-negative,
+   * otherwise the result is negative.
+   */
+  BigInt operator ^(BigInt other);
+
+  /**
+   * The bit-wise negate operator.
+   *
+   * Treating `this` as a sufficiently large two's component integer,
+   * the result is a number with the opposite bits set.
+   *
+   * This maps any integer `x` to `-x - 1`.
+   */
+  BigInt operator ~();
+
+  /** Relational less than operator. */
+  bool operator <(BigInt other);
+
+  /** Relational less than or equal operator. */
+  bool operator <=(BigInt other);
+
+  /** Relational greater than operator. */
+  bool operator >(BigInt other);
+
+  /** Relational greater than or equal operator. */
+  bool operator >=(BigInt other);
+
+  /**
+   * Compares this to `other`.
+   *
+   * Returns a negative number if `this` is less than `other`, zero if they are
+   * equal, and a positive number if `this` is greater than `other`.
+   */
+  int compareTo(BigInt other);
+
+  /**
+   * Returns the minimum number of bits required to store this big integer.
+   *
+   * The number of bits excludes the sign bit, which gives the natural length
+   * for non-negative (unsigned) values.  Negative values are complemented to
+   * return the bit position of the first bit that differs from the sign bit.
+   *
+   * To find the number of bits needed to store the value as a signed value,
+   * add one, i.e. use `x.bitLength + 1`.
+   *
+   * ```
+   * x.bitLength == (-x-1).bitLength
+   *
+   * new BigInt.from(3).bitLength == 2;   // 00000011
+   * new BigInt.from(2).bitLength == 2;   // 00000010
+   * new BigInt.from(1).bitLength == 1;   // 00000001
+   * new BigInt.from(0).bitLength == 0;   // 00000000
+   * new BigInt.from(-1).bitLength == 0;  // 11111111
+   * new BigInt.from(-2).bitLength == 1;  // 11111110
+   * new BigInt.from(-3).bitLength == 2;  // 11111101
+   * new BigInt.from(-4).bitLength == 2;  // 11111100
+   * ```
+   */
+  int get bitLength;
+
+  /**
+   * Returns the sign of this big integer.
+   *
+   * Returns 0 for zero, -1 for values less than zero and
+   * +1 for values greater than zero.
+   */
+  int get sign;
+
+  /// Whether this big integer is even.
+  bool get isEven;
+
+  /// Whether this big integer is odd.
+  bool get isOdd;
+
+  /// Whether this number is negative.
+  bool get isNegative;
+
+  /**
+   * Returns `this` to the power of [exponent].
+   *
+   * Returns [one] if the [exponent] equals 0.
+   *
+   * The [exponent] must otherwise be positive.
+   *
+   * The result is always equal to the mathematical result of this to the power
+   * [exponent], only limited by the available memory.
+   */
+  BigInt pow(int exponent);
+
+  /**
+   * Returns this integer to the power of [exponent] modulo [modulus].
+   *
+   * The [exponent] must be non-negative and [modulus] must be
+   * positive.
+   */
+  BigInt modPow(BigInt exponent, BigInt modulus);
+
+  /**
+   * Returns the modular multiplicative inverse of this big integer
+   * modulo [modulus].
+   *
+   * The [modulus] must be positive.
+   *
+   * It is an error if no modular inverse exists.
+   */
+  // Returns 1/this % modulus, with modulus > 0.
+  BigInt modInverse(BigInt modulus);
+
+  /**
+   * Returns the greatest common divisor of this big integer and [other].
+   *
+   * If either number is non-zero, the result is the numerically greatest
+   * integer dividing both `this` and `other`.
+   *
+   * The greatest common divisor is independent of the order,
+   * so `x.gcd(y)` is  always the same as `y.gcd(x)`.
+   *
+   * For any integer `x`, `x.gcd(x)` is `x.abs()`.
+   *
+   * If both `this` and `other` is zero, the result is also zero.
+   */
+  BigInt gcd(BigInt other);
+
+  /**
+   * Returns the least significant [width] bits of this big integer as a
+   * non-negative number (i.e. unsigned representation).  The returned value has
+   * zeros in all bit positions higher than [width].
+   *
+   * ```
+   * new BigInt.from(-1).toUnsigned(5) == 31   // 11111111  ->  00011111
+   * ```
+   *
+   * This operation can be used to simulate arithmetic from low level languages.
+   * For example, to increment an 8 bit quantity:
+   *
+   * ```
+   * q = (q + 1).toUnsigned(8);
+   * ```
+   *
+   * `q` will count from `0` up to `255` and then wrap around to `0`.
+   *
+   * If the input fits in [width] bits without truncation, the result is the
+   * same as the input.  The minimum width needed to avoid truncation of `x` is
+   * given by `x.bitLength`, i.e.
+   *
+   * ```
+   * x == x.toUnsigned(x.bitLength);
+   * ```
+   */
+  BigInt toUnsigned(int width);
+
+  /**
+   * Returns the least significant [width] bits of this integer, extending the
+   * highest retained bit to the sign.  This is the same as truncating the value
+   * to fit in [width] bits using an signed 2-s complement representation.  The
+   * returned value has the same bit value in all positions higher than [width].
+   *
+   * ```
+   * var big15 = new BigInt.from(15);
+   * var big16 = new BigInt.from(16);
+   * var big239 = new BigInt.from(239);
+   *                                      V--sign bit-V
+   * big16.toSigned(5) == -big16   //  00010000 -> 11110000
+   * big239.toSigned(5) == big15   //  11101111 -> 00001111
+   *                                      ^           ^
+   * ```
+   *
+   * This operation can be used to simulate arithmetic from low level languages.
+   * For example, to increment an 8 bit signed quantity:
+   *
+   * ```
+   * q = (q + 1).toSigned(8);
+   * ```
+   *
+   * `q` will count from `0` up to `127`, wrap to `-128` and count back up to
+   * `127`.
+   *
+   * If the input value fits in [width] bits without truncation, the result is
+   * the same as the input.  The minimum width needed to avoid truncation of `x`
+   * is `x.bitLength + 1`, i.e.
+   *
+   * ```
+   * x == x.toSigned(x.bitLength + 1);
+   * ```
+   */
+  BigInt toSigned(int width);
+
+  /**
+   * Whether this big integer can be represented as an `int` without losing
+   * precision.
+   *
+   * Warning: this function is not yet implemented and always returns true.
+   */
+  bool get isValidInt;
+
+  /**
+   * Returns this [BigInt] as an [int].
+   *
+   * If the number does not fit clamps to the max (or min) integer.
+   *
+   * Warning: the clamping is not yet implemented and the behavior of this
+   * function will change in future versions of this library.
+   */
+  int toInt();
+
+  /**
+   * Returns this [BigInt] as a [double].
+   *
+   * If the number is not representable as a [double], an
+   * approximation is returned. For numerically large integers, the
+   * approximation may be infinite.
+   */
+  double toDouble();
+
+  /**
+   * Returns a String-representation of this integer.
+   *
+   * The returned string is parsable by [parse].
+   * For any `BigInt` `i`, it is guaranteed that
+   * `i == BigInt.parse(i.toString())`.
+   */
+  String toString();
+
+  /**
+   * Converts [this] to a string representation in the given [radix].
+   *
+   * In the string representation, lower-case letters are used for digits above
+   * '9', with 'a' being 10 an 'z' being 35.
+   *
+   * The [radix] argument must be an integer in the range 2 to 36.
+   */
+  String toRadixString(int radix);
+}
+
+int _max(int a, int b) => a > b ? a : b;
+int _min(int a, int b) => a < b ? a : b;
+
+/**
+ * An implementation for the arbitrarily large integer.
+ *
+ * The integer number is represented by a sign, an array of 16-bit unsigned
+ * integers in little endian format, and a number of used digits in that array.
+ */
+class _BigIntImpl implements BigInt {
+  // Bits per digit.
+  static const int _digitBits = 16;
+  static const int _digitBase = 1 << _digitBits;
+  static const int _digitMask = (1 << _digitBits) - 1;
+
+  static final _BigIntImpl zero = new _BigIntImpl._fromInt(0);
+  static final _BigIntImpl one = new _BigIntImpl._fromInt(1);
+  static final _BigIntImpl two = new _BigIntImpl._fromInt(2);
+
+  static final _BigIntImpl _minusOne = -one;
+  static final _BigIntImpl _bigInt10000 = new _BigIntImpl._fromInt(10000);
+
+  // Result cache for last _divRem call.
+  // Result cache for last _divRem call.
+  static Uint16List _lastDividendDigits;
+  static int _lastDividendUsed;
+  static Uint16List _lastDivisorDigits;
+  static int _lastDivisorUsed;
+  static Uint16List _lastQuoRemDigits;
+  static int _lastQuoRemUsed;
+  static int _lastRemUsed;
+  static int _lastRem_nsh;
+
+  /// Whether this bigint is negative.
+  final bool _isNegative;
+
+  /// The unsigned digits of this bigint.
+  ///
+  /// The least significant digit is in slot 0.
+  /// The list may have more digits than needed. That is, `_digits.length` may
+  /// be strictly greater than `_used`.
+  final Uint16List _digits;
+
+  /// The number of used entries in [_digits].
+  ///
+  /// To avoid reallocating [Uint16List]s, lists that are too big are not
+  /// replaced.
+  final int _used;
+
+  /**
+   * Parses [source] as a, possibly signed, integer literal and returns its
+   * value.
+   *
+   * The [source] must be a non-empty sequence of base-[radix] digits,
+   * optionally prefixed with a minus or plus sign ('-' or '+').
+   *
+   * The [radix] must be in the range 2..36. The digits used are
+   * first the decimal digits 0..9, and then the letters 'a'..'z' with
+   * values 10 through 35. Also accepts upper-case letters with the same
+   * values as the lower-case ones.
+   *
+   * If no [radix] is given then it defaults to 10. In this case, the [source]
+   * digits may also start with `0x`, in which case the number is interpreted
+   * as a hexadecimal literal, which effectively means that the `0x` is ignored
+   * and the radix is instead set to 16.
+   *
+   * For any int `n` and radix `r`, it is guaranteed that
+   * `n == int.parse(n.toRadixString(r), radix: r)`.
+   *
+   * Throws a [FormatException] if the [source] is not a valid integer literal,
+   * optionally prefixed by a sign.
+   */
+  static _BigIntImpl parse(String source, {int radix}) {
+    var result = _tryParse(source, radix: radix);
+    if (result == null) {
+      throw new FormatException("Could not parse BigInt", source);
+    }
+    return result;
+  }
+
+  /// Parses a decimal bigint literal.
+  ///
+  /// The [source] must not contain leading or trailing whitespace.
+  static _BigIntImpl _parseDecimal(String source, bool isNegative) {
+    const _0 = 48;
+
+    int part = 0;
+    _BigIntImpl result = zero;
+    // Read in the source 4 digits at a time.
+    // The first part may have a few leading virtual '0's to make the remaining
+    // parts all have exactly 4 digits.
+    int digitInPartCount = 4 - source.length.remainder(4);
+    if (digitInPartCount == 4) digitInPartCount = 0;
+    for (int i = 0; i < source.length; i++) {
+      part = part * 10 + source.codeUnitAt(i) - _0;
+      if (++digitInPartCount == 4) {
+        result = result * _bigInt10000 + new _BigIntImpl._fromInt(part);
+        part = 0;
+        digitInPartCount = 0;
+      }
+    }
+    if (isNegative) return -result;
+    return result;
+  }
+
+  /// Returns the value of a given source digit.
+  ///
+  /// Source digits between "0" and "9" (inclusive) return their decimal value.
+  ///
+  /// Source digits between "a" and "z", or "A" and "Z" (inclusive) return
+  /// 10 + their position in the ASCII alphabet.
+  ///
+  /// The incoming [codeUnit] must be an ASCII code-unit.
+  static int _codeUnitToRadixValue(int codeUnit) {
+    // We know that the characters must be ASCII as otherwise the
+    // regexp wouldn't have matched. Lowercasing by doing `| 0x20` is thus
+    // guaranteed to be a safe operation, since it preserves digits
+    // and lower-cases ASCII letters.
+    const int _0 = 48;
+    const int _9 = 57;
+    const int _a = 97;
+    if (_0 <= codeUnit && codeUnit <= _9) return codeUnit - _0;
+    codeUnit |= 0x20;
+    var result = codeUnit - _a + 10;
+    return result;
+  }
+
+  /// Parses the given [source] string, starting at [startPos], as a hex
+  /// literal.
+  ///
+  /// If [isNegative] is true, negates the result before returning it.
+  ///
+  /// The [source] (substring) must be a valid hex literal.
+  static _BigIntImpl _parseHex(String source, int startPos, bool isNegative) {
+    int hexDigitsPerChunk = _digitBits ~/ 4;
+    int sourceLength = source.length - startPos;
+    int chunkCount = (sourceLength / hexDigitsPerChunk).ceil();
+    var digits = new Uint16List(chunkCount);
+
+    int lastDigitLength = sourceLength - (chunkCount - 1) * hexDigitsPerChunk;
+    int digitIndex = digits.length - 1;
+    int i = startPos;
+    int chunk = 0;
+    for (int j = 0; j < lastDigitLength; j++) {
+      var digitValue = _codeUnitToRadixValue(source.codeUnitAt(i++));
+      if (digitValue >= 16) return null;
+      chunk = chunk * 16 + digitValue;
+    }
+    digits[digitIndex--] = chunk;
+
+    while (i < source.length) {
+      chunk = 0;
+      for (int j = 0; j < 4; j++) {
+        var digitValue = _codeUnitToRadixValue(source.codeUnitAt(i++));
+        if (digitValue >= 16) return null;
+        chunk = chunk * 16 + digitValue;
+      }
+      digits[digitIndex--] = chunk;
+    }
+    if (digits.length == 1 && digits[0] == 0) return zero;
+    return new _BigIntImpl._(isNegative, digits.length, digits);
+  }
+
+  /// Parses the given [source] as a [radix] literal.
+  ///
+  /// The [source] will be checked for invalid characters. If it is invalid,
+  /// this function returns `null`.
+  static _BigIntImpl _parseRadix(String source, int radix, bool isNegative) {
+    var result = zero;
+    var base = new _BigIntImpl._fromInt(radix);
+    for (int i = 0; i < source.length; i++) {
+      var digitValue = _codeUnitToRadixValue(source.codeUnitAt(i));
+      if (digitValue >= radix) return null;
+      result = result * base + new _BigIntImpl._fromInt(digitValue);
+    }
+    if (isNegative) return -result;
+    return result;
+  }
+
+  /// Tries to parse the given [source] as a [radix] literal.
+  ///
+  /// Returns the parsed big integer, or `null` if it failed.
+  ///
+  /// If the [radix] is `null` accepts decimal literals or `0x` hex literals.
+  static _BigIntImpl _tryParse(String source, {int radix}) {
+    if (source == "") return null;
+
+    var re = new RegExp(r'^\s*([+-]?)((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$',
+        caseSensitive: false);
+    var match = re.firstMatch(source);
+    int signIndex = 1;
+    int hexIndex = 3;
+    int decimalIndex = 4;
+    int nonDecimalHexIndex = 5;
+    if (match == null) return null;
+
+    bool isNegative = match[signIndex] == "-";
+
+    String decimalMatch = match[decimalIndex];
+    String hexMatch = match[hexIndex];
+    String nonDecimalMatch = match[nonDecimalHexIndex];
+
+    if (radix == null) {
+      if (decimalMatch != null) {
+        // Cannot fail because we know that the digits are all decimal.
+        return _parseDecimal(decimalMatch, isNegative);
+      }
+      if (hexMatch != null) {
+        // Cannot fail because we know that the digits are all hex.
+        return _parseHex(hexMatch, 2, isNegative);
+      }
+      return null;
+    }
+
+    if (radix is! int) {
+      throw new ArgumentError.value(radix, 'radix', 'is not an integer');
+    }
+    if (radix < 2 || radix > 36) {
+      throw new RangeError.range(radix, 2, 36, 'radix');
+    }
+    if (radix == 10 && decimalMatch != null) {
+      return _parseDecimal(decimalMatch, isNegative);
+    }
+    if (radix == 16 && (decimalMatch != null || nonDecimalMatch != null)) {
+      return _parseHex(decimalMatch ?? nonDecimalMatch, 0, isNegative);
+    }
+
+    return _parseRadix(
+        decimalMatch ?? nonDecimalMatch ?? hexMatch, radix, isNegative);
+  }
+
+  /// Finds the amount significant digits in the provided [digits] array.
+  static int _normalize(int used, Uint16List digits) {
+    while (used > 0 && digits[used - 1] == 0) used--;
+    return used;
+  }
+
+  /// Factory returning an instance initialized with the given field values.
+  /// If the [digits] array contains leading 0s, the [used] value is adjusted
+  /// accordingly. The [digits] array is not modified.
+  _BigIntImpl._(bool isNegative, int used, Uint16List digits)
+      : this._normalized(isNegative, _normalize(used, digits), digits);
+
+  _BigIntImpl._normalized(bool isNegative, this._used, this._digits)
+      : _isNegative = _used == 0 ? false : isNegative;
+
+  /// Whether this big integer is zero.
+  bool get _isZero => _used == 0;
+
+  /// Allocates an array of the given [length] and copies the [digits] in the
+  /// range [from] to [to-1], starting at index 0, followed by leading zero
+  /// digits.
+  static Uint16List _cloneDigits(
+      Uint16List digits, int from, int to, int length) {
+    var resultDigits = new Uint16List(length);
+    var n = to - from;
+    for (var i = 0; i < n; i++) {
+      resultDigits[i] = digits[from + i];
+    }
+    return resultDigits;
+  }
+
+  /// Allocates a big integer from the provided [value] number.
+  factory _BigIntImpl.from(num value) {
+    if (value == 0) return zero;
+    if (value == 1) return one;
+    if (value == 2) return two;
+
+    // Given this order dart2js will use the `_fromInt` for smaller value and
+    // then use the bit-manipulating `_fromDouble` for all other values.
+    if (value.abs() < 0x100000000)
+      return new _BigIntImpl._fromInt(value.toInt());
+    if (value is double) return new _BigIntImpl._fromDouble(value);
+    return new _BigIntImpl._fromInt(value);
+  }
+
+  factory _BigIntImpl._fromInt(int value) {
+    bool isNegative = value < 0;
+    if (isNegative) {
+      // Handle the min 64-bit value differently, since its negation is not
+      // positive.
+      // TODO(floitsch): we should use min.minValue or 0x8000000000000000 here.
+      const int minInt64 = -9223372036854775807 - 1;
+      if (value == minInt64) {
+        var digits = new Uint16List(4);
+        digits[3] = 0x8000;
+        return new _BigIntImpl._(true, digits.length, digits);
+      }
+      value = -value;
+    }
+    assert(_digitBits == 16);
+    if (value < _digitBase) {
+      var digits = new Uint16List(1);
+      digits[0] = value;
+      return new _BigIntImpl._(isNegative, digits.length, digits);
+    }
+    if (value <= 0xFFFFFFFF) {
+      var digits = new Uint16List(2);
+      digits[0] = value & _digitMask;
+      digits[1] = value >> _digitBits;
+      return new _BigIntImpl._(isNegative, digits.length, digits);
+    }
+
+    var bits = value.bitLength;
+    var digits = new Uint16List((bits - 1) ~/ _digitBits + 1);
+    var i = 0;
+    while (value != 0) {
+      digits[i++] = value & _digitMask;
+      value = value ~/ _digitBase;
+    }
+    return new _BigIntImpl._(isNegative, digits.length, digits);
+  }
+
+  /// An 8-byte Uint8List we can reuse for [_fromDouble] to avoid generating
+  /// garbage.
+  static final Uint8List _bitsForFromDouble = new Uint8List(8);
+
+  factory _BigIntImpl._fromDouble(double value) {
+    const int exponentBias = 1075;
+
+    if (value.isNaN || value.isInfinite) {
+      throw new ArgumentError("Value must be finite: $value");
+    }
+    bool isNegative = value < 0;
+    if (isNegative) value = -value;
+
+    value = value.floorToDouble();
+    if (value == 0) return zero;
+
+    var bits = _bitsForFromDouble;
+    for (int i = 0; i < 8; i++) {
+      bits[i] = 0;
+    }
+    bits.buffer.asByteData().setFloat64(0, value, Endian.little);
+    // The exponent is in bits 53..63.
+    var biasedExponent = (bits[7] << 4) + (bits[6] >> 4);
+    var exponent = biasedExponent - exponentBias;
+
+    assert(_digitBits == 16);
+    // The significant bits are in 0 .. 52.
+    var unshiftedDigits = new Uint16List(4);
+    unshiftedDigits[0] = (bits[1] << 8) + bits[0];
+    unshiftedDigits[1] = (bits[3] << 8) + bits[2];
+    unshiftedDigits[2] = (bits[5] << 8) + bits[4];
+    // Don't forget to add the hidden bit.
+    unshiftedDigits[3] = 0x10 | (bits[6] & 0xF);
+
+    var unshiftedBig = new _BigIntImpl._normalized(false, 4, unshiftedDigits);
+    _BigIntImpl absResult;
+    if (exponent < 0) {
+      absResult = unshiftedBig >> -exponent;
+    } else if (exponent > 0) {
+      absResult = unshiftedBig << exponent;
+    }
+    if (isNegative) return -absResult;
+    return absResult;
+  }
+
+  /**
+   * Return the negative value of this integer.
+   *
+   * The result of negating an integer always has the opposite sign, except
+   * for zero, which is its own negation.
+   */
+  _BigIntImpl operator -() {
+    if (_used == 0) return this;
+    return new _BigIntImpl._(!_isNegative, _used, _digits);
+  }
+
+  /**
+   * Returns the absolute value of this integer.
+   *
+   * For any integer `x`, the result is the same as `x < 0 ? -x : x`.
+   */
+  _BigIntImpl abs() => _isNegative ? -this : this;
+
+  /// Returns this << n *_DIGIT_BITS.
+  _BigIntImpl _dlShift(int n) {
+    final used = _used;
+    if (used == 0) {
+      return zero;
+    }
+    final resultUsed = used + n;
+    final digits = _digits;
+    final resultDigits = new Uint16List(resultUsed);
+    for (int i = used - 1; i >= 0; i--) {
+      resultDigits[i + n] = digits[i];
+    }
+    return new _BigIntImpl._(_isNegative, resultUsed, resultDigits);
+  }
+
+  /// Same as [_dlShift] but works on the decomposed big integers.
+  ///
+  /// Returns `resultUsed`.
+  ///
+  /// `resultDigits[0..resultUsed-1] = xDigits[0..xUsed-1] << n*_DIGIT_BITS`.
+  static int _dlShiftDigits(
+      Uint16List xDigits, int xUsed, int n, Uint16List resultDigits) {
+    if (xUsed == 0) {
+      return 0;
+    }
+    if (n == 0 && identical(resultDigits, xDigits)) {
+      return xUsed;
+    }
+    final resultUsed = xUsed + n;
+    for (int i = xUsed - 1; i >= 0; i--) {
+      resultDigits[i + n] = xDigits[i];
+    }
+    for (int i = n - 1; i >= 0; i--) {
+      resultDigits[i] = 0;
+    }
+    return resultUsed;
+  }
+
+  /// Returns `this >> n*_DIGIT_BITS`.
+  _BigIntImpl _drShift(int n) {
+    final used = _used;
+    if (used == 0) {
+      return zero;
+    }
+    final resultUsed = used - n;
+    if (resultUsed <= 0) {
+      return _isNegative ? _minusOne : zero;
+    }
+    final digits = _digits;
+    final resultDigits = new Uint16List(resultUsed);
+    for (var i = n; i < used; i++) {
+      resultDigits[i - n] = digits[i];
+    }
+    final result = new _BigIntImpl._(_isNegative, resultUsed, resultDigits);
+    if (_isNegative) {
+      // Round down if any bit was shifted out.
+      for (var i = 0; i < n; i++) {
+        if (digits[i] != 0) {
+          return result - one;
+        }
+      }
+    }
+    return result;
+  }
+
+  /// Shifts the digits of [xDigits] into the right place in [resultDigits].
+  ///
+  /// `resultDigits[ds..xUsed+ds] = xDigits[0..xUsed-1] << (n % _DIGIT_BITS)`
+  ///   where `ds = ceil(n / _DIGIT_BITS)`
+  ///
+  /// Does *not* clear digits below ds.
+  static void _lsh(
+      Uint16List xDigits, int xUsed, int n, Uint16List resultDigits) {
+    final digitShift = n ~/ _digitBits;
+    final bitShift = n % _digitBits;
+    final carryBitShift = _digitBits - bitShift;
+    final bitMask = (1 << carryBitShift) - 1;
+    var carry = 0;
+    for (int i = xUsed - 1; i >= 0; i--) {
+      final digit = xDigits[i];
+      resultDigits[i + digitShift + 1] = (digit >> carryBitShift) | carry;
+      carry = (digit & bitMask) << bitShift;
+    }
+    resultDigits[digitShift] = carry;
+  }
+
+  /**
+   * Shift the bits of this integer to the left by [shiftAmount].
+   *
+   * Shifting to the left makes the number larger, effectively multiplying
+   * the number by `pow(2, shiftIndex)`.
+   *
+   * There is no limit on the size of the result. It may be relevant to
+   * limit intermediate values by using the "and" operator with a suitable
+   * mask.
+   *
+   * It is an error if [shiftAmount] is negative.
+   */
+  _BigIntImpl operator <<(int shiftAmount) {
+    if (shiftAmount < 0) {
+      throw new ArgumentError("shift-amount must be posititve $shiftAmount");
+    }
+    final digitShift = shiftAmount ~/ _digitBits;
+    final bitShift = shiftAmount % _digitBits;
+    if (bitShift == 0) {
+      return _dlShift(digitShift);
+    }
+    var resultUsed = _used + digitShift + 1;
+    var resultDigits = new Uint16List(resultUsed);
+    _lsh(_digits, _used, shiftAmount, resultDigits);
+    return new _BigIntImpl._(_isNegative, resultUsed, resultDigits);
+  }
+
+  // resultDigits[0..resultUsed-1] = xDigits[0..xUsed-1] << n.
+  // Returns resultUsed.
+  static int _lShiftDigits(
+      Uint16List xDigits, int xUsed, int n, Uint16List resultDigits) {
+    final digitsShift = n ~/ _digitBits;
+    final bitShift = n % _digitBits;
+    if (bitShift == 0) {
+      return _dlShiftDigits(xDigits, xUsed, digitsShift, resultDigits);
+    }
+    var resultUsed = xUsed + digitsShift + 1;
+    _lsh(xDigits, xUsed, n, resultDigits);
+    var i = digitsShift;
+    while (--i >= 0) {
+      resultDigits[i] = 0;
+    }
+    if (resultDigits[resultUsed - 1] == 0) {
+      resultUsed--; // Clamp result.
+    }
+    return resultUsed;
+  }
+
+  // resultDigits[0..resultUsed-1] = xDigits[0..xUsed-1] >> n.
+  static void _rsh(
+      Uint16List xDigits, int xUsed, int n, Uint16List resultDigits) {
+    final digitsShift = n ~/ _digitBits;
+    final bitShift = n % _digitBits;
+    final carryBitShift = _digitBits - bitShift;
+    final bitMask = (1 << bitShift) - 1;
+    var carry = xDigits[digitsShift] >> bitShift;
+    final last = xUsed - digitsShift - 1;
+    for (var i = 0; i < last; i++) {
+      final digit = xDigits[i + digitsShift + 1];
+      resultDigits[i] = ((digit & bitMask) << carryBitShift) | carry;
+      carry = digit >> bitShift;
+    }
+    resultDigits[last] = carry;
+  }
+
+  /**
+   * Shift the bits of this integer to the right by [shiftAmount].
+   *
+   * Shifting to the right makes the number smaller and drops the least
+   * significant bits, effectively doing an integer division by
+   *`pow(2, shiftIndex)`.
+   *
+   * It is an error if [shiftAmount] is negative.
+   */
+  _BigIntImpl operator >>(int shiftAmount) {
+    if (shiftAmount < 0) {
+      throw new ArgumentError("shift-amount must be posititve $shiftAmount");
+    }
+    final digitShift = shiftAmount ~/ _digitBits;
+    final bitShift = shiftAmount % _digitBits;
+    if (bitShift == 0) {
+      return _drShift(digitShift);
+    }
+    final used = _used;
+    final resultUsed = used - digitShift;
+    if (resultUsed <= 0) {
+      return _isNegative ? _minusOne : zero;
+    }
+    final digits = _digits;
+    final resultDigits = new Uint16List(resultUsed);
+    _rsh(digits, used, shiftAmount, resultDigits);
+    final result = new _BigIntImpl._(_isNegative, resultUsed, resultDigits);
+    if (_isNegative) {
+      // Round down if any bit was shifted out.
+      if ((digits[digitShift] & ((1 << bitShift) - 1)) != 0) {
+        return result - one;
+      }
+      for (var i = 0; i < digitShift; i++) {
+        if (digits[i] != 0) {
+          return result - one;
+        }
+      }
+    }
+    return result;
+  }
+
+  /// Compares this to [other] taking the absolute value of both operands.
+  ///
+  /// Returns 0 if abs(this) == abs(other); a positive number if
+  /// abs(this) > abs(other); and a negative number if abs(this) < abs(other).
+  int _absCompare(BigInt bigInt) {
+    _BigIntImpl other = bigInt;
+    return _compareDigits(_digits, _used, other._digits, other._used);
+  }
+
+  /**
+   * Compares this to `other`.
+   *
+   * Returns a negative number if `this` is less than `other`, zero if they are
+   * equal, and a positive number if `this` is greater than `other`.
+   */
+  int compareTo(BigInt bigInt) {
+    _BigIntImpl other = bigInt;
+    if (_isNegative == other._isNegative) {
+      var result = _absCompare(other);
+      // Use 0 - result to avoid negative zero in JavaScript.
+      return _isNegative ? 0 - result : result;
+    }
+    return _isNegative ? -1 : 1;
+  }
+
+  /// Compares `digits[0..used-1]` with `otherDigits[0..otherUsed-1]`.
+  ///
+  /// Returns 0 if equal; a positive number if larger;
+  /// and a negative number if smaller.
+  static int _compareDigits(
+      Uint16List digits, int used, Uint16List otherDigits, int otherUsed) {
+    var result = used - otherUsed;
+    if (result == 0) {
+      for (int i = used - 1; i >= 0; i--) {
+        result = digits[i] - otherDigits[i];
+        if (result != 0) return result;
+      }
+    }
+    return result;
+  }
+
+  // resultDigits[0..used] = digits[0..used-1] + otherDigits[0..otherUsed-1].
+  // used >= otherUsed > 0.
+  static void _absAdd(Uint16List digits, int used, Uint16List otherDigits,
+      int otherUsed, Uint16List resultDigits) {
+    assert(used >= otherUsed && otherUsed > 0);
+    var carry = 0;
+    for (var i = 0; i < otherUsed; i++) {
+      carry += digits[i] + otherDigits[i];
+      resultDigits[i] = carry & _digitMask;
+      carry >>= _digitBits;
+    }
+    for (var i = otherUsed; i < used; i++) {
+      carry += digits[i];
+      resultDigits[i] = carry & _digitMask;
+      carry >>= _digitBits;
+    }
+    resultDigits[used] = carry;
+  }
+
+  // resultDigits[0..used-1] = digits[0..used-1] - otherDigits[0..otherUsed-1].
+  // used >= otherUsed > 0.
+  static void _absSub(Uint16List digits, int used, Uint16List otherDigits,
+      int otherUsed, Uint16List resultDigits) {
+    assert(used >= otherUsed && otherUsed > 0);
+
+    var carry = 0;
+    for (var i = 0; i < otherUsed; i++) {
+      carry += digits[i] - otherDigits[i];
+      resultDigits[i] = carry & _digitMask;
+      // Dart2js only supports unsigned shifts.
+      // Since the carry can only be -1 or 0 use this hack.
+      carry = 0 - ((carry >> _digitBits) & 1);
+    }
+    for (var i = otherUsed; i < used; i++) {
+      carry += digits[i];
+      resultDigits[i] = carry & _digitMask;
+      // Dart2js only supports unsigned shifts.
+      // Since the carry can only be -1 or 0 use this hack.
+      carry = 0 - ((carry >> _digitBits) & 1);
+    }
+  }
+
+  /// Returns `abs(this) + abs(other)` with sign set according to [isNegative].
+  _BigIntImpl _absAddSetSign(_BigIntImpl other, bool isNegative) {
+    var used = _used;
+    var otherUsed = other._used;
+    if (used < otherUsed) {
+      return other._absAddSetSign(this, isNegative);
+    }
+    if (used == 0) {
+      assert(!isNegative);
+      return zero;
+    }
+    if (otherUsed == 0) {
+      return _isNegative == isNegative ? this : -this;
+    }
+    var resultUsed = used + 1;
+    var resultDigits = new Uint16List(resultUsed);
+    _absAdd(_digits, used, other._digits, otherUsed, resultDigits);
+    return new _BigIntImpl._(isNegative, resultUsed, resultDigits);
+  }
+
+  /// Returns `abs(this) - abs(other)` with sign set according to [isNegative].
+  ///
+  /// Requirement: `abs(this) >= abs(other)`.
+  _BigIntImpl _absSubSetSign(_BigIntImpl other, bool isNegative) {
+    assert(_absCompare(other) >= 0);
+    var used = _used;
+    if (used == 0) {
+      assert(!isNegative);
+      return zero;
+    }
+    var otherUsed = other._used;
+    if (otherUsed == 0) {
+      return _isNegative == isNegative ? this : -this;
+    }
+    var resultDigits = new Uint16List(used);
+    _absSub(_digits, used, other._digits, otherUsed, resultDigits);
+    return new _BigIntImpl._(isNegative, used, resultDigits);
+  }
+
+  /// Returns `abs(this) & abs(other)` with sign set according to [isNegative].
+  _BigIntImpl _absAndSetSign(_BigIntImpl other, bool isNegative) {
+    var resultUsed = _min(_used, other._used);
+    var digits = _digits;
+    var otherDigits = other._digits;
+    var resultDigits = new Uint16List(resultUsed);
+    for (var i = 0; i < resultUsed; i++) {
+      resultDigits[i] = digits[i] & otherDigits[i];
+    }
+    return new _BigIntImpl._(isNegative, resultUsed, resultDigits);
+  }
+
+  /// Returns `abs(this) &~ abs(other)` with sign set according to [isNegative].
+  _BigIntImpl _absAndNotSetSign(_BigIntImpl other, bool isNegative) {
+    var resultUsed = _used;
+    var digits = _digits;
+    var otherDigits = other._digits;
+    var resultDigits = new Uint16List(resultUsed);
+    var m = _min(resultUsed, other._used);
+    for (var i = 0; i < m; i++) {
+      resultDigits[i] = digits[i] & ~otherDigits[i];
+    }
+    for (var i = m; i < resultUsed; i++) {
+      resultDigits[i] = digits[i];
+    }
+    return new _BigIntImpl._(isNegative, resultUsed, resultDigits);
+  }
+
+  /// Returns `abs(this) | abs(other)` with sign set according to [isNegative].
+  _BigIntImpl _absOrSetSign(_BigIntImpl other, bool isNegative) {
+    var used = _used;
+    var otherUsed = other._used;
+    var resultUsed = _max(used, otherUsed);
+    var digits = _digits;
+    var otherDigits = other._digits;
+    var resultDigits = new Uint16List(resultUsed);
+    var l, m;
+    if (used < otherUsed) {
+      l = other;
+      m = used;
+    } else {
+      l = this;
+      m = otherUsed;
+    }
+    for (var i = 0; i < m; i++) {
+      resultDigits[i] = digits[i] | otherDigits[i];
+    }
+    var lDigits = l._digits;
+    for (var i = m; i < resultUsed; i++) {
+      resultDigits[i] = lDigits[i];
+    }
+    return new _BigIntImpl._(isNegative, resultUsed, resultDigits);
+  }
+
+  /// Returns `abs(this) ^ abs(other)` with sign set according to [isNegative].
+  _BigIntImpl _absXorSetSign(_BigIntImpl other, bool isNegative) {
+    var used = _used;
+    var otherUsed = other._used;
+    var resultUsed = _max(used, otherUsed);
+    var digits = _digits;
+    var otherDigits = other._digits;
+    var resultDigits = new Uint16List(resultUsed);
+    var l, m;
+    if (used < otherUsed) {
+      l = other;
+      m = used;
+    } else {
+      l = this;
+      m = otherUsed;
+    }
+    for (var i = 0; i < m; i++) {
+      resultDigits[i] = digits[i] ^ otherDigits[i];
+    }
+    var lDigits = l._digits;
+    for (var i = m; i < resultUsed; i++) {
+      resultDigits[i] = lDigits[i];
+    }
+    return new _BigIntImpl._(isNegative, resultUsed, resultDigits);
+  }
+
+  /**
+   * Bit-wise and operator.
+   *
+   * Treating both `this` and [other] as sufficiently large two's component
+   * integers, the result is a number with only the bits set that are set in
+   * both `this` and [other]
+   *
+   * Of both operands are negative, the result is negative, otherwise
+   * the result is non-negative.
+   */
+  _BigIntImpl operator &(BigInt bigInt) {
+    _BigIntImpl other = bigInt;
+    if (_isNegative == other._isNegative) {
+      if (_isNegative) {
+        // (-this) & (-other) == ~(this-1) & ~(other-1)
+        //                    == ~((this-1) | (other-1))
+        //                    == -(((this-1) | (other-1)) + 1)
+        _BigIntImpl this1 = _absSubSetSign(one, true);
+        _BigIntImpl other1 = other._absSubSetSign(one, true);
+        // Result cannot be zero if this and other are negative.
+        return this1._absOrSetSign(other1, true)._absAddSetSign(one, true);
+      }
+      return _absAndSetSign(other, false);
+    }
+    // _isNegative != other._isNegative
+    var p, n;
+    if (_isNegative) {
+      p = other;
+      n = this;
+    } else {
+      // & is symmetric.
+      p = this;
+      n = other;
+    }
+    // p & (-n) == p & ~(n-1) == p &~ (n-1)
+    var n1 = n._absSubSetSign(one, false);
+    return p._absAndNotSetSign(n1, false);
+  }
+
+  /**
+   * Bit-wise or operator.
+   *
+   * Treating both `this` and [other] as sufficiently large two's component
+   * integers, the result is a number with the bits set that are set in either
+   * of `this` and [other]
+   *
+   * If both operands are non-negative, the result is non-negative,
+   * otherwise the result us negative.
+   */
+  _BigIntImpl operator |(BigInt bigInt) {
+    _BigIntImpl other = bigInt;
+    if (_isNegative == other._isNegative) {
+      if (_isNegative) {
+        // (-this) | (-other) == ~(this-1) | ~(other-1)
+        //                    == ~((this-1) & (other-1))
+        //                    == -(((this-1) & (other-1)) + 1)
+        var this1 = _absSubSetSign(one, true);
+        var other1 = other._absSubSetSign(one, true);
+        // Result cannot be zero if this and a are negative.
+        return this1._absAndSetSign(other1, true)._absAddSetSign(one, true);
+      }
+      return _absOrSetSign(other, false);
+    }
+    // _neg != a._neg
+    var p, n;
+    if (_isNegative) {
+      p = other;
+      n = this;
+    } else {
+      // | is symmetric.
+      p = this;
+      n = other;
+    }
+    // p | (-n) == p | ~(n-1) == ~((n-1) &~ p) == -(~((n-1) &~ p) + 1)
+    var n1 = n._absSubSetSign(one, true);
+    // Result cannot be zero if only one of this or a is negative.
+    return n1._absAndNotSetSign(p, true)._absAddSetSign(one, true);
+  }
+
+  /**
+   * Bit-wise exclusive-or operator.
+   *
+   * Treating both `this` and [other] as sufficiently large two's component
+   * integers, the result is a number with the bits set that are set in one,
+   * but not both, of `this` and [other]
+   *
+   * If the operands have the same sign, the result is non-negative,
+   * otherwise the result is negative.
+   */
+  _BigIntImpl operator ^(BigInt bigInt) {
+    _BigIntImpl other = bigInt;
+    if (_isNegative == other._isNegative) {
+      if (_isNegative) {
+        // (-this) ^ (-other) == ~(this-1) ^ ~(other-1) == (this-1) ^ (other-1)
+        var this1 = _absSubSetSign(one, true);
+        var other1 = other._absSubSetSign(one, true);
+        return this1._absXorSetSign(other1, false);
+      }
+      return _absXorSetSign(other, false);
+    }
+    // _isNegative != a._isNegative
+    var p, n;
+    if (_isNegative) {
+      p = other;
+      n = this;
+    } else {
+      // ^ is symmetric.
+      p = this;
+      n = other;
+    }
+    // p ^ (-n) == p ^ ~(n-1) == ~(p ^ (n-1)) == -((p ^ (n-1)) + 1)
+    var n1 = n._absSubSetSign(one, true);
+    // Result cannot be zero if only one of this or a is negative.
+    return p._absXorSetSign(n1, true)._absAddSetSign(one, true);
+  }
+
+  /**
+   * The bit-wise negate operator.
+   *
+   * Treating `this` as a sufficiently large two's component integer,
+   * the result is a number with the opposite bits set.
+   *
+   * This maps any integer `x` to `-x - 1`.
+   */
+  _BigIntImpl operator ~() {
+    if (_isNegative) {
+      // ~(-this) == ~(~(this-1)) == this-1
+      return _absSubSetSign(one, false);
+    }
+    // ~this == -this-1 == -(this+1)
+    // Result cannot be zero if this is positive.
+    return _absAddSetSign(one, true);
+  }
+
+  /// Addition operator.
+  _BigIntImpl operator +(BigInt bigInt) {
+    _BigIntImpl other = bigInt;
+    var isNegative = _isNegative;
+    if (isNegative == other._isNegative) {
+      // this + other == this + other
+      // (-this) + (-other) == -(this + other)
+      return _absAddSetSign(other, isNegative);
+    }
+    // this + (-other) == this - other == -(this - other)
+    // (-this) + other == other - this == -(this - other)
+    if (_absCompare(other) >= 0) {
+      return _absSubSetSign(other, isNegative);
+    }
+    return other._absSubSetSign(this, !isNegative);
+  }
+
+  /// Subtraction operator.
+  _BigIntImpl operator -(BigInt bigInt) {
+    _BigIntImpl other = bigInt;
+    var isNegative = _isNegative;
+    if (isNegative != other._isNegative) {
+      // this - (-other) == this + other
+      // (-this) - other == -(this + other)
+      return _absAddSetSign(other, isNegative);
+    }
+    // this - other == this - a == -(this - other)
+    // (-this) - (-other) == other - this == -(this - other)
+    if (_absCompare(other) >= 0) {
+      return _absSubSetSign(other, isNegative);
+    }
+    return other._absSubSetSign(this, !isNegative);
+  }
+
+  /// Multiplies [x] with [multiplicandDigits] and adds the result to
+  /// [accumulatorDigits].
+  ///
+  /// The [multiplicandDigits] in the range [i] to [i]+[n]-1 are the
+  /// multiplicand digits.
+  ///
+  /// The [acculumatorDigits] in the range [j] to [j]+[n]-1 are the accumulator
+  /// digits.
+  ///
+  /// Adds the result of the multiplicand-digits * [x] to the accumulator.
+  ///
+  /// Concretely: `accumulatorDigits[j..j+n] += x * m_digits[i..i+n-1]`.
+  static void _mulAdd(int x, Uint16List multiplicandDigits, int i,
+      Uint16List accumulatorDigits, int j, int n) {
+    if (x == 0) {
+      // No-op if x is 0.
+      return;
+    }
+    int c = 0;
+    while (--n >= 0) {
+      int product = x * multiplicandDigits[i++];
+      int combined = product + accumulatorDigits[j] + c;
+      accumulatorDigits[j++] = combined & _digitMask;
+      // Note that this works with 53 bits, as the division will not lose
+      // bits.
+      c = combined ~/ _digitBase;
+    }
+    while (c != 0) {
+      int l = accumulatorDigits[j] + c;
+      accumulatorDigits[j++] = l & _digitMask;
+      c = l ~/ _digitBase;
+    }
+  }
+
+  /// Multiplication operator.
+  _BigIntImpl operator *(BigInt bigInt) {
+    _BigIntImpl other = bigInt;
+    var used = _used;
+    var otherUsed = other._used;
+    if (used == 0 || otherUsed == 0) {
+      return zero;
+    }
+    var resultUsed = used + otherUsed;
+    var digits = _digits;
+    var otherDigits = other._digits;
+    var resultDigits = new Uint16List(resultUsed);
+    var i = 0;
+    while (i < otherUsed) {
+      _mulAdd(otherDigits[i], digits, 0, resultDigits, i, used);
+      i++;
+    }
+    return new _BigIntImpl._(
+        _isNegative != other._isNegative, resultUsed, resultDigits);
+  }
+
+  // r_digits[0..rUsed-1] = xDigits[0..xUsed-1]*otherDigits[0..otherUsed-1].
+  // Return resultUsed = xUsed + otherUsed.
+  static int _mulDigits(Uint16List xDigits, int xUsed, Uint16List otherDigits,
+      int otherUsed, Uint16List resultDigits) {
+    var resultUsed = xUsed + otherUsed;
+    var i = resultUsed;
+    assert(resultDigits.length >= i);
+    while (--i >= 0) {
+      resultDigits[i] = 0;
+    }
+    i = 0;
+    while (i < otherUsed) {
+      _mulAdd(otherDigits[i], xDigits, 0, resultDigits, i, xUsed);
+      i++;
+    }
+    return resultUsed;
+  }
+
+  /// Returns an estimate of `digits[i-1..i] ~/ topDigitDivisor`.
+  static int _estimateQuotientDigit(
+      int topDigitDivisor, Uint16List digits, int i) {
+    if (digits[i] == topDigitDivisor) return _digitMask;
+    var quotientDigit =
+        (digits[i] << _digitBits | digits[i - 1]) ~/ topDigitDivisor;
+    if (quotientDigit > _digitMask) return _digitMask;
+    return quotientDigit;
+  }
+
+  /// Returns `trunc(this / other)`, with `other != 0`.
+  _BigIntImpl _div(BigInt bigInt) {
+    _BigIntImpl other = bigInt;
+    assert(other._used > 0);
+    if (_used < other._used) {
+      return zero;
+    }
+    _divRem(other);
+    // Return quotient, i.e.
+    // _lastQuoRem_digits[_lastRem_used.._lastQuoRem_used-1] with proper sign.
+    var lastQuo_used = _lastQuoRemUsed - _lastRemUsed;
+    var quo_digits = _cloneDigits(
+        _lastQuoRemDigits, _lastRemUsed, _lastQuoRemUsed, lastQuo_used);
+    var quo = new _BigIntImpl._(false, lastQuo_used, quo_digits);
+    if ((_isNegative != other._isNegative) && (quo._used > 0)) {
+      quo = -quo;
+    }
+    return quo;
+  }
+
+  /// Returns `this - other * trunc(this / other)`, with `other != 0`.
+  _BigIntImpl _rem(BigInt bigInt) {
+    _BigIntImpl other = bigInt;
+    assert(other._used > 0);
+    if (_used < other._used) {
+      return this;
+    }
+    _divRem(other);
+    // Return remainder, i.e.
+    // denormalized _lastQuoRem_digits[0.._lastRem_used-1] with proper sign.
+    var remDigits =
+        _cloneDigits(_lastQuoRemDigits, 0, _lastRemUsed, _lastRemUsed);
+    var rem = new _BigIntImpl._(false, _lastRemUsed, remDigits);
+    if (_lastRem_nsh > 0) {
+      rem = rem >> _lastRem_nsh; // Denormalize remainder.
+    }
+    if (_isNegative && (rem._used > 0)) {
+      rem = -rem;
+    }
+    return rem;
+  }
+
+  /// Computes this ~/ other and this.remainder(other).
+  ///
+  /// Stores the result in [_lastQuoRemDigits], [_lastQuoRemUsed] and
+  /// [_lastRemUsed]. The [_lastQuoRemDigits] contains the digits of *both*, the
+  /// quotient and the remainder.
+  ///
+  /// Caches the input to avoid doing the work again when users write
+  /// `a ~/ b` followed by a `a % b`.
+  void _divRem(_BigIntImpl other) {
+    // Check if result is already cached.
+    if ((this._used == _lastDividendUsed) &&
+        (other._used == _lastDivisorUsed) &&
+        identical(this._digits, _lastDividendDigits) &&
+        identical(other._digits, _lastDivisorDigits)) {
+      return;
+    }
+    assert(_used >= other._used);
+
+    var nsh = _digitBits - other._digits[other._used - 1].bitLength;
+    // Concatenated positive quotient and normalized positive remainder.
+    // The resultDigits can have at most one more digit than the dividend.
+    Uint16List resultDigits;
+    int resultUsed;
+    // Normalized positive divisor.
+    // The normalized divisor has the most-significant bit of it's most
+    // significant digit set.
+    // This makes estimating the quotient easier.
+    Uint16List yDigits;
+    int yUsed;
+    if (nsh > 0) {
+      yDigits = new Uint16List(other._used + 5);
+      yUsed = _lShiftDigits(other._digits, other._used, nsh, yDigits);
+      resultDigits = new Uint16List(_used + 5);
+      resultUsed = _lShiftDigits(_digits, _used, nsh, resultDigits);
+    } else {
+      yDigits = other._digits;
+      yUsed = other._used;
+      resultDigits = _cloneDigits(_digits, 0, _used, _used + 2);
+      resultUsed = _used;
+    }
+    var topDigitDivisor = yDigits[yUsed - 1];
+    var i = resultUsed;
+    var j = i - yUsed;
+    // tmpDigits is a temporary array of i (resultUsed) digits.
+    var tmpDigits = new Uint16List(i);
+    var tmpUsed = _dlShiftDigits(yDigits, yUsed, j, tmpDigits);
+    // Explicit first division step in case normalized dividend is larger or
+    // equal to shifted normalized divisor.
+    if (_compareDigits(resultDigits, resultUsed, tmpDigits, tmpUsed) >= 0) {
+      assert(i == resultUsed);
+      resultDigits[resultUsed++] = 1; // Quotient = 1.
+      // Subtract divisor from remainder.
+      _absSub(resultDigits, resultUsed, tmpDigits, tmpUsed, resultDigits);
+    } else {
+      // Account for possible carry in _mulAdd step.
+      resultDigits[resultUsed++] = 0;
+    }
+
+    // Negate y so we can later use _mulAdd instead of non-existent _mulSub.
+    var nyDigits = new Uint16List(yUsed + 2);
+    nyDigits[yUsed] = 1;
+    _absSub(nyDigits, yUsed + 1, yDigits, yUsed, nyDigits);
+    // nyDigits is read-only and has yUsed digits (possibly including several
+    // leading zeros).
+    // resultDigits is modified during iteration.
+    // resultDigits[0..yUsed-1] is the current remainder.
+    // resultDigits[yUsed..resultUsed-1] is the current quotient.
+    --i;
+
+    while (j > 0) {
+      var estimatedQuotientDigit =
+          _estimateQuotientDigit(topDigitDivisor, resultDigits, i);
+      j--;
+      _mulAdd(estimatedQuotientDigit, nyDigits, 0, resultDigits, j, yUsed);
+      if (resultDigits[i] < estimatedQuotientDigit) {
+        // Reusing the already existing tmpDigits array.
+        var tmpUsed = _dlShiftDigits(nyDigits, yUsed, j, tmpDigits);
+        _absSub(resultDigits, resultUsed, tmpDigits, tmpUsed, resultDigits);
+        while (resultDigits[i] < --estimatedQuotientDigit) {
+          _absSub(resultDigits, resultUsed, tmpDigits, tmpUsed, resultDigits);
+        }
+      }
+      i--;
+    }
+    // Cache result.
+    _lastDividendDigits = _digits;
+    _lastDividendUsed = _used;
+    _lastDivisorDigits = other._digits;
+    _lastDivisorUsed = other._used;
+    _lastQuoRemDigits = resultDigits;
+    _lastQuoRemUsed = resultUsed;
+    _lastRemUsed = yUsed;
+    _lastRem_nsh = nsh;
+  }
+
+  int get hashCode {
+    // This is the [Jenkins hash function][1] but using masking to keep
+    // values in SMI range.
+    //
+    // [1]: http://en.wikipedia.org/wiki/Jenkins_hash_function
+
+    int combine(int hash, int value) {
+      hash = 0x1fffffff & (hash + value);
+      hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
+      return hash ^ (hash >> 6);
+    }
+
+    int finish(int hash) {
+      hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
+      hash = hash ^ (hash >> 11);
+      return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
+    }
+
+    if (_isZero) return 6707; // Just a random number.
+    var hash = _isNegative ? 83585 : 429689; // Also random.
+    for (int i = 0; i < _used; i++) {
+      hash = combine(hash, _digits[i]);
+    }
+    return finish(hash);
+  }
+
+  /**
+   * Test whether this value is numerically equal to `other`.
+   *
+   * If [other] is a [_BigIntImpl] returns whether the two operands have the same
+   * value.
+   *
+   * Returns false if `other` is not a [_BigIntImpl].
+   */
+  bool operator ==(Object other) =>
+      other is _BigIntImpl && compareTo(other) == 0;
+
+  /**
+   * Returns the minimum number of bits required to store this big integer.
+   *
+   * The number of bits excludes the sign bit, which gives the natural length
+   * for non-negative (unsigned) values.  Negative values are complemented to
+   * return the bit position of the first bit that differs from the sign bit.
+   *
+   * To find the number of bits needed to store the value as a signed value,
+   * add one, i.e. use `x.bitLength + 1`.
+   *
+   * ```
+   * x.bitLength == (-x-1).bitLength
+   *
+   * new BigInt.from(3).bitLength == 2;   // 00000011
+   * new BigInt.from(2).bitLength == 2;   // 00000010
+   * new BigInt.from(1).bitLength == 1;   // 00000001
+   * new BigInt.from(0).bitLength == 0;   // 00000000
+   * new BigInt.from(-1).bitLength == 0;  // 11111111
+   * new BigInt.from(-2).bitLength == 1;  // 11111110
+   * new BigInt.from(-3).bitLength == 2;  // 11111101
+   * new BigInt.from(-4).bitLength == 2;  // 11111100
+   * ```
+   */
+  int get bitLength {
+    if (_used == 0) return 0;
+    if (_isNegative) return (~this).bitLength;
+    return _digitBits * (_used - 1) + _digits[_used - 1].bitLength;
+  }
+
+  /**
+   * Truncating division operator.
+   *
+   * Performs a truncating integer division, where the remainder is discarded.
+   *
+   * The remainder can be computed using the [remainder] method.
+   *
+   * Examples:
+   * ```
+   * var seven = new BigInt.from(7);
+   * var three = new BigInt.from(3);
+   * seven ~/ three;    // => 2
+   * (-seven) ~/ three; // => -2
+   * seven ~/ -three;   // => -2
+   * seven.remainder(three);    // => 1
+   * (-seven).remainder(three); // => -1
+   * seven.remainder(-three);   // => 1
+   * ```
+   */
+  _BigIntImpl operator ~/(BigInt bigInt) {
+    _BigIntImpl other = bigInt;
+    if (other._used == 0) {
+      throw const IntegerDivisionByZeroException();
+    }
+    return _div(other);
+  }
+
+  /**
+   * Returns the remainder of the truncating division of `this` by [other].
+   *
+   * The result `r` of this operation satisfies:
+   * `this == (this ~/ other) * other + r`.
+   * As a consequence the remainder `r` has the same sign as the divider `this`.
+   */
+  _BigIntImpl remainder(BigInt bigInt) {
+    _BigIntImpl other = bigInt;
+    if (other._used == 0) {
+      throw const IntegerDivisionByZeroException();
+    }
+    return _rem(other);
+  }
+
+  /// Division operator.
+  double operator /(BigInt other) => this.toDouble() / other.toDouble();
+
+  /** Relational less than operator. */
+  bool operator <(BigInt other) => compareTo(other) < 0;
+
+  /** Relational less than or equal operator. */
+  bool operator <=(BigInt other) => compareTo(other) <= 0;
+
+  /** Relational greater than operator. */
+  bool operator >(BigInt other) => compareTo(other) > 0;
+
+  /** Relational greater than or equal operator. */
+  bool operator >=(BigInt other) => compareTo(other) >= 0;
+
+  /**
+   * Euclidean modulo operator.
+   *
+   * Returns the remainder of the Euclidean division. The Euclidean division of
+   * two integers `a` and `b` yields two integers `q` and `r` such that
+   * `a == b * q + r` and `0 <= r < b.abs()`.
+   *
+   * The sign of the returned value `r` is always positive.
+   *
+   * See [remainder] for the remainder of the truncating division.
+   */
+  _BigIntImpl operator %(BigInt bigInt) {
+    _BigIntImpl other = bigInt;
+    if (other._used == 0) {
+      throw const IntegerDivisionByZeroException();
+    }
+    var result = _rem(other);
+    if (result._isNegative) {
+      if (other._isNegative) {
+        result = result - other;
+      } else {
+        result = result + other;
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Returns the sign of this big integer.
+   *
+   * Returns 0 for zero, -1 for values less than zero and
+   * +1 for values greater than zero.
+   */
+  int get sign {
+    if (_used == 0) return 0;
+    return _isNegative ? -1 : 1;
+  }
+
+  /// Whether this big integer is even.
+  bool get isEven => _used == 0 || (_digits[0] & 1) == 0;
+
+  /// Whether this big integer is odd.
+  bool get isOdd => !isEven;
+
+  /// Whether this number is negative.
+  bool get isNegative => _isNegative;
+
+  _BigIntImpl pow(int exponent) {
+    if (exponent < 0) {
+      throw new ArgumentError("Exponent must not be negative: $exponent");
+    }
+    if (exponent == 0) return one;
+
+    // Exponentiation by squaring.
+    var result = one;
+    var base = this;
+    while (exponent != 0) {
+      if ((exponent & 1) == 1) {
+        result *= base;
+      }
+      exponent >>= 1;
+      // Skip unnecessary operation.
+      if (exponent != 0) {
+        base *= base;
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Returns this integer to the power of [exponent] modulo [modulus].
+   *
+   * The [exponent] must be non-negative and [modulus] must be
+   * positive.
+   */
+  _BigIntImpl modPow(BigInt bigExponent, BigInt bigModulus) {
+    _BigIntImpl exponent = bigExponent;
+    _BigIntImpl modulus = bigModulus;
+    if (exponent._isNegative) {
+      throw new ArgumentError("exponent must be positive: $exponent");
+    }
+    if (modulus <= zero) {
+      throw new ArgumentError("modulus must be strictly positive: $modulus");
+    }
+    if (exponent._isZero) return one;
+
+    final modulusUsed = modulus._used;
+    final modulusUsed2p4 = 2 * modulusUsed + 4;
+    final exponentBitlen = exponent.bitLength;
+    if (exponentBitlen <= 0) return one;
+    _BigIntReduction z = new _BigIntClassic(modulus);
+    var resultDigits = new Uint16List(modulusUsed2p4);
+    var result2Digits = new Uint16List(modulusUsed2p4);
+    var gDigits = new Uint16List(modulusUsed);
+    var gUsed = z.convert(this, gDigits);
+    // Initialize result with g.
+    // Copy leading zero if any.
+    for (int j = gUsed - 1; j >= 0; j--) {
+      resultDigits[j] = gDigits[j];
+    }
+    var resultUsed = gUsed;
+    var result2Used;
+    for (int i = exponentBitlen - 2; i >= 0; i--) {
+      result2Used = z.sqr(resultDigits, resultUsed, result2Digits);
+      if (!(exponent & (one << i))._isZero) {
+        resultUsed =
+            z.mul(result2Digits, result2Used, gDigits, gUsed, resultDigits);
+      } else {
+        // Swap result and result2.
+        var tmpDigits = resultDigits;
+        var tmpUsed = resultUsed;
+        resultDigits = result2Digits;
+        resultUsed = result2Used;
+        result2Digits = tmpDigits;
+        result2Used = tmpUsed;
+      }
+    }
+    return z.revert(resultDigits, resultUsed);
+  }
+
+  // If inv is false, returns gcd(x, y).
+  // If inv is true and gcd(x, y) = 1, returns d, so that c*x + d*y = 1.
+  // If inv is true and gcd(x, y) != 1, throws Exception("Not coprime").
+  static _BigIntImpl _binaryGcd(_BigIntImpl x, _BigIntImpl y, bool inv) {
+    var xDigits = x._digits;
+    var yDigits = y._digits;
+    var xUsed = x._used;
+    var yUsed = y._used;
+    var maxUsed = xUsed > yUsed ? xUsed : yUsed;
+    var unshiftedMaxUsed = maxUsed; // Keep
+    xDigits = _cloneDigits(xDigits, 0, xUsed, maxUsed);
+    yDigits = _cloneDigits(yDigits, 0, yUsed, maxUsed);
+    int shiftAmount = 0;
+    if (inv) {
+      if ((yUsed == 1) && (yDigits[0] == 1)) return one;
+      if ((yUsed == 0) || (yDigits[0].isEven && xDigits[0].isEven)) {
+        throw new Exception("Not coprime");
+      }
+    } else {
+      if (x._isZero) {
+        throw new ArgumentError.value(0, "this", "must not be zero");
+      }
+      if (y._isZero) {
+        throw new ArgumentError.value(0, "other", "must not be zero");
+      }
+      if (((xUsed == 1) && (xDigits[0] == 1)) ||
+          ((yUsed == 1) && (yDigits[0] == 1))) return one;
+      while (((xDigits[0] & 1) == 0) && ((yDigits[0] & 1) == 0)) {
+        _rsh(xDigits, xUsed, 1, xDigits);
+        _rsh(yDigits, yUsed, 1, yDigits);
+        shiftAmount++;
+      }
+      if (shiftAmount >= _digitBits) {
+        var digitShiftAmount = shiftAmount ~/ _digitBits;
+        xUsed -= digitShiftAmount;
+        yUsed -= digitShiftAmount;
+        maxUsed -= digitShiftAmount;
+      }
+      if ((yDigits[0] & 1) == 1) {
+        // Swap x and y.
+        var tmpDigits = xDigits;
+        var tmpUsed = xUsed;
+        xDigits = yDigits;
+        xUsed = yUsed;
+        yDigits = tmpDigits;
+        yUsed = tmpUsed;
+      }
+    }
+    var uDigits = _cloneDigits(xDigits, 0, xUsed, unshiftedMaxUsed);
+    var vDigits =
+        _cloneDigits(yDigits, 0, yUsed, unshiftedMaxUsed + 2); // +2 for lsh.
+    final bool ac = (xDigits[0] & 1) == 0;
+
+    // Variables a, b, c, and d require one more digit.
+    final abcdUsed = maxUsed + 1;
+    final abcdLen = abcdUsed + 2; // +2 to satisfy _absAdd.
+    var aDigits, bDigits, cDigits, dDigits;
+    bool aIsNegative, bIsNegative, cIsNegative, dIsNegative;
+    if (ac) {
+      aDigits = new Uint16List(abcdLen);
+      aIsNegative = false;
+      aDigits[0] = 1;
+      cDigits = new Uint16List(abcdLen);
+      cIsNegative = false;
+    }
+    bDigits = new Uint16List(abcdLen);
+    bIsNegative = false;
+    dDigits = new Uint16List(abcdLen);
+    dIsNegative = false;
+    dDigits[0] = 1;
+
+    while (true) {
+      while ((uDigits[0] & 1) == 0) {
+        _rsh(uDigits, maxUsed, 1, uDigits);
+        if (ac) {
+          if (((aDigits[0] & 1) == 1) || ((bDigits[0] & 1) == 1)) {
+            if (aIsNegative) {
+              if ((aDigits[maxUsed] != 0) ||
+                  (_compareDigits(aDigits, maxUsed, yDigits, maxUsed)) > 0) {
+                _absSub(aDigits, abcdUsed, yDigits, maxUsed, aDigits);
+              } else {
+                _absSub(yDigits, maxUsed, aDigits, maxUsed, aDigits);
+                aIsNegative = false;
+              }
+            } else {
+              _absAdd(aDigits, abcdUsed, yDigits, maxUsed, aDigits);
+            }
+            if (bIsNegative) {
+              _absAdd(bDigits, abcdUsed, xDigits, maxUsed, bDigits);
+            } else if ((bDigits[maxUsed] != 0) ||
+                (_compareDigits(bDigits, maxUsed, xDigits, maxUsed) > 0)) {
+              _absSub(bDigits, abcdUsed, xDigits, maxUsed, bDigits);
+            } else {
+              _absSub(xDigits, maxUsed, bDigits, maxUsed, bDigits);
+              bIsNegative = true;
+            }
+          }
+          _rsh(aDigits, abcdUsed, 1, aDigits);
+        } else if ((bDigits[0] & 1) == 1) {
+          if (bIsNegative) {
+            _absAdd(bDigits, abcdUsed, xDigits, maxUsed, bDigits);
+          } else if ((bDigits[maxUsed] != 0) ||
+              (_compareDigits(bDigits, maxUsed, xDigits, maxUsed) > 0)) {
+            _absSub(bDigits, abcdUsed, xDigits, maxUsed, bDigits);
+          } else {
+            _absSub(xDigits, maxUsed, bDigits, maxUsed, bDigits);
+            bIsNegative = true;
+          }
+        }
+        _rsh(bDigits, abcdUsed, 1, bDigits);
+      }
+      while ((vDigits[0] & 1) == 0) {
+        _rsh(vDigits, maxUsed, 1, vDigits);
+        if (ac) {
+          if (((cDigits[0] & 1) == 1) || ((dDigits[0] & 1) == 1)) {
+            if (cIsNegative) {
+              if ((cDigits[maxUsed] != 0) ||
+                  (_compareDigits(cDigits, maxUsed, yDigits, maxUsed) > 0)) {
+                _absSub(cDigits, abcdUsed, yDigits, maxUsed, cDigits);
+              } else {
+                _absSub(yDigits, maxUsed, cDigits, maxUsed, cDigits);
+                cIsNegative = false;
+              }
+            } else {
+              _absAdd(cDigits, abcdUsed, yDigits, maxUsed, cDigits);
+            }
+            if (dIsNegative) {
+              _absAdd(dDigits, abcdUsed, xDigits, maxUsed, dDigits);
+            } else if ((dDigits[maxUsed] != 0) ||
+                (_compareDigits(dDigits, maxUsed, xDigits, maxUsed) > 0)) {
+              _absSub(dDigits, abcdUsed, xDigits, maxUsed, dDigits);
+            } else {
+              _absSub(xDigits, maxUsed, dDigits, maxUsed, dDigits);
+              dIsNegative = true;
+            }
+          }
+          _rsh(cDigits, abcdUsed, 1, cDigits);
+        } else if ((dDigits[0] & 1) == 1) {
+          if (dIsNegative) {
+            _absAdd(dDigits, abcdUsed, xDigits, maxUsed, dDigits);
+          } else if ((dDigits[maxUsed] != 0) ||
+              (_compareDigits(dDigits, maxUsed, xDigits, maxUsed) > 0)) {
+            _absSub(dDigits, abcdUsed, xDigits, maxUsed, dDigits);
+          } else {
+            _absSub(xDigits, maxUsed, dDigits, maxUsed, dDigits);
+            dIsNegative = true;
+          }
+        }
+        _rsh(dDigits, abcdUsed, 1, dDigits);
+      }
+      if (_compareDigits(uDigits, maxUsed, vDigits, maxUsed) >= 0) {
+        _absSub(uDigits, maxUsed, vDigits, maxUsed, uDigits);
+        if (ac) {
+          if (aIsNegative == cIsNegative) {
+            var a_cmp_c = _compareDigits(aDigits, abcdUsed, cDigits, abcdUsed);
+            if (a_cmp_c > 0) {
+              _absSub(aDigits, abcdUsed, cDigits, abcdUsed, aDigits);
+            } else {
+              _absSub(cDigits, abcdUsed, aDigits, abcdUsed, aDigits);
+              aIsNegative = !aIsNegative && (a_cmp_c != 0);
+            }
+          } else {
+            _absAdd(aDigits, abcdUsed, cDigits, abcdUsed, aDigits);
+          }
+        }
+        if (bIsNegative == dIsNegative) {
+          var b_cmp_d = _compareDigits(bDigits, abcdUsed, dDigits, abcdUsed);
+          if (b_cmp_d > 0) {
+            _absSub(bDigits, abcdUsed, dDigits, abcdUsed, bDigits);
+          } else {
+            _absSub(dDigits, abcdUsed, bDigits, abcdUsed, bDigits);
+            bIsNegative = !bIsNegative && (b_cmp_d != 0);
+          }
+        } else {
+          _absAdd(bDigits, abcdUsed, dDigits, abcdUsed, bDigits);
+        }
+      } else {
+        _absSub(vDigits, maxUsed, uDigits, maxUsed, vDigits);
+        if (ac) {
+          if (cIsNegative == aIsNegative) {
+            var c_cmp_a = _compareDigits(cDigits, abcdUsed, aDigits, abcdUsed);
+            if (c_cmp_a > 0) {
+              _absSub(cDigits, abcdUsed, aDigits, abcdUsed, cDigits);
+            } else {
+              _absSub(aDigits, abcdUsed, cDigits, abcdUsed, cDigits);
+              cIsNegative = !cIsNegative && (c_cmp_a != 0);
+            }
+          } else {
+            _absAdd(cDigits, abcdUsed, aDigits, abcdUsed, cDigits);
+          }
+        }
+        if (dIsNegative == bIsNegative) {
+          var d_cmp_b = _compareDigits(dDigits, abcdUsed, bDigits, abcdUsed);
+          if (d_cmp_b > 0) {
+            _absSub(dDigits, abcdUsed, bDigits, abcdUsed, dDigits);
+          } else {
+            _absSub(bDigits, abcdUsed, dDigits, abcdUsed, dDigits);
+            dIsNegative = !dIsNegative && (d_cmp_b != 0);
+          }
+        } else {
+          _absAdd(dDigits, abcdUsed, bDigits, abcdUsed, dDigits);
+        }
+      }
+      // Exit loop if u == 0.
+      var i = maxUsed;
+      while ((i > 0) && (uDigits[i - 1] == 0)) --i;
+      if (i == 0) break;
+    }
+    if (!inv) {
+      if (shiftAmount > 0) {
+        maxUsed = _lShiftDigits(vDigits, maxUsed, shiftAmount, vDigits);
+      }
+      return new _BigIntImpl._(false, maxUsed, vDigits);
+    }
+    // No inverse if v != 1.
+    var i = maxUsed - 1;
+    while ((i > 0) && (vDigits[i] == 0)) --i;
+    if ((i != 0) || (vDigits[0] != 1)) {
+      throw new Exception("Not coprime");
+    }
+
+    if (dIsNegative) {
+      if ((dDigits[maxUsed] != 0) ||
+          (_compareDigits(dDigits, maxUsed, xDigits, maxUsed) > 0)) {
+        _absSub(dDigits, abcdUsed, xDigits, maxUsed, dDigits);
+        if ((dDigits[maxUsed] != 0) ||
+            (_compareDigits(dDigits, maxUsed, xDigits, maxUsed) > 0)) {
+          _absSub(dDigits, abcdUsed, xDigits, maxUsed, dDigits);
+        } else {
+          _absSub(xDigits, maxUsed, dDigits, maxUsed, dDigits);
+          dIsNegative = false;
+        }
+      } else {
+        _absSub(xDigits, maxUsed, dDigits, maxUsed, dDigits);
+        dIsNegative = false;
+      }
+    } else if ((dDigits[maxUsed] != 0) ||
+        (_compareDigits(dDigits, maxUsed, xDigits, maxUsed) > 0)) {
+      _absSub(dDigits, abcdUsed, xDigits, maxUsed, dDigits);
+      if ((dDigits[maxUsed] != 0) ||
+          (_compareDigits(dDigits, maxUsed, xDigits, maxUsed) > 0)) {
+        _absSub(dDigits, abcdUsed, xDigits, maxUsed, dDigits);
+      }
+    }
+    return new _BigIntImpl._(false, maxUsed, dDigits);
+  }
+
+  /**
+   * Returns the modular multiplicative inverse of this big integer
+   * modulo [modulus].
+   *
+   * The [modulus] must be positive.
+   *
+   * It is an error if no modular inverse exists.
+   */
+  // Returns 1/this % modulus, with modulus > 0.
+  _BigIntImpl modInverse(BigInt bigInt) {
+    _BigIntImpl modulus = bigInt;
+    if (modulus <= zero) {
+      throw new ArgumentError("Modulus must be strictly positive: $modulus");
+    }
+    if (modulus == one) return zero;
+    var tmp = this;
+    if (tmp._isNegative || (tmp._absCompare(modulus) >= 0)) {
+      tmp %= modulus;
+    }
+    return _binaryGcd(modulus, tmp, true);
+  }
+
+  /**
+   * Returns the greatest common divisor of this big integer and [other].
+   *
+   * If either number is non-zero, the result is the numerically greatest
+   * integer dividing both `this` and `other`.
+   *
+   * The greatest common divisor is independent of the order,
+   * so `x.gcd(y)` is  always the same as `y.gcd(x)`.
+   *
+   * For any integer `x`, `x.gcd(x)` is `x.abs()`.
+   *
+   * If both `this` and `other` is zero, the result is also zero.
+   */
+  _BigIntImpl gcd(BigInt bigInt) {
+    _BigIntImpl other = bigInt;
+    if (_isZero) return other.abs();
+    if (other._isZero) return this.abs();
+    return _binaryGcd(this, other, false);
+  }
+
+  /**
+   * Returns the least significant [width] bits of this big integer as a
+   * non-negative number (i.e. unsigned representation).  The returned value has
+   * zeros in all bit positions higher than [width].
+   *
+   * ```
+   * new BigInt.from(-1).toUnsigned(5) == 31   // 11111111  ->  00011111
+   * ```
+   *
+   * This operation can be used to simulate arithmetic from low level languages.
+   * For example, to increment an 8 bit quantity:
+   *
+   * ```
+   * q = (q + 1).toUnsigned(8);
+   * ```
+   *
+   * `q` will count from `0` up to `255` and then wrap around to `0`.
+   *
+   * If the input fits in [width] bits without truncation, the result is the
+   * same as the input.  The minimum width needed to avoid truncation of `x` is
+   * given by `x.bitLength`, i.e.
+   *
+   * ```
+   * x == x.toUnsigned(x.bitLength);
+   * ```
+   */
+  _BigIntImpl toUnsigned(int width) {
+    return this & ((one << width) - one);
+  }
+
+  /**
+   * Returns the least significant [width] bits of this integer, extending the
+   * highest retained bit to the sign.  This is the same as truncating the value
+   * to fit in [width] bits using an signed 2-s complement representation.  The
+   * returned value has the same bit value in all positions higher than [width].
+   *
+   * ```
+   * var big15 = new BigInt.from(15);
+   * var big16 = new BigInt.from(16);
+   * var big239 = new BigInt.from(239);
+   *                                      V--sign bit-V
+   * big16.toSigned(5) == -big16   //  00010000 -> 11110000
+   * big239.toSigned(5) == big15   //  11101111 -> 00001111
+   *                                      ^           ^
+   * ```
+   *
+   * This operation can be used to simulate arithmetic from low level languages.
+   * For example, to increment an 8 bit signed quantity:
+   *
+   * ```
+   * q = (q + 1).toSigned(8);
+   * ```
+   *
+   * `q` will count from `0` up to `127`, wrap to `-128` and count back up to
+   * `127`.
+   *
+   * If the input value fits in [width] bits without truncation, the result is
+   * the same as the input.  The minimum width needed to avoid truncation of `x`
+   * is `x.bitLength + 1`, i.e.
+   *
+   * ```
+   * x == x.toSigned(x.bitLength + 1);
+   * ```
+   */
+  _BigIntImpl toSigned(int width) {
+    // The value of binary number weights each bit by a power of two.  The
+    // twos-complement value weights the sign bit negatively.  We compute the
+    // value of the negative weighting by isolating the sign bit with the
+    // correct power of two weighting and subtracting it from the value of the
+    // lower bits.
+    var signMask = one << (width - 1);
+    return (this & (signMask - one)) - (this & signMask);
+  }
+
+  // TODO(floitsch): implement `isValidInt`.
+  // Remove the comment in [BigInt.isValidInt] when done.
+  bool get isValidInt => true;
+
+  // TODO(floitsch): implement the clamping. It behaves differently on dart2js
+  // and the VM.
+  // Remove the comment in [BigInt.isValidInt] when done.
+  int toInt() {
+    var result = 0;
+    for (int i = _used - 1; i >= 0; i--) {
+      result = result * _digitBase + _digits[i];
+    }
+    return _isNegative ? -result : result;
+  }
+
+  /**
+   * Returns this [_BigIntImpl] as a [double].
+   *
+   * If the number is not representable as a [double], an
+   * approximation is returned. For numerically large integers, the
+   * approximation may be infinite.
+   */
+  double toDouble() {
+    const int exponentBias = 1075;
+    // There are 11 bits for the exponent.
+    // 2047 (all bits set to 1) is reserved for infinity and NaN.
+    // When storing the exponent in the 11 bits, it is biased by exponentBias
+    // to support negative exponents.
+    const int maxDoubleExponent = 2046 - exponentBias;
+    if (_isZero) return 0.0;
+
+    // We fill the 53 bits little-endian.
+    var resultBits = new Uint8List(8);
+
+    var length = _digitBits * (_used - 1) + _digits[_used - 1].bitLength;
+    if (length - 53 > maxDoubleExponent) return double.INFINITY;
+
+    // The most significant bit is for the sign.
+    if (_isNegative) resultBits[7] = 0x80;
+
+    // Write the exponent into bits 1..12:
+    var biasedExponent = length - 53 + exponentBias;
+    resultBits[6] = (biasedExponent & 0xF) << 4;
+    resultBits[7] |= biasedExponent >> 4;
+
+    int cachedBits = 0;
+    int cachedBitsLength = 0;
+    int digitIndex = _used - 1;
+    int readBits(int n) {
+      // Ensure that we have enough bits in [cachedBits].
+      while (cachedBitsLength < n) {
+        int nextDigit;
+        int nextDigitLength = _digitBits; // May get updated.
+        if (digitIndex < 0) {
+          nextDigit = 0;
+          digitIndex--;
+        } else {
+          nextDigit = _digits[digitIndex];
+          if (digitIndex == _used - 1) nextDigitLength = nextDigit.bitLength;
+          digitIndex--;
+        }
+        cachedBits = (cachedBits << nextDigitLength) + nextDigit;
+        cachedBitsLength += nextDigitLength;
+      }
+      // Read the top [n] bits.
+      var result = cachedBits >> (cachedBitsLength - n);
+      // Remove the bits from the cache.
+      cachedBits -= result << (cachedBitsLength - n);
+      cachedBitsLength -= n;
+      return result;
+    }
+
+    // The first leading 1 bit is implicit in the double-representation and can
+    // be discarded.
+    var leadingBits = readBits(5) & 0xF;
+    resultBits[6] |= leadingBits;
+
+    for (int i = 5; i >= 0; i--) {
+      // Get the remaining 48 bits.
+      resultBits[i] = readBits(8);
+    }
+
+    void roundUp() {
+      // Simply consists of adding 1 to the whole 64 bit "number".
+      // It will update the exponent, if necessary.
+      // It might even round up to infinity (which is what we want).
+      var carry = 1;
+      for (int i = 0; i < 8; i++) {
+        if (carry == 0) break;
+        var sum = resultBits[i] + carry;
+        resultBits[i] = sum & 0xFF;
+        carry = sum >> 8;
+      }
+    }
+
+    if (readBits(1) == 1) {
+      if (resultBits[0].isOdd) {
+        // Rounds to even all the time.
+        roundUp();
+      } else {
+        // Round up, if there is at least one other digit that is not 0.
+        if (cachedBits != 0) {
+          // There is already one in the cachedBits.
+          roundUp();
+        } else {
+          for (int i = digitIndex; digitIndex >= 0; i--) {
+            if (_digits[i] != 0) {
+              roundUp();
+              break;
+            }
+          }
+        }
+      }
+    }
+    return resultBits.buffer.asByteData().getFloat64(0, Endian.little);
+  }
+
+  /**
+   * Returns a String-representation of this integer.
+   *
+   * The returned string is parsable by [parse].
+   * For any `_BigIntImpl` `i`, it is guaranteed that
+   * `i == _BigIntImpl.parse(i.toString())`.
+   */
+  String toString() {
+    if (_used == 0) return "0";
+    if (_used == 1) {
+      if (_isNegative) return (-_digits[0]).toString();
+      return _digits[0].toString();
+    }
+
+    // Generate in chunks of 4 digits.
+    // The chunks are in reversed order.
+    var decimalDigitChunks = <String>[];
+    var rest = isNegative ? -this : this;
+    while (rest._used > 1) {
+      var digits4 = rest.remainder(_bigInt10000).toString();
+      decimalDigitChunks.add(digits4);
+      if (digits4.length == 1) decimalDigitChunks.add("000");
+      if (digits4.length == 2) decimalDigitChunks.add("00");
+      if (digits4.length == 3) decimalDigitChunks.add("0");
+      rest = rest ~/ _bigInt10000;
+    }
+    decimalDigitChunks.add(rest._digits[0].toString());
+    if (_isNegative) decimalDigitChunks.add("-");
+    return decimalDigitChunks.reversed.join();
+  }
+
+  int _toRadixCodeUnit(int digit) {
+    const int _0 = 48;
+    const int _a = 97;
+    if (digit < 10) return _0 + digit;
+    return _a + digit - 10;
+  }
+
+  /**
+   * Converts [this] to a string representation in the given [radix].
+   *
+   * In the string representation, lower-case letters are used for digits above
+   * '9', with 'a' being 10 an 'z' being 35.
+   *
+   * The [radix] argument must be an integer in the range 2 to 36.
+   */
+  String toRadixString(int radix) {
+    if (radix > 36) throw new RangeError.range(radix, 2, 36);
+
+    if (_used == 0) return "0";
+
+    if (_used == 1) {
+      var digitString = _digits[0].toRadixString(radix);
+      if (_isNegative) return "-" + digitString;
+      return digitString;
+    }
+
+    if (radix == 16) return _toHexString();
+
+    var base = new _BigIntImpl._fromInt(radix);
+    var reversedDigitCodeUnits = <int>[];
+    var rest = this.abs();
+    while (!rest._isZero) {
+      var digit = rest.remainder(base).toInt();
+      rest = rest ~/ base;
+      reversedDigitCodeUnits.add(_toRadixCodeUnit(digit));
+    }
+    var digitString = new String.fromCharCodes(reversedDigitCodeUnits.reversed);
+    if (_isNegative) return "-" + digitString;
+    return digitString;
+  }
+
+  String _toHexString() {
+    var chars = <int>[];
+    for (int i = 0; i < _used - 1; i++) {
+      int chunk = _digits[i];
+      for (int j = 0; j < (_digitBits ~/ 4); j++) {
+        chars.add(_toRadixCodeUnit(chunk & 0xF));
+        chunk >>= 4;
+      }
+    }
+    var msbChunk = _digits[_used - 1];
+    while (msbChunk != 0) {
+      chars.add(_toRadixCodeUnit(msbChunk & 0xF));
+      msbChunk >>= 4;
+    }
+    if (_isNegative) {
+      const _dash = 45;
+      chars.add(_dash);
+    }
+    return new String.fromCharCodes(chars.reversed);
+  }
+}
+
+// Interface for modular reduction.
+abstract class _BigIntReduction {
+  // Return the number of digits used by r_digits.
+  int convert(_BigIntImpl x, Uint16List r_digits);
+  int mul(Uint16List xDigits, int xUsed, Uint16List yDigits, int yUsed,
+      Uint16List resultDigits);
+  int sqr(Uint16List xDigits, int xUsed, Uint16List resultDigits);
+
+  // Return x reverted to _BigIntImpl.
+  _BigIntImpl revert(Uint16List xDigits, int xUsed);
+}
+
+// Modular reduction using "classic" algorithm.
+class _BigIntClassic implements _BigIntReduction {
+  final _BigIntImpl _modulus; // Modulus.
+  final _BigIntImpl _normalizedModulus; // Normalized _modulus.
+
+  _BigIntClassic(this._modulus)
+      : _normalizedModulus = _modulus <<
+            (_BigIntImpl._digitBits -
+                _modulus._digits[_modulus._used - 1].bitLength);
+
+  int convert(_BigIntImpl x, Uint16List resultDigits) {
+    var digits;
+    var used;
+    if (x._isNegative || x.compareTo(_modulus) >= 0) {
+      var remainder = x._rem(_modulus);
+      if (x._isNegative && !remainder._isNegative && remainder._used > 0) {
+        remainder = _modulus - remainder;
+      }
+      assert(!remainder._isNegative);
+      used = remainder._used;
+      digits = remainder._digits;
+    } else {
+      used = x._used;
+      digits = x._digits;
+    }
+    var i = used; // Copy leading zero if any.
+    while (--i >= 0) {
+      resultDigits[i] = digits[i];
+    }
+    return used;
+  }
+
+  _BigIntImpl revert(Uint16List xDigits, int xUsed) {
+    return new _BigIntImpl._(false, xUsed, xDigits);
+  }
+
+  int _reduce(Uint16List xDigits, int xUsed) {
+    if (xUsed < _modulus._used) {
+      return xUsed;
+    }
+    var reverted = revert(xDigits, xUsed);
+    var rem = reverted._rem(_normalizedModulus);
+    return convert(rem, xDigits);
+  }
+
+  int sqr(Uint16List xDigits, int xUsed, Uint16List resultDigits) {
+    var b = new _BigIntImpl._(false, xUsed, xDigits);
+    var b2 = b * b;
+    for (int i = 0; i < b2._used; i++) {
+      resultDigits[i] = b2._digits[i];
+    }
+    for (int i = b2._used; i < 2 * xUsed; i++) {
+      resultDigits[i] = 0;
+    }
+    return _reduce(resultDigits, 2 * xUsed);
+  }
+
+  int mul(Uint16List xDigits, int xUsed, Uint16List yDigits, int yUsed,
+      Uint16List resultDigits) {
+    var resultUsed =
+        _BigIntImpl._mulDigits(xDigits, xUsed, yDigits, yUsed, resultDigits);
+    return _reduce(resultDigits, resultUsed);
+  }
+}
diff --git a/sdk/lib/core/core.dart b/sdk/lib/core/core.dart
index 0eae3ec..bb46d6c 100644
--- a/sdk/lib/core/core.dart
+++ b/sdk/lib/core/core.dart
@@ -165,9 +165,10 @@
         StringConversionSink,
         utf8;
 import "dart:math" show Random; // Used by List.shuffle.
-import "dart:typed_data" show Uint8List;
+import "dart:typed_data" show Uint8List, Uint16List, Endian;
 
 part "annotations.dart";
+part "bigint.dart";
 part "bool.dart";
 part "comparable.dart";
 part "date_time.dart";
diff --git a/sdk/lib/core/core_sources.gni b/sdk/lib/core/core_sources.gni
index ad8e40d..ce2785e 100644
--- a/sdk/lib/core/core_sources.gni
+++ b/sdk/lib/core/core_sources.gni
@@ -7,6 +7,7 @@
 
   # The above file needs to be first as it lists the parts below.
   "annotations.dart",
+  "bigint.dart",
   "bool.dart",
   "comparable.dart",
   "date_time.dart",
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 0c46647..09a775c 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -64,7 +64,8 @@
         findDispatchTagForInterceptorClass,
         setNativeSubclassDispatchRecord,
         makeLeafDispatchRecord,
-        registerGlobalObject;
+        registerGlobalObject,
+        applyExtension;
 import 'dart:_interceptors'
     show
         Interceptor,
@@ -9745,6 +9746,7 @@
   Future<Entry> _getFile(String path, {Map options}) {
     var completer = new Completer<Entry>();
     __getFile(path, options: options, successCallback: (value) {
+      applyExtension('FileEntry', value);
       completer.complete(value);
     }, errorCallback: (error) {
       completer.completeError(error);
@@ -17234,6 +17236,7 @@
   Future<FileWriter> createWriter() {
     var completer = new Completer<FileWriter>();
     _createWriter((value) {
+      applyExtension('FileWriter', value);
       completer.complete(value);
     }, (error) {
       completer.completeError(error);
@@ -17253,6 +17256,7 @@
   Future<Blob> file() {
     var completer = new Completer<Blob>();
     _file((value) {
+      applyExtension('Blob', value);
       completer.complete(value);
     }, (error) {
       completer.completeError(error);
@@ -24429,7 +24433,7 @@
       String origin,
       String lastEventId,
       Window source,
-      List<MessagePort> messagePorts}) {
+      List<MessagePort> messagePorts: const []}) {
     if (source == null) {
       source = window;
     }
@@ -38402,6 +38406,8 @@
   Future<FileSystem> _requestFileSystem(int type, int size) {
     var completer = new Completer<FileSystem>();
     __requestFileSystem(type, size, (value) {
+      applyExtension('DOMFileSystem', value);
+      applyExtension('DirectoryEntry', value.root);
       completer.complete(value);
     }, (error) {
       completer.completeError(error);
@@ -46052,61 +46058,41 @@
     }
 
     var eventObj;
-    // In these two branches we create an underlying native KeyboardEvent, but
-    // we set it with our specified values. Because we are doing custom setting
-    // of certain values (charCode/keyCode, etc) only in this class (as opposed
-    // to KeyboardEvent) and the way we set these custom values depends on the
-    // type of underlying JS object, we do all the construction for the
-    // underlying KeyboardEvent here.
-    if (canUseDispatchEvent) {
-      // Currently works in everything but Internet Explorer.
-      eventObj = new Event.eventType('Event', type,
-          canBubble: canBubble, cancelable: cancelable);
 
-      JS('void', '#.keyCode = #', eventObj, keyCode);
-      JS('void', '#.which = #', eventObj, keyCode);
-      JS('void', '#.charCode = #', eventObj, charCode);
+    // Currently this works on everything but Safari. Safari throws an
+    // "Attempting to change access mechanism for an unconfigurable property"
+    // TypeError when trying to do the Object.defineProperty hack, so we avoid
+    // this branch if possible.
+    // Also, if we want this branch to work in FF, we also need to modify
+    // _initKeyboardEvent to also take charCode and keyCode values to
+    // initialize initKeyEvent.
 
-      JS('void', '#.location = #', eventObj, location);
-      JS('void', '#.ctrlKey = #', eventObj, ctrlKey);
-      JS('void', '#.altKey = #', eventObj, altKey);
-      JS('void', '#.shiftKey = #', eventObj, shiftKey);
-      JS('void', '#.metaKey = #', eventObj, metaKey);
-    } else {
-      // Currently this works on everything but Safari. Safari throws an
-      // "Attempting to change access mechanism for an unconfigurable property"
-      // TypeError when trying to do the Object.defineProperty hack, so we avoid
-      // this branch if possible.
-      // Also, if we want this branch to work in FF, we also need to modify
-      // _initKeyboardEvent to also take charCode and keyCode values to
-      // initialize initKeyEvent.
+    eventObj = new Event.eventType('KeyboardEvent', type,
+        canBubble: canBubble, cancelable: cancelable);
 
-      eventObj = new Event.eventType('KeyboardEvent', type,
-          canBubble: canBubble, cancelable: cancelable);
+    // Chromium Hack
+    JS(
+        'void',
+        "Object.defineProperty(#, 'keyCode', {"
+        "  get : function() { return this.keyCodeVal; } })",
+        eventObj);
+    JS(
+        'void',
+        "Object.defineProperty(#, 'which', {"
+        "  get : function() { return this.keyCodeVal; } })",
+        eventObj);
+    JS(
+        'void',
+        "Object.defineProperty(#, 'charCode', {"
+        "  get : function() { return this.charCodeVal; } })",
+        eventObj);
 
-      // Chromium Hack
-      JS(
-          'void',
-          "Object.defineProperty(#, 'keyCode', {"
-          "  get : function() { return this.keyCodeVal; } })",
-          eventObj);
-      JS(
-          'void',
-          "Object.defineProperty(#, 'which', {"
-          "  get : function() { return this.keyCodeVal; } })",
-          eventObj);
-      JS(
-          'void',
-          "Object.defineProperty(#, 'charCode', {"
-          "  get : function() { return this.charCodeVal; } })",
-          eventObj);
+    var keyIdentifier = _convertToHexString(charCode, keyCode);
+    eventObj._initKeyboardEvent(type, canBubble, cancelable, view,
+        keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey);
+    JS('void', '#.keyCodeVal = #', eventObj, keyCode);
+    JS('void', '#.charCodeVal = #', eventObj, charCode);
 
-      var keyIdentifier = _convertToHexString(charCode, keyCode);
-      eventObj._initKeyboardEvent(type, canBubble, cancelable, view,
-          keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey);
-      JS('void', '#.keyCodeVal = #', eventObj, keyCode);
-      JS('void', '#.charCodeVal = #', eventObj, charCode);
-    }
     // Tell dart2js that it smells like a KeyboardEvent!
     setDispatchProperty(eventObj, _keyboardEventDispatchRecord);
 
diff --git a/sdk/lib/html/html_common/conversions.dart b/sdk/lib/html/html_common/conversions.dart
index bf63ae6..a8e3329 100644
--- a/sdk/lib/html/html_common/conversions.dart
+++ b/sdk/lib/html/html_common/conversions.dart
@@ -77,7 +77,7 @@
   cleanupSlots() {} // Will be needed if we mark objects with a property.
   bool cloneNotRequired(object);
   newJsMap();
-  newJsList(length);
+  List newJsList(length);
   void putIntoMap(map, key, value);
 
   // Returns the input, or a clone of the input.
@@ -128,7 +128,7 @@
       // non-native properties or methods from interceptors and such, e.g.
       // an immutability marker. So we  had to stop doing that.
       var slot = findSlot(e);
-      var copy = readSlot(slot);
+      var copy = JS('List|Null', '#', readSlot(slot));
       if (copy != null) return copy;
       copy = copyList(e, slot);
       return copy;
@@ -137,7 +137,7 @@
     throw new UnimplementedError('structured clone of other type');
   }
 
-  copyList(List e, int slot) {
+  List copyList(List e, int slot) {
     int i = 0;
     int length = e.length;
     var copy = newJsList(length);
@@ -198,11 +198,11 @@
   }
 
   /// Iterate over the JS properties.
-  forEachJsField(object, action);
+  forEachJsField(object, action(key, value));
 
   /// Create a new Dart list of the given length. May create a native List or
   /// a JsArray, depending if we're in Dartium or dart2js.
-  newDartList(length);
+  List newDartList(length);
 
   walk(e) {
     if (e == null) return e;
@@ -237,18 +237,19 @@
     }
 
     if (isJavaScriptArray(e)) {
-      var slot = findSlot(e);
-      var copy = readSlot(slot);
+      var l = JS('List', '#', e);
+      var slot = findSlot(l);
+      var copy = JS('List|Null', '#', readSlot(slot));
       if (copy != null) return copy;
 
-      int length = e.length;
+      int length = l.length;
       // Since a JavaScript Array is an instance of Dart List, we can modify it
       // in-place unless we must copy.
-      copy = mustCopy ? newDartList(length) : e;
+      copy = mustCopy ? newDartList(length) : l;
       writeSlot(slot, copy);
 
       for (int i = 0; i < length; i++) {
-        copy[i] = walk(e[i]);
+        copy[i] = walk(l[i]);
       }
       return copy;
     }
diff --git a/sdk/lib/html/html_common/conversions_dart2js.dart b/sdk/lib/html/html_common/conversions_dart2js.dart
index c98b73c..0a315ec 100644
--- a/sdk/lib/html/html_common/conversions_dart2js.dart
+++ b/sdk/lib/html/html_common/conversions_dart2js.dart
@@ -13,7 +13,7 @@
 }
 
 /// Converts a flat Dart map into a JavaScript object with properties.
-convertDartToNative_Dictionary(Map dict, [void postCreate(dynamic)]) {
+convertDartToNative_Dictionary(Map dict, [void postCreate(Object f)]) {
   if (dict == null) return null;
   var object = JS('var', '{}');
   if (postCreate != null) {
@@ -60,11 +60,11 @@
 }
 
 class _AcceptStructuredCloneDart2Js extends _AcceptStructuredClone {
-  newJsList(length) => JS('JSExtendableArray', 'new Array(#)', length);
-  newDartList(length) => newJsList(length);
-  identicalInJs(a, b) => identical(a, b);
+  List newJsList(length) => JS('JSExtendableArray', 'new Array(#)', length);
+  List newDartList(length) => newJsList(length);
+  bool identicalInJs(a, b) => identical(a, b);
 
-  void forEachJsField(object, action) {
+  void forEachJsField(object, action(key, value)) {
     for (final key in JS('JSExtendableArray', 'Object.keys(#)', object)) {
       action(key, JS('var', '#[#]', object, key));
     }
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index 0e719b8..53090f7 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -560,8 +560,19 @@
     }
   }
 
-  Future<String> readAsString({Encoding encoding: utf8}) =>
-      readAsBytes().then((bytes) => _tryDecode(bytes, encoding));
+  Future<String> readAsString({Encoding encoding: utf8}) {
+    // TODO(dart:io): If the change in async semantics to run synchronously
+    // until await lands, this is as efficient as
+    // return _tryDecode(await readAsBytes(), encoding);
+    var stack = StackTrace.current;
+    return readAsBytes().then((bytes) {
+      try {
+        return _tryDecode(bytes, encoding);
+      } catch (e) {
+        return new Future.error(e, stack);
+      }
+    });
+  }
 
   String readAsStringSync({Encoding encoding: utf8}) =>
       _tryDecode(readAsBytesSync(), encoding);
diff --git a/sdk/lib/io/io_sink.dart b/sdk/lib/io/io_sink.dart
index 696288b..a8386dc 100644
--- a/sdk/lib/io/io_sink.dart
+++ b/sdk/lib/io/io_sink.dart
@@ -180,19 +180,19 @@
     if (_isBound) {
       throw new StateError("StreamSink is already bound to a stream");
     }
-    _isBound = true;
     if (_hasError) return done;
-    // Wait for any sync operations to complete.
-    Future targetAddStream() {
-      return _target.addStream(stream).whenComplete(() {
-        _isBound = false;
-      });
-    }
 
-    if (_controllerInstance == null) return targetAddStream();
-    var future = _controllerCompleter.future;
-    _controllerInstance.close();
-    return future.then((_) => targetAddStream());
+    _isBound = true;
+    var future = _controllerCompleter == null
+        ? _target.addStream(stream)
+        : _controllerCompleter.future.then((_) => _target.addStream(stream));
+    _controllerInstance?.close();
+
+    // Wait for any pending events in [_controller] to be dispatched before
+    // adding [stream].
+    return future.whenComplete(() {
+      _isBound = false;
+    });
   }
 
   Future flush() {
diff --git a/sdk/lib/io/socket.dart b/sdk/lib/io/socket.dart
index b2c24e7..3f89cff 100644
--- a/sdk/lib/io/socket.dart
+++ b/sdk/lib/io/socket.dart
@@ -577,9 +577,9 @@
    */
   InternetAddress get remoteAddress;
 
-  Future<Socket> close();
+  Future close();
 
-  Future<Socket> get done;
+  Future get done;
 }
 
 /**
diff --git a/sdk/lib/vmservice/message.dart b/sdk/lib/vmservice/message.dart
index 4e9ffd9..560ec63 100644
--- a/sdk/lib/vmservice/message.dart
+++ b/sdk/lib/vmservice/message.dart
@@ -7,7 +7,7 @@
 enum MessageType { Request, Notification, Response }
 
 class Message {
-  final Completer _completer = new Completer.sync();
+  final Completer<String> _completer = new Completer<String>.sync();
   bool get completed => _completer.isCompleted;
 
   /// Future of response.
@@ -187,7 +187,7 @@
     final receivePort = new RawReceivePort();
     receivePort.handler = (value) {
       receivePort.close();
-      _completer.complete(value);
+      _setResponseFromPort(value);
     };
     var keys = _makeAllString(params.keys.toList(growable: false));
     var values = _makeAllString(params.values.toList(growable: false));
@@ -235,34 +235,40 @@
     final receivePort = new RawReceivePort();
     receivePort.handler = (value) {
       receivePort.close();
-      _completer.complete(value);
+      _setResponseFromPort(value);
     };
+    final keys = params.keys.toList(growable: false);
+    final values = params.values.toList(growable: false);
+    if (!_methodNeedsObjectParameters(method)) {
+      _makeAllString(keys);
+      _makeAllString(values);
+    }
+
+    final request = new List(6)
+      ..[0] = 0 // Make room for OOB message type.
+      ..[1] = receivePort.sendPort
+      ..[2] = serial
+      ..[3] = method
+      ..[4] = keys
+      ..[5] = values;
+
     if (_methodNeedsObjectParameters(method)) {
       // We use a different method invocation path here.
-      var keys = params.keys.toList(growable: false);
-      var values = params.values.toList(growable: false);
-      var request = new List(6)
-        ..[0] = 0 // Make room for OOB message type.
-        ..[1] = receivePort.sendPort
-        ..[2] = serial
-        ..[3] = method
-        ..[4] = keys
-        ..[5] = values;
       sendObjectRootServiceMessage(request);
-      return _completer.future;
     } else {
-      var keys = _makeAllString(params.keys.toList(growable: false));
-      var values = _makeAllString(params.values.toList(growable: false));
-      var request = new List(6)
-        ..[0] = 0 // Make room for OOB message type.
-        ..[1] = receivePort.sendPort
-        ..[2] = serial
-        ..[3] = method
-        ..[4] = keys
-        ..[5] = values;
       sendRootServiceMessage(request);
-      return _completer.future;
     }
+
+    return _completer.future;
+  }
+
+  void _setResponseFromPort(response) {
+    if (response is List) {
+      // See JSONStream::PostReply for the format of messages that arrive from
+      // VM.
+      response = utf8.decode(response[0]);
+    }
+    _completer.complete(response);
   }
 
   void setResponse(String response) {
diff --git a/sdk/lib/vmservice/vmservice.dart b/sdk/lib/vmservice/vmservice.dart
index 717fe86..0fcfeef 100644
--- a/sdk/lib/vmservice/vmservice.dart
+++ b/sdk/lib/vmservice/vmservice.dart
@@ -531,14 +531,7 @@
     return encodeSuccess(message);
   }
 
-  static responseAsJson(portResponse) {
-    if (portResponse is String) {
-      return json.decode(portResponse);
-    } else {
-      var cstring = portResponse[0];
-      return json.fuse(utf8).decode(cstring);
-    }
-  }
+  static _responseAsJson(String response) => json.decode(response);
 
   // TODO(johnmccutchan): Turn this into a command line tool that uses the
   // service library.
@@ -563,12 +556,12 @@
     // Request VM.
     var getVM = Uri.parse('getVM');
     var getVmResponse =
-        responseAsJson(await new Message.fromUri(client, getVM).sendToVM());
+        _responseAsJson(await new Message.fromUri(client, getVM).sendToVM());
     responses[getVM.toString()] = getVmResponse['result'];
 
     // Request command line flags.
     var getFlagList = Uri.parse('getFlagList');
-    var getFlagListResponse = responseAsJson(
+    var getFlagListResponse = _responseAsJson(
         await new Message.fromUri(client, getFlagList).sendToVM());
     responses[getFlagList.toString()] = getFlagListResponse['result'];
 
@@ -578,13 +571,13 @@
         var message = new Message.forIsolate(client, request, isolate);
         // Decode the JSON and and insert it into the map. The map key
         // is the request Uri.
-        var response = responseAsJson(await isolate.routeRequest(message));
+        var response = _responseAsJson(await isolate.routeRequest(message));
         responses[message.toUri().toString()] = response['result'];
       }
       // Dump the object id ring requests.
       var message =
           new Message.forIsolate(client, Uri.parse('_dumpIdZone'), isolate);
-      var response = responseAsJson(await isolate.routeRequest(message));
+      var response = _responseAsJson(await isolate.routeRequest(message));
       // Insert getObject requests into responses map.
       for (var object in response['result']['objects']) {
         final requestUri =
@@ -597,7 +590,7 @@
     return encodeResult(message, responses);
   }
 
-  Future routeRequest(Message message) async {
+  Future<String> routeRequest(Message message) async {
     try {
       if (message.completed) {
         return await message.response;
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 2dc6f9c..be5d4a9 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -724,7 +724,6 @@
 LayoutTests/fast/events/scroll-event-does-not-bubble_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/events/scroll-event-phase_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/events/tabindex-removal-from-focused-element_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/eventsource/eventsource-attribute-listeners_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/eventsource/eventsource-constructor_t01: RuntimeError # https://github.com/dart-lang/sdk/issues/29814
 LayoutTests/fast/exclusions/parsing/parsing-wrap-flow_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/exclusions/parsing/parsing-wrap-through_t01: RuntimeError # Please triage this failure
@@ -1009,6 +1008,7 @@
 LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # Issue 16395
 LibTest/html/Element/isTagSupported_A01_t01: RuntimeError # Issue 25155
 LibTest/html/Element/marginEdge_A01_t01: RuntimeError # Issue 16574
+LibTest/html/Element/mouseOverEvent_A01_t01: RuntimeError, Pass # Issue 30068
 LibTest/html/Element/mouseWheelEvent_A01_t01: Skip # Times out. Please triage this failure
 LibTest/html/Element/onMouseWheel_A01_t01: Skip # Times out. Please triage this failure
 LibTest/html/Element/onTransitionEnd_A01_t01: Skip # Please triage this failure
@@ -3012,7 +3012,6 @@
 LayoutTests/fast/events/selectstart-on-selectall_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/events/selectstart-prevent-selectall_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/events/tabindex-removal-from-focused-element_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/eventsource/eventsource-attribute-listeners_t01: RuntimeError # Issue 28983
 LayoutTests/fast/eventsource/eventsource-constructor_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/exclusions/parsing/parsing-wrap-flow_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/exclusions/parsing/parsing-wrap-through_t01: RuntimeError # Please triage this failure
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index c643a7b..abe1e10 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -13,15 +13,31 @@
 # dartk: precompilation failures
 [ $compiler == dartkp ]
 Language/Classes/Constructors/Generative_Constructors/execution_of_an_initializer_t02: Pass
-Language/Expressions/Constants/bitwise_operators_t05: Crash
+Language/Classes/Superinterfaces/more_than_once_t01: MissingCompileTimeError # New entries after going from kernel-service to batch-mode compilation. Please investigate.
+Language/Classes/Superinterfaces/superclass_as_superinterface_t01: MissingCompileTimeError # New entries after going from kernel-service to batch-mode compilation. Please investigate.
+Language/Classes/definition_t23: RuntimeError # New entries after going from kernel-service to batch-mode compilation. Please investigate.
 Language/Expressions/Constants/depending_on_itself_t01: MissingCompileTimeError
+Language/Expressions/Constants/depending_on_itself_t01: Crash # New entries after going from kernel-service to batch-mode compilation. Please investigate.
 Language/Expressions/Constants/depending_on_itself_t02: MissingCompileTimeError
-Language/Expressions/Constants/logical_expression_t04: Crash
+Language/Expressions/Constants/depending_on_itself_t02: Crash # New entries after going from kernel-service to batch-mode compilation. Please investigate.
+Language/Expressions/Null/extend_or_implement_t02: MissingCompileTimeError # New entries after going from kernel-service to batch-mode compilation. Please investigate.
+Language/Expressions/Null/extend_or_implement_t03: MissingCompileTimeError # New entries after going from kernel-service to batch-mode compilation. Please investigate.
+Language/Expressions/Null/extend_or_implement_t04: MissingCompileTimeError # New entries after going from kernel-service to batch-mode compilation. Please investigate.
+Language/Expressions/Null/extend_or_implement_t05: MissingCompileTimeError # New entries after going from kernel-service to batch-mode compilation. Please investigate.
+Language/Mixins/Mixin_Application/syntax_t16: RuntimeError # New entries after going from kernel-service to batch-mode compilation. Please investigate.
 Language/Overview/Scoping/hiding_declaration_t11: Crash
 Language/Overview/Scoping/hiding_declaration_t11: Pass
 Language/Overview/Scoping/hiding_declaration_t12: Crash
 Language/Overview/Scoping/hiding_declaration_t12: Pass
 
+# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
+# are to be triaged.  Isolate tests are skipped on purpose due to the usage of
+# batch mode.
+[ $arch == simarm64 && $compiler == dartk && $mode == debug ]
+LibTest/core/DateTime/parse_A01_t02: Crash # Please triage.
+LibTest/core/DateTime/parse_A01_t03: Crash # Please triage.
+LibTest/core/DateTime/parse_A03_t01: Crash # Please triage.
+
 # dartk: JIT failures (debug)
 [ $compiler == dartk && $mode == debug ]
 LibTest/isolate/Isolate/spawnUri_A01_t04: Pass, Slow, Timeout
@@ -29,6 +45,21 @@
 [ $compiler == dartk && $strong ]
 *: SkipByDesign
 
+# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
+# are to be triaged.  Isolate tests are skipped on purpose due to the usage of
+# batch mode.
+[ $compiler == dartk && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
+Language/Classes/Superinterfaces/more_than_once_t01: MissingCompileTimeError # Please triaage.
+Language/Classes/Superinterfaces/superclass_as_superinterface_t01: MissingCompileTimeError # Please triaage.
+Language/Classes/definition_t23: RuntimeError # Please triaage.
+Language/Expressions/Null/extend_or_implement_t02: MissingCompileTimeError # Please triaage.
+Language/Expressions/Null/extend_or_implement_t03: MissingCompileTimeError # Please triaage.
+Language/Expressions/Null/extend_or_implement_t04: MissingCompileTimeError # Please triaage.
+Language/Expressions/Null/extend_or_implement_t05: MissingCompileTimeError # Please triaage.
+Language/Expressions/Spawning_an_Isolate/*: Skip
+Language/Mixins/Mixin_Application/syntax_t16: RuntimeError # Please triaage.
+LibTest/isolate/*/*: Skip
+
 # dartk: precompilation failures (debug)
 [ $compiler == dartkp && $mode == debug ]
 Language/Functions/External_Functions/not_connected_to_a_body_t01: Crash
diff --git a/tests/compiler/dart2js/all_native_test.dart b/tests/compiler/dart2js/all_native_test.dart
index 24cbdb2..3d1d5fd 100644
--- a/tests/compiler/dart2js/all_native_test.dart
+++ b/tests/compiler/dart2js/all_native_test.dart
@@ -3,23 +3,34 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/common/names.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:expect/expect.dart';
 import 'memory_compiler.dart';
 
 main() {
   asyncTest(() async {
-    DiagnosticCollector collector = new DiagnosticCollector();
-    await runCompiler(
-        entryPoint: Uris.dart_html,
-        diagnosticHandler: collector,
-        options: [Flags.analyzeAll, Flags.verbose]);
-    int allNativeUsedCount =
-        collector.verboseInfos.where((CollectedMessage message) {
-      return message.text.startsWith('All native types marked as used due to ');
-    }).length;
-    Expect.equals(
-        1, allNativeUsedCount, "Unexpected message count: $allNativeUsedCount");
+    print('--test from ast---------------------------------------------------');
+    await test([]);
+    print('--test from kernel------------------------------------------------');
+    await test([Flags.useKernel]);
   });
 }
+
+test(List<String> options) async {
+  DiagnosticCollector collector = new DiagnosticCollector();
+  await runCompiler(
+      memorySourceFiles: {
+        'main.dart': '''
+        import 'dart:html';
+        main() => document;
+        '''
+      },
+      diagnosticHandler: collector,
+      options: [Flags.analyzeAll, Flags.verbose]..addAll(options));
+  int allNativeUsedCount =
+      collector.verboseInfos.where((CollectedMessage message) {
+    return message.text.startsWith('All native types marked as used due to ');
+  }).length;
+  Expect.equals(
+      1, allNativeUsedCount, "Unexpected message count: $allNativeUsedCount");
+}
diff --git a/tests/compiler/dart2js/arithmetic_simplification_test.dart b/tests/compiler/dart2js/arithmetic_simplification_test.dart
index 09b1e32..6c2d57d 100644
--- a/tests/compiler/dart2js/arithmetic_simplification_test.dart
+++ b/tests/compiler/dart2js/arithmetic_simplification_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test constant folding on numbers.
 
-import 'dart:async';
 import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
@@ -79,14 +78,29 @@
   var timesOne = new RegExp(r"\* 1");
   var oneTimes = new RegExp(r"1 \*");
 
-  asyncTest(() => Future.wait([
-        compileAndDoNotMatch(INT_PLUS_ZERO, 'main', plusZero),
-        compileAndDoNotMatch(ZERO_PLUS_INT, 'main', zeroPlus),
-        compileAndMatch(NUM_PLUS_ZERO, 'main', plusZero),
-        compileAndMatch(ZERO_PLUS_NUM, 'main', zeroPlus),
-        compileAndDoNotMatch(INT_TIMES_ONE, 'main', timesOne),
-        compileAndDoNotMatch(ONE_TIMES_INT, 'main', oneTimes),
-        compileAndDoNotMatch(NUM_TIMES_ONE, 'main', timesOne),
-        compileAndDoNotMatch(ONE_TIMES_NUM, 'main', oneTimes),
-      ]));
+  test(CompileMode compileMode) async {
+    await compileAndDoNotMatch(INT_PLUS_ZERO, 'main', plusZero,
+        compileMode: compileMode);
+    await compileAndDoNotMatch(ZERO_PLUS_INT, 'main', zeroPlus,
+        compileMode: compileMode);
+    await compileAndMatch(NUM_PLUS_ZERO, 'main', plusZero,
+        compileMode: compileMode);
+    await compileAndMatch(ZERO_PLUS_NUM, 'main', zeroPlus,
+        compileMode: compileMode);
+    await compileAndDoNotMatch(INT_TIMES_ONE, 'main', timesOne,
+        compileMode: compileMode);
+    await compileAndDoNotMatch(ONE_TIMES_INT, 'main', oneTimes,
+        compileMode: compileMode);
+    await compileAndDoNotMatch(NUM_TIMES_ONE, 'main', timesOne,
+        compileMode: compileMode);
+    await compileAndDoNotMatch(ONE_TIMES_NUM, 'main', oneTimes,
+        compileMode: compileMode);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await test(CompileMode.memory);
+    print('--test from kernel------------------------------------------------');
+    await test(CompileMode.kernel);
+  });
 }
diff --git a/tests/compiler/dart2js/array_static_intercept_test.dart b/tests/compiler/dart2js/array_static_intercept_test.dart
index dbe3978..0ad768d 100644
--- a/tests/compiler/dart2js/array_static_intercept_test.dart
+++ b/tests/compiler/dart2js/array_static_intercept_test.dart
@@ -15,10 +15,20 @@
 """;
 
 main() {
-  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
-        Expect.isTrue(generated.contains(r'.add$1('));
-        Expect.isTrue(generated.contains(r'.removeLast$0('));
-        Expect.isTrue(generated.contains(r'.length'),
-            "Unexpected code to contain '.length':\n$generated");
-      }));
+  test(CompileMode compileMode) async {
+    await compile(TEST_ONE, entry: 'foo', compileMode: compileMode,
+        check: (String generated) {
+      Expect.isTrue(generated.contains(r'.add$1('));
+      Expect.isTrue(generated.contains(r'.removeLast$0('));
+      Expect.isTrue(generated.contains(r'.length'),
+          "Unexpected code to contain '.length':\n$generated");
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await test(CompileMode.memory);
+    print('--test from kernel------------------------------------------------');
+    await test(CompileMode.kernel);
+  });
 }
diff --git a/tests/compiler/dart2js/async_compiler_input_provider_test.dart b/tests/compiler/dart2js/async_compiler_input_provider_test.dart
index b178c3e..7ce403a0 100644
--- a/tests/compiler/dart2js/async_compiler_input_provider_test.dart
+++ b/tests/compiler/dart2js/async_compiler_input_provider_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// TODO(johnniwinther): Port this test to use '--use-kernel'.
+
 import "dart:async";
 import "dart:io";
 
diff --git a/tests/compiler/dart2js/bad_output_io_test.dart b/tests/compiler/dart2js/bad_output_io_test.dart
index 96cc736..487af98 100644
--- a/tests/compiler/dart2js/bad_output_io_test.dart
+++ b/tests/compiler/dart2js/bad_output_io_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// TODO(johnniwinther): Port this test to use '--use-kernel'.
+
 // Test that the compiler can handle imports when package root has not been set.
 
 library dart2js.test.bad_output_io;
diff --git a/tests/compiler/dart2js/boolified_operator_test.dart b/tests/compiler/dart2js/boolified_operator_test.dart
deleted file mode 100644
index 6f51ac4..0000000
--- a/tests/compiler/dart2js/boolified_operator_test.dart
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library boolified_operator_test;
-
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_EQUAL = r"""
-foo(param0, param1) {
-  if (param0 == param1) return 0;
-  return 1;
-}
-""";
-
-const String TEST_EQUAL_NULL = r"""
-foo(param0) {
-  if (param0 == null) return 0;
-  return 1;
-}
-""";
-
-const String TEST_LESS = r"""
-foo(param0, param1) {
-  if (param0 < param1) return 0;
-  return 1;
-}
-""";
-
-const String TEST_LESS_EQUAL = r"""
-foo(param0, param1) {
-  if (param0 <= param1) return 0;
-  return 1;
-}
-""";
-const String TEST_GREATER = r"""
-foo(param0, param1) {
-  if (param0 > param1) return 0;
-  return 1;
-}
-""";
-
-const String TEST_GREATER_EQUAL = r"""
-foo(param0, param1) {
-  if (param0 >= param1) return 0;
-  return 1;
-}
-""";
-
-main() {
-  asyncTest(() => Future.wait([
-        compile(TEST_EQUAL, entry: 'foo', check: (String generated) {
-          Expect.isFalse(generated.contains('=== true'));
-          Expect.isTrue(generated.contains('eqB'));
-        }),
-        compile(TEST_EQUAL_NULL, entry: 'foo', check: (String generated) {
-          Expect.isFalse(generated.contains('=== true'));
-          Expect.isTrue(generated.contains('== null'));
-        }),
-        compile(TEST_LESS, entry: 'foo', check: (String generated) {
-          Expect.isFalse(generated.contains('=== true'));
-          Expect.isTrue(generated.contains('ltB'));
-        }),
-        compile(TEST_LESS_EQUAL, entry: 'foo', check: (String generated) {
-          Expect.isFalse(generated.contains('=== true'));
-          Expect.isTrue(generated.contains('leB'));
-        }),
-        compile(TEST_GREATER, entry: 'foo', check: (String generated) {
-          Expect.isFalse(generated.contains('=== true'));
-          Expect.isTrue(generated.contains('gtB'));
-        }),
-        compile(TEST_GREATER_EQUAL, entry: 'foo', check: (String generated) {
-          Expect.isFalse(generated.contains('=== true'));
-          Expect.isTrue(generated.contains('geB'));
-        }),
-      ]));
-}
diff --git a/tests/compiler/dart2js/boolify_test.dart b/tests/compiler/dart2js/boolify_test.dart
index 12685a3..fb382cb 100644
--- a/tests/compiler/dart2js/boolify_test.dart
+++ b/tests/compiler/dart2js/boolify_test.dart
@@ -17,7 +17,17 @@
 """;
 
 main() {
-  asyncTest(() => compile(TEST, entry: 'foo', check: (String generated) {
-        Expect.isTrue(generated.contains('foo() !== true)'));
-      }));
+  test(CompileMode compileMode) async {
+    await compile(TEST, entry: 'foo', compileMode: compileMode,
+        check: (String generated) {
+      Expect.isTrue(generated.contains('foo() !== true)'));
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await test(CompileMode.memory);
+    print('--test from kernel------------------------------------------------');
+    await test(CompileMode.kernel);
+  });
 }
diff --git a/tests/compiler/dart2js/builtin_equals_test.dart b/tests/compiler/dart2js/builtin_equals_test.dart
index e60bdd5..6571c34 100644
--- a/tests/compiler/dart2js/builtin_equals_test.dart
+++ b/tests/compiler/dart2js/builtin_equals_test.dart
@@ -18,12 +18,23 @@
 """;
 
 main() {
-  asyncTest(() => compile(TEST, entry: 'foo', enableTypeAssertions: true,
-          check: (String generated) {
-        Expect.isTrue(!generated.contains('eqB'));
+  test(CompileMode compileMode) async {
+    await compile(TEST,
+        entry: 'foo',
+        enableTypeAssertions: true,
+        compileMode: compileMode, check: (String generated) {
+      Expect.isTrue(!generated.contains('eqB'));
 
-        RegExp regexp = new RegExp('==');
-        Iterator<Match> matches = regexp.allMatches(generated).iterator;
-        checkNumberOfMatches(matches, 4);
-      }));
+      RegExp regexp = new RegExp('==');
+      Iterator<Match> matches = regexp.allMatches(generated).iterator;
+      checkNumberOfMatches(matches, 4);
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await test(CompileMode.memory);
+    print('--test from kernel------------------------------------------------');
+    await test(CompileMode.kernel);
+  });
 }
diff --git a/tests/compiler/dart2js/builtin_interceptor_test.dart b/tests/compiler/dart2js/builtin_interceptor_test.dart
index a9ae6b2..19533c0 100644
--- a/tests/compiler/dart2js/builtin_interceptor_test.dart
+++ b/tests/compiler/dart2js/builtin_interceptor_test.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.
 
-import 'dart:async';
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
@@ -26,15 +25,25 @@
 """;
 
 main() {
-  asyncTest(() => Future.wait([
-        compile(TEST_ONE, entry: 'foo', check: (String generated) {
-          Expect.isTrue(generated.contains("return 3;"));
-        }),
-        compile(TEST_TWO, entry: 'foo', check: (String generated) {
-          Expect.isTrue(generated.contains("return 3;"));
-        }),
-        compile(TEST_THREE, entry: 'foo', check: (String generated) {
-          Expect.isTrue(generated.contains("push(2);"));
-        }),
-      ]));
+  test(CompileMode compileMode) async {
+    await compile(TEST_ONE, entry: 'foo', compileMode: compileMode,
+        check: (String generated) {
+      Expect.isTrue(generated.contains("return 3;"));
+    });
+    await compile(TEST_TWO, entry: 'foo', compileMode: compileMode,
+        check: (String generated) {
+      Expect.isTrue(generated.contains("return 3;"));
+    });
+    await compile(TEST_THREE, entry: 'foo', compileMode: compileMode,
+        check: (String generated) {
+      Expect.isTrue(generated.contains("push(2);"));
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await test(CompileMode.memory);
+    print('--test from kernel------------------------------------------------');
+    await test(CompileMode.kernel);
+  });
 }
diff --git a/tests/compiler/dart2js/class_set_test.dart b/tests/compiler/dart2js/class_set_test.dart
index 84f18fd..8a9fe87 100644
--- a/tests/compiler/dart2js/class_set_test.dart
+++ b/tests/compiler/dart2js/class_set_test.dart
@@ -18,7 +18,7 @@
 void main() {
   asyncTest(() async {
     await testAll(CompileMode.memory);
-    await testAll(CompileMode.dill);
+    await testAll(CompileMode.kernel);
   });
 }
 
diff --git a/tests/compiler/dart2js/compiler_annotations.dart b/tests/compiler/dart2js/compiler_annotations.dart
deleted file mode 100644
index c920add..0000000
--- a/tests/compiler/dart2js/compiler_annotations.dart
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library compiler_annotations;
-
-// This library contains annotations useful for testing.
-
-// TODO(ngeoffray): Implement in dart2js.
-class DontInline {
-  const DontInline();
-}
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index c74ad57..9462622 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -12,6 +12,7 @@
 import 'package:compiler/src/common_elements.dart';
 
 import 'package:compiler/src/elements/elements.dart';
+import 'package:compiler/src/elements/entities.dart';
 export 'package:compiler/src/elements/elements.dart';
 
 import 'package:compiler/src/js_backend/js_backend.dart' as js;
@@ -45,6 +46,8 @@
 import 'output_collector.dart';
 export 'output_collector.dart';
 
+enum CompileMode { mock, memory, kernel }
+
 /// Compile [code] and returns either the code for [entry] or, if [returnAll] is
 /// true, the code for the entire program.
 ///
@@ -58,11 +61,11 @@
     bool analyzeAll: false,
     bool disableInlining: true,
     bool trustJSInteropTypeAnnotations: false,
-    bool useMock: false,
+    CompileMode compileMode: CompileMode.memory,
     void check(String generatedEntry),
     bool returnAll: false}) async {
   OutputCollector outputCollector = returnAll ? new OutputCollector() : null;
-  if (useMock) {
+  if (compileMode == CompileMode.mock) {
     // TODO(johnniwinther): Remove this when no longer needed by
     // `arithmetic_simplication_test.dart`.
     MockCompiler compiler = new MockCompiler.internal(
@@ -111,6 +114,9 @@
     if (trustJSInteropTypeAnnotations) {
       options.add(Flags.trustJSInteropTypeAnnotations);
     }
+    if (compileMode == CompileMode.kernel) {
+      options.add(Flags.useKernel);
+    }
 
     if (disableInlining) {
       options.add(Flags.disableInlining);
@@ -129,9 +135,11 @@
         outputProvider: outputCollector);
     Expect.isTrue(result.isSuccess);
     Compiler compiler = result.compiler;
-    LibraryElement mainApp =
-        compiler.frontendStrategy.elementEnvironment.mainLibrary;
-    MemberElement element = mainApp.find(entry);
+    ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+    ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
+    LibraryEntity mainLibrary = elementEnvironment.mainLibrary;
+    FunctionEntity element =
+        elementEnvironment.lookupLibraryMember(mainLibrary, entry);
     js.JavaScriptBackend backend = compiler.backend;
     String generated = backend.getGeneratedCode(element);
     if (check != null) {
@@ -231,16 +239,18 @@
 }
 
 Future compileAndMatch(String code, String entry, RegExp regexp,
-    {bool useMock: false}) {
-  return compile(code, entry: entry, useMock: useMock,
+    {CompileMode compileMode: CompileMode.memory}) {
+  return compile(code, entry: entry, compileMode: compileMode,
       check: (String generated) {
     Expect.isTrue(
         regexp.hasMatch(generated), '"$generated" does not match /$regexp/');
   });
 }
 
-Future compileAndDoNotMatch(String code, String entry, RegExp regexp) {
-  return compile(code, entry: entry, check: (String generated) {
+Future compileAndDoNotMatch(String code, String entry, RegExp regexp,
+    {CompileMode compileMode: CompileMode.memory}) {
+  return compile(code, entry: entry, compileMode: compileMode,
+      check: (String generated) {
     Expect.isFalse(
         regexp.hasMatch(generated), '"$generated" has a match in /$regexp/');
   });
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index d189e0d..f7e0d06 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -6,8 +6,8 @@
 async_await_syntax_test: Pass # DON'T CHANGE THIS LINE -- Don't mark these tests as failing. Instead, fix the errors/warnings that they report or update the whitelist in the test-files to temporarily allow digression.
 backend_dart/opt_cyclic_redundant_phi_test: Fail # Issue 20159
 boolified_operator_test: Fail # Issue 8001
-check_elements_invariants_test: Skip # Times out even with Slow marker. Slow due to inlining in the CPS backend
-compile_with_empty_libraries_test: Fail # Issue 24223
+old_frontend/check_elements_invariants_test: Skip # Times out even with Slow marker. Slow due to inlining in the CPS backend
+old_frontend/compile_with_empty_libraries_test: Fail # Issue 24223
 equivalence/id_equivalence_test: Pass, Slow
 gvn_dynamic_field_get_test: Fail # Issue 18519
 inference/inference_test: Slow, Pass
@@ -52,11 +52,11 @@
 uri_retention_test: Fail # Issue 26504
 
 [ $mode == debug ]
-analyze_api_test: Pass, Slow # DON'T CHANGE THIS LINE -- Don't mark these tests as failing. Instead, fix the errors/warnings that they report or update the whitelist in the test-files to temporarily allow digression.
-analyze_dart2js_test: Pass, Slow # DON'T CHANGE THIS LINE -- Don't mark these tests as failing. Instead, fix the errors/warnings that they report or update the whitelist in the test-files to temporarily allow digression.
-analyze_unused_dart2js_test: Pass, Slow
-check_elements_invariants_test: Skip # Slow and only needs to be run in one configuration
-check_members_test: Pass, Slow
+old_frontend/analyze_api_test: Pass, Slow # DON'T CHANGE THIS LINE -- Don't mark these tests as failing. Instead, fix the errors/warnings that they report or update the whitelist in the test-files to temporarily allow digression.
+old_frontend/analyze_dart2js_test: Pass, Slow # DON'T CHANGE THIS LINE -- Don't mark these tests as failing. Instead, fix the errors/warnings that they report or update the whitelist in the test-files to temporarily allow digression.
+old_frontend/analyze_unused_dart2js_test: Pass, Slow
+old_frontend/check_elements_invariants_test: Skip # Slow and only needs to be run in one configuration
+old_frontend/check_members_test: Pass, Slow
 dart2js_batch_test: Pass, Slow
 deferred_load_graph_segmentation_test: Pass, Slow
 deferred_load_mapping_test: Pass, Slow
@@ -74,9 +74,9 @@
 dart2js_batch2_test: Pass, RuntimeError # Issue 29021
 
 [ $checked ]
-analyze_dart2js_helpers_test: Pass, Slow
-analyze_dart2js_test: Pass, Slow
-analyze_unused_dart2js_test: Pass, Slow
+old_frontend/analyze_dart2js_helpers_test: Pass, Slow
+old_frontend/analyze_dart2js_test: Pass, Slow
+old_frontend/analyze_unused_dart2js_test: Pass, Slow
 dart2js_resolver_test: Pass, Slow
 deferred_mirrors_test: Pass, Slow
 duplicate_library_test: Pass, Slow
diff --git a/tests/compiler/dart2js/deferred_closures_test.dart b/tests/compiler/dart2js/deferred_closures_test.dart
index f65fc1c..747b9a9 100644
--- a/tests/compiler/dart2js/deferred_closures_test.dart
+++ b/tests/compiler/dart2js/deferred_closures_test.dart
@@ -52,10 +52,6 @@
   "lib.dart": """
     library deferred;
 
-    unique_method_name() {
-      return (() => print("unique-string"))();
-      // TODO(sigmund): this line prevents inlining, but it should not be
-      // necessary: the kernel pipeline is incorrectly inlining this method.
-      return "1";
-    }"""
+    unique_method_name() => (() => print("unique-string"))();
+    """
 };
diff --git a/tests/compiler/dart2js/equivalence/show_helper.dart b/tests/compiler/dart2js/equivalence/show_helper.dart
new file mode 100644
index 0000000..aa46e75
--- /dev/null
+++ b/tests/compiler/dart2js/equivalence/show_helper.dart
@@ -0,0 +1,71 @@
+// 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.
+
+/// Helper program that shows the equivalence-based data on a dart program.
+
+import 'dart:io';
+import 'package:args/args.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/filenames.dart';
+import 'package:compiler/src/inferrer/inferrer_engine.dart';
+import 'package:compiler/src/io/source_file.dart';
+import 'package:compiler/src/source_file_provider.dart';
+import '../kernel/test_helpers.dart';
+import 'id_equivalence_helper.dart';
+
+show(List<String> args, ComputeMemberDataFunction computeAstData,
+    ComputeMemberDataFunction computeKernelData) async {
+  ArgParser argParser = new ArgParser(allowTrailingOptions: true);
+  argParser.addFlag('verbose', negatable: true, defaultsTo: false);
+  argParser.addFlag('colors', negatable: true);
+  argParser.addFlag('use-kernel', negatable: false, defaultsTo: false);
+  ArgResults argResults = argParser.parse(args);
+  if (argResults.wasParsed('colors')) {
+    useColors = argResults['colors'];
+  }
+  bool verbose = argResults['verbose'];
+  bool useKernel = argResults['use-kernel'];
+
+  InferrerEngineImpl.useSorterForTesting = true;
+  String file = argResults.rest.first;
+  List<String> show;
+  if (argResults.rest.length > 1) {
+    show = argResults.rest.skip(1).toList();
+  }
+
+  Uri entryPoint = Uri.base.resolve(nativeToUriPath(file));
+  List<String> options = <String>[];
+  if (useKernel) {
+    options.add(Flags.useKernel);
+  }
+  CompiledData data = await computeData(
+      entryPoint, const {}, useKernel ? computeKernelData : computeAstData,
+      options: options,
+      forMainLibraryOnly: false,
+      skipUnprocessedMembers: true,
+      skipFailedCompilations: true,
+      verbose: verbose);
+  if (data == null) {
+    print('Compilation failed.');
+  } else {
+    SourceFileProvider provider = data.compiler.provider;
+    for (Uri uri in data.actualMaps.keys) {
+      if (show != null && !show.any((f) => '$uri'.endsWith(f))) {
+        continue;
+      }
+      uri = resolveFastaUri(uri);
+      SourceFile sourceFile = await provider.autoReadFromFile(uri);
+      String sourceCode = sourceFile?.slowText();
+      if (sourceCode == null) {
+        sourceCode = new File.fromUri(uri).readAsStringSync();
+      }
+      if (sourceCode == null) {
+        print('--source code missing for $uri--------------------------------');
+      } else {
+        print('--annotations for $uri----------------------------------------');
+        print(withAnnotations(sourceCode, data.computeAnnotations(uri)));
+      }
+    }
+  }
+}
diff --git a/tests/compiler/dart2js/frontend_checker.dart b/tests/compiler/dart2js/frontend_checker.dart
index 09043312..c210ba2 100644
--- a/tests/compiler/dart2js/frontend_checker.dart
+++ b/tests/compiler/dart2js/frontend_checker.dart
@@ -14,7 +14,7 @@
 import 'memory_compiler.dart';
 
 import '../../../tools/testing/dart/multitest.dart'
-    show ExtractTestsFromMultitest;
+    show extractTestsFromMultitest;
 import '../../../tools/testing/dart/path.dart' show Path;
 
 /// Check the analysis of the multitests in [testFiles] to result in the
@@ -37,7 +37,7 @@
         Map<String, String> testSources = {};
         Map<String, Set<String>> testOutcomes = {};
         String fileName = 'tests/$testFile';
-        ExtractTestsFromMultitest(
+        extractTestsFromMultitest(
             new Path(fileName), testSources, testOutcomes);
         return Future.forEach(testSources.keys, (String testName) async {
           String testFileName = '$fileName/$testName';
diff --git a/tests/compiler/dart2js/function_type_variable_test.dart b/tests/compiler/dart2js/function_type_variable_test.dart
index 0193b35..a7b833c 100644
--- a/tests/compiler/dart2js/function_type_variable_test.dart
+++ b/tests/compiler/dart2js/function_type_variable_test.dart
@@ -14,6 +14,8 @@
   const FunctionTypeData('void', 'F2', '<S>(S s)'),
   const FunctionTypeData('void', 'F3', '<U, V>(U u, V v)'),
   const FunctionTypeData('void', 'F4', '<U, V>(V v, U u)'),
+  const FunctionTypeData('void', 'F5', '<W extends num>(W w)'),
+  const FunctionTypeData('void', 'F6', '<X extends int>(X x)'),
 ];
 
 main() {
@@ -23,12 +25,21 @@
         .create(createTypedefs(existentialTypeData, additionalData: """
     class C1 {}
     class C2 {}
-  """), compileMode: CompileMode.dill);
+  """), compileMode: CompileMode.kernel);
 
     testToString(FunctionType type, String expectedToString) {
       Expect.equals(expectedToString, type.toString());
     }
 
+    testBounds(FunctionType type, List<DartType> expectedBounds) {
+      Expect.equals(expectedBounds.length, type.typeVariables.length,
+          "Unexpected type variable count in $type.");
+      for (int i = 0; i < expectedBounds.length; i++) {
+        Expect.equals(expectedBounds[i], type.typeVariables[i].bound,
+            "Unexpected ${i}th bound in $type.");
+      }
+    }
+
     testInstantiate(FunctionType type, List<DartType> instantiation,
         String expectedToString) {
       DartType result = type.instantiate(instantiation);
@@ -36,51 +47,95 @@
           "Unexpected instantiation of $type with $instantiation: $result");
     }
 
-    testEquals(DartType a, DartType b, bool expectedEquals) {
+    testRelations(DartType a, DartType b, bool areEqual, bool isSubtype) {
       Expect.equals(
-          expectedEquals, a == b, "Unexpected equality for $a and $b.");
+          areEqual,
+          a == b,
+          "Expected `$a` and `$b` to be ${areEqual ? 'equal' : 'non-equal'}, "
+          "but they are not.");
+      Expect.equals(
+          isSubtype,
+          env.isSubtype(a, b),
+          "Expected `$a` ${isSubtype ? '' : 'not '}to be a subtype of `$b`, "
+          "but it is${isSubtype ? ' not' : ''}.");
     }
 
+    InterfaceType Object_ = env['Object'];
+    InterfaceType num_ = env['num'];
+    InterfaceType int_ = env['int'];
     InterfaceType C1 = instantiate(env.getClass('C1'), []);
     InterfaceType C2 = instantiate(env.getClass('C2'), []);
     FunctionType F1 = env.getFieldType('F1');
     FunctionType F2 = env.getFieldType('F2');
     FunctionType F3 = env.getFieldType('F3');
     FunctionType F4 = env.getFieldType('F4');
+    FunctionType F5 = env.getFieldType('F5');
+    FunctionType F6 = env.getFieldType('F6');
 
     testToString(F1, 'void Function<#A>(#A)');
     testToString(F2, 'void Function<#A>(#A)');
     testToString(F3, 'void Function<#A,#B>(#A,#B)');
     testToString(F4, 'void Function<#A,#B>(#B,#A)');
+    testToString(F5, 'void Function<#A extends num>(#A)');
+    testToString(F6, 'void Function<#A extends int>(#A)');
+
+    testBounds(F1, [Object_]);
+    testBounds(F2, [Object_]);
+    testBounds(F3, [Object_, Object_]);
+    testBounds(F4, [Object_, Object_]);
+    testBounds(F5, [num_]);
+    testBounds(F6, [int_]);
 
     testInstantiate(F1, [C1], 'void Function(C1)');
     testInstantiate(F2, [C2], 'void Function(C2)');
     testInstantiate(F3, [C1, C2], 'void Function(C1,C2)');
     testInstantiate(F4, [C1, C2], 'void Function(C2,C1)');
+    testInstantiate(F5, [num_], 'void Function(num)');
+    testInstantiate(F6, [int_], 'void Function(int)');
 
-    testEquals(F1, F1, true);
-    testEquals(F1, F2, true);
-    testEquals(F1, F3, false);
-    testEquals(F1, F4, false);
+    testRelations(F1, F1, true, true);
+    testRelations(F1, F2, true, true);
+    testRelations(F1, F3, false, false);
+    testRelations(F1, F4, false, false);
+    testRelations(F1, F5, false, false);
+    testRelations(F1, F6, false, false);
 
-    testEquals(F2, F1, true);
-    testEquals(F2, F2, true);
-    testEquals(F2, F3, false);
-    testEquals(F2, F4, false);
+    testRelations(F2, F1, true, true);
+    testRelations(F2, F2, true, true);
+    testRelations(F2, F3, false, false);
+    testRelations(F2, F4, false, false);
+    testRelations(F2, F5, false, false);
+    testRelations(F2, F6, false, false);
 
-    testEquals(F3, F1, false);
-    testEquals(F3, F2, false);
-    testEquals(F3, F3, true);
-    testEquals(F3, F4, false);
+    testRelations(F3, F1, false, false);
+    testRelations(F3, F2, false, false);
+    testRelations(F3, F3, true, true);
+    testRelations(F3, F4, false, false);
+    testRelations(F3, F5, false, false);
+    testRelations(F3, F6, false, false);
 
-    testEquals(F4, F1, false);
-    testEquals(F4, F2, false);
-    testEquals(F4, F3, false);
-    testEquals(F4, F4, true);
+    testRelations(F4, F1, false, false);
+    testRelations(F4, F2, false, false);
+    testRelations(F4, F3, false, false);
+    testRelations(F4, F4, true, true);
+    testRelations(F4, F5, false, false);
+    testRelations(F4, F6, false, false);
 
-    testEquals(F1.typeVariables.first, F1.typeVariables.first, true);
-    testEquals(F1.typeVariables.first, F2.typeVariables.first, false);
+    testRelations(F5, F1, false, false);
+    testRelations(F5, F2, false, false);
+    testRelations(F5, F3, false, false);
+    testRelations(F5, F4, false, false);
+    testRelations(F5, F5, true, true);
+    testRelations(F5, F6, false, false);
 
-    // TODO(johnniwinther): Test subtyping.
+    testRelations(F6, F1, false, false);
+    testRelations(F6, F2, false, false);
+    testRelations(F6, F3, false, false);
+    testRelations(F6, F4, false, false);
+    testRelations(F6, F5, false, false);
+    testRelations(F6, F6, true, true);
+
+    testRelations(F1.typeVariables.first, F1.typeVariables.first, true, true);
+    testRelations(F1.typeVariables.first, F2.typeVariables.first, false, false);
   });
 }
diff --git a/tests/compiler/dart2js/generic_method_test.dart b/tests/compiler/dart2js/generic_method_test.dart
index 69412bd..8f01ba3 100644
--- a/tests/compiler/dart2js/generic_method_test.dart
+++ b/tests/compiler/dart2js/generic_method_test.dart
@@ -16,6 +16,8 @@
   const FunctionTypeData("void", "2", "<T, S>(T t, S s)"),
   const FunctionTypeData("void", "3", "<T, S>(T t, [S s])"),
   const FunctionTypeData("void", "4", "<T, S>(T t, {S s})"),
+  const FunctionTypeData("void", "5", "<T extends num>(T t)"),
+  const FunctionTypeData("void", "6", "<T extends int>(T t)"),
 ];
 
 main() {
@@ -25,7 +27,7 @@
     TypeEnvironment env = await TypeEnvironment.create("""
       ${createTypedefs(signatures, prefix: 't')}
       ${createMethods(signatures, prefix: 'm')}
-    """, compileMode: CompileMode.dill);
+    """, compileMode: CompileMode.kernel);
 
     for (FunctionTypeData data in signatures) {
       FunctionType functionType = env.getElementType('t${data.name}');
diff --git a/tests/compiler/dart2js/assert_message_throw_test.dart b/tests/compiler/dart2js/inference/assert_message_throw_test.dart
similarity index 93%
rename from tests/compiler/dart2js/assert_message_throw_test.dart
rename to tests/compiler/dart2js/inference/assert_message_throw_test.dart
index be95a24..b6f202b 100644
--- a/tests/compiler/dart2js/assert_message_throw_test.dart
+++ b/tests/compiler/dart2js/inference/assert_message_throw_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
@@ -9,8 +11,8 @@
 import 'package:compiler/src/types/masks.dart';
 import 'package:compiler/src/world.dart' show ClosedWorld;
 import 'package:expect/expect.dart';
-import 'memory_compiler.dart';
-import 'type_mask_test_helper.dart';
+import '../memory_compiler.dart';
+import '../type_mask_test_helper.dart';
 
 const String SOURCE = '''
 main(args) {
diff --git a/tests/compiler/dart2js/call_site_simple_type_inferer_test.dart b/tests/compiler/dart2js/inference/call_site_simple_type_inferer_test.dart
similarity index 97%
rename from tests/compiler/dart2js/call_site_simple_type_inferer_test.dart
rename to tests/compiler/dart2js/inference/call_site_simple_type_inferer_test.dart
index 3960da8..1337230 100644
--- a/tests/compiler/dart2js/call_site_simple_type_inferer_test.dart
+++ b/tests/compiler/dart2js/inference/call_site_simple_type_inferer_test.dart
@@ -2,13 +2,15 @@
 // 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.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/elements/elements.dart';
 import 'package:compiler/src/types/masks.dart';
 import 'package:expect/expect.dart';
 
-import 'compiler_helper.dart';
-import 'type_mask_test_helper.dart';
+import '../compiler_helper.dart';
+import '../type_mask_test_helper.dart';
 
 void compileAndFind(String code, String className, String memberName,
     bool disableInlining, check(compiler, element)) {
diff --git a/tests/compiler/dart2js/inference/show.dart b/tests/compiler/dart2js/inference/show.dart
index f341278..6870b5f 100644
--- a/tests/compiler/dart2js/inference/show.dart
+++ b/tests/compiler/dart2js/inference/show.dart
@@ -4,68 +4,9 @@
 
 /// Helper program that shows the inferrer data on a dart program.
 
-import 'dart:io';
-import 'package:args/args.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/filenames.dart';
-import 'package:compiler/src/inferrer/inferrer_engine.dart';
-import 'package:compiler/src/io/source_file.dart';
-import 'package:compiler/src/source_file_provider.dart';
-import '../equivalence/id_equivalence_helper.dart';
-import '../kernel/test_helpers.dart';
+import '../equivalence/show_helper.dart';
 import 'inference_test_helper.dart';
 
 main(List<String> args) async {
-  ArgParser argParser = new ArgParser(allowTrailingOptions: true);
-  argParser.addFlag('verbose', negatable: true, defaultsTo: false);
-  argParser.addFlag('colors', negatable: true);
-  argParser.addFlag('use-kernel', negatable: false, defaultsTo: false);
-  ArgResults argResults = argParser.parse(args);
-  if (argResults.wasParsed('colors')) {
-    useColors = argResults['colors'];
-  }
-  bool verbose = argResults['verbose'];
-  bool useKernel = argResults['use-kernel'];
-
-  InferrerEngineImpl.useSorterForTesting = true;
-  String file = argResults.rest.first;
-  List<String> show;
-  if (argResults.rest.length > 1) {
-    show = argResults.rest.skip(1).toList();
-  }
-
-  Uri entryPoint = Uri.base.resolve(nativeToUriPath(file));
-  List<String> options = <String>[];
-  if (useKernel) {
-    options.add(Flags.useKernel);
-  }
-  CompiledData data = await computeData(entryPoint, const {},
-      useKernel ? computeMemberIrTypeMasks : computeMemberAstTypeMasks,
-      options: options,
-      forMainLibraryOnly: false,
-      skipUnprocessedMembers: true,
-      skipFailedCompilations: true,
-      verbose: verbose);
-  if (data == null) {
-    print('Compilation failed.');
-  } else {
-    SourceFileProvider provider = data.compiler.provider;
-    for (Uri uri in data.actualMaps.keys) {
-      if (show != null && !show.any((f) => '$uri'.endsWith(f))) {
-        continue;
-      }
-      uri = resolveFastaUri(uri);
-      SourceFile sourceFile = await provider.autoReadFromFile(uri);
-      String sourceCode = sourceFile?.slowText();
-      if (sourceCode == null) {
-        sourceCode = new File.fromUri(uri).readAsStringSync();
-      }
-      if (sourceCode == null) {
-        print('--source code missing for $uri--------------------------------');
-      } else {
-        print('--annotations for $uri----------------------------------------');
-        print(withAnnotations(sourceCode, data.computeAnnotations(uri)));
-      }
-    }
-  }
+  await show(args, computeMemberAstTypeMasks, computeMemberIrTypeMasks);
 }
diff --git a/tests/compiler/dart2js/inlining/data/external.dart b/tests/compiler/dart2js/inlining/data/external.dart
new file mode 100644
index 0000000..9204a33
--- /dev/null
+++ b/tests/compiler/dart2js/inlining/data/external.dart
@@ -0,0 +1,20 @@
+// 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.
+
+/// ignore: IMPORT_INTERNAL_LIBRARY
+import 'dart:_js_helper';
+
+/*element: main:[]*/
+main() {
+  externalFunction();
+}
+
+/*element: externalFunction:[]*/
+@NoInline()
+externalFunction() {
+  _externalFunction();
+}
+
+/*element: _externalFunction:[]*/
+external _externalFunction();
diff --git a/tests/compiler/dart2js/inlining/data/map.dart b/tests/compiler/dart2js/inlining/data/map.dart
new file mode 100644
index 0000000..8206a6b
--- /dev/null
+++ b/tests/compiler/dart2js/inlining/data/map.dart
@@ -0,0 +1,22 @@
+// 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.
+
+/// ignore: IMPORT_INTERNAL_LIBRARY
+import 'dart:_js_helper';
+
+/*element: main:[]*/
+main() {
+  passMapToNull();
+}
+
+/*element: _passMapToNull:[passMapToNull]*/
+_passMapToNull(f) {
+  f({});
+}
+
+/*element: passMapToNull:[]*/
+@NoInline()
+passMapToNull() {
+  _passMapToNull(null);
+}
diff --git a/tests/compiler/dart2js/inlining/data/switch.dart b/tests/compiler/dart2js/inlining/data/switch.dart
new file mode 100644
index 0000000..09577d7
--- /dev/null
+++ b/tests/compiler/dart2js/inlining/data/switch.dart
@@ -0,0 +1,28 @@
+// 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.
+
+/// ignore: IMPORT_INTERNAL_LIBRARY
+import 'dart:_js_helper';
+
+/*element: main:[]*/
+main() {
+  switchThrowing();
+}
+
+/*element: switchThrowing:[]*/
+@NoInline()
+switchThrowing() {
+  switch (0) {
+    case 0:
+      _switchThrowing();
+      break;
+    default:
+      return;
+  }
+}
+
+/*element: _switchThrowing:[]*/
+_switchThrowing() {
+  throw '';
+}
diff --git a/tests/compiler/dart2js/inlining/data/too_difficult.dart b/tests/compiler/dart2js/inlining/data/too_difficult.dart
index 5033474..446f66d 100644
--- a/tests/compiler/dart2js/inlining/data/too_difficult.dart
+++ b/tests/compiler/dart2js/inlining/data/too_difficult.dart
@@ -24,6 +24,10 @@
   codeAfterReturn();
   multipleThrows();
   returnAndThrow();
+
+  throwClosure();
+  returnClosure();
+  closureInInitializer();
 }
 
 /*element: _multipleReturns:code after return*/
@@ -152,3 +156,28 @@
     i++;
   } while (i < 10);
 }
+
+/*element: returnClosure:closure*/
+returnClosure() {
+  return /*[]*/ () {};
+}
+
+/*element: throwClosure:closure*/
+throwClosure() {
+  throw /*[]*/ () {};
+}
+
+class Class1 {
+  var f;
+
+  /*element: Class1.:closure*/
+  Class1() : f = (/*[]*/ () {}) {
+    print(f);
+  }
+}
+
+/*element: closureInInitializer:[]*/
+@NoInline()
+closureInInitializer() {
+  new Class1();
+}
diff --git a/tests/compiler/dart2js/inlining/data/type_variables.dart b/tests/compiler/dart2js/inlining/data/type_variables.dart
new file mode 100644
index 0000000..8c9366d
--- /dev/null
+++ b/tests/compiler/dart2js/inlining/data/type_variables.dart
@@ -0,0 +1,29 @@
+// 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.
+
+/// ignore: IMPORT_INTERNAL_LIBRARY
+import 'dart:_js_helper';
+
+/*element: main:[]*/
+main() {
+  inlineTypeTests();
+}
+
+/*element: Mixin1.:[inlineTypeTests:Mixin1<int>]*/
+class Mixin1<S> {
+  var field = /*[]*/ (S s) => null;
+}
+
+/*element: Class1.:[inlineTypeTests:Class1<int>]*/
+class Class1<T> extends Object with Mixin1<T> {}
+
+/*element: _inlineTypeTests:[inlineTypeTests]*/
+_inlineTypeTests(o) => o.field is dynamic Function(int);
+
+/*element: inlineTypeTests:[]*/
+@NoInline()
+void inlineTypeTests() {
+  _inlineTypeTests(new Mixin1<int>());
+  _inlineTypeTests(new Class1<int>());
+}
diff --git a/tests/compiler/dart2js/inlining/inlining_test.dart b/tests/compiler/dart2js/inlining/inlining_test.dart
index c602214..aeb1207 100644
--- a/tests/compiler/dart2js/inlining/inlining_test.dart
+++ b/tests/compiler/dart2js/inlining/inlining_test.dart
@@ -28,7 +28,7 @@
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
     await checkTests(
         dataDir, computeMemberAstInlinings, computeMemberIrInlinings,
-        args: args, skipForKernel: []);
+        args: args, skipforAst: ['external.dart'], skipForKernel: []);
   });
 }
 
@@ -116,6 +116,9 @@
   @override
   String getTooDifficultReason(MemberEntity member) {
     if (member is MethodElement) {
+      if (member is ConstructorElement && member.isDefaultConstructor) {
+        return null;
+      }
       return ast.InlineWeeder.cannotBeInlinedReason(member.resolvedAst, null,
           enableUserAssertions: true);
     }
diff --git a/tests/compiler/dart2js/inlining/inlining_viewer.dart b/tests/compiler/dart2js/inlining/inlining_viewer.dart
new file mode 100644
index 0000000..ed25d93
--- /dev/null
+++ b/tests/compiler/dart2js/inlining/inlining_viewer.dart
@@ -0,0 +1,14 @@
+// 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.
+
+/// Helper program that shows the inlining data on a dart program.
+
+import 'package:compiler/src/js_backend/backend.dart';
+import '../equivalence/show_helper.dart';
+import 'inlining_test.dart';
+
+main(List<String> args) async {
+  JavaScriptBackend.cacheCodegenImpactForTesting = true;
+  await show(args, computeMemberAstInlinings, computeMemberIrInlinings);
+}
diff --git a/tests/compiler/dart2js/jsinterop/world_test.dart b/tests/compiler/dart2js/jsinterop/world_test.dart
index 10f945f..a706741 100644
--- a/tests/compiler/dart2js/jsinterop/world_test.dart
+++ b/tests/compiler/dart2js/jsinterop/world_test.dart
@@ -16,7 +16,7 @@
 void main() {
   asyncTest(() async {
     await testClasses(CompileMode.memory);
-    await testClasses(CompileMode.dill);
+    await testClasses(CompileMode.kernel);
   });
 }
 
diff --git a/tests/compiler/dart2js/kernel/compiler_helper.dart b/tests/compiler/dart2js/kernel/compiler_helper.dart
index 27313b0..05a434b 100644
--- a/tests/compiler/dart2js/kernel/compiler_helper.dart
+++ b/tests/compiler/dart2js/kernel/compiler_helper.dart
@@ -14,17 +14,12 @@
 import 'package:compiler/src/common.dart';
 import 'package:compiler/src/common/tasks.dart';
 import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/filenames.dart';
 import 'package:compiler/src/kernel/element_map.dart';
 import 'package:compiler/src/library_loader.dart';
 import 'package:compiler/src/universe/world_builder.dart';
 import 'package:compiler/src/util/util.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../memory_compiler.dart';
-import '../../../../pkg/compiler/tool/generate_kernel.dart' as generate;
-
-import 'package:front_end/src/compute_platform_binaries_location.dart'
-    show computePlatformBinariesLocation;
 
 typedef Future<Compiler> CompileFunction();
 
@@ -119,25 +114,6 @@
   return entryPoint;
 }
 
-Future generateDill(Uri entryPoint, Map<String, String> memorySourceFiles,
-    {bool printSteps: false}) async {
-  entryPoint =
-      await createTemp(entryPoint, memorySourceFiles, printSteps: printSteps);
-  if (printSteps) {
-    print('---- generate dill -----------------------------------------------');
-  }
-
-  Uri dillFile = Uri.parse('$entryPoint.dill');
-  Uri platform =
-      computePlatformBinariesLocation().resolve("dart2js_platform.dill");
-  await generate.main([
-    '--platform=${platform.toFilePath()}',
-    '--out=${uriPathToNative(dillFile.path)}',
-    '${entryPoint.path}',
-  ]);
-  return dillFile;
-}
-
 Future<Compiler> compileWithDill(
     {Uri entryPoint,
     Map<String, String> memorySourceFiles: const <String, String>{},
diff --git a/tests/compiler/dart2js/kernel/run_from_dill_test.dart b/tests/compiler/dart2js/kernel/run_from_dill_test.dart
index 4d73a35..77243cc 100644
--- a/tests/compiler/dart2js/kernel/run_from_dill_test.dart
+++ b/tests/compiler/dart2js/kernel/run_from_dill_test.dart
@@ -19,13 +19,56 @@
 import '../serialization/helper.dart';
 
 const SOURCE = const {
-  'main.dart': '''
+  'main.dart': r'''
+import "package:expect/expect.dart";
+
+class K {}
+
+class A<T> {
+  foo() {
+    bar() => T;
+    return bar();
+  }
+}
+
+class B extends A<K> {}
+
+class X<T> {}
+
+// [globalMethod] and [format] are copied from
+// `language/named_parameters_with_dollars_test`. This test failed because
+// when inlining [globalMethod] the named arguments where processed unsorted,
+// passing `[a, a$b, a$$b, b]` to [format] instead of `[a, b, a$b, a$$b]`.
+globalMethod({a, b, a$b, a$$b}) => [a, b, a$b, a$$b];
+
+format(thing) {
+  if (thing == null) return '-';
+  if (thing is List) {
+    var fragments = ['['];
+    var sep;
+    for (final item in thing) {
+      if (sep != null) fragments.add(sep);
+      sep = ', ';
+      fragments.add(format(item));
+    }
+    fragments.add(']');
+    return fragments.join();
+  }
+  return thing.toString();
+}
+
 main() {
   for (int i = 0; i < 10; i++) {
     if (i == 5) continue;
-    print('Hello World: \$i!');
+    print('Hello World: $i!');
     if (i == 7) break;
   }
+  Expect.equals(new A<int>().foo(), int);
+  var v = new DateTime.now().millisecondsSinceEpoch != 42
+      ? new X<B>()
+      : new X<A<String>>();
+  Expect.isFalse(v is X<A<String>>);
+  Expect.equals('[1, 2, -, -]', format(globalMethod(a: 1, b: 2)));
 }
 '''
 };
@@ -61,16 +104,15 @@
     memorySourceFiles = SOURCE;
   }
 
-  Uri dillFile =
-      await generateDill(entryPoint, memorySourceFiles, printSteps: true);
-  String output = uriPathToNative(dillFile.resolve('out.js').path);
+  Uri mainFile =
+      await createTemp(entryPoint, memorySourceFiles, printSteps: true);
+  String output = uriPathToNative(mainFile.resolve('out.js').path);
   List<String> dart2jsArgs = [
-    dillFile.toString(),
+    mainFile.toString(),
     '-o$output',
     Flags.useKernel,
-    Flags.disableTypeInference,
-    Flags.disableInlining,
-    Flags.enableAssertMessage
+    Flags.enableAssertMessage,
+    '--packages=${Platform.packageConfig}',
   ];
   print('Running: dart2js ${dart2jsArgs.join(' ')}');
 
diff --git a/tests/compiler/dart2js/message_kind_helper.dart b/tests/compiler/dart2js/message_kind_helper.dart
index 86e6081..bd1f19c 100644
--- a/tests/compiler/dart2js/message_kind_helper.dart
+++ b/tests/compiler/dart2js/message_kind_helper.dart
@@ -112,7 +112,10 @@
       Expect.isTrue(
           messageFound,
           '${template.kind}} does not match any in\n '
-          '${messages.join('\n ')}');
+          '${messages.join('\n ')}\n'
+          'Consider searching for ${template.kind} in\n'
+          '  pkg/compiler/lib/src/diagnostics/messages.dart\n'
+          'and removing the associated example');
       dynamic reporter = compiler.reporter;
       Expect.isFalse(reporter.hasCrashed);
       if (!unexpectedMessages.isEmpty) {
diff --git a/tests/compiler/dart2js/array_tracing_mirror_test.dart b/tests/compiler/dart2js/mirrors/array_tracing_mirror_test.dart
similarity index 96%
rename from tests/compiler/dart2js/array_tracing_mirror_test.dart
rename to tests/compiler/dart2js/mirrors/array_tracing_mirror_test.dart
index d19f1fb..7e3cec6 100644
--- a/tests/compiler/dart2js/array_tracing_mirror_test.dart
+++ b/tests/compiler/dart2js/mirrors/array_tracing_mirror_test.dart
@@ -7,7 +7,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 const MEMORY_SOURCE_FILES = const {
   'main.dart': '''
diff --git a/tests/compiler/dart2js/analyze_all_test.dart b/tests/compiler/dart2js/old_frontend/analyze_all_test.dart
similarity index 98%
rename from tests/compiler/dart2js/analyze_all_test.dart
rename to tests/compiler/dart2js/old_frontend/analyze_all_test.dart
index 9b1b6e3f..b6daf1c 100644
--- a/tests/compiler/dart2js/analyze_all_test.dart
+++ b/tests/compiler/dart2js/old_frontend/analyze_all_test.dart
@@ -7,7 +7,7 @@
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/diagnostics/messages.dart';
 import 'package:expect/expect.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 const String SOURCE = """
 class Foo {
diff --git a/tests/compiler/dart2js/analyze_api_test.dart b/tests/compiler/dart2js/old_frontend/analyze_api_test.dart
similarity index 100%
rename from tests/compiler/dart2js/analyze_api_test.dart
rename to tests/compiler/dart2js/old_frontend/analyze_api_test.dart
diff --git a/tests/compiler/dart2js/analyze_dart2js_helpers_test.dart b/tests/compiler/dart2js/old_frontend/analyze_dart2js_helpers_test.dart
similarity index 99%
rename from tests/compiler/dart2js/analyze_dart2js_helpers_test.dart
rename to tests/compiler/dart2js/old_frontend/analyze_dart2js_helpers_test.dart
index 7e190bf..9375f46 100644
--- a/tests/compiler/dart2js/analyze_dart2js_helpers_test.dart
+++ b/tests/compiler/dart2js/old_frontend/analyze_dart2js_helpers_test.dart
@@ -25,7 +25,7 @@
 import 'package:compiler/src/universe/call_structure.dart' show CallStructure;
 import 'package:expect/expect.dart';
 
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 main(List<String> arguments) {
   bool verbose = arguments.contains('-v');
diff --git a/tests/compiler/dart2js/analyze_dart2js_test.dart b/tests/compiler/dart2js/old_frontend/analyze_dart2js_test.dart
similarity index 98%
rename from tests/compiler/dart2js/analyze_dart2js_test.dart
rename to tests/compiler/dart2js/old_frontend/analyze_dart2js_test.dart
index 7abf3d1..3b15544 100644
--- a/tests/compiler/dart2js/analyze_dart2js_test.dart
+++ b/tests/compiler/dart2js/old_frontend/analyze_dart2js_test.dart
@@ -8,7 +8,7 @@
 import 'package:compiler/src/filenames.dart';
 import 'package:compiler/src/compiler.dart';
 import 'analyze_helper.dart';
-import 'related_types.dart';
+import '../related_types.dart';
 
 /**
  * Map of whitelisted warnings and errors.
diff --git a/tests/compiler/dart2js/analyze_helper.dart b/tests/compiler/dart2js/old_frontend/analyze_helper.dart
similarity index 99%
rename from tests/compiler/dart2js/analyze_helper.dart
rename to tests/compiler/dart2js/old_frontend/analyze_helper.dart
index dadcf0c..e11223e 100644
--- a/tests/compiler/dart2js/analyze_helper.dart
+++ b/tests/compiler/dart2js/old_frontend/analyze_helper.dart
@@ -15,7 +15,7 @@
 import 'package:compiler/src/options.dart' show CompilerOptions;
 import 'package:compiler/src/source_file_provider.dart';
 import 'package:compiler/src/util/uri_extras.dart';
-import 'diagnostic_helper.dart';
+import '../diagnostic_helper.dart';
 
 /// Option for hiding whitelisted messages.
 const String HIDE_WHITELISTED = '--hide-whitelisted';
diff --git a/tests/compiler/dart2js/analyze_only_test.dart b/tests/compiler/dart2js/old_frontend/analyze_only_test.dart
similarity index 98%
rename from tests/compiler/dart2js/analyze_only_test.dart
rename to tests/compiler/dart2js/old_frontend/analyze_only_test.dart
index 7a70127..9b88dc9 100644
--- a/tests/compiler/dart2js/analyze_only_test.dart
+++ b/tests/compiler/dart2js/old_frontend/analyze_only_test.dart
@@ -17,8 +17,8 @@
 import 'package:compiler/src/old_to_new_api.dart';
 import 'package:compiler/src/options.dart';
 
-import '../dart2js_extra/dummy_compiler_test.dart' as dummy;
-import 'output_collector.dart';
+import '../../dart2js_extra/dummy_compiler_test.dart' as dummy;
+import '../output_collector.dart';
 
 runCompiler(String main, List<String> options,
     onValue(String code, List errors, List warnings)) {
diff --git a/tests/compiler/dart2js/analyze_test_test.dart b/tests/compiler/dart2js/old_frontend/analyze_test_test.dart
similarity index 100%
rename from tests/compiler/dart2js/analyze_test_test.dart
rename to tests/compiler/dart2js/old_frontend/analyze_test_test.dart
diff --git a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart b/tests/compiler/dart2js/old_frontend/analyze_unused_dart2js_test.dart
similarity index 100%
rename from tests/compiler/dart2js/analyze_unused_dart2js_test.dart
rename to tests/compiler/dart2js/old_frontend/analyze_unused_dart2js_test.dart
diff --git a/tests/compiler/dart2js/async_await_syntax_test.dart b/tests/compiler/dart2js/old_frontend/async_await_syntax_test.dart
similarity index 95%
rename from tests/compiler/dart2js/async_await_syntax_test.dart
rename to tests/compiler/dart2js/old_frontend/async_await_syntax_test.dart
index 16be073..1823e93 100644
--- a/tests/compiler/dart2js/async_await_syntax_test.dart
+++ b/tests/compiler/dart2js/old_frontend/async_await_syntax_test.dart
@@ -5,7 +5,7 @@
 // Test that dart2js produces the expected static type warnings and
 // compile-time errors for these tests.
 
-import 'frontend_checker.dart';
+import '../frontend_checker.dart';
 
 /// Map of test files to run together with their associated whitelist.
 ///
diff --git a/tests/compiler/dart2js/bad_loop_test.dart b/tests/compiler/dart2js/old_frontend/bad_loop_test.dart
similarity index 91%
rename from tests/compiler/dart2js/bad_loop_test.dart
rename to tests/compiler/dart2js/old_frontend/bad_loop_test.dart
index c0a72f9..889cecd 100644
--- a/tests/compiler/dart2js/bad_loop_test.dart
+++ b/tests/compiler/dart2js/old_frontend/bad_loop_test.dart
@@ -2,17 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:expect/expect.dart';
-import 'memory_source_file_helper.dart';
-import "package:async_helper/async_helper.dart";
-
+import 'package:async_helper/async_helper.dart';
 import 'package:compiler/compiler.dart' show Diagnostic;
 import 'package:compiler/src/options.dart' show CompilerOptions;
 import 'package:compiler/src/old_to_new_api.dart';
+import 'package:expect/expect.dart';
+import '../memory_source_file_helper.dart';
 
 main() {
   Uri script = currentDirectory.resolveUri(Platform.script);
-  Uri libraryRoot = script.resolve('../../../sdk/');
+  Uri libraryRoot = script.resolve('../../../../sdk/');
   Uri packageRoot = script.resolve('./packages/');
 
   var provider = new MemorySourceFileProvider(MEMORY_SOURCE_FILES);
diff --git a/tests/compiler/dart2js/begin_end_token_test.dart b/tests/compiler/dart2js/old_frontend/begin_end_token_test.dart
similarity index 98%
rename from tests/compiler/dart2js/begin_end_token_test.dart
rename to tests/compiler/dart2js/old_frontend/begin_end_token_test.dart
index fca0712..33a6853 100644
--- a/tests/compiler/dart2js/begin_end_token_test.dart
+++ b/tests/compiler/dart2js/old_frontend/begin_end_token_test.dart
@@ -2,9 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
-import 'parser_helper.dart';
 import 'package:compiler/src/tree/tree.dart';
+import 'package:expect/expect.dart';
+import '../parser_helper.dart';
 
 void testNode(Node node, String expected, String text, [bool hard = true]) {
   var debug = 'text=$text,expected=$expected,node:${node}';
diff --git a/tests/compiler/dart2js/benign_error_test.dart b/tests/compiler/dart2js/old_frontend/benign_error_test.dart
similarity index 97%
rename from tests/compiler/dart2js/benign_error_test.dart
rename to tests/compiler/dart2js/old_frontend/benign_error_test.dart
index 3e01a7d..9fd009f 100644
--- a/tests/compiler/dart2js/benign_error_test.dart
+++ b/tests/compiler/dart2js/old_frontend/benign_error_test.dart
@@ -4,7 +4,7 @@
 
 // Test that benign error do not prevent compilation.
 
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js/categories_test.dart b/tests/compiler/dart2js/old_frontend/categories_test.dart
similarity index 97%
rename from tests/compiler/dart2js/categories_test.dart
rename to tests/compiler/dart2js/old_frontend/categories_test.dart
index 552fd49..d1b8eaa 100644
--- a/tests/compiler/dart2js/categories_test.dart
+++ b/tests/compiler/dart2js/old_frontend/categories_test.dart
@@ -5,7 +5,7 @@
 import "package:expect/expect.dart";
 import 'package:async_helper/async_helper.dart';
 
-import "memory_compiler.dart";
+import "../memory_compiler.dart";
 
 runTest(String source, String categories, int expectedErrors) async {
   var collector = new DiagnosticCollector();
diff --git a/tests/compiler/dart2js/check_elements_invariants_test.dart b/tests/compiler/dart2js/old_frontend/check_elements_invariants_test.dart
similarity index 97%
rename from tests/compiler/dart2js/check_elements_invariants_test.dart
rename to tests/compiler/dart2js/old_frontend/check_elements_invariants_test.dart
index 714493a..3d0bea5 100644
--- a/tests/compiler/dart2js/check_elements_invariants_test.dart
+++ b/tests/compiler/dart2js/old_frontend/check_elements_invariants_test.dart
@@ -9,7 +9,7 @@
 import 'package:compiler/src/elements/entities.dart' show ClassEntity;
 import 'package:compiler/src/resolution/class_members.dart'
     show ClassMemberMixin;
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 const String DART2JS_SOURCE = 'pkg/compiler/lib/src/dart2js.dart';
 const List<String> DART2JS_OPTIONS = const <String>[
diff --git a/tests/compiler/dart2js/check_members_test.dart b/tests/compiler/dart2js/old_frontend/check_members_test.dart
similarity index 98%
rename from tests/compiler/dart2js/check_members_test.dart
rename to tests/compiler/dart2js/old_frontend/check_members_test.dart
index 26a5a53..08c4718 100644
--- a/tests/compiler/dart2js/check_members_test.dart
+++ b/tests/compiler/dart2js/old_frontend/check_members_test.dart
@@ -6,7 +6,7 @@
 // bound language tests. This ensures that the analyzer and dart2js agrees
 // on these tests.
 
-import 'warnings_checker.dart';
+import '../warnings_checker.dart';
 
 /// Map from test files to a map of their expected status. If the status map is
 /// `null` no warnings must be missing or unexpected, otherwise the status map
diff --git a/tests/compiler/dart2js/combinator_hint_test.dart b/tests/compiler/dart2js/old_frontend/combinator_hint_test.dart
similarity index 98%
rename from tests/compiler/dart2js/combinator_hint_test.dart
rename to tests/compiler/dart2js/old_frontend/combinator_hint_test.dart
index 0518285..30f9535 100644
--- a/tests/compiler/dart2js/combinator_hint_test.dart
+++ b/tests/compiler/dart2js/old_frontend/combinator_hint_test.dart
@@ -9,7 +9,7 @@
 import 'package:expect/expect.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 const SOURCE = const {
   'show_local.dart': """
diff --git a/tests/compiler/dart2js/compile_with_empty_libraries_test.dart b/tests/compiler/dart2js/old_frontend/compile_with_empty_libraries_test.dart
similarity index 94%
rename from tests/compiler/dart2js/compile_with_empty_libraries_test.dart
rename to tests/compiler/dart2js/old_frontend/compile_with_empty_libraries_test.dart
index d16fe9e..5b6c354 100644
--- a/tests/compiler/dart2js/compile_with_empty_libraries_test.dart
+++ b/tests/compiler/dart2js/old_frontend/compile_with_empty_libraries_test.dart
@@ -6,7 +6,7 @@
 /// references to core library definitions.
 
 import 'package:async_helper/async_helper.dart';
-import 'mock_compiler.dart';
+import '../mock_compiler.dart';
 
 const String TEST = r"main() {}";
 
diff --git a/tests/compiler/dart2js/compiler_test.dart b/tests/compiler/dart2js/old_frontend/compiler_test.dart
similarity index 97%
rename from tests/compiler/dart2js/compiler_test.dart
rename to tests/compiler/dart2js/old_frontend/compiler_test.dart
index 82db42a..a2b10f3 100644
--- a/tests/compiler/dart2js/compiler_test.dart
+++ b/tests/compiler/dart2js/old_frontend/compiler_test.dart
@@ -10,7 +10,7 @@
 import "package:compiler/src/old_to_new_api.dart";
 import "package:expect/expect.dart";
 
-import "mock_compiler.dart";
+import "../mock_compiler.dart";
 
 Future testErrorHandling() {
   // Test that compiler.currentElement is set correctly when
diff --git a/tests/compiler/dart2js/embedded_category_api_boundary_test.dart b/tests/compiler/dart2js/old_frontend/embedded_category_api_boundary_test.dart
similarity index 100%
rename from tests/compiler/dart2js/embedded_category_api_boundary_test.dart
rename to tests/compiler/dart2js/old_frontend/embedded_category_api_boundary_test.dart
diff --git a/tests/compiler/dart2js/receiver_type_test.dart b/tests/compiler/dart2js/receiver_type_test.dart
index aac37ef..aeb6e81 100644
--- a/tests/compiler/dart2js/receiver_type_test.dart
+++ b/tests/compiler/dart2js/receiver_type_test.dart
@@ -14,7 +14,7 @@
 main() {
   asyncTest(() async {
     await runTest(CompileMode.memory);
-    await runTest(CompileMode.dill);
+    await runTest(CompileMode.kernel);
   });
 }
 
diff --git a/tests/compiler/dart2js/subtype_test.dart b/tests/compiler/dart2js/subtype_test.dart
index ddacca5..7f0c366 100644
--- a/tests/compiler/dart2js/subtype_test.dart
+++ b/tests/compiler/dart2js/subtype_test.dart
@@ -15,7 +15,7 @@
 void main() {
   asyncTest(() async {
     await runTests(CompileMode.memory);
-    await runTests(CompileMode.dill);
+    await runTests(CompileMode.kernel);
   });
 }
 
diff --git a/tests/compiler/dart2js/type_test_helper.dart b/tests/compiler/dart2js/type_test_helper.dart
index 8dde099..3ebebb8 100644
--- a/tests/compiler/dart2js/type_test_helper.dart
+++ b/tests/compiler/dart2js/type_test_helper.dart
@@ -18,9 +18,12 @@
 import 'package:compiler/src/kernel/kernel_strategy.dart';
 import 'package:compiler/src/world.dart' show ClosedWorld;
 import 'compiler_helper.dart' as mock;
+import 'compiler_helper.dart' show CompileMode;
 import 'memory_compiler.dart' as memory;
 import 'kernel/compiler_helper.dart' as dill;
 
+export 'compiler_helper.dart' show CompileMode;
+
 DartType instantiate(Entity element, List<DartType> arguments) {
   if (element is ClassElement) {
     return new ResolutionInterfaceType(element, arguments);
@@ -32,8 +35,6 @@
   }
 }
 
-enum CompileMode { mock, memory, dill }
-
 class TypeEnvironment {
   final Compiler compiler;
   final bool testBackendWorld;
@@ -66,7 +67,7 @@
       source = '$mainSource\n$source';
     }
     memory.DiagnosticCollector collector;
-    if (compileMode == CompileMode.dill) {
+    if (compileMode == CompileMode.kernel) {
       collector = new memory.DiagnosticCollector();
       uri = Uri.parse('memory:main.dart');
       compiler = await dill.compileWithDill(
diff --git a/tests/compiler/dart2js/warnings_checker.dart b/tests/compiler/dart2js/warnings_checker.dart
index b29d19c..9e98299 100644
--- a/tests/compiler/dart2js/warnings_checker.dart
+++ b/tests/compiler/dart2js/warnings_checker.dart
@@ -21,11 +21,10 @@
 
 void checkWarnings(Map<String, dynamic> tests, [List<String> arguments]) {
   bool isWindows = Platform.isWindows;
-  Uri script = currentDirectory.resolveUri(Platform.script);
   bool warningsMismatch = false;
   bool verbose = arguments != null && arguments.contains('-v');
   asyncTest(() => Future.forEach(tests.keys, (String test) async {
-        Uri uri = script.resolve('../../$test');
+        Uri uri = Uri.base.resolve('tests/$test');
         String source = utf8.decode(readAll(uriPathToNative(uri.path)));
         SourceFile file = new StringSourceFile(
             uri, relativize(currentDirectory, uri, isWindows), source);
diff --git a/tests/compiler/dart2js_extra/class_hierarchy_extends_clause_test.dart b/tests/compiler/dart2js_extra/class_hierarchy_extends_clause_test.dart
new file mode 100644
index 0000000..1cd8ebb
--- /dev/null
+++ b/tests/compiler/dart2js_extra/class_hierarchy_extends_clause_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+import 'package:expect/expect.dart';
+
+class A {}
+
+abstract class B<T> {
+  final Box<T> x = new Box<T>();
+}
+
+class C extends B<A> {}
+
+class Box<T> {
+  Box();
+
+  bool doCheck(Object o) => o is T;
+}
+
+main() {
+  var c = new C();
+  Expect.isFalse(c.x.doCheck(3));
+}
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index e6eedf8..9c164b4 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -162,8 +162,8 @@
 deferred/reflect_multiple_annotations_test: Crash # Assertion failure: Missing scope info for j:method(_loadLibraryWrapper).
 deferred/reflect_multiple_default_arg_test: Crash # Assertion failure: Missing scope info for j:method(_loadLibraryWrapper).
 deferred_custom_loader_test: RuntimeError
-deferred_fail_and_retry_test: Crash # type 'Class' is not a subtype of type 'Member' of 'key' where
-deferred_fail_and_retry_worker_test: Crash # type 'Class' is not a subtype of type 'Member' of 'key' where
+deferred_fail_and_retry_test: RuntimeError
+deferred_fail_and_retry_worker_test: Fail
 invalid_annotation2_test/none: RuntimeError
 label_test/06: MissingCompileTimeError
 mirror_invalid_field_access2_test: RuntimeError
diff --git a/tests/compiler/dart2js_native/dart2js_native.status b/tests/compiler/dart2js_native/dart2js_native.status
index fb8f6dd..c339153 100644
--- a/tests/compiler/dart2js_native/dart2js_native.status
+++ b/tests/compiler/dart2js_native/dart2js_native.status
@@ -16,7 +16,6 @@
 native_mirror_test: RuntimeError
 native_no_such_method_exception4_frog_test: RuntimeError
 native_no_such_method_exception5_frog_test: RuntimeError
-optimization_hints_test: RuntimeError
 subclassing_constructor_1_test: RuntimeError
 subclassing_super_call_test: RuntimeError
 subclassing_super_field_1_test: RuntimeError
@@ -46,7 +45,6 @@
 native_mirror_test: RuntimeError
 native_no_such_method_exception4_frog_test: RuntimeError
 native_no_such_method_exception5_frog_test: RuntimeError
-optimization_hints_test: RuntimeError
 subclassing_constructor_1_test: RuntimeError
 subclassing_super_call_test: RuntimeError
 subclassing_super_field_1_test: RuntimeError
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 9c4289e..cb88d10 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -14,14 +14,12 @@
 [ $compiler == dart2js ]
 regexp/pcre_test: Pass, Slow # Issue 21593
 
-[ $compiler == dartkp ]
-apply3_test: CompileTimeError # No support for mirrors
-
 [ $compiler == precompiler ]
 apply3_test: SkipByDesign # Imports dart:mirrors
 big_integer_huge_mul_vm_test: Pass, Timeout # --no_intrinsify
 big_integer_parsed_mul_div_vm_test: Pass, Timeout # --no_intrinsify
 int_parse_radix_test: Pass, Timeout # --no_intrinsify
+regexp/stack-overflow_test: RuntimeError, OK # Smaller limit with irregex interpreter
 
 [ $mode == debug ]
 regexp/pcre_test: Pass, Slow # Timeout. Issue 22008
@@ -66,7 +64,7 @@
 unicode_test: RuntimeError # jsshell does not recognize character 223 aka \xdf
 
 [ $strong ]
-*: SkipByDesign # tests/corelib_strong has the strong mode versions of these tests.
+*: SkipByDesign # tests/corelib_2 has the strong mode versions of these tests.
 
 [ $arch == simarmv5te && ($runtime == dart_precompiled || $runtime == vm) ]
 big_integer_parsed_mul_div_vm_test: Pass, Slow
@@ -139,6 +137,7 @@
 bit_twiddling_bigint_test: RuntimeError
 compare_to2_test: RuntimeError
 double_parse_test/01: RuntimeError
+error_stack_trace1_test: RuntimeError # Issue 12399
 from_environment_const_type_test/02: MissingCompileTimeError
 from_environment_const_type_test/03: MissingCompileTimeError
 from_environment_const_type_test/04: MissingCompileTimeError
@@ -240,7 +239,7 @@
 bit_twiddling_bigint_test: RuntimeError
 compare_to2_test: RuntimeError
 double_parse_test/01: RuntimeError
-error_stack_trace1_test: Pass # Issue 27394
+error_stack_trace1_test: RuntimeError # Issue 12399
 hash_set_test/01: RuntimeError
 int_modulo_arith_test/bignum: RuntimeError
 int_modulo_arith_test/modPow: RuntimeError
@@ -347,58 +346,6 @@
 symbol_test/02: MissingCompileTimeError # bug 11669
 symbol_test/03: MissingCompileTimeError # bug 11669
 
-# dartk: checked mode failures
-[ $checked && ($compiler == dartk || $compiler == dartkp) ]
-from_environment_const_type_test/02: MissingCompileTimeError
-from_environment_const_type_test/03: MissingCompileTimeError
-from_environment_const_type_test/04: MissingCompileTimeError
-from_environment_const_type_test/06: MissingCompileTimeError
-from_environment_const_type_test/07: MissingCompileTimeError
-from_environment_const_type_test/08: MissingCompileTimeError
-from_environment_const_type_test/09: MissingCompileTimeError
-from_environment_const_type_test/11: MissingCompileTimeError
-from_environment_const_type_test/12: MissingCompileTimeError
-from_environment_const_type_test/13: MissingCompileTimeError
-from_environment_const_type_test/14: MissingCompileTimeError
-from_environment_const_type_test/16: MissingCompileTimeError
-from_environment_const_type_undefined_test/02: MissingCompileTimeError
-from_environment_const_type_undefined_test/03: MissingCompileTimeError
-from_environment_const_type_undefined_test/04: MissingCompileTimeError
-from_environment_const_type_undefined_test/06: MissingCompileTimeError
-from_environment_const_type_undefined_test/07: MissingCompileTimeError
-from_environment_const_type_undefined_test/08: MissingCompileTimeError
-symbol_test/01: Pass
-symbol_test/02: Pass
-
-[ ($compiler == dartk || $compiler == dartkp) && ($runtime == dart_precompiled || $runtime == vm) ]
-bool_from_environment2_test/01: MissingCompileTimeError
-bool_from_environment2_test/02: MissingCompileTimeError
-bool_from_environment2_test/03: MissingCompileTimeError
-bool_from_environment2_test/04: MissingCompileTimeError
-compare_to2_test: RuntimeError
-int_from_environment3_test/01: MissingCompileTimeError
-int_from_environment3_test/02: MissingCompileTimeError
-int_from_environment3_test/03: MissingCompileTimeError
-int_from_environment3_test/04: MissingCompileTimeError
-string_case_test/01: RuntimeError
-string_from_environment3_test/01: MissingCompileTimeError
-string_from_environment3_test/02: MissingCompileTimeError
-string_from_environment3_test/03: MissingCompileTimeError
-string_from_environment3_test/04: MissingCompileTimeError
-string_trimlr_test/02: RuntimeError
-symbol_operator_test/03: RuntimeError
-symbol_reserved_word_test/04: MissingCompileTimeError
-symbol_reserved_word_test/06: RuntimeError
-symbol_reserved_word_test/07: MissingCompileTimeError
-symbol_reserved_word_test/09: RuntimeError
-symbol_reserved_word_test/10: MissingCompileTimeError
-symbol_reserved_word_test/12: RuntimeError
-symbol_test/01: MissingCompileTimeError
-symbol_test/02: MissingCompileTimeError
-symbol_test/03: MissingCompileTimeError
-symbol_test/none: RuntimeError
-unicode_test: Fail # Bug 6706
-
 [ $arch == simdbc || $arch == simdbc64 ]
 regexp/stack-overflow_test: RuntimeError, OK # Smaller limit with irregex interpreter
 
@@ -425,8 +372,10 @@
 package_resource_test: Skip # Resolve URI not supported yet in product mode.
 string_trimlr_test/02: RuntimeError # Issue 29060
 
-[ $compiler == dartkp || $compiler == precompiler ]
-regexp/stack-overflow_test: RuntimeError, OK # Smaller limit with irregex interpreter
+# We skip all the Dart 1.0 tests in dartk and dartkp mode as these
+# modes are intended only for Dart 2.0 with strong mode enabled.
+[ $compiler == dartk || $compiler == dartkp ]
+*: Skip
 
 [ $runtime == dart_precompiled || $runtime == flutter || $runtime == vm ]
 regexp/capture-3: Pass, Slow, Timeout # Issues 21593 and 22008
diff --git a/tests/corelib_2/bigint_parse_radix_test.dart b/tests/corelib_2/bigint_parse_radix_test.dart
new file mode 100644
index 0000000..ad94bbf
--- /dev/null
+++ b/tests/corelib_2/bigint_parse_radix_test.dart
@@ -0,0 +1,139 @@
+// 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.
+
+// Testing Bigints with and without intrinsics.
+// VMOptions=
+// VMOptions=--no_intrinsify
+// VMOptions=--optimization_counter_threshold=10 --no-background_compilation
+
+import "package:expect/expect.dart";
+
+import 'dart:math' show pow;
+
+void testParseRadix() {
+  bool checkedMode = false;
+  assert((checkedMode = true));
+  const String oneByteWhiteSpace = "\x09\x0a\x0b\x0c\x0d\x20"
+      // "\x85" // Might make troubles on some systems. Was marked as OK test.
+      "\xa0";
+  const String whiteSpace = "$oneByteWhiteSpace\u1680"
+      "\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a"
+      "\u2028\u2029\u202f\u205f\u3000\ufeff";
+
+  var digits = "0123456789abcdefghijklmnopqrstuvwxyz";
+  var zeros = "0" * 64;
+
+  for (int i = 0; i < whiteSpace.length; i++) {
+    var ws = whiteSpace[i];
+    Expect.equals(BigInt.zero, BigInt.parse("${ws}0${ws}", radix: 2));
+  }
+
+  void testParse(BigInt result, String radixString, int radix) {
+    var m = "$radixString/$radix->$result";
+    Expect.equals(
+        result, BigInt.parse(radixString.toLowerCase(), radix: radix), m);
+    Expect.equals(
+        result, BigInt.parse(radixString.toUpperCase(), radix: radix), m);
+    Expect.equals(result, BigInt.parse(" $radixString", radix: radix), m);
+    Expect.equals(result, BigInt.parse("$radixString ", radix: radix), m);
+    Expect.equals(result, BigInt.parse(" $radixString ", radix: radix), m);
+    Expect.equals(result, BigInt.parse("+$radixString", radix: radix), m);
+    Expect.equals(result, BigInt.parse(" +$radixString", radix: radix), m);
+    Expect.equals(result, BigInt.parse("+$radixString ", radix: radix), m);
+    Expect.equals(result, BigInt.parse(" +$radixString ", radix: radix), m);
+    Expect.equals(-result, BigInt.parse("-$radixString", radix: radix), m);
+    Expect.equals(-result, BigInt.parse(" -$radixString", radix: radix), m);
+    Expect.equals(-result, BigInt.parse("-$radixString ", radix: radix), m);
+    Expect.equals(-result, BigInt.parse(" -$radixString ", radix: radix), m);
+    Expect.equals(
+        result,
+        BigInt.parse("$oneByteWhiteSpace$radixString$oneByteWhiteSpace",
+            radix: radix),
+        m);
+    Expect.equals(
+        -result,
+        BigInt.parse("$oneByteWhiteSpace-$radixString$oneByteWhiteSpace",
+            radix: radix),
+        m);
+    Expect.equals(result,
+        BigInt.parse("$whiteSpace$radixString$whiteSpace", radix: radix), m);
+    Expect.equals(-result,
+        BigInt.parse("$whiteSpace-$radixString$whiteSpace", radix: radix), m);
+
+    Expect.equals(result, BigInt.parse("$zeros$radixString", radix: radix), m);
+    Expect.equals(result, BigInt.parse("+$zeros$radixString", radix: radix), m);
+    Expect.equals(
+        -result, BigInt.parse("-$zeros$radixString", radix: radix), m);
+  }
+
+  for (int r = 2; r <= 36; r++) {
+    for (var i = BigInt.zero; i <= new BigInt.from(r * r); i += BigInt.one) {
+      String radixString = i.toRadixString(r);
+      testParse(i, radixString, r);
+    }
+  }
+
+  for (int i = 2; i <= 36; i++) {
+    var digit = digits[i - 1];
+    testParse(new BigInt.from(i).pow(64) - BigInt.one, digit * 64, i);
+    testParse(BigInt.zero, zeros, i);
+  }
+
+  // Allow both upper- and lower-case letters.
+  Expect.equals(new BigInt.from(0xABCD), BigInt.parse("ABCD", radix: 16));
+  Expect.equals(new BigInt.from(0xABCD), BigInt.parse("abcd", radix: 16));
+  Expect.equals(new BigInt.from(15628859), BigInt.parse("09azAZ", radix: 36));
+
+  Expect.equals(
+      (new BigInt.from(0x12345678) << 96) +
+          (new BigInt.from(0x12345678) << 64) +
+          (new BigInt.from(0x12345678) << 32) +
+          new BigInt.from(0x12345678),
+      BigInt.parse("0x12345678123456781234567812345678"));
+
+  // Allow whitespace before and after the number.
+  Expect.equals(BigInt.one, BigInt.parse(" 1", radix: 2));
+  Expect.equals(BigInt.one, BigInt.parse("1 ", radix: 2));
+  Expect.equals(BigInt.one, BigInt.parse(" 1 ", radix: 2));
+  Expect.equals(BigInt.one, BigInt.parse("\n1", radix: 2));
+  Expect.equals(BigInt.one, BigInt.parse("1\n", radix: 2));
+  Expect.equals(BigInt.one, BigInt.parse("\n1\n", radix: 2));
+  Expect.equals(BigInt.one, BigInt.parse("+1", radix: 2));
+
+  void testFails(String source, int radix) {
+    Expect.throws(() {
+      BigInt.parse(source, radix: radix);
+    }, (e) => e is FormatException, "$source/$radix");
+  }
+
+  for (int i = 2; i < 36; i++) {
+    var char = i.toRadixString(36);
+    testFails(char.toLowerCase(), i);
+    testFails(char.toUpperCase(), i);
+  }
+  testFails("", 2);
+  testFails("+ 1", 2); // No space between sign and digits.
+  testFails("- 1", 2); // No space between sign and digits.
+  testFails("0x", null);
+  for (int i = 2; i <= 33; i++) {
+    // No 0x specially allowed.
+    // At radix 34 and above, "x" is a valid digit.
+    testFails("0x10", i);
+  }
+
+  testBadArguments(String source, int radix) {
+    // If the types match, it should be an ArgumentError of some sort.
+    Expect.throws(
+        () => BigInt.parse(source, radix: radix), (e) => e is ArgumentError);
+  }
+
+  testBadArguments("0", -1);
+  testBadArguments("0", 0);
+  testBadArguments("0", 1);
+  testBadArguments("0", 37);
+}
+
+main() {
+  testParseRadix();
+}
diff --git a/tests/corelib_2/bigint_test.dart b/tests/corelib_2/bigint_test.dart
new file mode 100644
index 0000000..5d5dd3d
--- /dev/null
+++ b/tests/corelib_2/bigint_test.dart
@@ -0,0 +1,926 @@
+// 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.
+
+// Testing Bigints with and without intrinsics.
+// VMOptions=
+// VMOptions=--no_intrinsify
+// VMOptions=--optimization_counter_threshold=10 --no-background_compilation
+
+import "package:expect/expect.dart";
+
+import 'dart:math' show pow;
+
+var smallNumber = new BigInt.from(1234567890); //   is 31-bit integer.
+var mediumNumber = new BigInt.from(1234567890123456); // is 53-bit integer
+var bigNumber = BigInt.parse("590295810358705600000"); // > 64-bit integer
+
+testModPow() {
+  void test(BigInt x, BigInt e, BigInt m, BigInt expectedResult) {
+    // Check that expected result is correct, using an unoptimized version.
+    assert(() {
+      slowModPow(BigInt x, BigInt e, BigInt m) {
+        var r = BigInt.one;
+        while (e > BigInt.zero) {
+          if (e.isOdd) r = (r * x) % m;
+          e >>= 1;
+          x = (x * x) % m;
+        }
+        return r;
+      }
+
+      return slowModPow(x, e, m) == expectedResult;
+    }());
+    var result = x.modPow(e, m);
+    Expect.equals(expectedResult, result, "$x.modPow($e, $m)");
+  }
+
+  test(new BigInt.from(10), new BigInt.from(20), BigInt.one, BigInt.zero);
+  test(new BigInt.from(1234567890), new BigInt.from(1000000001),
+      new BigInt.from(19), new BigInt.from(11));
+  test(new BigInt.from(1234567890), new BigInt.from(19),
+      new BigInt.from(1000000001), new BigInt.from(122998977));
+  test(new BigInt.from(19), new BigInt.from(1234567890),
+      new BigInt.from(1000000001), new BigInt.from(619059596));
+  test(new BigInt.from(19), new BigInt.from(1000000001),
+      new BigInt.from(1234567890), new BigInt.from(84910879));
+  test(new BigInt.from(1000000001), new BigInt.from(19),
+      new BigInt.from(1234567890), new BigInt.from(872984351));
+  test(new BigInt.from(1000000001), new BigInt.from(1234567890),
+      new BigInt.from(19), BigInt.zero);
+  test(BigInt.parse("12345678901234567890"),
+      BigInt.parse("10000000000000000001"), new BigInt.from(19), BigInt.two);
+  test(
+      BigInt.parse("12345678901234567890"),
+      new BigInt.from(19),
+      BigInt.parse("10000000000000000001"),
+      BigInt.parse("3239137215315834625"));
+  test(
+      new BigInt.from(19),
+      BigInt.parse("12345678901234567890"),
+      BigInt.parse("10000000000000000001"),
+      BigInt.parse("4544207837373941034"));
+  test(
+      new BigInt.from(19),
+      BigInt.parse("10000000000000000001"),
+      BigInt.parse("12345678901234567890"),
+      BigInt.parse("11135411705397624859"));
+  test(
+      BigInt.parse("10000000000000000001"),
+      new BigInt.from(19),
+      BigInt.parse("12345678901234567890"),
+      BigInt.parse("2034013733189773841"));
+  test(BigInt.parse("10000000000000000001"),
+      BigInt.parse("12345678901234567890"), new BigInt.from(19), BigInt.one);
+  test(
+      BigInt.parse("12345678901234567890"),
+      new BigInt.from(19),
+      BigInt.parse("10000000000000000001"),
+      BigInt.parse("3239137215315834625"));
+  test(BigInt.parse("12345678901234567890"),
+      BigInt.parse("10000000000000000001"), new BigInt.from(19), BigInt.two);
+  test(
+      BigInt.parse("123456789012345678901234567890"),
+      BigInt.parse("123456789012345678901234567891"),
+      BigInt.parse("123456789012345678901234567899"),
+      BigInt.parse("116401406051033429924651549616"));
+  test(
+      BigInt.parse("123456789012345678901234567890"),
+      BigInt.parse("123456789012345678901234567899"),
+      BigInt.parse("123456789012345678901234567891"),
+      BigInt.parse("123456789012345678901234567890"));
+  test(
+      BigInt.parse("123456789012345678901234567899"),
+      BigInt.parse("123456789012345678901234567890"),
+      BigInt.parse("123456789012345678901234567891"),
+      BigInt.parse("35088523091000351053091545070"));
+  test(
+      BigInt.parse("123456789012345678901234567899"),
+      BigInt.parse("123456789012345678901234567891"),
+      BigInt.parse("123456789012345678901234567890"),
+      BigInt.parse("18310047270234132455316941949"));
+  test(
+      BigInt.parse("123456789012345678901234567891"),
+      BigInt.parse("123456789012345678901234567899"),
+      BigInt.parse("123456789012345678901234567890"),
+      BigInt.one);
+  test(
+      BigInt.parse("123456789012345678901234567891"),
+      BigInt.parse("123456789012345678901234567890"),
+      BigInt.parse("123456789012345678901234567899"),
+      BigInt.parse("40128068573873018143207285483"));
+}
+
+testModInverse() {
+  void test(BigInt x, BigInt m, BigInt expectedResult) {
+    //print("$x op $m == $expectedResult");
+    // Check that expectedResult is an inverse.
+    assert(expectedResult < m);
+    // The 1 % m handles the m = 1 special case.
+    assert((((x % m) * expectedResult) - BigInt.one) % m == BigInt.zero);
+
+    var result = x.modInverse(m);
+    Expect.equals(expectedResult, result, "$x modinv $m");
+
+    if (x > m) {
+      x = x % m;
+      var result = x.modInverse(m);
+      Expect.equals(expectedResult, result, "$x modinv $m");
+    }
+  }
+
+  void testThrows(BigInt x, BigInt m) {
+    // Throws if not co-prime, which is a symmetric property.
+    Expect.throws(() => x.modInverse(m), null, "$x modinv $m");
+    Expect.throws(() => m.modInverse(x), null, "$m modinv $x");
+  }
+
+  test(BigInt.one, BigInt.one, BigInt.zero);
+
+  testThrows(BigInt.zero, new BigInt.from(1000000001));
+  testThrows(BigInt.two, new BigInt.from(4));
+  testThrows(new BigInt.from(99), new BigInt.from(9));
+  testThrows(new BigInt.from(19), new BigInt.from(1000000001));
+  testThrows(BigInt.parse("123456789012345678901234567890"),
+      BigInt.parse("123456789012345678901234567899"));
+
+  // Co-prime numbers
+  test(new BigInt.from(1234567890), new BigInt.from(19), new BigInt.from(11));
+  test(new BigInt.from(1234567890), new BigInt.from(1000000001),
+      new BigInt.from(189108911));
+  test(new BigInt.from(19), new BigInt.from(1234567890),
+      new BigInt.from(519818059));
+  test(new BigInt.from(1000000001), new BigInt.from(1234567890),
+      new BigInt.from(1001100101));
+
+  test(new BigInt.from(12345), new BigInt.from(12346), new BigInt.from(12345));
+  test(new BigInt.from(12345), new BigInt.from(12346), new BigInt.from(12345));
+
+  test(smallNumber, new BigInt.from(137), new BigInt.from(42));
+  test(new BigInt.from(137), smallNumber, new BigInt.from(856087223));
+  test(mediumNumber, new BigInt.from(137), new BigInt.from(77));
+  test(new BigInt.from(137), mediumNumber, new BigInt.from(540686667207353));
+  test(bigNumber, new BigInt.from(137), new BigInt.from(128));
+}
+
+testGcd() {
+  // Call testFunc with all combinations and orders of plus/minus
+  // value and other.
+  void callCombos(
+      BigInt value, BigInt other, void testFunc(BigInt a, BigInt b)) {
+    testFunc(value, other);
+    testFunc(value, -other);
+    testFunc(-value, other);
+    testFunc(-value, -other);
+    if (value == other) return;
+    testFunc(other, value);
+    testFunc(other, -value);
+    testFunc(-other, value);
+    testFunc(-other, -value);
+  }
+
+  // Test that gcd of value and other (non-negative) is expectedResult.
+  // Tests all combinations of positive and negative values and order of
+  // operands, so use positive values and order is not important.
+  void test(BigInt value, BigInt other, BigInt expectedResult) {
+    // Check for bug in test.
+    assert(
+        expectedResult == BigInt.zero || value % expectedResult == BigInt.zero);
+    assert(
+        expectedResult == BigInt.zero || other % expectedResult == BigInt.zero);
+
+    callCombos(value, other, (BigInt a, BigInt b) {
+      var result = a.gcd(b);
+
+      /// Check that the result is a divisor.
+      Expect.equals(
+          BigInt.zero, result == BigInt.zero ? a : a % result, "$result | $a");
+      Expect.equals(
+          BigInt.zero, result == BigInt.zero ? b : b % result, "$result | $b");
+      // Check for bug in test. If assert fails, the expected value is too low,
+      // and the gcd call has found a greater common divisor.
+      assert(result >= expectedResult);
+      Expect.equals(expectedResult, result, "$a.gcd($b)");
+    });
+  }
+
+  // Test that gcd of value and other (non-negative) throws.
+  testThrows(value, other) {
+    callCombos(value, other, (a, b) {
+      Expect.throws(() => a.gcd(b), null, "$a.gcd($b)");
+    });
+  }
+
+  // Format:
+  //  test(value1, value2, expectedResult);
+  test(BigInt.one, BigInt.one, BigInt.one); //     both are 1
+  test(BigInt.one, BigInt.two, BigInt.one); //     one is 1
+  test(new BigInt.from(3), new BigInt.from(5), BigInt.one); //     coprime.
+  test(new BigInt.from(37), new BigInt.from(37),
+      new BigInt.from(37)); // Same larger prime.
+
+  test(new BigInt.from(9999), new BigInt.from(7272),
+      new BigInt.from(909)); // Larger numbers
+
+  test(BigInt.zero, new BigInt.from(1000),
+      new BigInt.from(1000)); // One operand is zero.
+  test(BigInt.zero, BigInt.zero, BigInt.zero); //        Both operands are zero.
+
+  // Multiplying both operands by a number multiplies result by same number.
+  test(new BigInt.from(693), new BigInt.from(609), new BigInt.from(21));
+  test(new BigInt.from(693) << 5, new BigInt.from(609) << 5,
+      new BigInt.from(21) << 5);
+  test(
+      new BigInt.from(693) * new BigInt.from(937),
+      new BigInt.from(609) * new BigInt.from(937),
+      new BigInt.from(21) * new BigInt.from(937));
+  test(
+      new BigInt.from(693) * new BigInt.from(pow(2, 32)),
+      new BigInt.from(609) * new BigInt.from(pow(2, 32)),
+      new BigInt.from(21) * new BigInt.from(pow(2, 32)));
+  test(
+      new BigInt.from(693) * BigInt.two.pow(52),
+      new BigInt.from(609) * BigInt.two.pow(52),
+      new BigInt.from(21) * BigInt.two.pow(52));
+  test(
+      new BigInt.from(693) * BigInt.two.pow(53),
+      new BigInt.from(609) * BigInt.two.pow(53),
+      new BigInt.from(21) * BigInt.two.pow(53)); // Regression.
+  test(
+      new BigInt.from(693) * BigInt.two.pow(99),
+      new BigInt.from(609) * BigInt.two.pow(99),
+      new BigInt.from(21) * BigInt.two.pow(99));
+
+  test(new BigInt.from(1234567890), new BigInt.from(19), BigInt.one);
+  test(new BigInt.from(1234567890), new BigInt.from(1000000001), BigInt.one);
+  test(new BigInt.from(19), new BigInt.from(1000000001), new BigInt.from(19));
+
+  test(new BigInt.from(0x3FFFFFFF), new BigInt.from(0x3FFFFFFF),
+      new BigInt.from(0x3FFFFFFF));
+  test(new BigInt.from(0x3FFFFFFF), new BigInt.from(0x40000000), BigInt.one);
+
+  test(BigInt.two.pow(54), BigInt.two.pow(53), BigInt.two.pow(53));
+
+  test(
+      (BigInt.two.pow(52) - BigInt.one) * BigInt.two.pow(14),
+      (BigInt.two.pow(26) - BigInt.one) * BigInt.two.pow(22),
+      (BigInt.two.pow(26) - BigInt.one) * BigInt.two.pow(14));
+}
+
+foo() => BigInt.parse("1234567890123456789");
+bar() => BigInt.parse("12345678901234567890");
+
+testSmiOverflow() {
+  var a = new BigInt.from(1073741823);
+  var b = new BigInt.from(1073741822);
+  Expect.equals(new BigInt.from(2147483645), a + b);
+  a = -new BigInt.from(1000000000);
+  b = new BigInt.from(1000000001);
+  Expect.equals(-new BigInt.from(2000000001), a - b);
+  Expect.equals(-BigInt.parse("1000000001000000000"), a * b);
+}
+
+testBigintAdd() {
+  // Bigint and Smi.
+  var a = BigInt.parse("12345678901234567890");
+  var b = BigInt.two;
+  Expect.equals(BigInt.parse("12345678901234567892"), a + b);
+  Expect.equals(BigInt.parse("12345678901234567892"), b + a);
+  // Bigint and Bigint.
+  a = BigInt.parse("10000000000000000001");
+  Expect.equals(BigInt.parse("20000000000000000002"), a + a);
+}
+
+testBigintSub() {
+  // Bigint and Smi.
+  var a = BigInt.parse("12345678901234567890");
+  var b = BigInt.two;
+  Expect.equals(BigInt.parse("12345678901234567888"), a - b);
+  Expect.equals(-BigInt.parse("12345678901234567888"), b - a);
+  // Bigint and Bigint.
+  a = BigInt.parse("10000000000000000001");
+  Expect.equals(BigInt.parse("20000000000000000002"), a + a);
+}
+
+testBigintMul() {
+  // Bigint and Smi.
+  var a = BigInt.parse("12345678901234567890");
+  var b = new BigInt.from(10);
+  Expect.equals(BigInt.parse("123456789012345678900"), a * b);
+  Expect.equals(BigInt.parse("123456789012345678900"), b * a);
+  // Bigint and Bigint.
+  a = BigInt.parse("12345678901234567890");
+  b = BigInt.parse("10000000000000000");
+  Expect.equals(BigInt.parse("123456789012345678900000000000000000"), a * b);
+}
+
+testBigintTruncDiv() {
+  var a = BigInt.parse("12345678901234567890");
+  var b = new BigInt.from(10);
+  // Bigint and Smi.
+  Expect.equals(BigInt.parse("1234567890123456789"), a ~/ b);
+  Expect.equals(BigInt.zero, b ~/ a);
+  Expect.equals(new BigInt.from(123456789),
+      BigInt.parse("123456789012345678") ~/ new BigInt.from(1000000000));
+  // Bigint and Bigint.
+  a = BigInt.parse("12345678901234567890");
+  b = BigInt.parse("10000000000000000");
+  Expect.equals(new BigInt.from(1234), a ~/ b);
+}
+
+testBigintDiv() {
+  // Bigint and Smi.
+  Expect.equals(1234567890123456789.1,
+      BigInt.parse("12345678901234567891") / new BigInt.from(10));
+  Expect.equals(
+      0.000000001234, new BigInt.from(1234) / new BigInt.from(1000000000000));
+  Expect.equals(12345678901234000000.0,
+      BigInt.parse("123456789012340000000") / new BigInt.from(10));
+  // Bigint and Bigint.
+  var a = BigInt.parse("12345670000000000000");
+  var b = BigInt.parse("10000000000000000");
+  Expect.equals(1234.567, a / b);
+}
+
+testBigintModulo() {
+  // Bigint and Smi.
+  var a = new BigInt.from(1000000000005);
+  var b = new BigInt.from(10);
+  Expect.equals(new BigInt.from(5), a % b);
+  Expect.equals(new BigInt.from(10), b % a);
+  // Bigint & Bigint
+  a = BigInt.parse("10000000000000000001");
+  b = BigInt.parse("10000000000000000000");
+  Expect.equals(BigInt.one, a % b);
+  Expect.equals(BigInt.parse("10000000000000000000"), b % a);
+}
+
+testBigintModPow() {
+  var x, e, m;
+  x = new BigInt.from(1234567890);
+  e = new BigInt.from(1000000001);
+  m = new BigInt.from(19);
+  Expect.equals(new BigInt.from(11), x.modPow(e, m));
+  x = new BigInt.from(1234567890);
+  e = new BigInt.from(19);
+  m = new BigInt.from(1000000001);
+  Expect.equals(new BigInt.from(122998977), x.modPow(e, m));
+  x = new BigInt.from(19);
+  e = new BigInt.from(1234567890);
+  m = new BigInt.from(1000000001);
+  Expect.equals(new BigInt.from(619059596), x.modPow(e, m));
+  x = new BigInt.from(19);
+  e = new BigInt.from(1000000001);
+  m = new BigInt.from(1234567890);
+  Expect.equals(new BigInt.from(84910879), x.modPow(e, m));
+  x = new BigInt.from(1000000001);
+  e = new BigInt.from(19);
+  m = new BigInt.from(1234567890);
+  Expect.equals(new BigInt.from(872984351), x.modPow(e, m));
+  x = new BigInt.from(1000000001);
+  e = new BigInt.from(1234567890);
+  m = new BigInt.from(19);
+  Expect.equals(BigInt.zero, x.modPow(e, m));
+  x = BigInt.parse("12345678901234567890");
+  e = BigInt.parse("10000000000000000001");
+  m = new BigInt.from(19);
+  Expect.equals(BigInt.two, x.modPow(e, m));
+  x = BigInt.parse("12345678901234567890");
+  e = new BigInt.from(19);
+  m = BigInt.parse("10000000000000000001");
+  Expect.equals(BigInt.parse("3239137215315834625"), x.modPow(e, m));
+  x = new BigInt.from(19);
+  e = BigInt.parse("12345678901234567890");
+  m = BigInt.parse("10000000000000000001");
+  Expect.equals(BigInt.parse("4544207837373941034"), x.modPow(e, m));
+  x = new BigInt.from(19);
+  e = BigInt.parse("10000000000000000001");
+  m = BigInt.parse("12345678901234567890");
+  Expect.equals(BigInt.parse("11135411705397624859"), x.modPow(e, m));
+  x = BigInt.parse("10000000000000000001");
+  e = new BigInt.from(19);
+  m = BigInt.parse("12345678901234567890");
+  Expect.equals(BigInt.parse("2034013733189773841"), x.modPow(e, m));
+  x = BigInt.parse("10000000000000000001");
+  e = BigInt.parse("12345678901234567890");
+  m = new BigInt.from(19);
+  Expect.equals(BigInt.one, x.modPow(e, m));
+  x = BigInt.parse("12345678901234567890");
+  e = new BigInt.from(19);
+  m = BigInt.parse("10000000000000000001");
+  Expect.equals(BigInt.parse("3239137215315834625"), x.modPow(e, m));
+  x = BigInt.parse("12345678901234567890");
+  e = BigInt.parse("10000000000000000001");
+  m = new BigInt.from(19);
+  Expect.equals(BigInt.two, x.modPow(e, m));
+  x = BigInt.parse("123456789012345678901234567890");
+  e = BigInt.parse("123456789012345678901234567891");
+  m = BigInt.parse("123456789012345678901234567899");
+  Expect.equals(BigInt.parse("116401406051033429924651549616"), x.modPow(e, m));
+  x = BigInt.parse("123456789012345678901234567890");
+  e = BigInt.parse("123456789012345678901234567899");
+  m = BigInt.parse("123456789012345678901234567891");
+  Expect.equals(BigInt.parse("123456789012345678901234567890"), x.modPow(e, m));
+  x = BigInt.parse("123456789012345678901234567899");
+  e = BigInt.parse("123456789012345678901234567890");
+  m = BigInt.parse("123456789012345678901234567891");
+  Expect.equals(BigInt.parse("35088523091000351053091545070"), x.modPow(e, m));
+  x = BigInt.parse("123456789012345678901234567899");
+  e = BigInt.parse("123456789012345678901234567891");
+  m = BigInt.parse("123456789012345678901234567890");
+  Expect.equals(BigInt.parse("18310047270234132455316941949"), x.modPow(e, m));
+  x = BigInt.parse("123456789012345678901234567891");
+  e = BigInt.parse("123456789012345678901234567899");
+  m = BigInt.parse("123456789012345678901234567890");
+  Expect.equals(BigInt.one, x.modPow(e, m));
+  x = BigInt.parse("123456789012345678901234567891");
+  e = BigInt.parse("123456789012345678901234567890");
+  m = BigInt.parse("123456789012345678901234567899");
+  Expect.equals(BigInt.parse("40128068573873018143207285483"), x.modPow(e, m));
+}
+
+testBigintModInverse() {
+  var x, m;
+  x = BigInt.one;
+  m = BigInt.one;
+  Expect.equals(BigInt.zero, x.modInverse(m));
+  x = BigInt.zero;
+  m = new BigInt.from(1000000001);
+  Expect.throws(() => x.modInverse(m), (e) => e is Exception); // Not coprime.
+  x = new BigInt.from(1234567890);
+  m = new BigInt.from(19);
+  Expect.equals(new BigInt.from(11), x.modInverse(m));
+  x = new BigInt.from(1234567890);
+  m = new BigInt.from(1000000001);
+  Expect.equals(new BigInt.from(189108911), x.modInverse(m));
+  x = new BigInt.from(19);
+  m = new BigInt.from(1000000001);
+  Expect.throws(() => x.modInverse(m), (e) => e is Exception); // Not coprime.
+  x = new BigInt.from(19);
+  m = new BigInt.from(1234567890);
+  Expect.equals(new BigInt.from(519818059), x.modInverse(m));
+  x = new BigInt.from(1000000001);
+  m = new BigInt.from(1234567890);
+  Expect.equals(new BigInt.from(1001100101), x.modInverse(m));
+  x = new BigInt.from(1000000001);
+  m = new BigInt.from(19);
+  Expect.throws(() => x.modInverse(m), (e) => e is Exception); // Not coprime.
+  x = BigInt.parse("12345678901234567890");
+  m = new BigInt.from(19);
+  Expect.equals(new BigInt.from(3), x.modInverse(m));
+  x = BigInt.parse("12345678901234567890");
+  m = BigInt.parse("10000000000000000001");
+  Expect.equals(BigInt.parse("9736746307686209582"), x.modInverse(m));
+  x = new BigInt.from(19);
+  m = BigInt.parse("10000000000000000001");
+  Expect.equals(BigInt.parse("6315789473684210527"), x.modInverse(m));
+  x = new BigInt.from(19);
+  m = BigInt.parse("12345678901234567890");
+  Expect.equals(BigInt.parse("10396361179987004539"), x.modInverse(m));
+  x = BigInt.parse("10000000000000000001");
+  m = BigInt.parse("12345678901234567890");
+  Expect.equals(BigInt.parse("325004555487045911"), x.modInverse(m));
+  x = BigInt.parse("10000000000000000001");
+  m = new BigInt.from(19);
+  Expect.equals(new BigInt.from(7), x.modInverse(m));
+  x = BigInt.parse("12345678901234567890");
+  m = BigInt.parse("10000000000000000001");
+  Expect.equals(BigInt.parse("9736746307686209582"), x.modInverse(m));
+  x = BigInt.parse("12345678901234567890");
+  m = new BigInt.from(19);
+  Expect.equals(new BigInt.from(3), x.modInverse(m));
+  x = BigInt.parse("123456789012345678901234567890");
+  m = BigInt.parse("123456789012345678901234567899");
+  Expect.throws(() => x.modInverse(m), (e) => e is Exception); // Not coprime.
+  x = BigInt.parse("123456789012345678901234567890");
+  m = BigInt.parse("123456789012345678901234567891");
+  Expect.equals(
+      BigInt.parse("123456789012345678901234567890"), x.modInverse(m));
+  x = BigInt.parse("123456789012345678901234567899");
+  m = BigInt.parse("123456789012345678901234567891");
+  Expect.equals(BigInt.parse("77160493132716049313271604932"), x.modInverse(m));
+  x = BigInt.parse("123456789012345678901234567899");
+  m = BigInt.parse("123456789012345678901234567890");
+  Expect.throws(() => x.modInverse(m), (e) => e is Exception); // Not coprime.
+  x = BigInt.parse("123456789012345678901234567891");
+  m = BigInt.parse("123456789012345678901234567890");
+  Expect.equals(BigInt.one, x.modInverse(m));
+  x = BigInt.parse("123456789012345678901234567891");
+  m = BigInt.parse("123456789012345678901234567899");
+  Expect.equals(BigInt.parse("46296295879629629587962962962"), x.modInverse(m));
+}
+
+testBigintGcd() {
+  var x, m;
+  x = BigInt.one;
+  m = BigInt.one;
+  Expect.equals(BigInt.one, x.gcd(m));
+  x = new BigInt.from(693);
+  m = new BigInt.from(609);
+  Expect.equals(new BigInt.from(21), x.gcd(m));
+  x = new BigInt.from(693) << 40;
+  m = new BigInt.from(609) << 40;
+  Expect.equals(new BigInt.from(21) << 40, x.gcd(m));
+  x = new BigInt.from(609) << 40;
+  m = new BigInt.from(693) << 40;
+  Expect.equals(new BigInt.from(21) << 40, x.gcd(m));
+  x = BigInt.zero;
+  m = new BigInt.from(1000000001);
+  Expect.equals(m, x.gcd(m));
+  x = new BigInt.from(1000000001);
+  m = BigInt.zero;
+  Expect.equals(x, x.gcd(m));
+  x = BigInt.zero;
+  m = -new BigInt.from(1000000001);
+  Expect.equals(-m, x.gcd(m));
+  x = -new BigInt.from(1000000001);
+  m = BigInt.zero;
+  Expect.equals(-x, x.gcd(m));
+  x = BigInt.zero;
+  m = BigInt.zero;
+  Expect.equals(BigInt.zero, x.gcd(m));
+  x = BigInt.zero;
+  m = BigInt.parse("123456789012345678901234567890");
+  Expect.equals(m, x.gcd(m));
+  x = BigInt.parse("123456789012345678901234567890");
+  m = BigInt.zero;
+  Expect.equals(x, x.gcd(m));
+  x = BigInt.zero;
+  m = -BigInt.parse("123456789012345678901234567890");
+  Expect.equals(-m, x.gcd(m));
+  x = -BigInt.parse("123456789012345678901234567890");
+  m = BigInt.zero;
+  Expect.equals(-x, x.gcd(m));
+  x = new BigInt.from(1234567890);
+  m = new BigInt.from(19);
+  Expect.equals(BigInt.one, x.gcd(m));
+  x = new BigInt.from(1234567890);
+  m = new BigInt.from(1000000001);
+  Expect.equals(BigInt.one, x.gcd(m));
+  x = new BigInt.from(19);
+  m = new BigInt.from(1000000001);
+  Expect.equals(new BigInt.from(19), x.gcd(m));
+  x = new BigInt.from(19);
+  m = new BigInt.from(1234567890);
+  Expect.equals(BigInt.one, x.gcd(m));
+  x = new BigInt.from(1000000001);
+  m = new BigInt.from(1234567890);
+  Expect.equals(BigInt.one, x.gcd(m));
+  x = new BigInt.from(1000000001);
+  m = new BigInt.from(19);
+  Expect.equals(new BigInt.from(19), x.gcd(m));
+  x = BigInt.parse("12345678901234567890");
+  m = new BigInt.from(19);
+  Expect.equals(BigInt.one, x.gcd(m));
+  x = BigInt.parse("12345678901234567890");
+  m = BigInt.parse("10000000000000000001");
+  Expect.equals(BigInt.one, x.gcd(m));
+  x = new BigInt.from(19);
+  m = BigInt.parse("10000000000000000001");
+  Expect.equals(BigInt.one, x.gcd(m));
+  x = new BigInt.from(19);
+  m = BigInt.parse("12345678901234567890");
+  Expect.equals(BigInt.one, x.gcd(m));
+  x = BigInt.parse("10000000000000000001");
+  m = BigInt.parse("12345678901234567890");
+  Expect.equals(BigInt.one, x.gcd(m));
+  x = BigInt.parse("10000000000000000001");
+  m = new BigInt.from(19);
+  Expect.equals(BigInt.one, x.gcd(m));
+  x = BigInt.parse("12345678901234567890");
+  m = BigInt.parse("10000000000000000001");
+  Expect.equals(BigInt.one, x.gcd(m));
+  x = BigInt.parse("12345678901234567890");
+  m = new BigInt.from(19);
+  Expect.equals(BigInt.one, x.gcd(m));
+  x = BigInt.parse("123456789012345678901234567890");
+  m = BigInt.parse("123456789012345678901234567899");
+  Expect.equals(new BigInt.from(9), x.gcd(m));
+  x = BigInt.parse("123456789012345678901234567890");
+  m = BigInt.parse("123456789012345678901234567891");
+  Expect.equals(BigInt.one, x.gcd(m));
+  x = BigInt.parse("123456789012345678901234567899");
+  m = BigInt.parse("123456789012345678901234567891");
+  Expect.equals(BigInt.one, x.gcd(m));
+  x = BigInt.parse("123456789012345678901234567899");
+  m = BigInt.parse("123456789012345678901234567890");
+  Expect.equals(new BigInt.from(9), x.gcd(m));
+  x = BigInt.parse("123456789012345678901234567891");
+  m = BigInt.parse("123456789012345678901234567890");
+  Expect.equals(BigInt.one, x.gcd(m));
+  x = BigInt.parse("123456789012345678901234567891");
+  m = BigInt.parse("123456789012345678901234567899");
+  Expect.equals(BigInt.one, x.gcd(m));
+}
+
+testBigintNegate() {
+  var a = BigInt.parse("0xF000000000000000F");
+  var b = ~a; // negate.
+  Expect.equals(BigInt.parse("-0xF0000000000000010"), b);
+  Expect.equals(BigInt.zero, a & b);
+  Expect.equals(-BigInt.one, a | b);
+}
+
+testShiftAmount() {
+  Expect.equals(BigInt.zero, new BigInt.from(12) >> 0x7FFFFFFFFFFFFFFF);
+  Expect.equals(-BigInt.one, -new BigInt.from(12) >> 0x7FFFFFFFFFFFFFFF);
+  bool exceptionCaught = false;
+  try {
+    var a = BigInt.one << 0x7FFFFFFFFFFFFFFF;
+  } on OutOfMemoryError catch (e) {
+    exceptionCaught = true;
+  } catch (e) {
+    // In JavaScript the allocation of the internal array throws different
+    // kind of errors. Just assume it's the right one.
+    exceptionCaught = true;
+  }
+  Expect.equals(true, exceptionCaught);
+}
+
+void testPow() {
+  Expect.throws(() => BigInt.zero.pow(-1), (e) => e is ArgumentError);
+  Expect.throws(() => BigInt.one.pow(-1), (e) => e is ArgumentError);
+  Expect.equals(BigInt.one, BigInt.zero.pow(0));
+  Expect.equals(BigInt.one, BigInt.one.pow(0));
+  Expect.equals(BigInt.one, BigInt.two.pow(0));
+
+  Expect.equals(
+      BigInt.parse("6208695403009031808124000434786599466508260573005"
+          "3508480680160632742505079094163654310415168343540278191693"
+          "5380629274547924077088101599462083663373536705603680787010"
+          "0454231036999140164473780469056908670815701571304455697970"
+          "9971709527651446612272365411298758026041094781651768636427"
+          "4780767345075500515905845436036697865291662016364446907149"
+          "5652136304764312997430969058854587555188117728022873502683"
+          "6327099687782677885098446991121805146733387058565662606025"
+          "2854981418159051193843689364388302820905062090182919338371"
+          "8783490348348213313279505263650976040646393394551465619437"
+          "7126646818740571207346633109049097273375955956480091920939"
+          "5595130499375022416542475049562151695680373438890512164488"
+          "6567991220660935537691145761690539808578087290707813875567"
+          "9145826183642842261374804672283964244725240865733938342036"
+          "1216219271232461693264437901347421563392441043817990067322"
+          "88"),
+      BigInt.parse("90218646930912603144382974164422").pow(27));
+  ;
+}
+
+void testToRadixString() {
+  // Test that we accept radix 2 to 36 and that we use lower-case
+  // letters.
+  var expected = [
+    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', //
+    'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', //
+    's', 't', 'u', 'v', 'w', 'x', 'y', 'z' //
+  ];
+  for (var radix = 2; radix <= 36; radix++) {
+    for (var i = 0; i < radix; i++) {
+      Expect.equals(expected[i], new BigInt.from(i).toRadixString(radix));
+    }
+  }
+
+  var illegalRadices = [-1, 0, 1, 37];
+  for (var radix in illegalRadices) {
+    try {
+      new BigInt.from(42).toRadixString(radix);
+      Expect.fail("Exception expected");
+    } on ArgumentError catch (e) {
+      // Nothing to do.
+    }
+  }
+
+  // Try large numbers (regression test for issue 15316).
+  var bignums = [
+    BigInt.parse("0x80000000"),
+    BigInt.parse("0x100000000"),
+    BigInt.parse("0x10000000000000"),
+    BigInt.parse("0x10000000000001"), // 53 significant bits.
+    BigInt.parse("0x20000000000000"),
+    BigInt.parse("0x20000000000002"),
+    BigInt.parse("0x1000000000000000"),
+    BigInt.parse("0x1000000000000100"),
+    BigInt.parse("0x2000000000000000"),
+    BigInt.parse("0x2000000000000200"),
+    BigInt.parse("0x8000000000000000"),
+    BigInt.parse("0x8000000000000800"),
+    BigInt.parse("0x10000000000000000"),
+    BigInt.parse("0x10000000000001000"),
+    BigInt.parse("0x100000000000010000"),
+    BigInt.parse("0x1000000000000100000"),
+    BigInt.parse("0x10000000000001000000"),
+    BigInt.parse("0x100000000000010000000"),
+    BigInt.parse("0x1000000000000100000000"),
+    BigInt.parse("0x10000000000001000000000"),
+  ];
+  for (var bignum in bignums) {
+    for (int radix = 2; radix <= 36; radix++) {
+      String digits = bignum.toRadixString(radix);
+      BigInt result = BigInt.parse(digits, radix: radix);
+      Expect.equals(
+          bignum, result, "${bignum.toRadixString(16)} -> $digits/$radix");
+    }
+  }
+}
+
+testToString() {
+  /// Test that converting [value] to a string gives [expect].
+  /// Also test that `-value` gives `"-"+expect`.
+  test(BigInt value, String expect) {
+    Expect.equals(expect, value.toString());
+    Expect.equals(expect, "$value");
+    Expect.equals(expect, (new StringBuffer()..write(value)).toString());
+    if (value == BigInt.zero) return;
+    expect = "-$expect";
+    value = -value;
+    Expect.equals(expect, value.toString());
+    Expect.equals(expect, "$value");
+    Expect.equals(expect, (new StringBuffer()..write(value)).toString());
+  }
+
+  // Very simple tests.
+  test(BigInt.zero, "0");
+  test(BigInt.one, "1");
+  test(BigInt.two, "2");
+  test(new BigInt.from(5), "5");
+
+  // Binary special cases.
+
+  // ~2^30.
+  test(BigInt.parse("0x3fffffff"), "1073741823");
+  test(BigInt.parse("0x40000000"), "1073741824");
+  test(BigInt.parse("0x40000001"), "1073741825");
+  // ~2^31.
+  test(BigInt.parse("0x7fffffff"), "2147483647");
+  test(BigInt.parse("0x80000000"), "2147483648");
+  test(BigInt.parse("0x80000001"), "2147483649");
+  // ~2^32.
+  test(BigInt.parse("0xffffffff"), "4294967295");
+  test(BigInt.parse("0x100000000"), "4294967296");
+  test(BigInt.parse("0x100000001"), "4294967297");
+
+  // ~2^51.
+  test(BigInt.parse("0x7ffffffffffff"), "2251799813685247");
+  test(BigInt.parse("0x8000000000000"), "2251799813685248");
+  test(BigInt.parse("0x8000000000001"), "2251799813685249");
+  // ~2^52.
+  test(BigInt.parse("0xfffffffffffff"), "4503599627370495");
+  test(BigInt.parse("0x10000000000000"), "4503599627370496");
+  test(BigInt.parse("0x10000000000001"), "4503599627370497");
+  // ~2^53.
+  test(BigInt.parse("0x1fffffffffffff"), "9007199254740991");
+  test(BigInt.parse("0x20000000000000"), "9007199254740992");
+  test(BigInt.parse("0x20000000000001"), "9007199254740993");
+  // ~2^62.
+  test(BigInt.parse("0x3fffffffffffffff"), "4611686018427387903");
+  test(BigInt.parse("0x4000000000000000"), "4611686018427387904");
+  test(BigInt.parse("0x4000000000000001"), "4611686018427387905");
+  // ~2^63.
+  test(BigInt.parse("0x7fffffffffffffff"), "9223372036854775807");
+  test(BigInt.parse("0x8000000000000000"), "9223372036854775808");
+  test(BigInt.parse("0x8000000000000001"), "9223372036854775809");
+  // ~2^64.
+  test(BigInt.parse("0xffffffffffffffff"), "18446744073709551615");
+  test(BigInt.parse("0x10000000000000000"), "18446744073709551616");
+  test(BigInt.parse("0x10000000000000001"), "18446744073709551617");
+  // Big bignum.
+  test(BigInt.parse("123456789012345678901234567890"),
+      "123456789012345678901234567890");
+
+  // Decimal special cases.
+
+  BigInt number = new BigInt.from(10);
+  // Numbers 99..99, 100...00, and 100..01 up to 23 digits.
+  for (int i = 1; i < 22; i++) {
+    test(number - BigInt.one, "9" * i);
+    test(number, "1" + "0" * i);
+    test(number + BigInt.one, "1" + "0" * (i - 1) + "1");
+    number *= new BigInt.from(10);
+  }
+}
+
+void testFromToInt() {
+  void test(int x) {
+    var bigFrom = new BigInt.from(x);
+    var bigStr = bigFrom.toString();
+    Expect.equals(x, bigFrom.toInt());
+    Expect.equals(x, int.parse(bigStr));
+  }
+
+  for (int i = 0; i < 20; i++) {
+    test(i);
+    // Dart2js doesn't know that -0 should stay 0.
+    if (i != 0) test(-i);
+  }
+
+  // For now just test "easy" integers since there is no check yet that clamps
+  // the returned integer.
+  for (int i = 0; i < 2000000; i += 10000) {
+    test(i);
+    // Dart2js doesn't know that -0 should stay 0.
+    if (i != 0) test(-i);
+  }
+
+  const minInt64 = -9223372036854775807 - 1;
+  test(minInt64);
+}
+
+void testFromToDouble() {
+  Expect.equals(-1.0, (-BigInt.one).toDouble());
+
+  Expect.throws(() => new BigInt.from(double.nan));
+  Expect.throws(() => new BigInt.from(double.infinity));
+  Expect.throws(() => new BigInt.from(-double.infinity));
+
+  const double maxDouble = 1.7976931348623157e+308;
+  const String maxDoubleHexStr = "0xfffffffffffff8000000000000000"
+      "00000000000000000000000000000000000000000000000000000000000000"
+      "00000000000000000000000000000000000000000000000000000000000000"
+      "00000000000000000000000000000000000000000000000000000000000000"
+      "00000000000000000000000000000000000000000";
+
+  // The following value lies directly on the boundary between max double and
+  // infinity. It rounds to infinity. Any value below rounds to a finite double
+  // value.
+  const String maxDoubleBoundaryStr = "0xfffffffffffffc0000000000"
+      "00000000000000000000000000000000000000000000000000000000000000"
+      "00000000000000000000000000000000000000000000000000000000000000"
+      "00000000000000000000000000000000000000000000000000000000000000"
+      "0000000000000000000000000000000000000000000000";
+
+  var bigMax = BigInt.parse(maxDoubleHexStr);
+  var bigBoundary = BigInt.parse(maxDoubleBoundaryStr);
+  Expect.equals(maxDouble, bigMax.toDouble());
+  Expect.equals(bigMax, new BigInt.from(maxDouble));
+  Expect.equals(double.infinity, bigBoundary.toDouble());
+  Expect.equals(maxDouble, (bigBoundary - BigInt.one).toDouble());
+
+  Expect.equals(-maxDouble, (-bigMax).toDouble());
+  Expect.equals(-bigMax, new BigInt.from(-maxDouble));
+  Expect.equals(-double.infinity, (-bigBoundary).toDouble());
+  Expect.equals(-maxDouble, (-(bigBoundary - BigInt.one)).toDouble());
+
+  void test(int x) {
+    var str = x.toString();
+    var big = BigInt.parse(str);
+    Expect.equals(x, big.toDouble());
+  }
+
+  for (int i = 0; i < 20; i++) {
+    test(i);
+    // Dart2js doesn't know that -0 should stay 0.
+    if (i != 0) test(-i);
+  }
+
+  for (int i = 0; i < 2000000; i += 10000) {
+    test(i);
+    // Dart2js doesn't know that -0 should stay 0.
+    if (i != 0) test(-i);
+  }
+
+  for (int i = 1000; i < 100000; i += 1000) {
+    var d = 1 / i;
+    Expect.equals(BigInt.zero, new BigInt.from(d));
+  }
+
+  // Non-integer values are truncated.
+  Expect.equals(BigInt.one, new BigInt.from(1.5));
+  Expect.equals(-BigInt.one, new BigInt.from(-1.5));
+
+  Expect.equals(BigInt.zero, new BigInt.from(0.9999999999999999));
+  Expect.equals(BigInt.zero, new BigInt.from(-0.9999999999999999));
+}
+
+main() {
+  for (int i = 0; i < 10; i++) {
+    Expect.equals(BigInt.parse("1234567890123456789"), foo());
+    Expect.equals(BigInt.parse("12345678901234567890"), bar());
+    testModPow();
+    testModInverse();
+    testGcd();
+    testSmiOverflow();
+    testBigintAdd();
+    testBigintSub();
+    testBigintMul();
+    testBigintTruncDiv();
+    testBigintDiv();
+    testBigintModulo();
+    testBigintModPow();
+    testBigintModInverse();
+    testBigintGcd();
+    testBigintNegate();
+    testShiftAmount();
+    testPow();
+    testToRadixString();
+    testToString();
+    testFromToInt();
+    testFromToDouble();
+    Expect.equals(BigInt.parse("12345678901234567890"),
+        BigInt.parse("12345678901234567890").abs());
+    Expect.equals(BigInt.parse("12345678901234567890"),
+        BigInt.parse("-12345678901234567890").abs());
+    var a = BigInt.parse("10000000000000000000");
+    var b = BigInt.parse("10000000000000000001");
+    Expect.equals(false, a.hashCode == b.hashCode);
+    Expect.equals(true, a.hashCode == (b - BigInt.one).hashCode);
+  }
+}
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index ccb021f..f81aae5 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -209,6 +209,7 @@
 
 [ $compiler == dart2js && $checked && $dart2js_with_kernel ]
 apply3_test: RuntimeError
+error_stack_trace1_test: RuntimeError # Issue 12399
 from_environment_const_type_test/02: MissingCompileTimeError
 from_environment_const_type_test/03: MissingCompileTimeError
 from_environment_const_type_test/04: MissingCompileTimeError
@@ -259,6 +260,7 @@
 
 [ $compiler == dart2js && $dart2js_with_kernel && $host_checked ]
 apply3_test: RuntimeError
+error_stack_trace1_test: RuntimeError # Issue 12399
 iterable_return_type_test/01: RuntimeError
 iterable_return_type_test/02: RuntimeError
 iterable_to_list_test/01: RuntimeError
@@ -314,6 +316,7 @@
 [ $compiler == dartdevc && $runtime != none ]
 apply2_test: RuntimeError # Issue 29921
 apply3_test: RuntimeError # Issue 29921
+bigint_test: Pass, Slow
 compare_to2_test: RuntimeError # Issue 30170
 date_time10_test: RuntimeError # Issue 29921
 error_stack_trace_test/nullThrown: RuntimeError # .stackTrace not present for exception caught from 'throw null;'
@@ -447,6 +450,15 @@
 symbol_test/none: RuntimeError
 unicode_test: RuntimeError
 
+# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
+# are to be triaged.  Isolate tests are skipped on purpose due to the usage of
+# batch mode.
+[ $compiler == dartk && $strong && ($arch == simarm || $arch == simarm64) ]
+bit_twiddling_test/int64: CompileTimeError # Please triage.
+integer_to_radix_string_test/02: CompileTimeError # Please triage.
+integer_to_string_test/01: CompileTimeError # Please triage.
+num_sign_test: CompileTimeError # Please triage.
+
 [ $compiler == dartkp && $mode == debug && $runtime == dart_precompiled && $strong ]
 bit_twiddling_test/int64: CompileTimeError
 integer_parsed_arith_vm_test/01: RuntimeError
@@ -681,5 +693,6 @@
 string_trimlr_test/02: RuntimeError # Uses Unicode 6.2.0 or earlier.
 
 [ $hot_reload || $hot_reload_rollback ]
+bigint_parse_radix_test: Pass, Timeout # Issue 31659
+bigint_test: Pass, Crash # Issue 31660
 integer_parsed_mul_div_vm_test: Pass, Slow # Slow
-
diff --git a/tests/corelib_2/int_parse_with_limited_ints_test.dart b/tests/corelib_2/int_parse_with_limited_ints_test.dart
index 301d13d..0007cec 100644
--- a/tests/corelib_2/int_parse_with_limited_ints_test.dart
+++ b/tests/corelib_2/int_parse_with_limited_ints_test.dart
@@ -20,10 +20,7 @@
   Expect.equals(0x7fffffffffffffff, int.parse("0x7fffffffffffffff"));
   Expect.equals(-0x7fffffffffffffff, int.parse("-0x7fffffffffffffff"));
   Expect.equals(-0x7fffffffffffffff - 1, int.parse("-0x8000000000000000"));
-
-  Expect.throwsFormatException(() => int.parse("0x8000000000000000"));
-  Expect.equals(ERROR, int.parse("0x8000000000000000", onError: returnError));
-  Expect.equals(ERROR, int.parse("-0x8000000000000001", onError: returnError));
+  Expect.equals(1 << 63, int.parse("0x8000000000000000"));
 
   Expect.equals(8999999999999999999, int.parse("8999999999999999999"));
   Expect.equals(-8999999999999999999, int.parse("-8999999999999999999"));
@@ -31,6 +28,7 @@
   Expect.equals(-9223372036854775807, int.parse("-9223372036854775807"));
   Expect.equals(-9223372036854775807 - 1, int.parse("-9223372036854775808"));
 
+  Expect.equals(ERROR, int.parse("-0x8000000000000001", onError: returnError));
   Expect.equals(ERROR, int.parse("9223372036854775808", onError: returnError));
   Expect.equals(ERROR, int.parse("9223372036854775809", onError: returnError));
   Expect.equals(ERROR, int.parse("-9223372036854775809", onError: returnError));
diff --git a/tests/html/html.status b/tests/html/html.status
index 663af62..629256f 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -161,8 +161,6 @@
 fileapi_test/getFile: Fail # TODO(dart2js-team): Please triage this failure.
 media_stream_test/supported_MediaStreamEvent: RuntimeError # Please triage.
 media_stream_test/supported_MediaStreamTrackEvent: RuntimeError # Please triage.
-messageevent_test: RuntimeError # Please triage this error. New in Chrome 62.
-serialized_script_value_test: RuntimeError # Please triage this error. New in Chrome 62.
 speechrecognition_test/types: RuntimeError # Please triage.
 touchevent_test/supported: Fail # Touch events are only supported on touch devices
 
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index 9b965dd..2c49cf8 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -153,6 +153,12 @@
 typed_message_test: CompileTimeError
 unresolved_ports_test: CompileTimeError
 
+# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
+# are to be triaged.  Isolate tests are skipped on purpose due to the usage of
+# batch mode.
+[ $compiler == dartk && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
+*: Skip
+
 [ $compiler == none && $runtime == vm && $system == fuchsia ]
 *: Skip # Not yet triaged.
 
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 21780f3..d2c1b6f 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -105,6 +105,7 @@
 generic_list_checked_test: StaticWarning
 generic_local_functions_test: CompileTimeError # Issue 28515
 generic_methods_generic_function_parameter_test: CompileTimeError # Issue 28515
+generic_methods_type_expression_test: Skip # This tests now unsupported Dart 1.0 behavior (is check warnings)
 generic_test: StaticWarning
 generics_test: StaticWarning
 get_set_syntax_test/none: Fail # Issue 11575
@@ -397,11 +398,8 @@
 *: Skip # Issue 28649
 
 [ $compiler == dart2analyzer && $runtime == none ]
-assertion_initializer_const_error2_test/cc10: CompileTimeError # Issue #31320
-assertion_initializer_const_error2_test/cc11: CompileTimeError # Issue #31320
 assertion_initializer_const_function_error_test/01: MissingCompileTimeError
 assertion_initializer_const_function_test/01: MissingStaticWarning
-assertion_initializer_test: CompileTimeError
 
 [ $compiler == dart2analyzer && $runtime == none && $checked ]
 assertion_initializer_const_error2_test/*: MissingCompileTimeError # Issue #
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 96b01ad..dce3ec3 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -55,7 +55,6 @@
 library_env_test/has_no_io_support: Pass # Issue 27398
 
 [ $compiler == dart2js && $checked && $dart2js_with_kernel ]
-arithmetic_canonicalization_test: RuntimeError
 assertion_initializer_const_function_test/01: RuntimeError
 assertion_initializer_test: CompileTimeError
 assign_static_type_test/01: Fail
@@ -147,6 +146,7 @@
 constructor_redirect2_test/01: MissingCompileTimeError
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
 cyclic_constructor_test/01: Crash # Issue 30856
+deferred_call_empty_before_load_test: RuntimeError
 deferred_closurize_load_library_test: RuntimeError
 deferred_constraints_constants_test/default_argument2: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred_constraints_constants_test/none: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
@@ -196,9 +196,9 @@
 final_attempt_reinitialization_test/01: MissingCompileTimeError
 final_attempt_reinitialization_test/02: MissingCompileTimeError
 final_field_initialization_order_test: RuntimeError
-generic_field_mixin4_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(M.T) in (Instance of 'ThisLocal') for j:field(M.field).
-generic_field_mixin5_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(M.T) in (Instance of 'ThisLocal') for j:field(M.field).
-generic_field_mixin_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(M.T) in () for j:constructor(C3.).
+full_stacktrace1_test: RuntimeError # Issue 12698
+full_stacktrace2_test: RuntimeError # Issue 12698
+full_stacktrace3_test: RuntimeError # Issue 12698
 generic_local_functions_test: Crash # Unsupported operation: Unsupported type parameter type node Y.
 generic_methods_type_expression_test/01: RuntimeError
 generic_methods_type_expression_test/03: RuntimeError
@@ -405,6 +405,9 @@
 setter_override_test/00: MissingCompileTimeError
 setter_override_test/03: MissingCompileTimeError
 stacktrace_demangle_ctors_test: RuntimeError
+stacktrace_rethrow_error_test/none: RuntimeError
+stacktrace_rethrow_error_test/withtraceparameter: RuntimeError
+stacktrace_rethrow_nonerror_test: RuntimeError
 stacktrace_test: RuntimeError
 static_getter_no_setter1_test/01: RuntimeError
 static_getter_no_setter2_test/01: RuntimeError
@@ -803,7 +806,6 @@
 type_checks_in_factory_method_test: RuntimeError
 
 [ $compiler == dart2js && $dart2js_with_kernel && $host_checked ]
-arithmetic_canonicalization_test: RuntimeError
 assertion_initializer_test: CompileTimeError
 assertion_test: RuntimeError
 async_await_test: Crash # 'file:*/pkg/compiler/lib/src/ssa/locals_handler.dart': Failed assertion: line 296 pos 12: 'local != null': is not true.
@@ -855,6 +857,7 @@
 constructor_redirect2_test/01: MissingCompileTimeError
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
 cyclic_constructor_test/01: Crash # Issue 30856
+deferred_call_empty_before_load_test: RuntimeError
 deferred_closurize_load_library_test: RuntimeError
 deferred_constraints_constants_test/default_argument2: Crash # Assertion failure: Missing scope info for j:method(_loadLibraryWrapper).
 deferred_constraints_constants_test/none: Crash # Assertion failure: Missing scope info for j:method(_loadLibraryWrapper).
@@ -895,9 +898,9 @@
 final_attempt_reinitialization_test/01: MissingCompileTimeError
 final_attempt_reinitialization_test/02: MissingCompileTimeError
 final_field_initialization_order_test: RuntimeError
-generic_field_mixin4_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(M.T) in ()in j:constructor(C3.).
-generic_field_mixin5_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(M.T) in ()in j:constructor(C3.).
-generic_field_mixin_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(M.T) in ()in j:constructor(C3.).
+full_stacktrace1_test: RuntimeError
+full_stacktrace2_test: RuntimeError
+full_stacktrace3_test: RuntimeError
 generic_local_functions_test: Crash # Unsupported operation: Unsupported type parameter type node Y.
 generic_methods_generic_function_parameter_test: Crash # 'file:*/pkg/compiler/lib/src/ssa/builder_kernel.dart': Failed assertion: line 1728 pos 16: 'type is MethodTypeVariableType': is not true.
 generic_methods_type_expression_test/01: Crash # 'file:*/pkg/compiler/lib/src/ssa/builder_kernel.dart': Failed assertion: line 1728 pos 16: 'type is MethodTypeVariableType': is not true.
@@ -1101,8 +1104,11 @@
 regress_28255_test: RuntimeError
 setter_override_test/00: MissingCompileTimeError
 setter_override_test/03: MissingCompileTimeError
-stacktrace_demangle_ctors_test: RuntimeError
-stacktrace_test: RuntimeError
+stacktrace_demangle_ctors_test: RuntimeError # Issue 12698
+stacktrace_rethrow_error_test/none: RuntimeError
+stacktrace_rethrow_error_test/withtraceparameter: RuntimeError
+stacktrace_rethrow_nonerror_test: RuntimeError
+stacktrace_test: RuntimeError # Issue 12698
 static_getter_no_setter1_test/01: RuntimeError
 static_getter_no_setter2_test/01: RuntimeError
 static_getter_no_setter3_test/01: RuntimeError
@@ -1123,7 +1129,6 @@
 type_checks_in_factory_method_test: RuntimeError
 
 [ $compiler == dart2js && $dart2js_with_kernel && $minified ]
-arithmetic_canonicalization_test: RuntimeError
 assertion_initializer_const_error2_test/none: CompileTimeError
 assertion_initializer_test: CompileTimeError
 assertion_test: RuntimeError
@@ -1181,6 +1186,7 @@
 cyclic_type_test/02: RuntimeError
 cyclic_type_test/03: RuntimeError
 cyclic_type_test/04: RuntimeError
+deferred_call_empty_before_load_test: RuntimeError
 deferred_closurize_load_library_test: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
 deferred_closurize_load_library_test: RuntimeError
 deferred_constraints_constants_test/default_argument2: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
@@ -1230,13 +1236,10 @@
 final_attempt_reinitialization_test/01: MissingCompileTimeError
 final_attempt_reinitialization_test/02: MissingCompileTimeError
 final_field_initialization_order_test: RuntimeError
-full_stacktrace1_test: RuntimeError
-full_stacktrace2_test: RuntimeError
-full_stacktrace3_test: RuntimeError
+full_stacktrace1_test: RuntimeError # Issue 12698
+full_stacktrace2_test: RuntimeError # Issue 12698
+full_stacktrace3_test: RuntimeError # Issue 12698
 generic_closure_test: RuntimeError
-generic_field_mixin4_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(M.T) in ()in j:constructor(C3.).
-generic_field_mixin5_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(M.T) in ()in j:constructor(C3.).
-generic_field_mixin_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(M.T) in ()in j:constructor(C3.).
 generic_local_functions_test: Crash # Unsupported operation: Unsupported type parameter type node Y.
 generic_methods_type_expression_test/01: RuntimeError
 generic_methods_type_expression_test/03: RuntimeError
@@ -1440,11 +1443,11 @@
 setter_override_test/00: MissingCompileTimeError
 setter_override_test/03: MissingCompileTimeError
 stack_trace_test: RuntimeError
-stacktrace_demangle_ctors_test: RuntimeError
-stacktrace_rethrow_error_test/none: RuntimeError
-stacktrace_rethrow_error_test/withtraceparameter: RuntimeError
-stacktrace_rethrow_nonerror_test: RuntimeError
-stacktrace_test: RuntimeError
+stacktrace_demangle_ctors_test: RuntimeError # Issue 12698
+stacktrace_rethrow_error_test/none: RuntimeError # Issue 12698
+stacktrace_rethrow_error_test/withtraceparameter: RuntimeError # Issue 12698
+stacktrace_rethrow_nonerror_test: RuntimeError # Issue 12698
+stacktrace_test: RuntimeError # Issue 12698
 static_getter_no_setter1_test/01: RuntimeError
 static_getter_no_setter2_test/01: RuntimeError
 static_getter_no_setter3_test/01: RuntimeError
@@ -1580,7 +1583,7 @@
 regress_29481_test: Crash # Issue 29754
 scope_variable_test/01: MissingCompileTimeError # Issue 13016
 setter4_test: CompileTimeError # issue 13639
-stacktrace_demangle_ctors_test: Fail # dart2js stack traces are not always compliant.
+stacktrace_demangle_ctors_test: Fail # dart2js stack traces are not always compliant, issue 12698
 stacktrace_rethrow_error_test: Pass, RuntimeError # Issue 12698
 stacktrace_rethrow_nonerror_test: Pass, RuntimeError # Issue 12698
 stacktrace_test: Pass, RuntimeError # # Issue 12698
diff --git a/tests/language/language_kernel.status b/tests/language/language_kernel.status
index b3e68f2..acb42e5 100644
--- a/tests/language/language_kernel.status
+++ b/tests/language/language_kernel.status
@@ -2,373 +2,7 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-# dartk: JIT failures
-[ $compiler == dartk ]
-const_locals_test: RuntimeError
-const_string_test: RuntimeError
-ct_const2_test: Pass, Crash # Flaky
-hello_dart_test: Crash
-library_env_test/has_no_mirror_support: RuntimeError
-redirecting_factory_reflection_test: Crash
-redirecting_factory_reflection_test: RuntimeError
-vm/lazy_deopt_vm_test: Pass, Slow, Timeout
-vm/optimized_stacktrace_test: Skip # Issue 28788
-
-# dartk: precompilation failures
-[ $compiler == dartkp ]
-const_syntax_test/08: Crash
-deferred_redirecting_factory_test: CompileTimeError # Issue 31296
-export_double_same_main_test: Crash # Issue 29895
-final_syntax_test/09: Crash
-final_syntax_test/09: MissingCompileTimeError
-ref_before_declaration_test/none: Pass
-ref_before_declaration_test/none: Crash
-stacktrace_demangle_ctors_test: RuntimeError
-vm/optimized_stacktrace_test: Crash
-vm/regress_27671_test: Crash
-vm/regress_27671_test: Skip # Unsupported
-vm/type_vm_test: Crash
-
-# dartk: JIT failures (debug)
-[ $compiler == dartk && $mode == debug ]
-deopt_inlined_function_lazy_test: Skip
-hello_dart_test: Crash # error: expected: cls.is_type_finalized()
-vm/lazy_deopt_vm_test: Crash
-
-[ $compiler == dartk && $runtime == vm ]
-assertion_initializer_const_function_error_test/01: MissingCompileTimeError
-disassemble_test: Pass, Slow
-
-[ $compiler == dartk && $runtime == vm && $checked ]
-assertion_initializer_const_function_test/01: RuntimeError
-
-# dartk: precompilation failures (debug)
-[ $compiler == dartkp && $mode == debug ]
-assertion_test: Crash
-external_test/13: Crash
-final_syntax_test/09: Crash
-malbounded_type_cast_test: Crash
-regress_29025_test: Crash
-vm/async_await_catch_stacktrace_test: Crash
-
-[ $compiler == dartkp && $runtime == dart_precompiled && $checked ]
-assertion_initializer_const_error2_test/*: Crash
-assertion_initializer_const_error2_test/none: Pass
-assertion_initializer_const_error_test/none: Crash
-assertion_initializer_const_function_error_test/01: Crash
-assertion_initializer_const_function_error_test/none: Crash
-assertion_initializer_const_function_test/01: Crash
-assertion_initializer_const_function_test/none: Crash
-assertion_initializer_test: CompileTimeError
-
-[ $compiler == dartkp && $runtime == dart_precompiled && !$checked ]
-assertion_initializer_const_function_error_test/01: MissingCompileTimeError
-
-# dartk: JIT & AOT failures (debug)
-[ $mode == debug && ($compiler == dartk || $compiler == dartkp) ]
-const_instance_field_test/01: Crash
-cyclic_type_variable_test/01: Crash
-cyclic_type_variable_test/02: Crash
-cyclic_type_variable_test/03: Crash
-cyclic_type_variable_test/04: Crash
-cyclic_type_variable_test/none: Crash
-type_parameter_test/04: Crash
-type_parameter_test/05: Crash
-
-# Triaged checked mode failures
-[ $checked && ($compiler == dartk || $compiler == dartkp) ]
-assert_initializer_test/31: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-assert_initializer_test/32: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-assert_initializer_test/33: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-assert_initializer_test/34: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-assert_initializer_test/35: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-assert_initializer_test/36: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-assert_initializer_test/37: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-assert_initializer_test/38: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-assert_initializer_test/41: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-assert_initializer_test/42: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-assert_initializer_test/43: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-assert_initializer_test/44: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-assert_initializer_test/45: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-assert_initializer_test/46: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-assert_initializer_test/47: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-assert_initializer_test/48: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-assert_initializer_test/none: RuntimeError # KernelVM bug: Constant evaluation.
-assign_static_type_test/02: MissingCompileTimeError
-async_await_test: RuntimeError
-async_return_types_test/nestedFuture: Fail
-async_return_types_test/wrongTypeParameter: Fail
-compile_time_constant_checked_test/02: MissingCompileTimeError
-const_constructor2_test/20: MissingCompileTimeError
-const_constructor2_test/22: MissingCompileTimeError
-const_constructor2_test/24: MissingCompileTimeError
-const_init2_test/02: MissingCompileTimeError
-default_factory2_test/01: Fail
-factory_redirection_test/08: Fail
-factory_redirection_test/09: Fail
-factory_redirection_test/10: Fail
-factory_redirection_test/12: Fail
-factory_redirection_test/13: Fail
-factory_redirection_test/14: Fail
-function_type/function_type0_test: RuntimeError
-function_type/function_type10_test: RuntimeError
-function_type/function_type11_test: RuntimeError
-function_type/function_type12_test: RuntimeError
-function_type/function_type13_test: RuntimeError
-function_type/function_type14_test: RuntimeError
-function_type/function_type15_test: RuntimeError
-function_type/function_type16_test: RuntimeError
-function_type/function_type17_test: RuntimeError
-function_type/function_type18_test: RuntimeError
-function_type/function_type19_test: RuntimeError
-function_type/function_type1_test: RuntimeError
-function_type/function_type20_test: RuntimeError
-function_type/function_type21_test: RuntimeError
-function_type/function_type22_test: RuntimeError
-function_type/function_type23_test: RuntimeError
-function_type/function_type24_test: RuntimeError
-function_type/function_type25_test: RuntimeError
-function_type/function_type26_test: RuntimeError
-function_type/function_type27_test: RuntimeError
-function_type/function_type28_test: RuntimeError
-function_type/function_type29_test: RuntimeError
-function_type/function_type2_test: RuntimeError
-function_type/function_type30_test: RuntimeError
-function_type/function_type31_test: RuntimeError
-function_type/function_type32_test: RuntimeError
-function_type/function_type33_test: RuntimeError
-function_type/function_type34_test: RuntimeError
-function_type/function_type35_test: RuntimeError
-function_type/function_type36_test: RuntimeError
-function_type/function_type37_test: RuntimeError
-function_type/function_type38_test: RuntimeError
-function_type/function_type39_test: RuntimeError
-function_type/function_type3_test: RuntimeError
-function_type/function_type40_test: RuntimeError
-function_type/function_type41_test: RuntimeError
-function_type/function_type42_test: RuntimeError
-function_type/function_type43_test: RuntimeError
-function_type/function_type44_test: RuntimeError
-function_type/function_type45_test: RuntimeError
-function_type/function_type46_test: RuntimeError
-function_type/function_type47_test: RuntimeError
-function_type/function_type48_test: RuntimeError
-function_type/function_type49_test: RuntimeError
-function_type/function_type4_test: RuntimeError
-function_type/function_type50_test: RuntimeError
-function_type/function_type51_test: RuntimeError
-function_type/function_type52_test: RuntimeError
-function_type/function_type53_test: RuntimeError
-function_type/function_type54_test: RuntimeError
-function_type/function_type55_test: RuntimeError
-function_type/function_type56_test: RuntimeError
-function_type/function_type57_test: RuntimeError
-function_type/function_type58_test: RuntimeError
-function_type/function_type59_test: RuntimeError
-function_type/function_type5_test: RuntimeError
-function_type/function_type60_test: RuntimeError
-function_type/function_type61_test: RuntimeError
-function_type/function_type62_test: RuntimeError
-function_type/function_type63_test: RuntimeError
-function_type/function_type64_test: RuntimeError
-function_type/function_type65_test: RuntimeError
-function_type/function_type66_test: RuntimeError
-function_type/function_type67_test: RuntimeError
-function_type/function_type68_test: RuntimeError
-function_type/function_type69_test: RuntimeError
-function_type/function_type6_test: RuntimeError
-function_type/function_type70_test: RuntimeError
-function_type/function_type71_test: RuntimeError
-function_type/function_type72_test: RuntimeError
-function_type/function_type73_test: RuntimeError
-function_type/function_type74_test: RuntimeError
-function_type/function_type75_test: RuntimeError
-function_type/function_type76_test: RuntimeError
-function_type/function_type77_test: RuntimeError
-function_type/function_type78_test: RuntimeError
-function_type/function_type79_test: RuntimeError
-function_type/function_type7_test: RuntimeError
-function_type/function_type80_test: RuntimeError
-function_type/function_type81_test: RuntimeError
-function_type/function_type82_test: RuntimeError
-function_type/function_type83_test: RuntimeError
-function_type/function_type84_test: RuntimeError
-function_type/function_type85_test: RuntimeError
-function_type/function_type86_test: RuntimeError
-function_type/function_type87_test: RuntimeError
-function_type/function_type88_test: RuntimeError
-function_type/function_type89_test: RuntimeError
-function_type/function_type8_test: RuntimeError
-function_type/function_type90_test: RuntimeError
-function_type/function_type91_test: RuntimeError
-function_type/function_type92_test: RuntimeError
-function_type/function_type93_test: RuntimeError
-function_type/function_type94_test: RuntimeError
-function_type/function_type95_test: RuntimeError
-function_type/function_type96_test: RuntimeError
-function_type/function_type97_test: RuntimeError
-function_type/function_type98_test: RuntimeError
-function_type/function_type99_test: RuntimeError
-function_type/function_type9_test: RuntimeError
-function_type2_test: RuntimeError
-list_literal1_test/01: MissingCompileTimeError
-malbounded_redirecting_factory2_test/03: Fail
-malbounded_redirecting_factory2_test/04: Fail
-malbounded_redirecting_factory_test/03: Fail
-malbounded_redirecting_factory_test/04: Fail
-malbounded_type_cast_test: RuntimeError
-malbounded_type_test_test/03: Fail
-malbounded_type_test_test/04: Fail
-malformed2_test/00: RuntimeError
-malformed2_test/01: MissingCompileTimeError
-map_literal1_test/01: MissingCompileTimeError
-mixin_invalid_bound2_test/08: Fail
-mixin_invalid_bound2_test/09: Fail
-mixin_invalid_bound2_test/10: Fail
-mixin_invalid_bound_test/06: Fail
-mixin_invalid_bound_test/07: Fail
-mixin_super_bound2_test/01: RuntimeError
-mixin_super_bound_test: RuntimeError
-msk_bound_test: RuntimeError
-redirecting_factory_infinite_steps_test/01: Fail
-redirecting_factory_malbounded_test/01: Fail
-regress_22728_test: Fail # Dartk Issue 28498
-regress_22728_test: RuntimeError
-regress_26133_test: RuntimeError
-type_parameter_test/05: MissingCompileTimeError
-type_parameter_test/none: RuntimeError
-type_variable_bounds4_test/01: RuntimeError
-
-[ !$checked && ($compiler == dartk || $compiler == dartkp) ]
-cha_deopt1_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-cha_deopt2_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-cha_deopt3_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-compile_time_constant_c_test/02: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-compile_time_constant_k_test/01: RuntimeError # KernelVM bug: Constant map duplicated key.
-compile_time_constant_k_test/02: RuntimeError # KernelVM bug: Constant map duplicated key.
-compile_time_constant_k_test/03: RuntimeError # KernelVM bug: Constant map duplicated key.
-compile_time_constant_o_test/01: RuntimeError # KernelVM bug: Constant map duplicated key.
-compile_time_constant_o_test/02: RuntimeError # KernelVM bug: Constant map duplicated key.
-conditional_import_string_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-conditional_import_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-config_import_corelib_test: RuntimeError # KernelVM bug: Configurable imports.
-config_import_test: RuntimeError # KernelVM bug: Configurable imports.
-const_constructor_nonconst_field_test/01: MissingCompileTimeError # Fasta bug: Non-const expression in field initializer.
-const_dynamic_type_literal_test/02: RuntimeError # KernelVM bug: Constant map duplicated key.
-const_factory_with_body_test/01: MissingCompileTimeError # Fasta bug: Const factory with body.
-const_instance_field_test/01: MissingCompileTimeError # Fasta bug: Const instance field.
-const_map2_test/00: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-const_map3_test/00: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-const_native_factory_test/01: MissingCompileTimeError # Fasta bug: Issue 29763
-const_nested_test: RuntimeError # KernelVM bug: Constant evaluation.
-const_optional_args_negative_test: Fail # Fasta bug: Default parameter values must be const.
-const_switch2_test/01: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-const_syntax_test/05: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-constant_expression_test/01: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-constant_expression_test/03: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-constructor_redirect2_test/01: MissingCompileTimeError # Fasta bug: Body on redirecting constructor.
-constructor_redirect_test/01: MissingCompileTimeError # Fasta bug: Initializer refers to this.
-cyclic_constructor_test/01: MissingCompileTimeError # Fasta bug: Cyclic constructor redirection.
-deferred_call_empty_before_load_test: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
-deferred_closurize_load_library_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constant_list_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_constants_test/default_argument2: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_constants_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_constants_test/reference_after_load: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/as_operation: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/catch_check: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/is_check: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/new: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/new_before_load: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/new_generic1: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/new_generic2: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/new_generic3: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/static_method: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/type_annotation1: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/type_annotation_generic1: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/type_annotation_generic2: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/type_annotation_generic3: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/type_annotation_generic4: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/type_annotation_non_deferred: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/type_annotation_null: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/type_annotation_top_level: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_function_type_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_global_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_import_core_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_inheritance_constraints_test/extends: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
-deferred_inheritance_constraints_test/implements: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
-deferred_inheritance_constraints_test/mixin: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
-deferred_inheritance_constraints_test/redirecting_constructor: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
-deferred_inlined_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_load_constants_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_load_inval_code_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_load_library_wrong_args_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 28335.
-deferred_load_library_wrong_args_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_mixin_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_no_such_method_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_not_loaded_check_test: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
-deferred_only_constant_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_optimized_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_redirecting_factory_test: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
-deferred_regression_22995_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_regression_28678_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_shadow_load_library_test: CompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
-deferred_shared_and_unshared_classes_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_static_seperate_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_super_dependency_test/01: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_type_dependency_test/as: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_type_dependency_test/is: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_type_dependency_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_type_dependency_test/type_annotation: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-dynamic_prefix_core_test/01: RuntimeError # KernelVM bug: Blocked on language issue 29125.
-external_test/10: MissingRuntimeError # KernelVM bug: Unbound external.
-external_test/13: MissingRuntimeError # KernelVM bug: Unbound external.
-external_test/20: MissingRuntimeError # KernelVM bug: Unbound external.
-factory_redirection_test/07: MissingCompileTimeError # Fasta bug: Bad constructor redirection.
-final_attempt_reinitialization_test/01: MissingCompileTimeError # Issue 29900
-final_attempt_reinitialization_test/02: MissingCompileTimeError # Issue 29900
-issue_1751477_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-library_env_test/has_html_support: RuntimeError # KernelVM bug: Configurable imports.
-library_env_test/has_no_io_support: RuntimeError # KernelVM bug: Configurable imports.
-map_literal3_test: RuntimeError # KernelVM bug: Constant map duplicated key.
-map_literal6_test: RuntimeError # KernelVM bug: Constant map duplicated key.
-method_name_test: CompileTimeError # Fasta bug: Parser bug.
-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
-mixin_super_constructor_named_test/01: MissingCompileTimeError # KernelVM bug: Issue 15101
-mixin_super_constructor_positionals_test/01: MissingCompileTimeError # KernelVM bug: Issue 15101
-named_constructor_test/01: MissingRuntimeError # Fasta bug: Bad compilation of constructor reference.
-named_parameters_default_eq_test/02: MissingCompileTimeError # Fasta bug: Default values are not allowed on redirecting factory constructors.
-private_super_constructor_test/01: MissingCompileTimeError # Fasta bug: Illegal access to private constructor.
-redirecting_constructor_initializer_test: RuntimeError # Super is evaluated last; same result as source-based pipeline.
-redirecting_factory_default_values_test/01: MissingCompileTimeError # Fasta bug: Default values are not allowed on redirecting factory constructors.
-redirecting_factory_default_values_test/02: MissingCompileTimeError # Fasta bug: Default values are not allowed on redirecting factory constructors.
-redirecting_factory_long_test: RuntimeError # Fasta bug: Bad compilation of type arguments for redirecting factory.
-regress_20394_test/01: MissingCompileTimeError # Fasta bug: Illegal access to private constructor.
-regress_22443_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-regress_23408_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-regress_27617_test/1: MissingCompileTimeError # Fasta bug: Bad constructor redirection.
-regress_28217_test/01: MissingCompileTimeError # Fasta bug: Bad constructor redirection.
-regress_28217_test/none: MissingCompileTimeError # Fasta bug: Bad constructor redirection.
-regress_28278_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-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.
-switch_case_test/01: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-switch_case_test/02: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-syntax_test/64: MissingCompileTimeError # Test bug: Test doesn't execute erroneous code.
-syntax_test/65: MissingCompileTimeError # Test bug: Test doesn't execute erroneous code.
-syntax_test/none: CompileTimeError # Issue #30176.
-vm/closure_memory_retention_test: Skip # KernelVM bug: Hits OOM
-vm/debug_break_enabled_vm_test/01: CompileTimeError # KernelVM bug: Bad test using extended break syntax.
-vm/debug_break_enabled_vm_test/none: CompileTimeError # KernelVM bug: Bad test using extended break syntax.
-vm/regress_27201_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-vm/type_vm_test: RuntimeError # Fasta bug: Bad position information in stack trace.
-
+# We skip all the Dart 1.0 tests in dartk and dartkp mode as these
+# modes are intended only for Dart 2.0 with strong mode enabled.
 [ $compiler == dartk || $compiler == dartkp ]
-bad_constructor_test/06: DartkCrash # Issue 31299
-const_error_multiply_initialized_test/02: MissingCompileTimeError # Issue 29900
-const_error_multiply_initialized_test/04: MissingCompileTimeError # Issue 29900
-
+*: Skip
diff --git a/tests/language_2/cascade_on_static_field_test.dart b/tests/language_2/cascade_on_static_field_test.dart
new file mode 100644
index 0000000..e92212f
--- /dev/null
+++ b/tests/language_2/cascade_on_static_field_test.dart
@@ -0,0 +1,9 @@
+// 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.
+
+final List<String> list = []..add("foo")..add("bar")..add("baz");
+
+main() {
+  print(list);
+}
diff --git a/tests/language_2/final_syntax_test.dart b/tests/language_2/final_syntax_test.dart
index 64bbf12..42b2163 100644
--- a/tests/language_2/final_syntax_test.dart
+++ b/tests/language_2/final_syntax_test.dart
@@ -56,8 +56,8 @@
 // expressions.
 final A0 = 42;
 final A1 = A0 + 1;
-final A2 = A3 + 1; //# 08: continued
-final A3 = A2 + 1; //# 08: continued
+final dynamic A2 = A3 + 1; //# 08: continued
+final dynamic A3 = A2 + 1; //# 08: continued
 
 class C0 {
   static final X = const C1();
diff --git a/tests/language_2/forwarding_semi_stub_test.dart b/tests/language_2/forwarding_semi_stub_test.dart
new file mode 100644
index 0000000..12db5f8
--- /dev/null
+++ b/tests/language_2/forwarding_semi_stub_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class B {
+  void f(num x) {}
+}
+
+abstract class I<T> {
+  void f(T x);
+}
+
+class C extends B implements I<num> {
+  // This method is a "forwarding semi-stub"--the front end needs to add an
+  // implementation to it that performs type checking and forwards to B::f.
+  void f(num x);
+}
+
+main() {
+  I<Object> i = new C();
+  Expect.throwsTypeError(() {
+    i.f('oops');
+  });
+}
diff --git a/tests/language_2/generic_methods_type_expression_test.dart b/tests/language_2/generic_methods_type_expression_test.dart
index 06c54eb..c83b20a 100644
--- a/tests/language_2/generic_methods_type_expression_test.dart
+++ b/tests/language_2/generic_methods_type_expression_test.dart
@@ -54,10 +54,9 @@
   Expect.equals(f8<int>(), new TypeValue<List<int>>().value);
 
   Expect.isTrue(f9<int>(<int, String>{}));
-  Expect
-      .isTrue(f9<int>(<bool, String>{})); // `is Map<dynamic, String>` is true.
+  Expect.isFalse(f9<int>(<bool, String>{}));
   Expect.isFalse(f9<int>(<int, int>{}));
 
   Expect.isTrue(new IsMap<int>().check<String>(<int, String>{}));
-  Expect.isTrue(new IsMap<int>().check<int>(<int, String>{}));
+  Expect.isFalse(new IsMap<int>().check<int>(<int, String>{}));
 }
diff --git a/tests/language_2/instantiate_tearoff_after_contravariance_check_test.dart b/tests/language_2/instantiate_tearoff_after_contravariance_check_test.dart
new file mode 100644
index 0000000..cb0fa33
--- /dev/null
+++ b/tests/language_2/instantiate_tearoff_after_contravariance_check_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class A {}
+
+class B extends A {}
+
+class C<T> {
+  void Function(T) f<U>(U x) => (y) {};
+}
+
+void test(C<A> cA, C<A> cB) {
+  // Tear-off of c.f needs to be type checked due to contravariance.  The
+  // instantiation should occur after the type check, so if the type is wrong we
+  // should get a type error.
+  void Function(A) Function(int) tearoffOfCA = cA.f;
+  Expect.throwsTypeError(() {
+    void Function(A) Function(int) tearoffOfCB = cB.f;
+  });
+}
+
+main() {
+  test(new C<A>(), new C<B>());
+}
diff --git a/tests/language_2/instantiate_tearoff_of_call_test.dart b/tests/language_2/instantiate_tearoff_of_call_test.dart
new file mode 100644
index 0000000..665a271
--- /dev/null
+++ b/tests/language_2/instantiate_tearoff_of_call_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+T f<T>(T x) => x;
+
+void test(T Function<T>(T) f) {
+  int Function(int) intFunc = f.call;
+  dynamic intFuncDynamic = intFunc;
+  Expect.isTrue(intFuncDynamic is int Function(int));
+  Expect.isFalse(intFuncDynamic is String Function(String));
+  Expect.equals(intFuncDynamic(1), 1);
+  Expect.throwsTypeError(() {
+    intFuncDynamic('oops');
+  });
+  String Function(String) stringFunc = f.call;
+  dynamic stringFuncDynamic = stringFunc;
+  Expect.isTrue(stringFuncDynamic is String Function(String));
+  Expect.isFalse(stringFuncDynamic is int Function(int));
+  Expect.equals(stringFuncDynamic('hello'), 'hello');
+  Expect.throwsTypeError(() {
+    stringFuncDynamic(1);
+  });
+}
+
+main() {
+  test(f);
+}
diff --git a/tests/language_2/instantiate_tearoff_test.dart b/tests/language_2/instantiate_tearoff_test.dart
new file mode 100644
index 0000000..892be77
--- /dev/null
+++ b/tests/language_2/instantiate_tearoff_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+T f<T>(T x) => x;
+
+main() {
+  int Function(int) intFunc = f;
+  dynamic intFuncDynamic = intFunc;
+  Expect.isTrue(intFuncDynamic is int Function(int));
+  Expect.isFalse(intFuncDynamic is String Function(String));
+  Expect.equals(intFuncDynamic(1), 1);
+  Expect.throwsTypeError(() {
+    intFuncDynamic('oops');
+  });
+  String Function(String) stringFunc = f;
+  dynamic stringFuncDynamic = stringFunc;
+  Expect.isTrue(stringFuncDynamic is String Function(String));
+  Expect.isFalse(stringFuncDynamic is int Function(int));
+  Expect.equals(stringFuncDynamic('hello'), 'hello');
+  Expect.throwsTypeError(() {
+    stringFuncDynamic(1);
+  });
+}
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index 084d0f8..e93ae0d 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -144,6 +144,7 @@
 test_negative_test: CompileTimeError
 try_catch_on_syntax_test/10: MissingCompileTimeError
 try_catch_on_syntax_test/11: MissingCompileTimeError
+type_inference_inconsistent_inheritance_test: MissingCompileTimeError
 type_variable_scope_test/none: Fail # Issue 11578
 type_variable_static_context_negative_test: Fail # Issue 12161
 vm/debug_break_enabled_vm_test: Skip
@@ -153,10 +154,7 @@
 vm/regress_27201_test: SkipByDesign # Loads bad library, so will always crash.
 
 [ $compiler == dart2analyzer && $runtime == none ]
-assertion_initializer_const_error2_test/cc10: CompileTimeError # Issue 31320
-assertion_initializer_const_error2_test/cc11: CompileTimeError # Issue 31320
 assertion_initializer_const_function_test/01: CompileTimeError
-assertion_initializer_test: CompileTimeError
 error_stacktrace_test/00: MissingCompileTimeError
 vm/lazy_deopt_with_exception_test: CompileTimeError
 
@@ -327,16 +325,12 @@
 function_type_call_getter2_test/05: MissingCompileTimeError
 generic_list_checked_test: CompileTimeError
 generic_methods_bounds_test/01: MissingCompileTimeError
-generic_methods_closure_test: StaticWarning
 generic_methods_dynamic_test/01: MissingCompileTimeError
 generic_methods_dynamic_test/03: MissingCompileTimeError
-generic_methods_local_variable_declaration_test: StaticWarning
 generic_methods_overriding_test/01: MissingCompileTimeError
 generic_methods_overriding_test/03: MissingCompileTimeError
 generic_methods_overriding_test/06: StaticWarning
 generic_methods_recursive_bound_test/02: MissingCompileTimeError
-generic_methods_shadowing_test: StaticWarning
-generic_methods_simple_is_expression_test: StaticWarning
 generic_no_such_method_dispatcher_test: StaticWarning
 generic_tearoff_test: CompileTimeError
 generic_test: CompileTimeError
@@ -743,16 +737,12 @@
 function_type_call_getter2_test/04: MissingCompileTimeError
 function_type_call_getter2_test/05: MissingCompileTimeError
 generic_methods_bounds_test/01: MissingCompileTimeError
-generic_methods_closure_test: StaticWarning
 generic_methods_dynamic_test/01: MissingCompileTimeError
 generic_methods_dynamic_test/03: MissingCompileTimeError
-generic_methods_local_variable_declaration_test: StaticWarning
 generic_methods_overriding_test/01: MissingCompileTimeError
 generic_methods_overriding_test/03: MissingCompileTimeError
 generic_methods_overriding_test/06: StaticWarning
 generic_methods_recursive_bound_test/02: MissingCompileTimeError
-generic_methods_shadowing_test: StaticWarning
-generic_methods_simple_is_expression_test: StaticWarning
 generic_no_such_method_dispatcher_test: StaticWarning
 generic_tearoff_test: CompileTimeError
 getter_no_setter2_test/00: MissingCompileTimeError
@@ -1037,6 +1027,7 @@
 accessor_conflict_import_test: CompileTimeError # Issue 25626
 additional_interface_adds_optional_args_test: CompileTimeError # Issue #30568
 assertion_initializer_const_function_test/01: MissingStaticWarning
+assertion_initializer_test: CompileTimeError
 async_return_types_test/nestedFuture: MissingCompileTimeError
 bug31436_test: CompileTimeError
 cascaded_forwarding_stubs_test: CompileTimeError
@@ -1054,14 +1045,9 @@
 field3a_negative_test: StaticWarning # Issue 28823
 forwarding_stub_tearoff_test: CompileTimeError
 generic_list_checked_test: CompileTimeError
-generic_methods_closure_test: CompileTimeError # Issue 29070
 generic_methods_generic_function_result_test/none: CompileTimeError # Issue #30207
-generic_methods_local_variable_declaration_test: CompileTimeError # Issue 29070
 generic_methods_overriding_test/01: MissingCompileTimeError # Issue 29070
 generic_methods_overriding_test/03: MissingCompileTimeError # Issue 29070
-generic_methods_shadowing_test: CompileTimeError # Issue 29070
-generic_methods_simple_is_expression_test: CompileTimeError # Issue 29070
-generic_methods_type_expression_test: CompileTimeError # Incorrectly disallows type parameter in "is" test.
 generic_no_such_method_dispatcher_test: CompileTimeError
 generic_tearoff_test: CompileTimeError
 generic_test: CompileTimeError
@@ -1140,6 +1126,7 @@
 super_bound_closure_test/none: CompileTimeError
 super_setter_test: StaticWarning # Issue 28823
 switch_case_test/none: CompileTimeError
+type_inference_circularity_test: MissingCompileTimeError
 type_promotion_functions_test/01: Pass
 type_promotion_functions_test/05: Pass
 type_promotion_functions_test/06: Pass
@@ -1203,8 +1190,6 @@
 additional_interface_adds_optional_args_test: StaticWarning
 argument_assignability_function_typed_test/01: MissingCompileTimeError
 argument_assignability_function_typed_test/02: MissingCompileTimeError
-assertion_initializer_const_error2_test/cc10: CompileTimeError # Issue 31320
-assertion_initializer_const_error2_test/cc11: CompileTimeError # Issue 31320
 assertion_initializer_const_function_test/01: MissingStaticWarning
 async_congruence_local_test/01: MissingCompileTimeError
 async_congruence_local_test/02: MissingCompileTimeError
@@ -1335,7 +1320,6 @@
 generic_field_mixin6_test/01: MissingCompileTimeError
 generic_function_typedef2_test/04: MissingCompileTimeError
 generic_methods_generic_function_result_test/01: MissingCompileTimeError # Issue #30207
-generic_methods_type_expression_test: StaticWarning # Issue 30530
 identical_const_test/01: MissingCompileTimeError
 identical_const_test/02: MissingCompileTimeError
 identical_const_test/03: MissingCompileTimeError
@@ -1585,6 +1569,7 @@
 try_catch_on_syntax_test/07: MissingCompileTimeError
 try_catch_syntax_test/08: MissingCompileTimeError
 type_checks_in_factory_method_test/01: MissingCompileTimeError
+type_inference_circularity_test: MissingCompileTimeError
 type_promotion_functions_test/01: MissingCompileTimeError
 type_promotion_functions_test/05: MissingCompileTimeError
 type_promotion_functions_test/06: MissingCompileTimeError
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index 4559a25..465cd64 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -142,7 +142,7 @@
 example_constructor_test: RuntimeError
 external_test/21: CompileTimeError
 external_test/24: CompileTimeError
-extract_type_arguments_test: CompileTimeError # Issue 31371
+extract_type_arguments_test: RuntimeError # Issue 31371
 f_bounded_quantification_test/01: MissingCompileTimeError
 f_bounded_quantification_test/02: MissingCompileTimeError
 factory1_test/00: MissingCompileTimeError
@@ -1076,7 +1076,6 @@
 covariant_subtyping_test: CompileTimeError
 
 [ $compiler == dart2js && $checked && $dart2js_with_kernel ]
-arithmetic_canonicalization_test: RuntimeError
 assertion_initializer_const_function_test/01: MissingCompileTimeError
 assertion_initializer_test: CompileTimeError
 assertion_test: RuntimeError
@@ -1197,6 +1196,7 @@
 covariant_override/runtime_check_test: RuntimeError
 covariant_subtyping_test: Crash # Unsupported operation: Unsupported type parameter type node E.
 cyclic_constructor_test/01: Crash # Stack Overflow
+deferred_call_empty_before_load_test: RuntimeError
 deferred_closurize_load_library_test: RuntimeError
 deferred_constraints_constants_test/default_argument2: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred_constraints_constants_test/none: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
@@ -1243,13 +1243,13 @@
 field_override4_test/02: MissingCompileTimeError
 final_attempt_reinitialization_test/01: MissingCompileTimeError
 final_attempt_reinitialization_test/02: MissingCompileTimeError
+full_stacktrace1_test: RuntimeError # Issue 12698
+full_stacktrace2_test: RuntimeError # Issue 12698
+full_stacktrace3_test: RuntimeError # Issue 12698
 function_type_alias_test: RuntimeError
 generalized_void_syntax_test: CompileTimeError
 generic_closure_test/01: RuntimeError
 generic_closure_test/none: RuntimeError
-generic_field_mixin4_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(M.T) in () for j:constructor(C3.).
-generic_field_mixin5_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(M.T) in () for j:constructor(C3.).
-generic_field_mixin_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(M.T) in () for j:constructor(C3.).
 generic_function_bounds_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_function_dcall_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_function_typedef_test/01: RuntimeError
@@ -1440,8 +1440,11 @@
 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
-stacktrace_test: RuntimeError
+stacktrace_demangle_ctors_test: RuntimeError # Issue 12698
+stacktrace_rethrow_error_test/none: RuntimeError # Issue 12698
+stacktrace_rethrow_error_test/withtraceparameter: RuntimeError # Issue 12698
+stacktrace_rethrow_nonerror_test: RuntimeError # Issue 12698
+stacktrace_test: RuntimeError # Issue 12698
 super_call4_test: Crash # NoSuchMethodError: The getter 'thisLocal' was called on null.
 switch_bad_case_test/01: MissingCompileTimeError
 switch_bad_case_test/02: MissingCompileTimeError
@@ -1521,6 +1524,7 @@
 cascaded_forwarding_stubs_generic_test: RuntimeError
 cascaded_forwarding_stubs_test: RuntimeError
 checked_setter3_test: RuntimeError # Issue 31128
+forwarding_semi_stub_test: RuntimeError
 forwarding_stub_tearoff_generic_test: RuntimeError
 forwarding_stub_tearoff_test: RuntimeError
 implicit_downcast_during_assignment_test: RuntimeError
@@ -1566,6 +1570,7 @@
 const_constructor3_test/02: MissingCompileTimeError
 const_constructor3_test/04: MissingCompileTimeError
 const_init2_test/02: MissingCompileTimeError
+forwarding_semi_stub_test: RuntimeError
 forwarding_stub_tearoff_generic_test: RuntimeError
 forwarding_stub_tearoff_test: RuntimeError
 function_subtype_inline2_test: RuntimeError
@@ -1610,6 +1615,9 @@
 implicit_downcast_during_super_initializer_test: RuntimeError
 implicit_downcast_during_yield_star_test: RuntimeError
 implicit_downcast_during_yield_test: RuntimeError
+instantiate_tearoff_after_contravariance_check_test: RuntimeError
+instantiate_tearoff_of_call_test: RuntimeError
+instantiate_tearoff_test: RuntimeError
 invalid_cast_test/01: MissingCompileTimeError
 invalid_cast_test/02: MissingCompileTimeError
 invalid_cast_test/03: MissingCompileTimeError
@@ -1623,6 +1631,8 @@
 object_has_no_call_method_test/02: MissingCompileTimeError
 object_has_no_call_method_test/05: MissingCompileTimeError
 object_has_no_call_method_test/08: MissingCompileTimeError
+type_inference_circularity_test: MissingCompileTimeError
+type_inference_inconsistent_inheritance_test: MissingCompileTimeError
 
 [ $compiler == dart2js && $dart2js_with_kernel && $fast_startup ]
 arithmetic_canonicalization_test: RuntimeError
@@ -2026,8 +2036,8 @@
 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
-stacktrace_test: RuntimeError
+stacktrace_demangle_ctors_test: RuntimeError # Issue 12698
+stacktrace_test: RuntimeError # Issue 12698
 super_call4_test: Crash # NoSuchMethodError: The getter 'thisLocal' was called on null.
 switch_bad_case_test/01: MissingCompileTimeError
 switch_bad_case_test/02: MissingCompileTimeError
@@ -2048,7 +2058,6 @@
 typevariable_substitution2_test/02: RuntimeError
 
 [ $compiler == dart2js && $dart2js_with_kernel && $host_checked ]
-arithmetic_canonicalization_test: RuntimeError
 assertion_initializer_const_function_test/01: MissingCompileTimeError
 assertion_initializer_test: CompileTimeError
 assertion_test: RuntimeError
@@ -2172,6 +2181,7 @@
 covariant_subtyping_unsafe_call2_test: RuntimeError
 covariant_subtyping_unsafe_call3_test: RuntimeError
 cyclic_constructor_test/01: Crash # Issue 30856
+deferred_call_empty_before_load_test: RuntimeError
 deferred_closurize_load_library_test: RuntimeError
 deferred_constraints_constants_test/default_argument2: Crash # Assertion failure: Missing scope info for j:method(_loadLibraryWrapper).
 deferred_constraints_constants_test/none: Crash # Assertion failure: Missing scope info for j:method(_loadLibraryWrapper).
@@ -2220,6 +2230,9 @@
 field_override4_test/02: MissingCompileTimeError
 final_attempt_reinitialization_test/01: MissingCompileTimeError
 final_attempt_reinitialization_test/02: MissingCompileTimeError
+full_stacktrace1_test: RuntimeError
+full_stacktrace2_test: RuntimeError
+full_stacktrace3_test: RuntimeError
 function_subtype_bound_closure3_test: RuntimeError
 function_subtype_bound_closure4_test: RuntimeError
 function_subtype_bound_closure7_test: RuntimeError
@@ -2250,10 +2263,7 @@
 generalized_void_syntax_test: CompileTimeError
 generic_closure_test/01: RuntimeError
 generic_closure_test/none: RuntimeError
-generic_field_mixin4_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(M.T) in ()in j:constructor(C3.).
-generic_field_mixin5_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(M.T) in ()in j:constructor(C3.).
 generic_field_mixin6_test/none: RuntimeError
-generic_field_mixin_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(M.T) in ()in j:constructor(C3.).
 generic_function_bounds_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_function_dcall_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_function_typedef_test/01: RuntimeError
@@ -2454,8 +2464,11 @@
 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
-stacktrace_test: RuntimeError
+stacktrace_demangle_ctors_test: RuntimeError # Issue 12698
+stacktrace_rethrow_error_test/none: RuntimeError
+stacktrace_rethrow_error_test/withtraceparameter: RuntimeError
+stacktrace_rethrow_nonerror_test: RuntimeError
+stacktrace_test: RuntimeError # Issue 12698
 super_call4_test: Crash # Assertion failure: Missing scope info for j:method(E.boz).
 switch_bad_case_test/01: MissingCompileTimeError
 switch_bad_case_test/02: MissingCompileTimeError
@@ -2478,7 +2491,6 @@
 typevariable_substitution2_test/02: RuntimeError
 
 [ $compiler == dart2js && $dart2js_with_kernel && $minified ]
-arithmetic_canonicalization_test: RuntimeError
 assertion_initializer_const_function_test/01: MissingCompileTimeError
 assertion_initializer_test: CompileTimeError
 assertion_test: RuntimeError
@@ -2600,6 +2612,7 @@
 covariant_subtyping_unsafe_call2_test: RuntimeError
 covariant_subtyping_unsafe_call3_test: RuntimeError
 cyclic_constructor_test/01: Crash # Issue 30856
+deferred_call_empty_before_load_test: RuntimeError
 deferred_closurize_load_library_test: RuntimeError
 deferred_constraints_constants_test/default_argument2: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
 deferred_constraints_constants_test/none: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
@@ -2648,9 +2661,9 @@
 field_override4_test/02: MissingCompileTimeError
 final_attempt_reinitialization_test/01: MissingCompileTimeError
 final_attempt_reinitialization_test/02: MissingCompileTimeError
-full_stacktrace1_test: RuntimeError
-full_stacktrace2_test: RuntimeError
-full_stacktrace3_test: RuntimeError
+full_stacktrace1_test: RuntimeError # Issue 12698
+full_stacktrace2_test: RuntimeError # Issue 12698
+full_stacktrace3_test: RuntimeError # Issue 12698
 function_subtype_bound_closure3_test: RuntimeError
 function_subtype_bound_closure4_test: RuntimeError
 function_subtype_bound_closure7_test: RuntimeError
@@ -2679,10 +2692,7 @@
 function_type_call_getter2_test/none: RuntimeError
 function_type_test: RuntimeError
 generalized_void_syntax_test: CompileTimeError
-generic_field_mixin4_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(M.T) in ()in j:constructor(C3.).
-generic_field_mixin5_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(M.T) in ()in j:constructor(C3.).
 generic_field_mixin6_test/none: RuntimeError
-generic_field_mixin_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(M.T) in ()in j:constructor(C3.).
 generic_function_bounds_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_function_dcall_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_function_typedef_test/01: RuntimeError
@@ -2876,11 +2886,11 @@
 setter_override_test/00: MissingCompileTimeError
 setter_override_test/03: MissingCompileTimeError
 stack_trace_test: RuntimeError
-stacktrace_demangle_ctors_test: RuntimeError
-stacktrace_rethrow_error_test/none: RuntimeError
-stacktrace_rethrow_error_test/withtraceparameter: RuntimeError
-stacktrace_rethrow_nonerror_test: RuntimeError
-stacktrace_test: RuntimeError
+stacktrace_demangle_ctors_test: RuntimeError # Issue 12698
+stacktrace_rethrow_error_test/none: RuntimeError # Issue 12698
+stacktrace_rethrow_error_test/withtraceparameter: RuntimeError # Issue 12698
+stacktrace_rethrow_nonerror_test: RuntimeError # Issue 12698
+stacktrace_test: RuntimeError # Issue 12698
 super_call4_test: Crash # NoSuchMethodError: The getter 'thisLocal' was called on null.
 switch_bad_case_test/01: MissingCompileTimeError
 switch_bad_case_test/02: MissingCompileTimeError
@@ -3031,6 +3041,9 @@
 if_null_assignment_behavior_test/13: Crash # Issue 23491
 if_null_assignment_behavior_test/14: Crash # Issue 23491
 infinity_test: RuntimeError # Issue 4984
+instantiate_tearoff_after_contravariance_check_test: RuntimeError
+instantiate_tearoff_of_call_test: RuntimeError
+instantiate_tearoff_test: RuntimeError
 integer_division_by_zero_test: RuntimeError # Issue 8301
 invocation_mirror2_test: RuntimeError # Issue 6490 (wrong retval).
 left_shift_test: RuntimeError # Issue 1533
@@ -3086,13 +3099,15 @@
 regress_24283_test: RuntimeError # Issue 1533
 scope_variable_test/01: MissingCompileTimeError # Issue 13016
 setter4_test: CompileTimeError # issue 13639
-stacktrace_demangle_ctors_test: Fail # dart2js stack traces are not always compliant.
+stacktrace_demangle_ctors_test: Fail # dart2js stack traces are not always compliant, issue 12698
 stacktrace_rethrow_error_test: Pass, RuntimeError # Issue 12698
 stacktrace_rethrow_nonerror_test: Pass, RuntimeError # Issue 12698
 stacktrace_test: Pass, RuntimeError # # Issue 12698
 truncdiv_test: RuntimeError # Issue 15246
 try_catch_on_syntax_test/10: Fail # Issue 19823
 try_catch_on_syntax_test/11: Fail # Issue 19823
+type_inference_circularity_test: MissingCompileTimeError
+type_inference_inconsistent_inheritance_test: MissingCompileTimeError
 type_variable_conflict_test/01: Fail # Issue 13702
 type_variable_conflict_test/02: Fail # Issue 13702
 type_variable_conflict_test/03: Fail # Issue 13702
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index f996cb1..f86090e 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -48,13 +48,8 @@
 forwarding_stub_tearoff_test: CompileTimeError
 fuzzy_arrows_test/01: MissingCompileTimeError
 generic_local_functions_test: CompileTimeError
-generic_methods_closure_test: CompileTimeError # Issue 29920
 generic_methods_generic_function_parameter_test: CompileTimeError
 generic_methods_generic_function_result_test/none: CompileTimeError # Issue #30208
-generic_methods_local_variable_declaration_test: CompileTimeError # Issue 29920
-generic_methods_shadowing_test: CompileTimeError # Issue 29920
-generic_methods_simple_is_expression_test: CompileTimeError # Issue 29920
-generic_methods_type_expression_test: CompileTimeError
 generic_no_such_method_dispatcher_simple_test: Skip # This test is just for kernel.
 generic_no_such_method_dispatcher_test: CompileTimeError
 generic_test: CompileTimeError
@@ -65,6 +60,8 @@
 import_core_prefix_test: CompileTimeError
 import_private_test/01: MissingCompileTimeError # Issue 29920
 initializing_formal_final_test: MissingCompileTimeError
+instantiate_tearoff_after_contravariance_check_test: RuntimeError
+instantiate_tearoff_of_call_test: RuntimeError
 interface_test/00: MissingCompileTimeError
 internal_library_test/01: MissingCompileTimeError # Issue 29920
 method_override_test: CompileTimeError # Negative test
@@ -111,6 +108,8 @@
 syntax_test/none: CompileTimeError
 try_catch_on_syntax_test/10: MissingCompileTimeError
 try_catch_on_syntax_test/11: MissingCompileTimeError
+type_inference_circularity_test: MissingCompileTimeError
+type_inference_inconsistent_inheritance_test: MissingCompileTimeError
 type_promotion_functions_test/02: CompileTimeError # Issue 30895
 type_promotion_functions_test/03: CompileTimeError # Issue 30895
 type_promotion_functions_test/04: CompileTimeError # Issue 30895
@@ -189,6 +188,7 @@
 call_non_method_field_test/02: MissingCompileTimeError
 call_with_no_such_method_test: CompileTimeError # Issue 31402 Error: A value of type '#lib1::F' can't be assigned to a variable of type 'dart.core::Function'.
 callable_test/none: CompileTimeError
+cascade_on_static_field_test: Crash
 check_member_static_test/01: MissingCompileTimeError
 check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
@@ -230,7 +230,6 @@
 const_qq_test: Crash
 const_switch2_test/01: MissingCompileTimeError
 const_syntax_test/05: MissingCompileTimeError
-const_syntax_test/08: MissingCompileTimeError
 const_syntax_test/09: Crash
 const_types_test/34: MissingCompileTimeError
 const_types_test/35: MissingCompileTimeError
@@ -286,7 +285,6 @@
 export_ambiguous_main_test: MissingCompileTimeError
 external_test/21: CompileTimeError
 external_test/24: CompileTimeError
-extract_type_arguments_test: CompileTimeError # Issue 31371
 f_bounded_quantification_test/01: MissingCompileTimeError
 f_bounded_quantification_test/02: MissingCompileTimeError
 factory2_test/03: MissingCompileTimeError
@@ -307,7 +305,7 @@
 final_attempt_reinitialization_test/02: Crash
 final_syntax_test/09: Crash
 function_propagation_test: CompileTimeError
-function_subtype_bound_closure7_test: CompileTimeError
+function_subtype_bound_closure7_test: Crash
 function_type/function_type10_test: CompileTimeError
 function_type/function_type11_test: CompileTimeError
 function_type/function_type14_test: CompileTimeError
@@ -378,12 +376,12 @@
 function_type_parameter_negative_test: Fail
 generalized_void_syntax_test: CompileTimeError
 generic_function_bounds_test: CompileTimeError
-generic_function_dcall_test: CompileTimeError
+generic_function_dcall_test: Crash
 generic_methods_bounds_test/01: MissingCompileTimeError
 generic_methods_generic_function_result_test/01: MissingCompileTimeError
 generic_methods_recursive_bound_test/02: MissingCompileTimeError
-generic_methods_tearoff_specialization_test: CompileTimeError
-generic_methods_unused_parameter_test: CompileTimeError
+generic_methods_tearoff_specialization_test: Crash
+generic_methods_unused_parameter_test: Crash
 generic_no_such_method_dispatcher_simple_test: CompileTimeError # Warning: Superclass has no method named 'foo'.
 generic_no_such_method_dispatcher_test: CompileTimeError # Issue 31533
 getter_override2_test/02: MissingCompileTimeError
@@ -400,6 +398,9 @@
 initializing_formal_type_annotation_test/01: MissingCompileTimeError
 initializing_formal_type_annotation_test/02: MissingCompileTimeError
 instance_call_wrong_argument_count_negative_test: Fail
+instantiate_tearoff_after_contravariance_check_test: Crash
+instantiate_tearoff_of_call_test: Crash
+instantiate_tearoff_test: Crash
 invocation_mirror_test: CompileTimeError # Issue 31402 Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Invocation'.
 issue13179_test: CompileTimeError # Issue 31537
 issue18628_2_test/01: MissingCompileTimeError
@@ -544,6 +545,7 @@
 mixin_type_parameters_errors_test/03: MissingCompileTimeError
 mixin_type_parameters_errors_test/04: MissingCompileTimeError
 mixin_type_parameters_errors_test/05: MissingCompileTimeError
+mixin_with_named_import_test: Crash
 multiline_newline_test/06: MissingCompileTimeError
 multiline_newline_test/06r: MissingCompileTimeError
 named_constructor_test/01: MissingCompileTimeError
@@ -641,6 +643,7 @@
 super_in_async3_test: Crash
 super_in_async4_test: Crash
 super_in_async6_test: Crash
+super_in_constructor_test: RuntimeError
 super_in_finally_test: Crash
 super_no_such_method1_test: CompileTimeError
 super_no_such_method2_test: CompileTimeError
@@ -685,6 +688,7 @@
 type_variable_bounds_test/06: MissingCompileTimeError
 type_variable_bounds_test/08: MissingCompileTimeError
 type_variable_bounds_test/11: MissingCompileTimeError
+typedef_class_in_other_file_test: Crash
 void_block_return_test/00: MissingCompileTimeError
 void_type_callbacks_test/none: CompileTimeError
 wrong_number_type_arguments_test/01: MissingCompileTimeError
@@ -738,11 +742,6 @@
 super_operator_index7_test: RuntimeError
 super_operator_index8_test: RuntimeError
 truncdiv_test: RuntimeError # Issue 29920
-yieldstar_pause_test: Skip # Times out
-
-[ $compiler == dartdevk && $runtime == none ]
-no_such_method_negative_test: Fail
-prefix6_negative_test: Fail
 
 [ $compiler == dartdevk && $runtime != none ]
 callable_test/none: RuntimeError # Expect.throws(TypeError) fails: Did not throw
@@ -791,7 +790,6 @@
 generic_closure_test/none: RuntimeError # ReferenceError: TToT is not defined
 generic_list_checked_test: RuntimeError # Expect.throws fails: Did not throw
 generic_method_types_test/02: RuntimeError
-generic_methods_type_expression_test: RuntimeError # Expect.isTrue(false) fails.
 generic_methods_unused_parameter_test: RuntimeError # Expect.isTrue(false) fails.
 generic_test: RuntimeError # ReferenceError: BOfT is not defined
 library_env_test/has_io_support: RuntimeError # Unsupported operation: bool.fromEnvironment can only be used as a const constructor
@@ -823,7 +821,6 @@
 runtime_type_function_test: RuntimeError # Expect.fail('Type print string does not match expectation
 syncstar_yield_test/copyParameters: RuntimeError # Expect.equals(expected: <2>, actual: <3>) fails.
 type_literal_test: RuntimeError # Expect.equals(expected: <Func>, actual: <(bool) => int>) fails.
-yieldstar_pause_test: Timeout
 
 # Compiler tests for dartdevc and dartdevk.  These contain common expectations
 # for all runtimes including $runtime == none.  They are organized by: shared
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index b8486e7..6578d02 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -22,6 +22,9 @@
 vm/unaligned_integer_access_register_index_test: CompileTimeError # Issue 31339
 
 [ $compiler == dartk && $mode == debug && $runtime == vm && $strong ]
+bad_named_parameters_test/01: Crash # Issue(http://dartbug.com/31630)
+bad_named_parameters_test/02: Crash # Issue(http://dartbug.com/31630)
+bad_named_parameters_test/04: Crash # Issue(http://dartbug.com/31630)
 const_instance_field_test/01: Crash
 cyclic_type_variable_test/01: Crash
 cyclic_type_variable_test/02: Crash
@@ -30,6 +33,11 @@
 cyclic_type_variable_test/none: Crash
 deopt_inlined_function_lazy_test: Skip
 flatten_test/04: Crash # Issue #31381
+instance_call_wrong_argument_count_negative_test: Crash # Issue(http//dartbug.com/31630)
+optional_named_parameters_test/02: Crash # Issue(http://dartbug.com/31630)
+optional_named_parameters_test/04: Crash # Issue(http://dartbug.com/31630)
+optional_named_parameters_test/06: Crash # Issue(http://dartbug.com/31630)
+optional_named_parameters_test/08: Crash # Issue(http://dartbug.com/31630)
 tearoff_dynamic_test: Crash
 
 [ $compiler == dartk && $mode == product && $runtime == vm ]
@@ -176,9 +184,6 @@
 async_await_syntax_test/c10a: MissingCompileTimeError
 async_await_syntax_test/d08b: MissingCompileTimeError
 async_await_syntax_test/d10a: MissingCompileTimeError
-async_await_test/02: CompileTimeError # Issue 31402 (Invocation arguments)
-async_await_test/03: CompileTimeError # Issue 31402 (Invocation arguments)
-async_await_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
 async_or_generator_return_type_stacktrace_test/01: MissingCompileTimeError
 async_or_generator_return_type_stacktrace_test/02: MissingCompileTimeError
 async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError
@@ -296,9 +301,7 @@
 compile_time_constant_static5_test/21: CompileTimeError # Issue 31537
 compile_time_constant_static5_test/23: CompileTimeError # Issue 31402 (Field declaration)
 conditional_import_string_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-conditional_import_string_test: DartkCompileTimeError
 conditional_import_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-conditional_import_test: DartkCompileTimeError
 conditional_method_invocation_test/12: MissingCompileTimeError
 conditional_method_invocation_test/13: MissingCompileTimeError
 conditional_property_access_test/10: MissingCompileTimeError
@@ -425,8 +428,8 @@
 deferred_inlined_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
 deferred_inlined_test: RuntimeError
 deferred_load_constants_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_load_inval_code_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
 deferred_load_inval_code_test: RuntimeError
+deferred_load_inval_code_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
 deferred_load_library_wrong_args_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 28335.
 deferred_load_library_wrong_args_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
 deferred_load_library_wrong_args_test/none: RuntimeError
@@ -451,8 +454,8 @@
 deferred_static_seperate_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
 deferred_static_seperate_test: RuntimeError
 deferred_super_dependency_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 28335.
-deferred_type_dependency_test/as: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
 deferred_type_dependency_test/as: RuntimeError
+deferred_type_dependency_test/as: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
 deferred_type_dependency_test/is: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
 deferred_type_dependency_test/is: RuntimeError
 deferred_type_dependency_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
@@ -464,8 +467,8 @@
 dynamic_prefix_core_test/01: MissingCompileTimeError
 dynamic_prefix_core_test/01: RuntimeError # KernelVM bug: Blocked on language issue 29125.
 dynamic_prefix_core_test/none: RuntimeError
-dynamic_test: CompileTimeError # Issue 31402 (Variable declaration)
 dynamic_test: RuntimeError
+dynamic_test: CompileTimeError # Issue 31402 (Variable declaration)
 emit_const_fields_test: CompileTimeError # Issue 31533
 empty_block_case_test: MissingCompileTimeError
 enum_private_test/02: MissingCompileTimeError
@@ -473,7 +476,7 @@
 external_test/10: MissingRuntimeError # KernelVM bug: Unbound external.
 external_test/13: MissingRuntimeError # KernelVM bug: Unbound external.
 external_test/20: MissingRuntimeError # KernelVM bug: Unbound external.
-extract_type_arguments_test: CompileTimeError # Issue 31371
+extract_type_arguments_test: RuntimeError # Issue 31371
 f_bounded_quantification_test/01: MissingCompileTimeError
 f_bounded_quantification_test/02: MissingCompileTimeError
 factory2_test/03: MissingCompileTimeError
@@ -644,8 +647,8 @@
 generic_function_bounds_test: RuntimeError
 generic_function_dcall_test: CompileTimeError
 generic_function_dcall_test: RuntimeError
-generic_function_type_as_type_argument_test/02: MissingCompileTimeError, OK # No type inference
 generic_function_type_as_type_argument_test/02: Pass # For the wrong reason, issue 30931
+generic_function_type_as_type_argument_test/02: MissingCompileTimeError, OK # No type inference
 generic_function_typedef2_test/04: MissingCompileTimeError
 generic_instanceof2_test: RuntimeError
 generic_instanceof_test: RuntimeError
@@ -658,7 +661,6 @@
 generic_methods_recursive_bound_test/02: MissingCompileTimeError
 generic_methods_tearoff_specialization_test: CompileTimeError # Issue 31402 (Variable declaration)
 generic_methods_tearoff_specialization_test: RuntimeError
-generic_methods_type_expression_test: RuntimeError # Issue 25869 / 27460
 generic_methods_unused_parameter_test: CompileTimeError # Issue 31402 (Variable declaration)
 generic_methods_unused_parameter_test: RuntimeError
 generic_no_such_method_dispatcher_simple_test: CompileTimeError # Issue 31533
@@ -689,6 +691,9 @@
 initializing_formal_type_annotation_test/01: MissingCompileTimeError
 initializing_formal_type_annotation_test/02: MissingCompileTimeError
 instanceof2_test: RuntimeError
+instantiate_tearoff_after_contravariance_check_test: CompileTimeError
+instantiate_tearoff_of_call_test: CompileTimeError
+instantiate_tearoff_test: CompileTimeError
 int64_literal_test/03: MissingCompileTimeError # http://dartbug.com/31479
 int64_literal_test/30: MissingCompileTimeError # http://dartbug.com/31479
 interface_test/00: MissingCompileTimeError
@@ -1140,8 +1145,6 @@
 unresolved_top_level_method_test: MissingCompileTimeError
 unresolved_top_level_var_test: MissingCompileTimeError
 vm/canonicalization_preserves_deopt_test: CompileTimeError # Issue 31402 (Assert statement)
-vm/causal_async_exception_stack2_test: CompileTimeError # Issue 31402 (Invocation arguments)
-vm/causal_async_exception_stack_test: CompileTimeError # Issue 31402 (Invocation arguments)
 vm/closure_memory_retention_test: Skip # KernelVM bug: Hits OOM
 vm/debug_break_enabled_vm_test/01: CompileTimeError # KernelVM bug: Bad test using extended break syntax.
 vm/debug_break_enabled_vm_test/none: CompileTimeError # KernelVM bug: Bad test using extended break syntax.
@@ -1194,6 +1197,30 @@
 wrong_number_type_arguments_test/*: MissingCompileTimeError
 wrong_number_type_arguments_test/none: Pass
 
+# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
+# are to be triaged.  Isolate tests are skipped on purpose due to the usage of
+# batch mode.
+[ $compiler == dartk && $strong && ($arch == simarm || $arch == simarm64) ]
+bit_operations_test/03: CompileTimeError # Please triage.
+bit_operations_test/04: CompileTimeError # Please triage.
+bit_operations_test/none: CompileTimeError # Please triage.
+class_cycle_test/02: MissingCompileTimeError # Please triage.
+class_cycle_test/03: MissingCompileTimeError # Please triage.
+duplicate_implements_test/01: MissingCompileTimeError # Please triage.
+duplicate_implements_test/02: MissingCompileTimeError # Please triage.
+duplicate_implements_test/03: MissingCompileTimeError # Please triage.
+duplicate_implements_test/04: MissingCompileTimeError # Please triage.
+generic_methods_generic_function_result_test/01: MissingCompileTimeError # Please triage.
+identical_closure2_test: CompileTimeError # Please triage.
+issue23244_test: RuntimeError # Please triage.
+least_upper_bound_expansive_test/none: RuntimeError # Please triage.
+mint_arithmetic_test: CompileTimeError # Please triage.
+mixin_black_listed_test/02: MissingCompileTimeError # Please triage.
+null_test/02: MissingCompileTimeError # Please triage.
+null_test/03: MissingCompileTimeError # Please triage.
+vm/unaligned_integer_access_literal_index_test: CompileTimeError # Please triage.
+vm/unaligned_integer_access_register_index_test: CompileTimeError # Please triage.
+
 [ $compiler == dartk && !$strong ]
 *: SkipByDesign # language_2 is only supported in strong mode.
 
@@ -1208,8 +1235,7 @@
 cyclic_type_variable_test/04: Crash
 cyclic_type_variable_test/none: Crash
 external_test/13: Crash
-final_syntax_test/09: Crash
-flatten_test/04: Crash
+instance_call_wrong_argument_count_negative_test: Crash # Issue(http://dartbug.com/31630)
 optional_named_parameters_test/06: Crash
 optional_named_parameters_test/08: Crash
 regress_29025_test: Crash
@@ -1399,8 +1425,8 @@
 async_star_test/01: CompileTimeError # Issue 2238.
 async_star_test/01: Crash
 async_star_test/01: Pass
-async_star_test/02: RuntimeError
 async_star_test/02: CompileTimeError # Issue 31402 (Invocation arguments)
+async_star_test/02: RuntimeError
 async_star_test/03: CompileTimeError # Issue 31402 (Invocation arguments)
 async_star_test/04: CompileTimeError # Issue 31402 (Invocation arguments)
 async_star_test/05: CompileTimeError # Issue 31402 (Invocation arguments)
@@ -1471,8 +1497,8 @@
 checked_setter3_test/03: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
-class_keyword_test/02: Pass
 class_keyword_test/02: MissingCompileTimeError # Issue 13627
+class_keyword_test/02: Pass
 class_literal_static_test/12: MissingCompileTimeError
 class_literal_static_test/13: MissingCompileTimeError
 class_literal_static_test/17: MissingCompileTimeError
@@ -1543,7 +1569,6 @@
 const_redirecting_factory_test: CompileTimeError # Issue 31402 (Field declaration)
 const_switch2_test/01: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 const_syntax_test/05: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-const_syntax_test/08: Crash
 const_types_test/01: MissingCompileTimeError
 const_types_test/02: MissingCompileTimeError
 const_types_test/03: MissingCompileTimeError
@@ -1615,8 +1640,8 @@
 deferred_constraints_type_annotation_test/type_annotation_generic1: Pass
 deferred_constraints_type_annotation_test/type_annotation_generic2: MissingCompileTimeError
 deferred_constraints_type_annotation_test/type_annotation_generic2: Pass
-deferred_constraints_type_annotation_test/type_annotation_generic3: Pass
 deferred_constraints_type_annotation_test/type_annotation_generic3: MissingCompileTimeError
+deferred_constraints_type_annotation_test/type_annotation_generic3: Pass
 deferred_constraints_type_annotation_test/type_annotation_generic4: MissingCompileTimeError
 deferred_constraints_type_annotation_test/type_annotation_generic4: Pass
 deferred_constraints_type_annotation_test/type_annotation_non_deferred: CompileTimeError
@@ -1678,9 +1703,8 @@
 external_test/10: MissingRuntimeError # KernelVM bug: Unbound external.
 external_test/13: MissingRuntimeError # KernelVM bug: Unbound external.
 external_test/20: MissingRuntimeError # KernelVM bug: Unbound external.
-external_test/21: CompileTimeError
-external_test/24: CompileTimeError
-extract_type_arguments_test: CompileTimeError # Issue 31371
+external_test/24: Pass, CompileTimeError # Started to pass after switching to batch-mode.
+extract_type_arguments_test: RuntimeError # Issue 31371
 f_bounded_quantification_test/01: MissingCompileTimeError
 f_bounded_quantification_test/02: MissingCompileTimeError
 factory2_test/03: MissingCompileTimeError
@@ -1706,7 +1730,6 @@
 final_for_in_variable_test: MissingCompileTimeError
 final_param_test: MissingCompileTimeError
 final_super_field_set_test: MissingCompileTimeError
-final_syntax_test/09: Crash
 final_variable_assignment_test/01: MissingCompileTimeError
 final_variable_assignment_test/02: MissingCompileTimeError
 final_variable_assignment_test/03: MissingCompileTimeError
@@ -1890,8 +1913,6 @@
 generic_methods_reuse_type_variables_test: Pass
 generic_methods_tearoff_specialization_test: RuntimeError
 generic_methods_tearoff_specialization_test: CompileTimeError # Issue 31402 (Variable declaration)
-generic_methods_type_expression_test: Crash
-generic_methods_type_expression_test: RuntimeError # Issue 25869 / 27460
 generic_methods_unused_parameter_test: CompileTimeError # Issue 31402 (Variable declaration)
 generic_methods_unused_parameter_test: RuntimeError
 generic_no_such_method_dispatcher_simple_test: CompileTimeError # Issue 31533
@@ -1951,6 +1972,9 @@
 instanceof4_test/01: RuntimeError
 instanceof4_test/none: Pass
 instanceof4_test/none: RuntimeError
+instantiate_tearoff_after_contravariance_check_test: CompileTimeError
+instantiate_tearoff_of_call_test: CompileTimeError
+instantiate_tearoff_test: CompileTimeError
 int64_literal_test/03: MissingCompileTimeError # http://dartbug.com/31479
 int64_literal_test/30: MissingCompileTimeError # http://dartbug.com/31479
 interface_test/00: MissingCompileTimeError
@@ -2162,8 +2186,8 @@
 mock_writable_final_private_field_test: RuntimeError # Issue 30849
 multiline_strings_test: Pass
 multiline_strings_test: Fail # Issue 23020
-named_constructor_test/01: MissingRuntimeError # Fasta bug: Bad compilation of constructor reference.
 named_constructor_test/01: MissingCompileTimeError
+named_constructor_test/01: MissingRuntimeError # Fasta bug: Bad compilation of constructor reference.
 named_constructor_test/03: MissingCompileTimeError
 named_parameters2_test: MissingCompileTimeError
 named_parameters3_test: MissingCompileTimeError
@@ -2333,15 +2357,15 @@
 regress_28217_test/none: MissingCompileTimeError # Fasta bug: Bad constructor redirection.
 regress_28255_test: SkipByDesign
 regress_28278_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-regress_28341_test: RuntimeError
 regress_28341_test: Pass
+regress_28341_test: RuntimeError
 regress_29025_test: CompileTimeError # Issue 31402 (Variable declaration)
 regress_29405_test: CompileTimeError # Issue 31402 (Invocation arguments)
 regress_29784_test/01: MissingCompileTimeError
 regress_29784_test/02: MissingCompileTimeError
 regress_30339_test: CompileTimeError # Issue 31402 (Variable declaration)
 setter4_test: MissingCompileTimeError # Issue 14736
-setter_no_getter_test/01: CompileTimeError # Issue 31533
+setter_no_getter_test/01: Pass, CompileTimeError # Issue 31533 (started passing after switching to batch-mode)
 setter_override_test/01: MissingCompileTimeError
 setter_override_test/02: MissingCompileTimeError
 stacktrace_demangle_ctors_test: RuntimeError
@@ -2449,8 +2473,8 @@
 vm/reflect_core_vm_test: SkipByDesign
 vm/regress_27201_test: CompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
 vm/regress_27201_test: Fail
-vm/regress_27671_test: Skip # Unsupported
 vm/regress_27671_test: Crash
+vm/regress_27671_test: Skip # Unsupported
 vm/regress_29145_test: Skip # Issue 29145
 vm/type_cast_vm_test: RuntimeError # Expects line and column numbers
 vm/type_vm_test: RuntimeError, Pass # Expects line and column numbers
diff --git a/tests/language_2/language_2_precompiled.status b/tests/language_2/language_2_precompiled.status
index ec2cac1..f5f5cd5 100644
--- a/tests/language_2/language_2_precompiled.status
+++ b/tests/language_2/language_2_precompiled.status
@@ -282,7 +282,7 @@
 export_ambiguous_main_negative_test: Skip # Issue 29895
 export_ambiguous_main_test: Crash
 export_double_same_main_test: Skip # Issue 29895
-extract_type_arguments_test: CompileTimeError # Issue 31371
+extract_type_arguments_test: RuntimeError # Issue 31371
 f_bounded_quantification_test/01: MissingCompileTimeError
 f_bounded_quantification_test/02: MissingCompileTimeError
 factory1_test/00: MissingCompileTimeError
@@ -405,7 +405,6 @@
 generic_methods_recursive_bound_test/02: MissingCompileTimeError
 generic_methods_recursive_bound_test/03: Crash, Pass
 generic_methods_tearoff_specialization_test: RuntimeError
-generic_methods_type_expression_test: RuntimeError # Issue 25869 / 27460
 generic_methods_unused_parameter_test: RuntimeError
 generic_tearoff_test: RuntimeError
 getter_no_setter2_test/00: MissingCompileTimeError
@@ -472,6 +471,9 @@
 instanceof2_test: RuntimeError
 instanceof4_test/01: RuntimeError
 instanceof4_test/none: RuntimeError
+instantiate_tearoff_after_contravariance_check_test: RuntimeError
+instantiate_tearoff_of_call_test: RuntimeError
+instantiate_tearoff_test: RuntimeError
 interface_test/00: MissingCompileTimeError
 invalid_cast_test/01: MissingCompileTimeError
 invalid_cast_test/02: MissingCompileTimeError
@@ -881,6 +883,8 @@
 try_catch_on_syntax_test/11: MissingCompileTimeError
 try_catch_syntax_test/08: MissingCompileTimeError
 type_checks_in_factory_method_test/01: MissingCompileTimeError
+type_inference_circularity_test: MissingCompileTimeError
+type_inference_inconsistent_inheritance_test: MissingCompileTimeError
 type_parameter_test/05: MissingCompileTimeError
 type_promotion_functions_test/01: MissingCompileTimeError
 type_promotion_functions_test/05: MissingCompileTimeError
@@ -1045,6 +1049,7 @@
 covariance_type_parameter_test/01: RuntimeError
 covariance_type_parameter_test/02: RuntimeError
 covariance_type_parameter_test/03: RuntimeError
+forwarding_semi_stub_test: RuntimeError
 forwarding_stub_tearoff_generic_test: RuntimeError
 forwarding_stub_tearoff_test: RuntimeError
 function_type_call_getter2_test/none: RuntimeError
diff --git a/tests/language_2/language_2_vm.status b/tests/language_2/language_2_vm.status
index 2af057b..360e97e 100644
--- a/tests/language_2/language_2_vm.status
+++ b/tests/language_2/language_2_vm.status
@@ -43,7 +43,6 @@
 export_ambiguous_main_negative_test: Fail # Issue 14763
 field_initialization_order_test: Fail, OK
 generalized_void_syntax_test: CompileTimeError # Issue #30176
-generic_methods_type_expression_test: RuntimeError # Issue 25869 / 27460
 hello_dart_test: Skip # Incompatible flag: --compile_all
 language_2/least_upper_bound_expansive_test/none: CompileTimeError
 library_env_test/has_html_support: RuntimeError, OK
@@ -311,7 +310,7 @@
 enum_private_test/02: MissingCompileTimeError
 error_stacktrace_test/00: MissingCompileTimeError
 export_ambiguous_main_test: MissingCompileTimeError
-extract_type_arguments_test: CompileTimeError # Issue 31371
+extract_type_arguments_test: RuntimeError # Issue 31371
 f_bounded_quantification_test/01: MissingCompileTimeError
 f_bounded_quantification_test/02: MissingCompileTimeError
 factory1_test/00: MissingCompileTimeError
@@ -462,6 +461,9 @@
 initializing_formal_final_test: MissingCompileTimeError
 initializing_formal_type_test: MissingCompileTimeError
 instanceof2_test: RuntimeError
+instantiate_tearoff_after_contravariance_check_test: RuntimeError
+instantiate_tearoff_of_call_test: RuntimeError
+instantiate_tearoff_test: RuntimeError
 interface_test/00: MissingCompileTimeError
 invalid_cast_test/01: MissingCompileTimeError
 invalid_cast_test/02: MissingCompileTimeError
@@ -837,6 +839,8 @@
 try_catch_on_syntax_test/11: MissingCompileTimeError
 try_catch_syntax_test/08: MissingCompileTimeError
 type_checks_in_factory_method_test/01: MissingCompileTimeError
+type_inference_circularity_test: MissingCompileTimeError
+type_inference_inconsistent_inheritance_test: MissingCompileTimeError
 type_promotion_functions_test/01: MissingCompileTimeError
 type_promotion_functions_test/05: MissingCompileTimeError
 type_promotion_functions_test/06: MissingCompileTimeError
@@ -1064,6 +1068,7 @@
 covariant_subtyping_unsafe_call3_test: RuntimeError
 field_override_optimization_test: RuntimeError
 field_type_check2_test/01: MissingRuntimeError
+forwarding_semi_stub_test: RuntimeError
 forwarding_stub_tearoff_generic_test: RuntimeError
 forwarding_stub_tearoff_test: RuntimeError
 function_subtype_checked0_test: RuntimeError
@@ -1182,7 +1187,6 @@
 field_initialization_order_test: Fail, OK
 generalized_void_syntax_test: CompileTimeError # Issue #30176
 generic_methods_bounds_test/02: MissingRuntimeError
-generic_methods_type_expression_test: RuntimeError # Issue 25869 / 27460
 library_env_test/has_html_support: RuntimeError, OK
 library_env_test/has_no_io_support: RuntimeError, OK
 main_not_a_function_test: Skip
diff --git a/tests/language_2/mixin_with_named_import_test.dart b/tests/language_2/mixin_with_named_import_test.dart
new file mode 100644
index 0000000..0af06a8
--- /dev/null
+++ b/tests/language_2/mixin_with_named_import_test.dart
@@ -0,0 +1,16 @@
+// 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 'dart:collection' as collection;
+
+class Foo extends Object with collection.ListMixin {
+  int get length => 0;
+  operator [](int index) => null;
+  void operator []=(int index, value) => null;
+  set length(int newLength) => null;
+}
+
+main() {
+  new Foo();
+}
diff --git a/tests/language_2/super_in_constructor_test.dart b/tests/language_2/super_in_constructor_test.dart
new file mode 100644
index 0000000..621eee9
--- /dev/null
+++ b/tests/language_2/super_in_constructor_test.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class Foo {
+  bool myBoolean = false;
+
+  void set foo(bool b) {
+    print("Setting foo in Foo");
+    myBoolean = b;
+  }
+}
+
+class Baz extends Foo {
+  Baz() {
+    super.foo = true;
+    Expect.equals(true, super.myBoolean);
+  }
+}
+
+main() {
+  new Baz();
+}
diff --git a/tests/language_2/type_inference_circularity_test.dart b/tests/language_2/type_inference_circularity_test.dart
new file mode 100644
index 0000000..f7d1db2
--- /dev/null
+++ b/tests/language_2/type_inference_circularity_test.dart
@@ -0,0 +1,11 @@
+// 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.
+
+var /*@compile-error=unspecified*/ x = () => y;
+var /*@compile-error=unspecified*/ y = () => x;
+
+void main() {
+  x;
+  y;
+}
diff --git a/tests/language_2/type_inference_inconsistent_inheritance_test.dart b/tests/language_2/type_inference_inconsistent_inheritance_test.dart
new file mode 100644
index 0000000..45f7db9
--- /dev/null
+++ b/tests/language_2/type_inference_inconsistent_inheritance_test.dart
@@ -0,0 +1,19 @@
+// 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.
+
+class A {
+  void f(Object x) {}
+}
+
+class B {
+  void f(String x) {}
+}
+
+class C extends A implements B {
+  // No type can be inferred for x since the two inherited interfaces specify
+  // different types.
+  void f(/*@compile-error=unspecified*/ x) {}
+}
+
+void main() {}
diff --git a/tests/language_2/typedef_class_in_other_file_helper.dart b/tests/language_2/typedef_class_in_other_file_helper.dart
new file mode 100644
index 0000000..3b66850
--- /dev/null
+++ b/tests/language_2/typedef_class_in_other_file_helper.dart
@@ -0,0 +1,5 @@
+// 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.
+
+class Bar {}
diff --git a/tests/language_2/typedef_class_in_other_file_test.dart b/tests/language_2/typedef_class_in_other_file_test.dart
new file mode 100644
index 0000000..5300104
--- /dev/null
+++ b/tests/language_2/typedef_class_in_other_file_test.dart
@@ -0,0 +1,13 @@
+// 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.
+
+// This has crashed DDC with Kernel because of a
+// "Concurrent modification during iteration" exception.
+
+import 'typedef_class_in_other_file_helper.dart';
+
+typedef bool Foo1(bool baz);
+typedef bool Foo2(Bar baz);
+
+main() {}
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index b7a1b22..2482bda 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -161,7 +161,7 @@
 mirrors/generic_bounded_test/02: Fail # Type equality - Issue 26869
 
 [ $strong ]
-*: SkipByDesign # tests/lib_strong has the strong mode versions of these tests.
+*: SkipByDesign # tests/lib_2 has the strong mode versions of these tests.
 
 [ $arch == ia32 && $mode == debug && $system == windows ]
 convert/streamed_conversion_json_utf8_decode_test: Skip # Verification OOM.
@@ -276,6 +276,20 @@
 math/math2_test: RuntimeError
 math/math_test: RuntimeError
 
+# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
+# are to be triaged.  Isolate tests are skipped on purpose due to the usage of
+# batch mode.
+[ $compiler == dartk && $mode == debug && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
+mirrors/variable_is_const_test/01: Crash # Please triage.
+
+# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
+# are to be triaged.  Isolate tests are skipped on purpose due to the usage of
+# batch mode.
+[ $compiler == dartk && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
+mirrors/invocation_fuzz_test/smi: Crash # Please triage.
+mirrors/library_uri_io_test: RuntimeError # Please triage.
+mirrors/spawn_function_root_library_test: Skip
+
 [ $compiler != dartk && $compiler != dartkp && ($runtime == dart_precompiled || $runtime == flutter || $runtime == vm) ]
 mirrors/initializing_formals_test/01: Fail # initializing formals are implicitly final as of Dart 1.21
 
diff --git a/tests/lib_strong/html/Ahem.ttf b/tests/lib_2/html/Ahem.ttf
similarity index 100%
rename from tests/lib_strong/html/Ahem.ttf
rename to tests/lib_2/html/Ahem.ttf
Binary files differ
diff --git a/tests/lib_strong/html/cross_domain_iframe_script.html b/tests/lib_2/html/cross_domain_iframe_script.html
similarity index 100%
rename from tests/lib_strong/html/cross_domain_iframe_script.html
rename to tests/lib_2/html/cross_domain_iframe_script.html
diff --git a/tests/lib_strong/html/cross_domain_iframe_script.js b/tests/lib_2/html/cross_domain_iframe_script.js
similarity index 100%
rename from tests/lib_strong/html/cross_domain_iframe_script.js
rename to tests/lib_2/html/cross_domain_iframe_script.js
diff --git a/tests/lib_strong/html/custom/attribute_changed_callback_test.html b/tests/lib_2/html/custom/attribute_changed_callback_test.html
similarity index 100%
rename from tests/lib_strong/html/custom/attribute_changed_callback_test.html
rename to tests/lib_2/html/custom/attribute_changed_callback_test.html
diff --git a/tests/lib_strong/html/custom/constructor_calls_created_synchronously_test.html b/tests/lib_2/html/custom/constructor_calls_created_synchronously_test.html
similarity index 100%
rename from tests/lib_strong/html/custom/constructor_calls_created_synchronously_test.html
rename to tests/lib_2/html/custom/constructor_calls_created_synchronously_test.html
diff --git a/tests/lib_strong/html/custom/created_callback_test.html b/tests/lib_2/html/custom/created_callback_test.html
similarity index 100%
rename from tests/lib_strong/html/custom/created_callback_test.html
rename to tests/lib_2/html/custom/created_callback_test.html
diff --git a/tests/lib_strong/html/custom/document_register_basic_test.html b/tests/lib_2/html/custom/document_register_basic_test.html
similarity index 100%
rename from tests/lib_strong/html/custom/document_register_basic_test.html
rename to tests/lib_2/html/custom/document_register_basic_test.html
diff --git a/tests/lib_2/html/debugger_test.dart b/tests/lib_2/html/debugger_test.dart
index 587d3b9..8207b59 100644
--- a/tests/lib_2/html/debugger_test.dart
+++ b/tests/lib_2/html/debugger_test.dart
@@ -322,7 +322,7 @@
     if (actualStr != golden) {
       var helpMessage =
           'Debugger output does not match the golden data found in:\n'
-          'tests/lib_strong/html/debugger_test_golden.txt\n'
+          'tests/lib_2/html/debugger_test_golden.txt\n'
           'The new golden data is copied to the clipboard when you click on '
           'this window.\n'
           'Please update the golden file with the following output and review '
diff --git a/tests/lib_strong/html/events_test.dart b/tests/lib_2/html/events_test.dart
similarity index 86%
rename from tests/lib_strong/html/events_test.dart
rename to tests/lib_2/html/events_test.dart
index fb95033..43a6737 100644
--- a/tests/lib_strong/html/events_test.dart
+++ b/tests/lib_2/html/events_test.dart
@@ -13,9 +13,9 @@
   useHtmlConfiguration();
 
   test('TimeStamp', () {
-    Event event = new Event('test');
+    var event = new Event('test');
 
-    int timeStamp = event.timeStamp;
+    var timeStamp = event.timeStamp;
     expect(timeStamp, greaterThan(0));
   });
 
@@ -33,19 +33,19 @@
   // The next test is not asynchronous because [on['test'].dispatch(event)] fires the event
   // and event listener synchronously.
   test('EventTarget', () {
-    Element element = new Element.tag('test');
+    var element = new Element.tag('test');
     element.id = 'eventtarget';
-    window.document.body.append(element);
+    document.body.append(element);
 
-    int invocationCounter = 0;
+    var invocationCounter = 0;
     void handler(Event e) {
       expect(e.type, equals('test'));
-      Element target = e.target;
+      var target = e.target;
       expect(element, equals(target));
       invocationCounter++;
     }
 
-    Event event = new Event('test');
+    var event = new Event('test');
 
     invocationCounter = 0;
     element.dispatchEvent(event);
@@ -84,24 +84,24 @@
   });
 
   test('InitMouseEvent', () {
-    DivElement div = new Element.tag('div');
-    MouseEvent event = new MouseEvent('zebra', relatedTarget: div);
+    var div = new Element.tag('div');
+    var event = new MouseEvent('zebra', relatedTarget: div);
   });
 
   test('DOM event callbacks are associated with the correct zone', () {
     var callbacks = [];
 
-    final element = new Element.tag('test');
+    var element = new Element.tag('test');
     element.id = 'eventtarget';
     document.body.append(element);
 
     // runZoned executes the function synchronously, but we don't want to
     // rely on this. We therefore wrap it into an expectAsync.
     runZoned(expectAsync(() {
-      Zone zone = Zone.current;
+      var zone = Zone.current;
       expect(zone, isNot(equals(Zone.root)));
 
-      var sub;
+      StreamSubscription<Event> sub;
 
       void handler(Event e) {
         expect(Zone.current, equals(zone));
diff --git a/tests/lib_2/html/file_sample_test.dart b/tests/lib_2/html/file_sample_test.dart
new file mode 100644
index 0000000..1e0f355
--- /dev/null
+++ b/tests/lib_2/html/file_sample_test.dart
@@ -0,0 +1,125 @@
+library file_sample;
+
+import 'dart:async';
+import 'dart:html';
+
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:async_helper/async_helper.dart';
+
+// Expected output from all functions, asynchronous, and event routines.
+const String log_results = 'test-first\n' +
+    'acquire START\n' +
+    'acquire CALLBACK START\n' +
+    'acquire CALLBACK END\n' +
+    'first START\n' +
+    'first END\n' +
+    'test-second\n' +
+    'second START\n' +
+    'second END\n' +
+    'reader onLoadEnd event\n' +
+    'file content = XYZZY Output\n';
+
+// Simple logger to record all output.
+class Logger {
+  StringBuffer _log = new StringBuffer();
+
+  void log(String message) {
+    _log.writeln(message);
+  }
+
+  String get contents => _log.toString();
+}
+
+Logger testLog = new Logger();
+
+Future<FileSystem> _fileSystem;
+
+Future<FileSystem> get fileSystem async {
+  if (_fileSystem != null) return _fileSystem;
+
+  testLog.log('acquire START');
+  _fileSystem = window.requestFileSystem(100);
+
+  var fs = await _fileSystem;
+  testLog.log('acquire CALLBACK START');
+  expect(fs != null, true);
+  expect(fs.root != null, true);
+  expect(fs.runtimeType, FileSystem);
+  expect(fs.root.runtimeType, DirectoryEntry);
+  testLog.log('acquire CALLBACK END');
+
+  return _fileSystem;
+}
+
+Future<FileEntry> createFile() async {
+  var fs = await fileSystem;
+
+  FileEntry fileEntry = await fs.root.createFile('log.txt');
+
+  expect(fileEntry.isFile, true);
+  expect(fileEntry.name, 'log.txt');
+  expect(fileEntry.fullPath, '/log.txt');
+
+  FileWriter writer = await fileEntry.createWriter();
+
+  Blob blob = new Blob(['XYZZY Output'], 'text/plain');
+
+  writer.write(blob);
+
+  var reader = new FileReader();
+
+  var completer = new Completer<String>();
+
+  reader.onLoadEnd.listen((event) {
+    testLog.log('reader onLoadEnd event');
+    dynamic target = event.currentTarget;
+    testLog.log('file content = ${target.result}');
+    expect(target.result, 'XYZZY Output');
+
+    completer.complete(target.result);
+  });
+
+  Blob readBlob = await fileEntry.file();
+
+  reader.readAsText(readBlob);
+
+  // Wait until onLoadEnd if fired.
+  await completer.future;
+
+  return new Future<FileEntry>.value(fileEntry);
+}
+
+main() {
+  useHtmlConfiguration();
+
+  group('test FileSystem', () {
+    test('FileSystem request #1', () async {
+      testLog.log('test-first');
+      var fs = await fileSystem;
+      testLog.log('first START');
+      expect(fs != null, true);
+      expect(fs.root != null, true);
+      expect(fs.runtimeType, FileSystem);
+      expect(fs.root.runtimeType, DirectoryEntry);
+      testLog.log('first END');
+    });
+
+    test('FileSystem request, create, R/W', () async {
+      testLog.log('test-second');
+      var fs = await fileSystem;
+      testLog.log('second START');
+      expect(fs != null, true);
+      expect(fs.root != null, true);
+      expect(fs.runtimeType, FileSystem);
+      expect(fs.root.runtimeType, DirectoryEntry);
+      testLog.log('second END');
+
+      FileEntry fileEntry = await createFile();
+      expect(fileEntry.name, 'log.txt');
+
+      // Validate every function, async and event mechanism successfully ran.
+      expect(testLog.contents, log_results);
+    });
+  });
+}
diff --git a/tests/lib_2/html/fileapi_supported_test.dart b/tests/lib_2/html/fileapi_supported_test.dart
index 7ab7407..ba93f46 100644
--- a/tests/lib_2/html/fileapi_supported_test.dart
+++ b/tests/lib_2/html/fileapi_supported_test.dart
@@ -1,21 +1,41 @@
 library fileapi;
 
+import 'dart:async';
 import 'dart:html';
 
 import 'package:unittest/unittest.dart';
-import 'package:unittest/html_individual_config.dart';
+import 'package:unittest/html_config.dart';
+import 'package:async_helper/async_helper.dart';
+
+
+Future<FileSystem> _fileSystem;
+
+Future<FileSystem> get fileSystem async {
+  if (_fileSystem != null) return _fileSystem;
+
+  _fileSystem = window.requestFileSystem(100);
+
+  var fs = await _fileSystem;
+  expect(fs != null, true);
+  expect(fs.root != null, true);
+  expect(fs.runtimeType, FileSystem);
+  expect(fs.root.runtimeType, DirectoryEntry);
+
+  return _fileSystem;
+}
 
 main() {
-  useHtmlIndividualConfiguration();
+  useHtmlConfiguration();
 
   test('supported', () {
     expect(FileSystem.supported, true);
   });
 
-  test('requestFileSystem', () {
+  test('requestFileSystem', () async {
     var expectation = FileSystem.supported ? returnsNormally : throws;
-    expect(() {
-      window.requestFileSystem(100);
+    expect(() async {
+      var fs = await fileSystem;
+      expect(fs.root != null, true);
     }, expectation);
   });
 }
diff --git a/tests/lib_2/html/notification_permission_test.dart b/tests/lib_2/html/notification_permission_test.dart
new file mode 100644
index 0000000..e403d2f
--- /dev/null
+++ b/tests/lib_2/html/notification_permission_test.dart
@@ -0,0 +1,19 @@
+// 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 'dart:async';
+import 'dart:html';
+
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:async_helper/async_helper.dart';
+
+main() async {
+  useHtmlConfiguration();
+
+  test('Notification.requestPermission', () async {
+    String permission = await Notification.requestPermission();
+    expect(permission, isNotNull);
+  });
+}
diff --git a/tests/lib_strong/html/small.mp4 b/tests/lib_2/html/small.mp4
similarity index 100%
rename from tests/lib_strong/html/small.mp4
rename to tests/lib_2/html/small.mp4
Binary files differ
diff --git a/tests/lib_strong/html/small.webm b/tests/lib_2/html/small.webm
similarity index 100%
rename from tests/lib_strong/html/small.webm
rename to tests/lib_2/html/small.webm
Binary files differ
diff --git a/tests/lib_2/html/websocket_test.dart b/tests/lib_2/html/websocket_test.dart
index a2778ae..ff161ca 100644
--- a/tests/lib_2/html/websocket_test.dart
+++ b/tests/lib_2/html/websocket_test.dart
@@ -2,7 +2,7 @@
 
 import 'dart:html';
 
-import 'package:expect/minitest.dart';
+import 'package:unittest/unittest.dart';
 
 main() {
   group('supported', () {
diff --git a/tests/lib_2/html/websql_test.dart b/tests/lib_2/html/websql_test.dart
index 6c64f58..a066ea5 100644
--- a/tests/lib_2/html/websql_test.dart
+++ b/tests/lib_2/html/websql_test.dart
@@ -4,7 +4,7 @@
 import 'dart:html';
 import 'dart:web_sql';
 
-import 'package:expect/minitest.dart';
+import 'package:unittest/unittest.dart';
 
 Future<SqlTransaction> transaction(SqlDatabase db) {
   final completer = new Completer<SqlTransaction>.sync();
diff --git a/tests/lib_strong/html/xhr_cross_origin_data.txt b/tests/lib_2/html/xhr_cross_origin_data.txt
similarity index 100%
rename from tests/lib_strong/html/xhr_cross_origin_data.txt
rename to tests/lib_2/html/xhr_cross_origin_data.txt
diff --git a/tests/lib_strong/html/xsltprocessor_test.dart b/tests/lib_2/html/xsltprocessor_test.dart
similarity index 100%
rename from tests/lib_strong/html/xsltprocessor_test.dart
rename to tests/lib_2/html/xsltprocessor_test.dart
diff --git a/tests/lib_2/js/prototype_access_test.dart b/tests/lib_2/js/prototype_access_test.dart
index fe93733..adea05e 100644
--- a/tests/lib_2/js/prototype_access_test.dart
+++ b/tests/lib_2/js/prototype_access_test.dart
@@ -14,7 +14,8 @@
 @JS('Function')
 class Class {
   external dynamic get prototype;
-  external dynamic get constructor;
+  external Constructor get constructor;
+  external String get name;
 }
 
 class Normal {
@@ -26,6 +27,11 @@
   int operator [](int i) => prototype;
 }
 
+@JS()
+class Constructor {
+  external String get name;
+}
+
 void main() {
   Expect.isTrue(arrayBufferClass.prototype != null);
   var normal = new Normal();
@@ -33,6 +39,10 @@
   Expect.equals(42, normal[0]);
   Expect.isTrue(arrayBufferClass.constructor != null);
   Expect.isTrue(arrayBufferClass.constructor is Function);
+  Expect.isTrue(arrayBufferClass.constructor is Constructor);
+  Expect.equals("ArrayBuffer", arrayBufferClass.name);
+  Expect.equals("Function", arrayBufferClass.constructor.name);
+
   Expect.isTrue(normal.constructor is Function);
   Expect.equals(normal, normal.constructor());
 }
diff --git a/tests/lib_2/lib_2_analyzer.status b/tests/lib_2/lib_2_analyzer.status
index 761ea22..a5ead32 100644
--- a/tests/lib_2/lib_2_analyzer.status
+++ b/tests/lib_2/lib_2_analyzer.status
@@ -33,6 +33,7 @@
 mirrors/generic_bounded_test/01: MissingCompileTimeError
 mirrors/generic_bounded_test/02: MissingCompileTimeError
 mirrors/generic_interface_test/01: MissingCompileTimeError
+mirrors/generics_test/01: MissingCompileTimeError
 mirrors/redirecting_factory_different_type_test/01: MissingCompileTimeError
 mirrors/reflect_class_test/01: MissingCompileTimeError
 mirrors/reflect_class_test/02: MissingCompileTimeError
diff --git a/tests/lib_2/lib_2_dart2js.status b/tests/lib_2/lib_2_dart2js.status
index 4c03b62..8b36efd 100644
--- a/tests/lib_2/lib_2_dart2js.status
+++ b/tests/lib_2/lib_2_dart2js.status
@@ -89,8 +89,6 @@
 html/fileapi_entry_test: Pass, Fail # TODO(dart2js-team): Please triage this failure.
 html/fileapi_file_test: Fail # TODO(dart2js-team): Please triage this failure.
 html/media_stream_test: RuntimeError # Please triage.
-html/messageevent_test: RuntimeError # Please triage this error. New in Chrome 62.
-html/serialized_script_value_test: RuntimeError # Please triage this error. New in Chrome 62.
 html/speechrecognition_test: RuntimeError # Please triage.
 isolate/function_send_test: Skip # Crashes Chrome 62: https://bugs.chromium.org/p/chromium/issues/detail?id=775506
 isolate/kill_self_synchronously_test: RuntimeError
@@ -168,13 +166,15 @@
 html/dart_object_local_storage_test: Skip # sessionStorage NS_ERROR_DOM_NOT_SUPPORTED_ERR
 html/element_animate_test/timing_dict: RuntimeError # Issue 26730
 html/element_classes_test: RuntimeError # Issue 27535
-html/element_types_content_test: Pass, RuntimeError # Issue 28983
 html/element_types_content_test: RuntimeError # Issue 29922
+html/element_types_content_test: Pass, RuntimeError # Issue 28983
 html/element_types_keygen_test: RuntimeError # Issue 29922
 html/element_types_keygen_test: Fail
 html/element_types_shadow_test: RuntimeError # Issue 29922
 html/element_types_shadow_test: Pass, RuntimeError # Issue 28983
-html/fileapi_supported_throws_test: Fail
+html/file_sample_test: Skip # FileSystem not supported on FireFox.
+html/fileapi_supported_test: Skip # FileSystem not supported on FireFox.
+html/fileapi_supported_throws_test: Skip # FileSystem not supported on FireFox.
 html/history_test/history: Skip # Issue 22050
 html/input_element_datetime_test: Fail
 html/input_element_month_test: Fail
@@ -262,13 +262,14 @@
 
 [ $compiler == dart2js && $runtime == safari ]
 html/audiobuffersourcenode_test: RuntimeError
-html/custom/attribute_changed_callback_test: Pass, Timeout
+html/custom/attribute_changed_callback_test: RuntimeError, Timeout
 html/custom/constructor_calls_created_synchronously_test: Pass, Timeout
 html/custom/created_callback_test: Pass, Timeout
 html/custom/document_register_basic_test: Pass, Timeout
 html/element_types_content_test: RuntimeError # Issue 29922
 html/element_types_datalist_test: RuntimeError # Issue 29922
 html/element_types_shadow_test: RuntimeError # Issue 29922
+html/file_sample_test: Skip # FileSystem not supported on Safari.
 isolate/cross_isolate_message_test: Skip # Issue 12627
 isolate/message_test: Skip # Issue 12627
 
@@ -397,8 +398,8 @@
 html/js_array_test: CompileTimeError
 html/js_array_test: Crash # FileSystemException(uri=file:///usr/local/google/home/efortuna/dart2/sdk/sdk/lib/_internal/dart2js_platform.dill; message=Error reading 'sdk/lib/_internal/dart2js_platform.dill'  (No such file or directory))
 html/js_dart_to_string_test: Crash # 'file:*/pkg/compiler/lib/src/common_elements.dart': Failed assertion: line 405 pos 12: 'element.name == '=='': is not true.
-html/js_dispatch_property_test: CompileTimeError
 html/js_dispatch_property_test: Crash # FileSystemException(uri=file:///usr/local/google/home/efortuna/dart2/sdk/sdk/lib/_internal/dart2js_platform.dill; message=Error reading 'sdk/lib/_internal/dart2js_platform.dill'  (No such file or directory))
+html/js_dispatch_property_test: CompileTimeError
 html/js_function_getter_test: CompileTimeError
 html/js_function_getter_test/call getter as function: Crash # FileSystemException(uri=file:///usr/local/google/home/efortuna/dart2/sdk/sdk/lib/_internal/dart2js_platform.dill; message=Error reading 'sdk/lib/_internal/dart2js_platform.dill'  (No such file or directory))
 html/js_function_getter_trust_types_test: Crash # FileSystemException(uri=file:///usr/local/google/home/efortuna/dart2/sdk/sdk/lib/_internal/dart2js_platform.dill; message=Error reading 'sdk/lib/_internal/dart2js_platform.dill'  (No such file or directory))
@@ -676,7 +677,6 @@
 html/location_test: RuntimeError
 html/media_stream_test: RuntimeError, Crash # NoSuchMethodError: Class 'JMethod' has no instance getter 'implementation'.
 html/mediasource_test: RuntimeError, Crash # NoSuchMethodError: Class 'JMethod' has no instance getter 'implementation'.
-html/messageevent_test: RuntimeError
 html/mirrors_js_typed_interop_test: RuntimeError
 html/mouse_event_test: RuntimeError
 html/mutationobserver_test: Crash # NoSuchMethodError: Class 'JMethod' has no instance getter 'implementation'.
@@ -694,7 +694,6 @@
 html/request_animation_frame_test: Crash # NoSuchMethodError: Class 'JMethod' has no instance getter 'implementation'.
 html/rtc_test: Crash # NoSuchMethodError: Class 'JMethod' has no instance getter 'implementation'.
 html/selectelement_test: RuntimeError
-html/serialized_script_value_test: RuntimeError
 html/shadow_dom_test: Crash # NoSuchMethodError: Class 'JMethod' has no instance getter 'implementation'.
 html/shadowroot_test: RuntimeError
 html/speechrecognition_test: Crash # NoSuchMethodError: Class 'JMethod' has no instance getter 'implementation'.
diff --git a/tests/lib_2/lib_2_dartdevc.status b/tests/lib_2/lib_2_dartdevc.status
index 6d2a597..9ad5f8f 100644
--- a/tests/lib_2/lib_2_dartdevc.status
+++ b/tests/lib_2/lib_2_dartdevc.status
@@ -3,9 +3,10 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dartdevc ]
-html/custom/attribute_changed_callback_test: RuntimeError # Issue 31577
-html/custom/constructor_calls_created_synchronously_test: RuntimeError # Issue 31577
-html/custom/document_register_basic_test: RuntimeError # Issue 29922
+html/custom/attribute_changed_callback_test: Skip # Issue 31577
+html/custom/constructor_calls_created_synchronously_test: Skip # Issue 31577
+html/custom/created_callback_test: Skip # Issue 31577
+html/custom/document_register_basic_test: Skip # Issue 31577
 html/custom/document_register_template_test: Skip # Issue 31577
 html/custom/document_register_type_extensions_test/construction: Skip # Issue 31577
 html/custom/document_register_type_extensions_test/constructors: Skip # Issue 31577
@@ -24,10 +25,8 @@
 html/deferred_multi_app_htmltest: Skip # Issue 29919
 html/fontface_loaded_test: RuntimeError
 html/gamepad_test: RuntimeError # Issue 31029
-html/messageevent_test: Skip # Issue 31144
 html/no_linked_scripts_htmltest: Skip # Issue 29919
 html/scripts_htmltest: Skip # Issue 29919
-html/serialized_script_value_test: Skip # Issue 31144
 html/transferables_test: CompileTimeError # Issue 30975
 html/two_scripts_htmltest: Skip # Issue 29919
 html/websql_test: Pass, RuntimeError # Issue 31036
@@ -92,7 +91,6 @@
 html/js_typed_interop_type3_test/*: RuntimeError # Issue 30947
 html/js_typed_interop_type_test: RuntimeError # Issue 30947
 html/js_util_test: RuntimeError # Issue 29922
-html/keyboard_event_test: RuntimeError # Issue 30946
 html/media_stream_test: RuntimeError # Issue 29922
 html/mediasource_test: RuntimeError # Issue 29922
 html/transition_event_test: Pass, RuntimeError, Timeout # Issue 29922, this test seems flaky
@@ -123,3 +121,4 @@
 
 [ $compiler == dartdevc && $system == windows ]
 html/xhr_test/xhr: Skip # Times out. Issue 21527
+
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index f9de2f7..af19ce3 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -37,37 +37,16 @@
 async/slow_consumer3_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/slow_consumer_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/stream_controller_async_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_first_where_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/stream_from_iterable_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_iterator_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/stream_join_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_last_where_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_periodic2_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_periodic3_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_periodic4_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_periodic5_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_periodic6_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_periodic_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_single_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_single_to_multi_subscriber_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_state_nonzero_timer_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_state_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/stream_subscription_as_future_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_subscription_cancel_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_timeout_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_transform_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/stream_transformation_broadcast_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/timer_cancel1_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/timer_cancel2_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/timer_cancel_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/timer_isActive_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/timer_not_available_test: RuntimeError
 async/timer_repeat_test: CompileTimeError # Issue 31402 (Invocation arguments)
-async/timer_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/zone_run_unary_test: CompileTimeError # Issue 31537
-convert/streamed_conversion_json_utf8_decode_test: DartkCompileTimeError
 convert/streamed_conversion_json_utf8_decode_test: Pass, Slow # Infrequent timeouts.
-html/*: DartkCompileTimeError
 html/*: SkipByDesign # dart:html not supported on VM.
 isolate/compile_time_error_test/01: MissingCompileTimeError
 isolate/count_test: CompileTimeError # Issue 31402 (Invocation arguments)
@@ -99,19 +78,18 @@
 isolate/message_test: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/mint_maker_test: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/nested_spawn2_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/nested_spawn_test: CompileTimeError # Issue 31402 (Invocation arguments)
+isolate/nested_spawn_test: RuntimeError # Issue 31402 (Invocation arguments)
 isolate/ping_pause_test: Pass, Timeout
 isolate/raw_port_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/request_reply_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/spawn_function_custom_class_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/spawn_function_test: CompileTimeError # Issue 31402 (Invocation arguments)
+isolate/request_reply_test: RuntimeError # Issue 31402 (Invocation arguments)
+isolate/spawn_function_custom_class_test: RuntimeError # Issue 31402 (Invocation arguments)
+isolate/spawn_function_test: RuntimeError # Issue 31402 (Invocation arguments)
 isolate/spawn_uri_exported_main_test: RuntimeError # Issue 31402 (Return and yield statements)
 isolate/spawn_uri_multi_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/spawn_uri_nested_vm_test: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/spawn_uri_test: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/spawn_uri_vm_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/static_function_test: CompileTimeError # Issue 31402 (Invocation arguments)
-isolate/timer_isolate_test: CompileTimeError # Issue 31402 (Invocation arguments)
+isolate/static_function_test: RuntimeError # Issue 31402 (Invocation arguments)
 isolate/typed_message_test: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/unresolved_ports_test: CompileTimeError # Issue 31402 (Invocation arguments)
 js/datetime_roundtrip_test: CompileTimeError
@@ -143,6 +121,7 @@
 mirrors/empty_test: RuntimeError
 mirrors/enum_test: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/equality_test: RuntimeError
+mirrors/fake_function_without_call_test: RuntimeError
 mirrors/function_type_mirror_test: RuntimeError
 mirrors/generic_bounded_by_type_parameter_test/02: MissingCompileTimeError
 mirrors/generic_bounded_test/01: MissingCompileTimeError
@@ -155,6 +134,12 @@
 mirrors/generic_interface_test/none: RuntimeError
 mirrors/generic_mixin_applications_test: RuntimeError
 mirrors/generic_mixin_test: RuntimeError
+mirrors/generics_double_substitution_test/01: RuntimeError
+mirrors/generics_double_substitution_test/none: RuntimeError
+mirrors/generics_dynamic_test: RuntimeError
+mirrors/generics_substitution_test: RuntimeError
+mirrors/generics_test/01: MissingCompileTimeError
+mirrors/generics_test/none: RuntimeError
 mirrors/hot_get_field_test: RuntimeError
 mirrors/hot_set_field_test: RuntimeError
 mirrors/inherit_field_test: CompileTimeError # Issue 31402 (Invocation arguments)
@@ -193,8 +178,6 @@
 mirrors/library_imports_shown_test: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/library_imports_shown_test: RuntimeError
 mirrors/library_metadata_test: RuntimeError
-mirrors/library_uri_io_test: CompileTimeError # Issue 31402 (Invocation arguments)
-mirrors/library_uri_package_test: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/list_constructor_test/01: Crash
 mirrors/list_constructor_test/01: RuntimeError
 mirrors/list_constructor_test/none: Crash
@@ -290,25 +273,9 @@
 async/slow_consumer_test: RuntimeError
 async/stream_controller_async_test: RuntimeError
 async/stream_distinct_test: RuntimeError
-async/stream_first_where_test: RuntimeError
 async/stream_from_iterable_test: RuntimeError
-async/stream_iterator_test: RuntimeError
 async/stream_join_test: RuntimeError
-async/stream_last_where_test: RuntimeError
-async/stream_periodic2_test: RuntimeError
-async/stream_periodic3_test: RuntimeError
-async/stream_periodic4_test: RuntimeError
-async/stream_periodic5_test: RuntimeError
-async/stream_periodic6_test: RuntimeError
-async/stream_periodic_test: RuntimeError
-async/stream_single_test: RuntimeError
-async/stream_single_to_multi_subscriber_test: RuntimeError
-async/stream_state_test: RuntimeError
 async/stream_subscription_as_future_test: RuntimeError
-async/stream_subscription_cancel_test: RuntimeError
-async/stream_timeout_test: RuntimeError
-async/stream_transform_test: RuntimeError
-async/stream_transformation_broadcast_test: RuntimeError
 async/timer_cancel2_test: RuntimeError
 async/timer_cancel_test: RuntimeError
 async/timer_isActive_test: RuntimeError
@@ -355,7 +322,6 @@
 isolate/spawn_uri_vm_test: RuntimeError
 isolate/stacktrace_message_test: RuntimeError
 isolate/static_function_test: Timeout
-isolate/timer_isolate_test: RuntimeError
 isolate/typed_message_test: RuntimeError
 isolate/unresolved_ports_test: RuntimeError
 mirrors/class_mirror_type_variables_test: RuntimeError
@@ -412,6 +378,24 @@
 typed_data/int32x4_static_test/01: MissingCompileTimeError
 typed_data/int32x4_static_test/02: MissingCompileTimeError
 
+# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
+# are to be triaged.  Isolate tests are skipped on purpose due to the usage of
+# batch mode.
+[ $compiler == dartk && $strong && ($arch == simarm || $arch == simarm64) ]
+mirrors/invocation_fuzz_test/emptyarray: CompileTimeError # Please triage.
+mirrors/invocation_fuzz_test/false: CompileTimeError # Please triage.
+mirrors/invocation_fuzz_test/none: CompileTimeError # Please triage.
+mirrors/invocation_fuzz_test/smi: CompileTimeError # Please triage.
+mirrors/invocation_fuzz_test/string: CompileTimeError # Please triage.
+mirrors/spawn_function_root_library_test: Skip
+typed_data/int32x4_arithmetic_test/int64: CompileTimeError # Please triage.
+
+# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
+# are to be triaged.  Isolate tests are skipped on purpose due to the usage of
+# batch mode.
+[ $compiler == dartk && $strong && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
+isolate/*: Skip
+
 # ===== Skip dartk and darkp in !$strong mode ====
 [ $compiler == dartk && !$strong ]
 *: SkipByDesign
diff --git a/tests/lib_2/lib_2_vm.status b/tests/lib_2/lib_2_vm.status
index d387ae5..3325cdf 100644
--- a/tests/lib_2/lib_2_vm.status
+++ b/tests/lib_2/lib_2_vm.status
@@ -22,6 +22,7 @@
 mirrors/generic_bounded_test/01: MissingCompileTimeError
 mirrors/generic_bounded_test/02: MissingCompileTimeError
 mirrors/generic_interface_test/01: MissingCompileTimeError
+mirrors/generics_test/01: MissingCompileTimeError
 mirrors/initializing_formals_test/01: Fail # initializing formals are implicitly final as of Dart 1.21
 mirrors/mirrors_used*: SkipByDesign # Invalid tests. MirrorsUsed does not have a specification, and dart:mirrors is not required to hide declarations that are not covered by any MirrorsUsed annotation.
 mirrors/native_class_test: SkipByDesign # Imports dart:html
diff --git a/tests/lib_strong/mirrors/fake_function_without_call_test.dart b/tests/lib_2/mirrors/fake_function_without_call_test.dart
similarity index 91%
rename from tests/lib_strong/mirrors/fake_function_without_call_test.dart
rename to tests/lib_2/mirrors/fake_function_without_call_test.dart
index 3cc42d5..1d341ea 100644
--- a/tests/lib_strong/mirrors/fake_function_without_call_test.dart
+++ b/tests/lib_2/mirrors/fake_function_without_call_test.dart
@@ -14,7 +14,7 @@
 }
 
 main() {
-  var f = new MultiArityFunction();
+  dynamic f = new MultiArityFunction();
 
   Expect.isTrue(f is Function);
   Expect.equals('a', f('a'));
@@ -23,7 +23,7 @@
   Expect.equals('a', Function.apply(f, ['a']));
   Expect.equals('a,b', Function.apply(f, ['a', 'b']));
   Expect.equals('a,b,c', Function.apply(f, ['a', 'b', 'c']));
-  Expect.throws(() => f.foo('a', 'b', 'c'), (e) => e is NoSuchMethodError);
+  Expect.throwsNoSuchMethodError(() => f.foo('a', 'b', 'c'));
 
   ClosureMirror cm = reflect(f);
   Expect.isTrue(cm is ClosureMirror);
diff --git a/tests/lib_strong/mirrors/generics_double_substitution_test.dart b/tests/lib_2/mirrors/generics_double_substitution_test.dart
similarity index 93%
rename from tests/lib_strong/mirrors/generics_double_substitution_test.dart
rename to tests/lib_2/mirrors/generics_double_substitution_test.dart
index ed058a7..ae0666e 100644
--- a/tests/lib_strong/mirrors/generics_double_substitution_test.dart
+++ b/tests/lib_2/mirrors/generics_double_substitution_test.dart
@@ -5,6 +5,7 @@
 library test.generics_double_substitution;
 
 import 'dart:mirrors';
+
 import 'package:expect/expect.dart';
 
 class A<R> {}
@@ -31,5 +32,5 @@
   Expect.equals(aOfString, parameterType.parameters.single.type);
 
   ClassMirror typeArgOfSuperclass = cOfString.superclass.typeArguments.single;
-  Expect.equals(aOfString, typeArgOfSuperclass); // //# 01: ok
+  Expect.equals(aOfString, typeArgOfSuperclass); //# 01: ok
 }
diff --git a/tests/lib_strong/mirrors/generics_dynamic_test.dart b/tests/lib_2/mirrors/generics_dynamic_test.dart
similarity index 100%
rename from tests/lib_strong/mirrors/generics_dynamic_test.dart
rename to tests/lib_2/mirrors/generics_dynamic_test.dart
diff --git a/tests/lib_2/mirrors/generics_helper.dart b/tests/lib_2/mirrors/generics_helper.dart
index e63ffb2..da10962 100644
--- a/tests/lib_2/mirrors/generics_helper.dart
+++ b/tests/lib_2/mirrors/generics_helper.dart
@@ -7,7 +7,6 @@
 import 'package:expect/expect.dart';
 
 typeParameters(mirror, parameterNames) {
-  print(mirror.typeVariables.map((v) => v.simpleName).toList());
   Expect.listEquals(
       parameterNames, mirror.typeVariables.map((v) => v.simpleName).toList());
 }
diff --git a/tests/lib_strong/mirrors/generics_special_types_test.dart b/tests/lib_2/mirrors/generics_special_types_test.dart
similarity index 100%
rename from tests/lib_strong/mirrors/generics_special_types_test.dart
rename to tests/lib_2/mirrors/generics_special_types_test.dart
diff --git a/tests/lib_strong/mirrors/generics_substitution_test.dart b/tests/lib_2/mirrors/generics_substitution_test.dart
similarity index 100%
rename from tests/lib_strong/mirrors/generics_substitution_test.dart
rename to tests/lib_2/mirrors/generics_substitution_test.dart
diff --git a/tests/lib_strong/mirrors/generics_test.dart b/tests/lib_2/mirrors/generics_test.dart
similarity index 97%
rename from tests/lib_strong/mirrors/generics_test.dart
rename to tests/lib_2/mirrors/generics_test.dart
index fb1ff11..fface13 100644
--- a/tests/lib_strong/mirrors/generics_test.dart
+++ b/tests/lib_2/mirrors/generics_test.dart
@@ -16,7 +16,7 @@
 class B extends A {}
 
 class C
-    extends A<num, int> // //# 01: static type warning
+    extends A<num, int> //# 01: compile-time error
 {}
 
 class D extends A<int> {}
@@ -146,7 +146,7 @@
   Expect.equals(
       reflect(new I()).type, reflect(new I()).type.originalDeclaration);
 
-  // Library members are all uninstantaited generics or non-generics.
+  // Library members are all uninstantiated generics or non-generics.
   currentMirrorSystem().libraries.values.forEach((libraryMirror) {
     libraryMirror.declarations.values.forEach((declaration) {
       if (declaration is ClassMirror) {
diff --git a/tests/lib_strong/typed_data/typed_list_iterable_test.dart b/tests/lib_2/typed_data/typed_list_iterable_test.dart
similarity index 89%
rename from tests/lib_strong/typed_data/typed_list_iterable_test.dart
rename to tests/lib_2/typed_data/typed_list_iterable_test.dart
index 03046bc..844f535 100644
--- a/tests/lib_strong/typed_data/typed_list_iterable_test.dart
+++ b/tests/lib_2/typed_data/typed_list_iterable_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:typed_data';
+
 import 'package:expect/expect.dart';
 
 void testIterableFunctions<T extends num>(
@@ -17,7 +18,7 @@
     Expect.equals(first, list.single);
     Expect.equals(first, list.singleWhere((x) => x == last));
   } else {
-    Expect.throws(() => list.single, (e) => e is StateError);
+    Expect.throwsStateError(() => list.single);
     bool isFirst = true;
     Expect.equals(first, list.singleWhere((x) {
       if (isFirst) {
@@ -97,7 +98,7 @@
   l2.add(first);
   Expect.equals(first, l2.last);
   var l3 = list.toList(growable: false);
-  Expect.throws(() => l3.add(last), (e) => e is UnsupportedError);
+  Expect.throwsUnsupportedError(() => l3.add(last));
 }
 
 void emptyChecks<T extends num>(List<T> list, T zero) {
@@ -105,12 +106,12 @@
 
   Expect.isTrue(list.isEmpty);
 
-  Expect.throws(() => list.first, (e) => e is StateError);
-  Expect.throws(() => list.last, (e) => e is StateError);
-  Expect.throws(() => list.single, (e) => e is StateError);
-  Expect.throws(() => list.firstWhere((x) => true), (e) => e is StateError);
-  Expect.throws(() => list.lastWhere((x) => true), (e) => e is StateError);
-  Expect.throws(() => list.singleWhere((x) => true), (e) => e is StateError);
+  Expect.throwsStateError(() => list.first);
+  Expect.throwsStateError(() => list.last);
+  Expect.throwsStateError(() => list.single);
+  Expect.throwsStateError(() => list.firstWhere((x) => true));
+  Expect.throwsStateError(() => list.lastWhere((x) => true));
+  Expect.throwsStateError(() => list.singleWhere((x) => true));
 
   Expect.isFalse(list.any((x) => true));
   Expect.isFalse(list.contains(null));
@@ -147,7 +148,7 @@
   Expect.equals(list.length, whereList.length);
   Expect.equals(list.length, whereCount);
 
-  Expect.throws(() => list.reduce((x, y) => x), (e) => e is StateError);
+  Expect.throwsStateError(() => list.reduce((x, y) => x));
 
   Expect.isTrue(list.skip(list.length).isEmpty);
   Expect.isTrue(list.skip(0).isEmpty);
@@ -162,7 +163,7 @@
   l2.add(zero);
   Expect.equals(zero, l2.last);
   var l3 = list.toList(growable: false);
-  Expect.throws(() => l3.add(zero), (e) => e is UnsupportedError);
+  Expect.throwsUnsupportedError(() => l3.add(zero));
 }
 
 main() {
diff --git a/tests/lib_strong/html/util.dart b/tests/lib_strong/html/util.dart
deleted file mode 100644
index 0cf55fb..0000000
--- a/tests/lib_strong/html/util.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.html.util;
-
-import 'dart:html';
-import 'package:expect/minitest.dart';
-
-void expectEmptyRect(Rectangle rect) {
-  expect(rect.bottom, 0);
-  expect(rect.top, 0);
-  expect(rect.left, 0);
-  expect(rect.right, 0);
-  expect(rect.height, 0);
-  expect(rect.width, 0);
-}
diff --git a/tests/lib_strong/html/utils.dart b/tests/lib_strong/html/utils.dart
deleted file mode 100644
index 4209f9b..0000000
--- a/tests/lib_strong/html/utils.dart
+++ /dev/null
@@ -1,219 +0,0 @@
-library TestUtils;
-
-import 'dart:async';
-import 'dart:html';
-import 'dart:js' as js;
-import 'dart:typed_data';
-import 'package:unittest/unittest.dart';
-
-/**
- * Verifies that [actual] has the same graph structure as [expected].
- * Detects cycles and DAG structure in Maps and Lists.
- */
-verifyGraph(expected, actual) {
-  var eItems = [];
-  var aItems = [];
-
-  message(path, reason) => path == ''
-      ? reason
-      : reason == null ? "path: $path" : "path: $path, $reason";
-
-  walk(path, expected, actual) {
-    if (expected is String || expected is num || expected == null) {
-      expect(actual, equals(expected), reason: message(path, 'not equal'));
-      return;
-    }
-
-    // Cycle or DAG?
-    for (int i = 0; i < eItems.length; i++) {
-      if (identical(expected, eItems[i])) {
-        expect(actual, same(aItems[i]),
-            reason: message(path, 'missing back or side edge'));
-        return;
-      }
-    }
-    for (int i = 0; i < aItems.length; i++) {
-      if (identical(actual, aItems[i])) {
-        expect(expected, same(eItems[i]),
-            reason: message(path, 'extra back or side edge'));
-        return;
-      }
-    }
-    eItems.add(expected);
-    aItems.add(actual);
-
-    if (expected is Blob) {
-      expect(actual is Blob, isTrue, reason: '$actual is Blob');
-      expect(expected.type, equals(actual.type),
-          reason: message(path, '.type'));
-      expect(expected.size, equals(actual.size),
-          reason: message(path, '.size'));
-      return;
-    }
-
-    if (expected is ByteBuffer) {
-      expect(actual is ByteBuffer, isTrue, reason: '$actual is ByteBuffer');
-      expect(expected.lengthInBytes, equals(actual.lengthInBytes),
-          reason: message(path, '.lengthInBytes'));
-      // TODO(antonm): one can create a view on top of those
-      // and check if contents identical.  Let's do it later.
-      return;
-    }
-
-    if (expected is DateTime) {
-      expect(actual is DateTime, isTrue, reason: '$actual is DateTime');
-      expect(expected.millisecondsSinceEpoch,
-          equals(actual.millisecondsSinceEpoch),
-          reason: message(path, '.millisecondsSinceEpoch'));
-      return;
-    }
-
-    if (expected is ImageData) {
-      expect(actual is ImageData, isTrue, reason: '$actual is ImageData');
-      expect(expected.width, equals(actual.width),
-          reason: message(path, '.width'));
-      expect(expected.height, equals(actual.height),
-          reason: message(path, '.height'));
-      walk('$path.data', expected.data, actual.data);
-      return;
-    }
-
-    if (expected is TypedData) {
-      expect(actual is TypedData, isTrue, reason: '$actual is TypedData');
-      walk('$path/.buffer', expected.buffer, actual.buffer);
-      expect(expected.offsetInBytes, equals(actual.offsetInBytes),
-          reason: message(path, '.offsetInBytes'));
-      expect(expected.lengthInBytes, equals(actual.lengthInBytes),
-          reason: message(path, '.lengthInBytes'));
-      // And also fallback to elements check below.
-    }
-
-    if (expected is List) {
-      expect(actual, isList, reason: message(path, '$actual is List'));
-      expect(actual.length, expected.length,
-          reason: message(path, 'different list lengths'));
-      for (var i = 0; i < expected.length; i++) {
-        walk('$path[$i]', expected[i], actual[i]);
-      }
-      return;
-    }
-
-    if (expected is Map) {
-      expect(actual, isMap, reason: message(path, '$actual is Map'));
-      for (var key in expected.keys) {
-        if (!actual.containsKey(key)) {
-          expect(false, isTrue, reason: message(path, 'missing key "$key"'));
-        }
-        walk('$path["$key"]', expected[key], actual[key]);
-      }
-      for (var key in actual.keys) {
-        if (!expected.containsKey(key)) {
-          expect(false, isTrue, reason: message(path, 'extra key "$key"'));
-        }
-      }
-      return;
-    }
-
-    expect(false, isTrue, reason: 'Unhandled type: $expected');
-  }
-
-  walk('', expected, actual);
-}
-
-/**
- * Sanitizer which does nothing.
- */
-class NullTreeSanitizer implements NodeTreeSanitizer {
-  void sanitizeTree(Node node) {}
-}
-
-/**
- * Validate that two DOM trees are equivalent.
- */
-void validateNodeTree(Node a, Node b, [String path = '']) {
-  path = '${path}${a.runtimeType}';
-  expect(a.nodeType, b.nodeType, reason: '$path nodeTypes differ');
-  expect(a.nodeValue, b.nodeValue, reason: '$path nodeValues differ');
-  expect(a.text, b.text, reason: '$path texts differ');
-  expect(a.nodes.length, b.nodes.length, reason: '$path nodes.lengths differ');
-
-  if (a is Element) {
-    Element bE = b;
-    Element aE = a;
-
-    expect(aE.tagName, bE.tagName, reason: '$path tagNames differ');
-    expect(aE.attributes.length, bE.attributes.length,
-        reason: '$path attributes.lengths differ');
-    for (var key in aE.attributes.keys) {
-      expect(aE.attributes[key], bE.attributes[key],
-          reason: '$path attribute [$key] values differ');
-    }
-  }
-  for (var i = 0; i < a.nodes.length; ++i) {
-    validateNodeTree(a.nodes[i], b.nodes[i], '$path[$i].');
-  }
-}
-
-/**
- * Upgrade all custom elements in the subtree which have not been upgraded.
- *
- * This is needed to cover timing scenarios which the custom element polyfill
- * does not cover.
- */
-void upgradeCustomElements(Node node) {
-  if (js.context.hasProperty('CustomElements') &&
-      js.context['CustomElements'].hasProperty('upgradeAll')) {
-    js.context['CustomElements'].callMethod('upgradeAll', [node]);
-  }
-}
-
-/**
- * A future that completes once all custom elements in the initial HTML page
- * have been upgraded.
- *
- * This is needed because the native implementation can update the elements
- * while parsing the HTML document, but the custom element polyfill cannot,
- * so it completes this future once all elements are upgraded.
- */
-// TODO(jmesserly): rename to webComponentsReady to match the event?
-Future customElementsReady = () {
-  if (_isReady) return new Future.value();
-
-  // Not upgraded. Wait for the polyfill to fire the WebComponentsReady event.
-  // Note: we listen on document (not on document.body) to allow this polyfill
-  // to be loaded in the HEAD element.
-  return document.on['WebComponentsReady'].first;
-}();
-
-// Return true if we are using the polyfill and upgrade is complete, or if we
-// have native document.register and therefore the browser took care of it.
-// Otherwise return false, including the case where we can't find the polyfill.
-bool get _isReady {
-  // If we don't have dart:js, assume things are ready
-  if (js.context == null) return true;
-
-  var customElements = js.context['CustomElements'];
-  if (customElements == null) {
-    // Return true if native document.register, otherwise false.
-    // (Maybe the polyfill isn't loaded yet. Wait for it.)
-    return document.supportsRegisterElement;
-  }
-
-  return customElements['ready'] == true;
-}
-
-/**
- * *Note* this API is primarily intended for tests. In other code it is better
- * to write it in a style that works with or without the polyfill, rather than
- * using this method.
- *
- * Synchronously trigger evaluation of pending lifecycle events, which otherwise
- * need to wait for a [MutationObserver] to signal the changes in the polyfill.
- * This method can be used to resolve differences in timing between native and
- * polyfilled custom elements.
- */
-void customElementsTakeRecords([Node node]) {
-  var customElements = js.context['CustomElements'];
-  if (customElements == null) return;
-  customElements.callMethod('takeRecords', [node]);
-}
diff --git a/tests/lib_strong/lib_strong.status b/tests/lib_strong/lib_strong.status
deleted file mode 100644
index 7877ef7..0000000
--- a/tests/lib_strong/lib_strong.status
+++ /dev/null
@@ -1,145 +0,0 @@
-# Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-# TODO(29919): HTML tests are not supported on dartdevc in test.dart yet.
-[ $compiler == dartdevc ]
-html/custom/attribute_changed_callback_test: Crash # Issue 29922
-html/custom/constructor_calls_created_synchronously_test: Crash # Issue 29922
-html/custom/created_callback_test: CompileTimeError # Issue 29922
-html/custom/document_register_basic_test: CompileTimeError # Issue 29922
-html/custom/document_register_type_extensions_test/construction: CompileTimeError # Issue 29922
-html/custom/document_register_type_extensions_test/constructors: CompileTimeError # Issue 29922
-html/custom/document_register_type_extensions_test/createElement with type extension: CompileTimeError # Issue 29922
-html/custom/document_register_type_extensions_test/functional: CompileTimeError # Issue 29922
-html/custom/document_register_type_extensions_test/namespaces: CompileTimeError # Issue 29922
-html/custom/document_register_type_extensions_test/parsing: CompileTimeError # Issue 29922
-html/custom/document_register_type_extensions_test/registration: CompileTimeError # Issue 29922
-html/custom/document_register_type_extensions_test/single-parameter createElement: CompileTimeError # Issue 29922
-html/custom/element_upgrade_test: CompileTimeError # Issue 29922
-html/custom/entered_left_view_test: Crash # Issue 29922
-html/custom/js_custom_test: Crash # Issue 29922
-html/custom/mirrors_test: Crash # Issue 29922
-html/custom/regress_194523002_test: Crash # Issue 29922
-html/deferred_multi_app_htmltest: Skip # Issue 29919
-html/no_linked_scripts_htmltest: Skip # Issue 29919
-html/scripts_htmltest: Skip # Issue 29919
-html/two_scripts_htmltest: Skip # Issue 29919
-
-# Skip tests that are not yet strong-mode clean.
-[ $strong ]
-async/print_test/01: Skip # Temporalily disable the following tests until we figure out why they started failing.
-async/print_test/none: Skip # Temporalily disable the following tests until we figure out why they started failing.
-html/cross_frame_test: Skip # Temporalily disable the following tests until we figure out why they started failing.
-html/custom/created_callback_test: CompileTimeError # Issue 28969
-html/custom/document_register_basic_test: CompileTimeError # Issue 28969
-html/custom/document_register_type_extensions_test: CompileTimeError # Issue 28969
-html/custom/element_upgrade_test: CompileTimeError # Issue 28969
-html/element_dimensions_test: Skip
-html/events_test: Skip
-html/fileapi_test: Skip
-html/filereader_test: Skip
-html/fontface_loaded_test: Skip
-html/js_function_getter_trust_types_test: Skip
-html/js_typed_interop_default_arg_test/default_value: MissingCompileTimeError # Issue 28969
-html/keyboard_event_test: Skip
-html/mutationobserver_test: Skip
-html/postmessage_structured_test: Skip
-html/resource_http_test: Skip
-html/transferables_test: Skip
-html/webgl_1_test: Skip
-html/wrapping_collections_test: Skip
-mirrors/circular_factory_redirection_test: Skip
-mirrors/class_declarations_test: Skip
-mirrors/closures_test: Skip
-mirrors/fake_function_without_call_test: Skip
-mirrors/generic_bounded_by_type_parameter_test: Skip
-mirrors/generic_bounded_test: Skip
-mirrors/generic_class_declaration_test: Skip
-mirrors/generic_f_bounded_mixin_application_test: Skip
-mirrors/generic_interface_test: Skip
-mirrors/generics_test: Skip
-mirrors/intercepted_class_test: Skip
-mirrors/intercepted_object_test: Skip
-mirrors/invoke_call_through_getter_previously_accessed_test: Skip
-mirrors/invoke_call_through_getter_test: Skip
-mirrors/invoke_call_through_implicit_getter_previously_accessed_test: Skip
-mirrors/invoke_call_through_implicit_getter_test: Skip
-mirrors/lazy_static_test: Skip
-mirrors/mirrors_test: Skip
-mirrors/mixin_application_test: Skip
-mirrors/mixin_members_test: Skip
-mirrors/model_test: Skip
-mirrors/native_class_test: Skip
-mirrors/no_metadata_test: Skip
-mirrors/operator_test: Skip
-mirrors/parameter_is_const_test: Skip
-mirrors/parameter_of_mixin_app_constructor_test: Skip
-mirrors/parameter_test: Skip
-mirrors/private_symbol_test: Skip
-mirrors/redirecting_factory_different_type_test: Skip
-mirrors/redirecting_factory_test: Skip
-mirrors/reflect_class_test: Skip
-mirrors/reflect_model_test: Skip
-mirrors/reflected_type_classes_test: Skip
-mirrors/reflected_type_test: Skip
-mirrors/regress_16321_test: Skip
-mirrors/regress_19731_test: Skip
-
-# Skip entire suite if not running in strong mode.
-[ !$strong ]
-*: SkipByDesign
-
-[ $compiler == dartdevc && $runtime == chrome ]
-html/element_animate_test/timing_dict: RuntimeError # Issue 29922
-html/element_types_keygen_test: RuntimeError # Issue 29922
-
-[ $compiler == dartdevc && $runtime != none ]
-async/future_or_non_strong_test: RuntimeError # Issue 29922
-html/element_classes_svg_test: RuntimeError # Issue 29922
-html/element_classes_test: RuntimeError # Issue 29922
-html/indexeddb_1_test/functional: RuntimeError # Issue 29922, strong mode cast failure
-html/indexeddb_2_test: RuntimeError, Skip # Times out. Issue 29922, strong mode cast failure
-html/interactive_test: Skip # requests interactive permissions (camera, geolocation)
-html/isolates_test: RuntimeError # Issue 29922
-html/js_util_test: RuntimeError # Issue 29922
-html/media_stream_test: RuntimeError # Issue 29922
-html/mediasource_test: RuntimeError # Issue 29922
-html/transition_event_test: Pass, RuntimeError, Timeout # Issue 29922, this test seems flaky
-html/typing_test: RuntimeError # Issue 29922
-html/websql_test/functional: RuntimeError # Issue 29922
-html/worker_api_test: RuntimeError # Issue 29922
-html/xhr_cross_origin_test/functional: RuntimeError # Issue 29922
-html/xhr_test/xhr: RuntimeError # Issue 29922, strong mode cast failure
-mirrors/basic_types_in_dart_core_test: RuntimeError # Issue 29922
-mirrors/class_mirror_location_test: RuntimeError # Issue 29922
-mirrors/class_mirror_type_variables_test: RuntimeError # Issue 29922
-mirrors/closurization_equivalence_test: RuntimeError # Issue 29922
-mirrors/constructor_kinds_test/01: RuntimeError # Issue 29922
-mirrors/fake_function_with_call_test: RuntimeError # Issue 29922
-mirrors/field_metadata2_test: RuntimeError # Issue 29922
-mirrors/field_type_test: RuntimeError # Issue 29922
-mirrors/function_type_mirror_test: RuntimeError # Issue 29922
-mirrors/generic_f_bounded_test/01: RuntimeError # Issue 29922
-mirrors/generic_f_bounded_test/none: RuntimeError # Issue 29922
-mirrors/generic_function_typedef_test: RuntimeError # Issue 29922
-mirrors/generics_double_substitution_test/01: RuntimeError # Issue 29922
-mirrors/generics_double_substitution_test/none: RuntimeError # Issue 29922
-mirrors/generics_dynamic_test: RuntimeError # Issue 29922
-mirrors/generics_special_types_test: RuntimeError # Issue 29922
-mirrors/generics_substitution_test: RuntimeError # Issue 29922
-mirrors/instantiate_abstract_class_test: RuntimeError # Issue 29922
-mirrors/invocation_fuzz_test/emptyarray: RuntimeError # Issue 29922
-mirrors/invocation_fuzz_test/false: RuntimeError # Issue 29922
-mirrors/invocation_fuzz_test/none: RuntimeError # Issue 29922
-mirrors/invocation_fuzz_test/smi: RuntimeError # Issue 29922
-mirrors/invocation_fuzz_test/string: RuntimeError # Issue 29922
-mirrors/invoke_call_on_closure_test: RuntimeError # Issue 29922
-mirrors/libraries_test: RuntimeError # Issue 29922
-mirrors/library_enumeration_deferred_loading_test: RuntimeError # Issue 29922
-mirrors/library_metadata_test: RuntimeError # Issue 29922
-mirrors/library_uri_io_test: RuntimeError # Issue 29922
-mirrors/library_uri_package_test: RuntimeError # Issue 29922
-mirrors/local_function_is_static_test: RuntimeError # Issue 29922
-mirrors/metadata_test: RuntimeError # Issue 29922
-
diff --git a/tests/lib_strong/lib_strong_kernel.status b/tests/lib_strong/lib_strong_kernel.status
deleted file mode 100644
index 3cee57b..0000000
--- a/tests/lib_strong/lib_strong_kernel.status
+++ /dev/null
@@ -1,134 +0,0 @@
-# Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-[ $compiler == dartk && $runtime == vm ]
-html/canvas_test: DartkCompileTimeError
-html/cdata_test: DartkCompileTimeError
-html/client_rect_test: DartkCompileTimeError
-html/cross_domain_iframe_test: DartkCompileTimeError
-html/crypto_test: DartkCompileTimeError
-html/css_rule_list_test: DartkCompileTimeError
-html/css_test: DartkCompileTimeError
-html/cssstyledeclaration_test: DartkCompileTimeError
-html/custom/attribute_changed_callback_test: DartkCompileTimeError
-html/custom/constructor_calls_created_synchronously_test: DartkCompileTimeError
-html/custom/created_callback_test: DartkCompileTimeError
-html/custom/document_register_basic_test: DartkCompileTimeError
-html/custom/document_register_type_extensions_test: DartkCompileTimeError
-html/custom/element_upgrade_test: DartkCompileTimeError
-html/custom/entered_left_view_test: DartkCompileTimeError
-html/custom/js_custom_test: DartkCompileTimeError
-html/custom/mirrors_test: DartkCompileTimeError
-html/custom/regress_194523002_test: DartkCompileTimeError
-html/custom_element_method_clash_test: DartkCompileTimeError
-html/custom_element_name_clash_test: DartkCompileTimeError
-html/custom_elements_23127_test: DartkCompileTimeError
-html/custom_elements_test: DartkCompileTimeError
-html/dom_constructors_test: DartkCompileTimeError
-html/domparser_test: DartkCompileTimeError
-html/element_add_test: DartkCompileTimeError
-html/element_animate_test: DartkCompileTimeError
-html/element_classes_svg_test: DartkCompileTimeError
-html/element_classes_test: DartkCompileTimeError
-html/element_constructor_1_test: DartkCompileTimeError
-html/element_dimensions_test: DartkCompileTimeError
-html/element_offset_test: DartkCompileTimeError
-html/indexeddb_1_test: DartkCompileTimeError
-html/indexeddb_2_test: DartkCompileTimeError
-html/indexeddb_3_test: DartkCompileTimeError
-html/indexeddb_4_test: DartkCompileTimeError
-html/indexeddb_5_test: DartkCompileTimeError
-html/input_element_test: DartkCompileTimeError
-html/instance_of_test: DartkCompileTimeError
-html/interactive_test: DartkCompileTimeError
-html/isolates_test: DartkCompileTimeError
-html/js_function_getter_test: DartkCompileTimeError
-html/js_interop_1_test: DartkCompileTimeError
-html/js_test: DartkCompileTimeError
-html/js_util_test: DartkCompileTimeError
-html/localstorage_test: DartkCompileTimeError
-html/location_test: DartkCompileTimeError
-html/media_stream_test: DartkCompileTimeError
-html/mediasource_test: DartkCompileTimeError
-html/messageevent_test: DartkCompileTimeError
-html/mirrors_js_typed_interop_test: DartkCompileTimeError
-html/mouse_event_test: DartkCompileTimeError
-html/native_gc_test: DartkCompileTimeError
-html/navigator_test: DartkCompileTimeError
-html/node_test: DartkCompileTimeError
-html/node_validator_important_if_you_suppress_make_the_bug_critical_test: DartkCompileTimeError
-html/non_instantiated_is_test: DartkCompileTimeError
-html/notification_test: DartkCompileTimeError
-html/performance_api_test: DartkCompileTimeError
-html/private_extension_member_test: DartkCompileTimeError
-html/query_test: DartkCompileTimeError
-html/queryall_test: DartkCompileTimeError
-html/range_test: DartkCompileTimeError
-html/request_animation_frame_test: DartkCompileTimeError
-html/rtc_test: DartkCompileTimeError
-html/selectelement_test: DartkCompileTimeError
-html/serialized_script_value_test: DartkCompileTimeError
-html/shadow_dom_test: DartkCompileTimeError
-html/shadowroot_test: DartkCompileTimeError
-html/speechrecognition_test: DartkCompileTimeError
-html/storage_test: DartkCompileTimeError
-html/streams_test: DartkCompileTimeError
-html/svg_test: DartkCompileTimeError
-html/svgelement_test: DartkCompileTimeError
-html/table_test: DartkCompileTimeError
-html/text_event_test: DartkCompileTimeError
-html/touchevent_test: DartkCompileTimeError
-html/track_element_constructor_test: DartkCompileTimeError
-html/transition_event_test: DartkCompileTimeError
-html/trusted_html_tree_sanitizer_test: DartkCompileTimeError
-html/typed_arrays_1_test: DartkCompileTimeError
-html/typed_arrays_2_test: DartkCompileTimeError
-html/typed_arrays_3_test: DartkCompileTimeError
-html/typed_arrays_4_test: DartkCompileTimeError
-html/typed_arrays_5_test: DartkCompileTimeError
-html/typed_arrays_arraybuffer_test: DartkCompileTimeError
-html/typed_arrays_dataview_test: DartkCompileTimeError
-html/typed_arrays_range_checks_test: DartkCompileTimeError
-html/typed_arrays_simd_test: DartkCompileTimeError
-html/typing_test: DartkCompileTimeError
-html/unknownelement_test: DartkCompileTimeError
-html/uri_test: DartkCompileTimeError
-html/url_test: DartkCompileTimeError
-html/websocket_test: DartkCompileTimeError
-html/websql_test: DartkCompileTimeError
-html/wheelevent_test: DartkCompileTimeError
-html/window_eq_test: DartkCompileTimeError
-html/window_mangling_test: DartkCompileTimeError
-html/window_nosuchmethod_test: DartkCompileTimeError
-html/window_test: DartkCompileTimeError
-html/worker_api_test: DartkCompileTimeError
-html/worker_test: DartkCompileTimeError
-html/xhr_cross_origin_test: DartkCompileTimeError
-html/xhr_test: DartkCompileTimeError
-html/xsltprocessor_test: DartkCompileTimeError
-mirrors/basic_types_in_dart_core_test: RuntimeError
-mirrors/class_mirror_location_test: RuntimeError
-mirrors/constructor_kinds_test/01: RuntimeError
-mirrors/constructor_kinds_test/none: RuntimeError
-mirrors/fake_function_with_call_test: Crash
-mirrors/field_type_test: RuntimeError
-mirrors/function_type_mirror_test: RuntimeError
-mirrors/generic_function_typedef_test: RuntimeError
-mirrors/generics_double_substitution_test/01: RuntimeError
-mirrors/generics_double_substitution_test/none: RuntimeError
-mirrors/generics_dynamic_test: Crash
-mirrors/generics_substitution_test: RuntimeError
-mirrors/invocation_fuzz_test/emptyarray: Crash
-mirrors/invocation_fuzz_test/false: Crash
-mirrors/invocation_fuzz_test/none: Crash
-mirrors/invocation_fuzz_test/smi: Crash
-mirrors/invocation_fuzz_test/string: Crash
-mirrors/libraries_test: RuntimeError
-mirrors/library_enumeration_deferred_loading_test: RuntimeError
-mirrors/library_metadata_test: RuntimeError
-mirrors/library_uri_io_test: DartkCompileTimeError
-mirrors/library_uri_package_test: DartkCompileTimeError
-mirrors/list_constructor_test/01: RuntimeError
-mirrors/list_constructor_test/none: RuntimeError
-mirrors/metadata_test: RuntimeError
diff --git a/tests/lib_strong/mirrors/declarations_model.dart b/tests/lib_strong/mirrors/declarations_model.dart
deleted file mode 100644
index f25523f..0000000
--- a/tests/lib_strong/mirrors/declarations_model.dart
+++ /dev/null
@@ -1,166 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.declarations_model;
-
-var libraryVariable;
-get libraryGetter => null;
-set librarySetter(x) => x;
-libraryMethod() => null;
-
-var _libraryVariable;
-get _libraryGetter => null;
-set _librarySetter(x) => x;
-_libraryMethod() => null;
-
-typedef bool Predicate(dynamic);
-
-abstract class Interface<I> {
-  operator /(x) => null;
-
-  var interfaceInstanceVariable;
-  get interfaceInstanceGetter;
-  set interfaceInstanceSetter(x);
-  interfaceInstanceMethod();
-
-  var _interfaceInstanceVariable;
-  get _interfaceInstanceGetter;
-  set _interfaceInstanceSetter(x);
-  _interfaceInstanceMethod();
-
-  static var interfaceStaticVariable;
-  static get interfaceStaticGetter => null;
-  static set interfaceStaticSetter(x) => x;
-  static interfaceStaticMethod() => null;
-
-  static var _interfaceStaticVariable;
-  static get _interfaceStaticGetter => null;
-  static set _interfaceStaticSetter(x) => x;
-  static _interfaceStaticMethod() => null;
-}
-
-class Mixin<M> {
-  operator *(x) => null;
-
-  var mixinInstanceVariable;
-  get mixinInstanceGetter => null;
-  set mixinInstanceSetter(x) => x;
-  mixinInstanceMethod() => null;
-
-  var _mixinInstanceVariable;
-  get _mixinInstanceGetter => null;
-  set _mixinInstanceSetter(x) => x;
-  _mixinInstanceMethod() => null;
-
-  static var mixinStaticVariable;
-  static get mixinStaticGetter => null;
-  static set mixinStaticSetter(x) => x;
-  static mixinStaticMethod() => null;
-
-  static var _mixinStaticVariable;
-  static get _mixinStaticGetter => null;
-  static set _mixinStaticSetter(x) => x;
-  static _mixinStaticMethod() => null;
-}
-
-class Superclass<S> {
-  operator -(x) => null;
-
-  var inheritedInstanceVariable;
-  get inheritedInstanceGetter => null;
-  set inheritedInstanceSetter(x) => x;
-  inheritedInstanceMethod() => null;
-
-  var _inheritedInstanceVariable;
-  get _inheritedInstanceGetter => null;
-  set _inheritedInstanceSetter(x) => x;
-  _inheritedInstanceMethod() => null;
-
-  static var inheritedStaticVariable;
-  static get inheritedStaticGetter => null;
-  static set inheritedStaticSetter(x) => x;
-  static inheritedStaticMethod() => null;
-
-  static var _inheritedStaticVariable;
-  static get _inheritedStaticGetter => null;
-  static set _inheritedStaticSetter(x) => x;
-  static _inheritedStaticMethod() => null;
-
-  Superclass.inheritedGenerativeConstructor(this.inheritedInstanceVariable);
-  Superclass.inheritedRedirectingConstructor(x)
-      : this.inheritedGenerativeConstructor(x * 2);
-  factory Superclass.inheritedNormalFactory(y) =>
-      new Superclass.inheritedRedirectingConstructor(y * 3);
-  factory Superclass.inheritedRedirectingFactory(z) =
-      Superclass<S>.inheritedNormalFactory;
-
-  Superclass._inheritedGenerativeConstructor(this._inheritedInstanceVariable);
-  Superclass._inheritedRedirectingConstructor(x)
-      : this._inheritedGenerativeConstructor(x * 2);
-  factory Superclass._inheritedNormalFactory(y) =>
-      new Superclass._inheritedRedirectingConstructor(y * 3);
-  factory Superclass._inheritedRedirectingFactory(z) =
-      Superclass<S>._inheritedNormalFactory;
-}
-
-abstract class Class<C> extends Superclass<C>
-    with Mixin<C>
-    implements Interface<C> {
-  operator +(x) => null;
-
-  abstractMethod();
-
-  var instanceVariable;
-  get instanceGetter => null;
-  set instanceSetter(x) => x;
-  instanceMethod() => null;
-
-  var _instanceVariable;
-  get _instanceGetter => null;
-  set _instanceSetter(x) => x;
-  _instanceMethod() => null;
-
-  static var staticVariable;
-  static get staticGetter => null;
-  static set staticSetter(x) => x;
-  static staticMethod() => null;
-
-  static var _staticVariable;
-  static get _staticGetter => null;
-  static set _staticSetter(x) => x;
-  static _staticMethod() => null;
-
-  Class.generativeConstructor(this.instanceVariable)
-      : super.inheritedGenerativeConstructor(0);
-  Class.redirectingConstructor(x) : this.generativeConstructor(x * 2);
-  factory Class.normalFactory(y) => new ConcreteClass(y * 3);
-  factory Class.redirectingFactory(z) = Class<C>.normalFactory;
-
-  Class._generativeConstructor(this._instanceVariable)
-      : super._inheritedGenerativeConstructor(0);
-  Class._redirectingConstructor(x) : this._generativeConstructor(x * 2);
-  factory Class._normalFactory(y) => new ConcreteClass(y * 3);
-  factory Class._redirectingFactory(z) = Class<C>._normalFactory;
-}
-
-// This is just here as a target of Class's factories to appease the analyzer.
-class ConcreteClass<CC> extends Class<CC> {
-  abstractMethod() {}
-
-  operator /(x) => null;
-
-  var interfaceInstanceVariable;
-  get interfaceInstanceGetter => null;
-  set interfaceInstanceSetter(x) => null;
-  interfaceInstanceMethod() => null;
-
-  var _interfaceInstanceVariable;
-  get _interfaceInstanceGetter => null;
-  set _interfaceInstanceSetter(x) => null;
-  _interfaceInstanceMethod() => null;
-
-  ConcreteClass(x) : super.generativeConstructor(x);
-}
-
-class _PrivateClass {}
diff --git a/tests/lib_strong/mirrors/declarations_model_easier.dart b/tests/lib_strong/mirrors/declarations_model_easier.dart
deleted file mode 100644
index 665b691..0000000
--- a/tests/lib_strong/mirrors/declarations_model_easier.dart
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.declarations_model;
-
-var libraryVariable;
-get libraryGetter => null;
-set librarySetter(x) => x;
-libraryMethod() => null;
-
-typedef bool Predicate(dynamic);
-
-abstract class Interface<I> {
-  operator /(x) => null;
-
-  var interfaceInstanceVariable;
-  get interfaceInstanceGetter;
-  set interfaceInstanceSetter(x);
-  interfaceInstanceMethod();
-
-  static var interfaceStaticVariable;
-  static get interfaceStaticGetter => null;
-  static set interfaceStaticSetter(x) => x;
-  static interfaceStaticMethod() => null;
-}
-
-class Superclass<S> {
-  operator -(x) => null;
-
-  var inheritedInstanceVariable;
-  get inheritedInstanceGetter => null;
-  set inheritedInstanceSetter(x) => x;
-  inheritedInstanceMethod() => null;
-
-  static var inheritedStaticVariable;
-  static get inheritedStaticGetter => null;
-  static set inheritedStaticSetter(x) => x;
-  static inheritedStaticMethod() => null;
-
-  Superclass.inheritedGenerativeConstructor(this.inheritedInstanceVariable);
-  Superclass.inheritedRedirectingConstructor(x)
-      : this.inheritedGenerativeConstructor(x * 2);
-  factory Superclass.inheritedNormalFactory(y) =>
-      new Superclass.inheritedRedirectingConstructor(y * 3);
-  factory Superclass.inheritedRedirectingFactory(z) =
-      Superclass<S>.inheritedNormalFactory;
-}
-
-abstract class Class<C> extends Superclass<C> implements Interface<C> {
-  operator +(x) => null;
-
-  abstractMethod();
-
-  var instanceVariable;
-  get instanceGetter => null;
-  set instanceSetter(x) => x;
-  instanceMethod() => null;
-
-  static var staticVariable;
-  static get staticGetter => null;
-  static set staticSetter(x) => x;
-  static staticMethod() => null;
-
-  Class.generativeConstructor(this.instanceVariable)
-      : super.inheritedGenerativeConstructor(0);
-  Class.redirectingConstructor(x) : this.generativeConstructor(x * 2);
-  factory Class.normalFactory(y) => new ConcreteClass(y * 3);
-  factory Class.redirectingFactory(z) = Class<C>.normalFactory;
-}
-
-// This is just here as a target of Class's factories to appease the analyzer.
-class ConcreteClass<CC> extends Class<CC> {
-  abstractMethod() {}
-
-  operator /(x) => null;
-
-  var interfaceInstanceVariable;
-  get interfaceInstanceGetter => null;
-  set interfaceInstanceSetter(x) => null;
-  interfaceInstanceMethod() => null;
-
-  ConcreteClass(x) : super.generativeConstructor(x);
-}
diff --git a/tests/lib_strong/mirrors/fake_function_with_call_test.dart b/tests/lib_strong/mirrors/fake_function_with_call_test.dart
deleted file mode 100644
index b77eb59..0000000
--- a/tests/lib_strong/mirrors/fake_function_with_call_test.dart
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:mirrors";
-
-import "package:expect/expect.dart";
-
-membersOf(ClassMirror cm) {
-  var result = new Map();
-  cm.declarations.forEach((k, v) {
-    if (v is MethodMirror && !v.isConstructor) result[k] = v;
-    if (v is VariableMirror) result[k] = v;
-  });
-  return result;
-}
-
-class WannabeFunction {
-  int call(int a, int b) => a + b;
-  method(x) => x * x;
-}
-
-main() {
-  Expect.isTrue(new WannabeFunction() is Function);
-
-  ClosureMirror cm = reflect(new WannabeFunction());
-  Expect.equals(7, cm.invoke(#call, [3, 4]).reflectee);
-  Expect.throws(() => cm.invoke(#call, [3]), (e) => e is NoSuchMethodError,
-      "Wrong arity");
-  Expect.equals(49, cm.invoke(#method, [7]).reflectee);
-  Expect.throws(() => cm.invoke(#method, [3, 4]), (e) => e is NoSuchMethodError,
-      "Wrong arity");
-  Expect.equals(7, cm.apply([3, 4]).reflectee);
-  Expect.throws(
-      () => cm.apply([3]), (e) => e is NoSuchMethodError, "Wrong arity");
-
-  MethodMirror mm = cm.function;
-  Expect.equals(#call, mm.simpleName);
-  Expect.equals(reflectClass(WannabeFunction), mm.owner);
-  Expect.isTrue(mm.isRegularMethod);
-  Expect.equals(#int, mm.returnType.simpleName);
-  Expect.equals(#int, mm.parameters[0].type.simpleName);
-  Expect.equals(#int, mm.parameters[1].type.simpleName);
-
-  ClassMirror km = cm.type;
-  Expect.equals(reflectClass(WannabeFunction), km);
-  Expect.equals(#WannabeFunction, km.simpleName);
-  Expect.equals(mm, km.declarations[#call]);
-  Expect.setEquals([#call, #method], membersOf(km).keys);
-}
diff --git a/tests/lib_strong/mirrors/field_metadata2_test.dart b/tests/lib_strong/mirrors/field_metadata2_test.dart
deleted file mode 100644
index e3dc834..0000000
--- a/tests/lib_strong/mirrors/field_metadata2_test.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-// compile options: --emit-metadata
-// 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.
-
-// Run essentially the same test, but with emit-metadata compile option,
-// which allows us to reflect on the fields.
-import 'dart:mirrors';
-import 'package:expect/expect.dart';
-
-import 'field_metadata_test.dart' as field_metadata_test;
-import 'field_metadata_test.dart' show Foo, Bar;
-
-void main() {
-  // Make sure the other test still works.
-  field_metadata_test.main();
-
-  // Check that we can now reflect on the annotations.
-  dynamic f = new Foo();
-  var members = reflect(f).type.declarations;
-  var bar = members[#x].metadata.first.reflectee as Bar;
-  Expect.equals(bar.name, 'bar');
-
-  var baz = members[#y].metadata.first.reflectee as Bar;
-  Expect.equals(baz.name, 'baz');
-}
diff --git a/tests/lib_strong/mirrors/field_metadata_test.dart b/tests/lib_strong/mirrors/field_metadata_test.dart
deleted file mode 100644
index a8db33d..0000000
--- a/tests/lib_strong/mirrors/field_metadata_test.dart
+++ /dev/null
@@ -1,47 +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 'dart:mirrors';
-import 'package:expect/expect.dart';
-
-class Bar {
-  final String name;
-
-  const Bar(this.name);
-}
-
-class Foo {
-  @Bar('bar')
-  int x = 40;
-
-  @Bar('baz')
-  final String y = 'hi';
-
-  @Bar('foo')
-  void set z(int val) {
-    x = val;
-  }
-}
-
-void main() {
-  dynamic f = new Foo();
-  Expect.throws(() {
-    f.x = 'hello';
-  });
-  f.x += 2;
-  Expect.equals(f.x, 42);
-  Expect.equals(f.y, 'hi');
-
-  Expect.throws(() {
-    f.z = 'hello';
-  });
-  f.z = 0;
-  Expect.equals(f.x, 0);
-
-  var members = reflect(f).type.declarations;
-  var x = members[#x] as VariableMirror;
-  var y = members[#y] as VariableMirror;
-  Expect.equals(x.type.simpleName, #int);
-  Expect.equals(y.type.simpleName, #String);
-}
diff --git a/tests/lib_strong/mirrors/field_type_test.dart b/tests/lib_strong/mirrors/field_type_test.dart
deleted file mode 100644
index 9e56745..0000000
--- a/tests/lib_strong/mirrors/field_type_test.dart
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library field_test;
-
-import 'dart:mirrors';
-import "package:expect/expect.dart";
-
-String toplevelVariable;
-
-class C {
-  final int i;
-  const C(this.i);
-}
-
-class A<T> {
-  static int staticField;
-  @C(42)
-  @C(44)
-  String field;
-  var dynamicTypeField;
-  T typeVariableField;
-  H<int> parameterizedTypeField;
-}
-
-class H<T> {}
-
-testOriginalDeclaration() {
-  ClassMirror a = reflectClass(A);
-  VariableMirror staticField = a.declarations[#staticField];
-  VariableMirror field = a.declarations[#field];
-  VariableMirror dynamicTypeField = a.declarations[#dynamicTypeField];
-  VariableMirror typeVariableField = a.declarations[#typeVariableField];
-  VariableMirror parameterizedTypeField =
-      a.declarations[#parameterizedTypeField];
-
-  Expect.equals(reflectType(int), staticField.type);
-  Expect.equals(reflectClass(String), field.type);
-  Expect.equals(reflectType(dynamic), dynamicTypeField.type);
-  Expect.equals(a.typeVariables.single, typeVariableField.type);
-  Expect.equals(reflect(new H<int>()).type, parameterizedTypeField.type);
-
-  Expect.equals(2, field.metadata.length);
-  Expect.equals(reflect(const C(42)), field.metadata.first);
-  Expect.equals(reflect(const C(44)), field.metadata.last);
-}
-
-testInstance() {
-  ClassMirror aOfString = reflect(new A<String>()).type;
-  VariableMirror staticField = aOfString.declarations[#staticField];
-  VariableMirror field = aOfString.declarations[#field];
-  VariableMirror dynamicTypeField = aOfString.declarations[#dynamicTypeField];
-  VariableMirror typeVariableField = aOfString.declarations[#typeVariableField];
-  VariableMirror parameterizedTypeField =
-      aOfString.declarations[#parameterizedTypeField];
-
-  Expect.equals(reflectType(int), staticField.type);
-  Expect.equals(reflectClass(String), field.type);
-  Expect.equals(reflectType(dynamic), dynamicTypeField.type);
-  Expect.equals(reflectClass(String), typeVariableField.type);
-  Expect.equals(reflect(new H<int>()).type, parameterizedTypeField.type);
-
-  Expect.equals(2, field.metadata.length);
-  Expect.equals(reflect(const C(42)), field.metadata.first);
-  Expect.equals(reflect(const C(44)), field.metadata.last);
-}
-
-testTopLevel() {
-  LibraryMirror currentLibrary = currentMirrorSystem().findLibrary(#field_test);
-  VariableMirror topLevel = currentLibrary.declarations[#toplevelVariable];
-  Expect.equals(reflectClass(String), topLevel.type);
-}
-
-main() {
-  testOriginalDeclaration();
-  testInstance();
-  testTopLevel();
-}
diff --git a/tests/lib_strong/mirrors/function_apply_mirrors_lib.dart b/tests/lib_strong/mirrors/function_apply_mirrors_lib.dart
deleted file mode 100644
index e94a55a..0000000
--- a/tests/lib_strong/mirrors/function_apply_mirrors_lib.dart
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library function_apply_mirrors_lib;
-
-@MirrorsUsed(targets: "function_apply_mirrors_lib")
-import "dart:mirrors";
-
-bar() => reflect(499).reflectee;
diff --git a/tests/lib_strong/mirrors/function_apply_mirrors_test.dart b/tests/lib_strong/mirrors/function_apply_mirrors_test.dart
deleted file mode 100644
index 81d3b9e..0000000
--- a/tests/lib_strong/mirrors/function_apply_mirrors_test.dart
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Only 'lib' imports mirrors.
-// Function.apply is resolved, before it is known that mirrors are used.
-// Dart2js has different implementations of Function.apply for different
-// emitters (like --fast-startup). Dart2js must not switch the resolved
-// Function.apply when it discovers the use of mirrors.
-// In particular it must not switch from the fast-startup emitter to the full
-// emitter without updating the Function.apply reference.
-import 'function_apply_mirrors_lib.dart' as lib;
-
-import "package:expect/expect.dart";
-
-int foo({x: 499, y: 42}) => x + y;
-
-main() {
-  Expect.equals(709, Function.apply(foo, [], {#y: 210}));
-  Expect.equals(499, lib.bar());
-}
diff --git a/tests/lib_strong/mirrors/function_type_mirror_test.dart b/tests/lib_strong/mirrors/function_type_mirror_test.dart
deleted file mode 100644
index 3b547e3..0000000
--- a/tests/lib_strong/mirrors/function_type_mirror_test.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:mirrors";
-
-import "package:expect/expect.dart";
-
-typedef void FooFunction(int a, double b);
-
-bar(int a) {}
-
-main() {
-  TypedefMirror tm = reflectType(FooFunction);
-  FunctionTypeMirror ftm = tm.referent;
-  Expect.equals(const Symbol('void'), ftm.returnType.simpleName);
-  Expect.equals(#int, ftm.parameters[0].type.simpleName);
-  Expect.equals(#double, ftm.parameters[1].type.simpleName);
-  ClosureMirror cm = reflect(bar);
-  ftm = cm.type;
-  Expect.equals(#dynamic, ftm.returnType.simpleName);
-  Expect.equals(#int, ftm.parameters[0].type.simpleName);
-}
diff --git a/tests/lib_strong/mirrors/generic_bounded_by_type_parameter_test.dart b/tests/lib_strong/mirrors/generic_bounded_by_type_parameter_test.dart
deleted file mode 100644
index f7aa697..0000000
--- a/tests/lib_strong/mirrors/generic_bounded_by_type_parameter_test.dart
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.generic_bounded_by_type_parameter;
-
-import 'dart:mirrors';
-
-import 'package:expect/expect.dart';
-
-import 'generics_helper.dart';
-
-class Super<T, R extends T> {}
-
-class Fixed extends Super<num, int> {}
-class Generic<X, Y> extends Super<X, Y> {} //# 02: static type warning
-class Malbounded extends Super<num, String> {} //# 01: static type warning
-
-bool inCheckedMode() {
-  try {
-    var s = 'string';
-    int i = s;
-  } catch (e) {
-    return true;
-  }
-  return false;
-}
-
-main() {
-  ClassMirror superDecl = reflectClass(Super);
-  ClassMirror superOfNumAndInt = reflectClass(Fixed).superclass;
-  ClassMirror genericDecl = reflectClass(Generic); // //# 02: continued
-  ClassMirror superOfXAndY = genericDecl.superclass; // //# 02: continued
-  ClassMirror genericOfNumAndDouble = reflect(new Generic<num, double>()).type; // //# 02: continued
-  ClassMirror superOfNumAndDouble = genericOfNumAndDouble.superclass; // //# 02: continued
-  ClassMirror superOfNumAndString = reflectClass(Malbounded).superclass; // //# 01: continued
-
-  try {
-    ClassMirror genericOfNumAndBool = reflect(new Generic<num, bool>()).type; // //# 02: static type warning
-    ClassMirror superOfNumAndBool = genericOfNumAndBool.superclass; // //# 02: continued
-    Expect.isFalse(genericOfNumAndBool.isOriginalDeclaration); // //# 02: continued
-    Expect.isFalse(superOfNumAndBool.isOriginalDeclaration); // //# 02: continued
-    typeParameters(genericOfNumAndBool, [#X, #Y]); // //# 02: continued
-    typeParameters(superOfNumAndBool, [#T, #R]); // //# 02: continued
-    typeArguments(genericOfNumAndBool, [reflectClass(num), reflectClass(bool)]); // //# 02: continued
-    typeArguments(superOfNumAndBool, [reflectClass(num), reflectClass(bool)]); // //# 02: continued
-    Expect.isFalse(inCheckedMode()); //# 02: continued
-  } on TypeError catch (e) {
-    Expect.isTrue(inCheckedMode());
-  }
-
-  Expect.isTrue(superDecl.isOriginalDeclaration);
-  Expect.isFalse(superOfNumAndInt.isOriginalDeclaration);
-  Expect.isTrue(genericDecl.isOriginalDeclaration); // //# 02: continued
-  Expect.isFalse(superOfXAndY.isOriginalDeclaration); //  //# 02: continued
-  Expect.isFalse(genericOfNumAndDouble.isOriginalDeclaration); // //# 02: continued
-  Expect.isFalse(superOfNumAndDouble.isOriginalDeclaration); // //# 02: continued
-  Expect.isFalse(superOfNumAndString.isOriginalDeclaration); // //# 01: continued
-
-  TypeVariableMirror tFromSuper = superDecl.typeVariables[0];
-  TypeVariableMirror rFromSuper = superDecl.typeVariables[1];
-  TypeVariableMirror xFromGeneric = genericDecl.typeVariables[0]; // //# 02: continued
-  TypeVariableMirror yFromGeneric = genericDecl.typeVariables[1]; // //# 02: continued
-
-  Expect.equals(reflectClass(Object), tFromSuper.upperBound);
-  Expect.equals(tFromSuper, rFromSuper.upperBound);
-  Expect.equals(reflectClass(Object), xFromGeneric.upperBound); // //# 02: continued
-  Expect.equals(reflectClass(Object), yFromGeneric.upperBound); // //# 02: continued
-
-  typeParameters(superDecl, [#T, #R]);
-  typeParameters(superOfNumAndInt, [#T, #R]);
-  typeParameters(genericDecl, [#X, #Y]); // //# 02: continued
-  typeParameters(superOfXAndY, [#T, #R]); // //# 02: continued
-  typeParameters(genericOfNumAndDouble, [#X, #Y]); // //# 02: continued
-  typeParameters(superOfNumAndDouble, [#T, #R]); // //# 02: continued
-  typeParameters(superOfNumAndString, [#T, #R]); // //# 01: continued
-
-  typeArguments(superDecl, []);
-  typeArguments(superOfNumAndInt, [reflectClass(num), reflectClass(int)]);
-  typeArguments(genericDecl, []); // //# 02: continued
-  typeArguments(superOfXAndY, [xFromGeneric, yFromGeneric]); // //# 02: continued
-  typeArguments(genericOfNumAndDouble, [reflectClass(num), reflectClass(double)]); // //# 02: continued
-  typeArguments(superOfNumAndDouble, [reflectClass(num), reflectClass(double)]); // //# 02: continued
-  typeArguments(superOfNumAndString, [reflectClass(num), reflectClass(String)]); // //# 01: continued
-}
diff --git a/tests/lib_strong/mirrors/generic_bounded_test.dart b/tests/lib_strong/mirrors/generic_bounded_test.dart
deleted file mode 100644
index d0ea427..0000000
--- a/tests/lib_strong/mirrors/generic_bounded_test.dart
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.generic_bounded;
-
-import 'dart:mirrors';
-
-import 'package:expect/expect.dart';
-
-import 'generics_helper.dart';
-
-class Super<T extends num> {}
-
-class Fixed extends Super<int> {}
-class Generic<R> extends Super<R> {} // //# 02: static type warning
-class Malbounded extends Super<String> {} //# 01: static type warning
-
-bool inCheckedMode() {
-  try {
-    var s = 'string';
-    int i = s;
-  } catch (e) {
-    return true;
-  }
-  return false;
-}
-
-main() {
-  ClassMirror superDecl = reflectClass(Super);
-  ClassMirror superOfInt = reflectClass(Fixed).superclass;
-  ClassMirror genericDecl = reflectClass(Generic); // //# 02: continued
-  ClassMirror superOfR = genericDecl.superclass; // //# 02: continued
-  ClassMirror genericOfDouble = reflect(new Generic<double>()).type; // //# 02: continued
-  ClassMirror superOfDouble = genericOfDouble.superclass; // //# 02: continued
-
-  try {
-    ClassMirror genericOfBool = reflect(new Generic<bool>()).type; // //# 02: static type warning
-    ClassMirror superOfBool = genericOfBool.superclass; // //# 02: continued
-    Expect.isFalse(genericOfBool.isOriginalDeclaration); // //# 02: continued
-    Expect.isFalse(superOfBool.isOriginalDeclaration); // //# 02: continued
-    typeParameters(genericOfBool, [#R]); // //# 02: continued
-    typeParameters(superOfBool, [#T]); // //# 02: continued
-    typeArguments(genericOfBool, [reflectClass(bool)]); // //# 02: continued
-    typeArguments(superOfBool, [reflectClass(bool)]); // //# 02: continued
-    Expect.isFalse(inCheckedMode()); //# 02: continued
-  } on TypeError catch (e) {
-    Expect.isTrue(inCheckedMode());
-  }
-
-  ClassMirror superOfString = reflectClass(Malbounded).superclass; // //# 01: continued
-
-  Expect.isTrue(superDecl.isOriginalDeclaration);
-  Expect.isFalse(superOfInt.isOriginalDeclaration);
-  Expect.isTrue(genericDecl.isOriginalDeclaration); // //# 02: continued
-  Expect.isFalse(superOfR.isOriginalDeclaration); // //# 02: continued
-  Expect.isFalse(genericOfDouble.isOriginalDeclaration); // //# 02: continued
-  Expect.isFalse(superOfDouble.isOriginalDeclaration); // //# 02: continued
-
-  Expect.isFalse(superOfString.isOriginalDeclaration); // //# 01: continued
-
-  TypeVariableMirror tFromSuper = superDecl.typeVariables.single;
-  TypeVariableMirror rFromGeneric = genericDecl.typeVariables.single; // //# 02: continued
-
-  Expect.equals(reflectClass(num), tFromSuper.upperBound);
-  Expect.equals(reflectClass(Object), rFromGeneric.upperBound); // //# 02: continued
-
-  typeParameters(superDecl, [#T]);
-  typeParameters(superOfInt, [#T]);
-  typeParameters(genericDecl, [#R]); // //# 02: continued
-  typeParameters(superOfR, [#T]); // //# 02: continued
-  typeParameters(genericOfDouble, [#R]); // //# 02: continued
-  typeParameters(superOfDouble, [#T]); // //# 02: continued
-  typeParameters(superOfString, [#T]); // //# 01: continued
-
-  typeArguments(superDecl, []);
-  typeArguments(superOfInt, [reflectClass(int)]);
-  typeArguments(genericDecl, []); // //# 02: continued
-  typeArguments(superOfR, [rFromGeneric]); // //# 02: continued
-  typeArguments(genericOfDouble, [reflectClass(double)]); // //# 02: continued
-  typeArguments(superOfDouble, [reflectClass(double)]); // //# 02: continued
-  typeArguments(superOfString, [reflectClass(String)]); // //# 01: continued
-}
diff --git a/tests/lib_strong/mirrors/generic_class_declaration_test.dart b/tests/lib_strong/mirrors/generic_class_declaration_test.dart
deleted file mode 100644
index 79ebee1..0000000
--- a/tests/lib_strong/mirrors/generic_class_declaration_test.dart
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:mirrors';
-import 'package:expect/expect.dart';
-
-import 'stringify.dart';
-
-class A<T> {
-  var instanceVariable;
-  get instanceGetter => null;
-  set instanceSetter(x) => x;
-  instanceMethod() => null;
-
-  var _instanceVariable;
-  get _instanceGetter => null;
-  set _instanceSetter(x) => x;
-  _instanceMethod() => null;
-
-  static var staticVariable;
-  static get staticGetter => null;
-  static set staticSetter(x) => x;
-  static staticMethod() => null;
-
-  static var _staticVariable;
-  static get _staticGetter => null;
-  static set _staticSetter(x) => x;
-  static _staticMethod() => null;
-}
-
-main() {
-  ClassMirror cm = reflect(new A<String>()).type;
-  Expect.setEquals([
-    'Variable(s(_instanceVariable) in s(A), private)',
-    'Variable(s(_staticVariable) in s(A), private, static)',
-    'Variable(s(instanceVariable) in s(A))',
-    'Variable(s(staticVariable) in s(A), static)'
-  ], cm.declarations.values.where((dm) => dm is VariableMirror).map(stringify),
-      'variables');
-
-  Expect.setEquals(
-      [
-        'Method(s(_instanceGetter) in s(A), private, getter)',
-        'Method(s(_staticGetter) in s(A), private, static, getter)',
-        'Method(s(instanceGetter) in s(A), getter)',
-        'Method(s(staticGetter) in s(A), static, getter)'
-      ],
-      cm.declarations.values
-          .where((dm) => dm is MethodMirror && dm.isGetter)
-          .map(stringify),
-      'getters');
-
-  Expect.setEquals(
-      [
-        'Method(s(_instanceSetter=) in s(A), private, setter)',
-        'Method(s(_staticSetter=) in s(A), private, static, setter)',
-        'Method(s(instanceSetter=) in s(A), setter)',
-        'Method(s(staticSetter=) in s(A), static, setter)'
-      ],
-      cm.declarations.values
-          .where((dm) => dm is MethodMirror && dm.isSetter)
-          .map(stringify),
-      'setters');
-
-  Expect.setEquals(
-      [
-        'Method(s(_instanceMethod) in s(A), private)',
-        'Method(s(_staticMethod) in s(A), private, static)',
-        'Method(s(instanceMethod) in s(A))',
-        'Method(s(staticMethod) in s(A), static)'
-      ],
-      cm.declarations.values
-          .where((dm) => dm is MethodMirror && dm.isRegularMethod)
-          .map(stringify),
-      'methods');
-
-  Expect.setEquals(
-      ['Method(s(A) in s(A), constructor)'],
-      cm.declarations.values
-          .where((dm) => dm is MethodMirror && dm.isConstructor)
-          .map(stringify),
-      'constructors');
-
-  Expect.setEquals(
-      [
-        'TypeVariable(s(T) in s(A), upperBound = Class(s(Object) in '
-            's(dart.core), top-level))'
-      ],
-      cm.declarations.values
-          .where((dm) => dm is TypeVariableMirror)
-          .map(stringify),
-      'type variables');
-}
diff --git a/tests/lib_strong/mirrors/generic_f_bounded_mixin_application_test.dart b/tests/lib_strong/mirrors/generic_f_bounded_mixin_application_test.dart
deleted file mode 100644
index 2b8d81e..0000000
--- a/tests/lib_strong/mirrors/generic_f_bounded_mixin_application_test.dart
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.generic_f_bounded;
-
-import 'dart:mirrors';
-
-import 'package:expect/expect.dart';
-
-import 'generics_helper.dart';
-
-class Collection<C> {}
-
-class Serializable<S> {}
-
-class OrderedCollection<V> extends Collection<V>
-    with Serializable<OrderedCollection<V>> {}
-
-class AbstractOrderedCollection<W> = Collection<W>
-    with Serializable<AbstractOrderedCollection<W>>;
-
-class CustomOrderedCollection<Z> extends AbstractOrderedCollection<Z> {}
-
-class OrderedIntegerCollection extends OrderedCollection<int> {}
-
-class CustomOrderedIntegerCollection extends CustomOrderedCollection<int> {}
-
-class Serializer<R extends Serializable<R>> {}
-
-class CollectionSerializer extends Serializer<Collection> {}
-
-class OrderedCollectionSerializer extends Serializer<OrderedCollection> {}
-
-main() {
-  ClassMirror collectionDecl = reflectClass(Collection);
-  ClassMirror serializableDecl = reflectClass(Serializable);
-  ClassMirror orderedCollectionDecl = reflectClass(OrderedCollection);
-  ClassMirror abstractOrderedCollectionDecl =
-      reflectClass(AbstractOrderedCollection);
-  ClassMirror customOrderedCollectionDecl =
-      reflectClass(CustomOrderedCollection);
-  ClassMirror orderedIntegerCollection = reflectClass(OrderedIntegerCollection);
-  ClassMirror customOrderedIntegerCollection =
-      reflectClass(CustomOrderedIntegerCollection);
-  ClassMirror serializerDecl = reflectClass(Serializer);
-  ClassMirror collectionSerializerDecl = reflectClass(CollectionSerializer);
-  ClassMirror orderedCollectionSerializerDecl =
-      reflectClass(OrderedCollectionSerializer);
-
-  ClassMirror orderedCollectionOfInt = orderedIntegerCollection.superclass;
-  ClassMirror customOrderedCollectionOfInt =
-      customOrderedIntegerCollection.superclass;
-  ClassMirror serializerOfCollection = collectionSerializerDecl.superclass;
-  ClassMirror serializerOfOrderedCollection =
-      orderedCollectionSerializerDecl.superclass;
-  ClassMirror collectionOfDynamic = reflect(new Collection()).type;
-  ClassMirror orderedCollectionOfDynamic =
-      reflect(new OrderedCollection()).type;
-  ClassMirror collectionWithSerializableOfOrderedCollection =
-      orderedCollectionDecl.superclass;
-
-  Expect.isTrue(collectionDecl.isOriginalDeclaration);
-  Expect.isTrue(serializableDecl.isOriginalDeclaration);
-  Expect.isTrue(orderedCollectionDecl.isOriginalDeclaration);
-  Expect.isTrue(abstractOrderedCollectionDecl.isOriginalDeclaration);
-  Expect.isTrue(customOrderedCollectionDecl.isOriginalDeclaration);
-  Expect.isTrue(orderedIntegerCollection.isOriginalDeclaration);
-  Expect.isTrue(customOrderedIntegerCollection.isOriginalDeclaration);
-  Expect.isTrue(serializerDecl.isOriginalDeclaration);
-  Expect.isTrue(collectionSerializerDecl.isOriginalDeclaration);
-  Expect.isTrue(orderedCollectionSerializerDecl.isOriginalDeclaration);
-
-  Expect.isFalse(orderedCollectionOfInt.isOriginalDeclaration);
-  Expect.isFalse(customOrderedCollectionOfInt.isOriginalDeclaration);
-  Expect.isFalse(serializerOfCollection.isOriginalDeclaration);
-  Expect.isFalse(serializerOfOrderedCollection.isOriginalDeclaration);
-  Expect.isFalse(collectionOfDynamic.isOriginalDeclaration);
-  Expect.isFalse(
-      collectionWithSerializableOfOrderedCollection.isOriginalDeclaration);
-
-  TypeVariableMirror rFromSerializer = serializerDecl.typeVariables.single;
-  ClassMirror serializableOfR = rFromSerializer.upperBound;
-  Expect.isFalse(serializableOfR.isOriginalDeclaration);
-  Expect.equals(serializableDecl, serializableOfR.originalDeclaration);
-  Expect.equals(rFromSerializer, serializableOfR.typeArguments.single);
-
-  typeParameters(collectionDecl, [#C]);
-  typeParameters(serializableDecl, [#S]);
-  typeParameters(orderedCollectionDecl, [#V]);
-  typeParameters(abstractOrderedCollectionDecl, [#W]);
-  typeParameters(customOrderedCollectionDecl, [#Z]);
-  typeParameters(orderedIntegerCollection, []);
-  typeParameters(customOrderedIntegerCollection, []);
-  typeParameters(serializerDecl, [#R]);
-  typeParameters(collectionSerializerDecl, []);
-  typeParameters(orderedCollectionSerializerDecl, []);
-
-  typeParameters(orderedCollectionOfInt, [#V]);
-  typeParameters(customOrderedCollectionOfInt, [#Z]);
-  typeParameters(serializerOfCollection, [#R]);
-  typeParameters(serializerOfOrderedCollection, [#R]);
-  typeParameters(collectionOfDynamic, [#C]);
-  typeParameters(collectionWithSerializableOfOrderedCollection, []);
-
-  typeArguments(collectionDecl, []);
-  typeArguments(serializableDecl, []);
-  typeArguments(orderedCollectionDecl, []);
-  typeArguments(abstractOrderedCollectionDecl, []);
-  typeArguments(customOrderedCollectionDecl, []);
-  typeArguments(orderedIntegerCollection, []);
-  typeArguments(customOrderedIntegerCollection, []);
-  typeArguments(serializerDecl, []);
-  typeArguments(collectionSerializerDecl, []);
-  typeArguments(orderedCollectionSerializerDecl, []);
-
-  typeArguments(orderedCollectionOfInt, [reflectClass(int)]);
-  typeArguments(customOrderedCollectionOfInt, [reflectClass(int)]);
-  typeArguments(serializerOfCollection, [collectionOfDynamic]);
-  typeArguments(serializerOfOrderedCollection, [orderedCollectionOfDynamic]);
-  typeArguments(collectionWithSerializableOfOrderedCollection, []);
-}
diff --git a/tests/lib_strong/mirrors/generic_f_bounded_test.dart b/tests/lib_strong/mirrors/generic_f_bounded_test.dart
deleted file mode 100644
index 1ddf7e4..0000000
--- a/tests/lib_strong/mirrors/generic_f_bounded_test.dart
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.generic_f_bounded;
-
-import 'dart:mirrors';
-
-import 'package:expect/expect.dart';
-
-import 'generics_helper.dart';
-
-class Magnitude<T> {}
-
-class Real extends Magnitude<Real> {}
-
-class Sorter<R extends Magnitude<R>> {}
-
-class RealSorter extends Sorter<Real> {}
-
-main() {
-  ClassMirror magnitudeDecl = reflectClass(Magnitude);
-  ClassMirror realDecl = reflectClass(Real);
-  ClassMirror sorterDecl = reflectClass(Sorter);
-  ClassMirror realSorterDecl = reflectClass(RealSorter);
-  ClassMirror magnitudeOfReal = realDecl.superclass;
-  ClassMirror sorterOfReal = realSorterDecl.superclass;
-
-  Expect.isTrue(magnitudeDecl.isOriginalDeclaration);
-  Expect.isTrue(realDecl.isOriginalDeclaration);
-  Expect.isTrue(sorterDecl.isOriginalDeclaration);
-  Expect.isTrue(realSorterDecl.isOriginalDeclaration);
-  Expect.isFalse(magnitudeOfReal.isOriginalDeclaration);
-  Expect.isFalse(sorterOfReal.isOriginalDeclaration);
-
-  TypeVariableMirror tFromMagnitude = magnitudeDecl.typeVariables.single;
-  TypeVariableMirror rFromSorter = sorterDecl.typeVariables.single;
-
-  Expect.equals(reflectClass(Object), tFromMagnitude.upperBound);
-
-  ClassMirror magnitudeOfR = rFromSorter.upperBound;
-  Expect.isFalse(magnitudeOfR.isOriginalDeclaration);
-  Expect.equals(magnitudeDecl, magnitudeOfR.originalDeclaration);
-  Expect.equals(rFromSorter, magnitudeOfR.typeArguments.single);
-
-  typeParameters(magnitudeDecl, [#T]);
-  typeParameters(realDecl, []);
-  typeParameters(sorterDecl, [#R]);
-  typeParameters(realSorterDecl, []);
-  typeParameters(magnitudeOfReal, [#T]);
-  typeParameters(sorterOfReal, [#R]);
-  typeParameters(magnitudeOfR, [#T]);
-
-  typeArguments(magnitudeDecl, []);
-  typeArguments(realDecl, []);
-  typeArguments(sorterDecl, []);
-  typeArguments(realSorterDecl, []);
-  typeArguments(magnitudeOfReal, [realDecl]); //# 01: ok
-  typeArguments(sorterOfReal, [realDecl]); //# 01: ok
-  typeArguments(magnitudeOfR, [rFromSorter]);
-}
diff --git a/tests/lib_strong/mirrors/generic_function_typedef_test.dart b/tests/lib_strong/mirrors/generic_function_typedef_test.dart
deleted file mode 100644
index e119d51..0000000
--- a/tests/lib_strong/mirrors/generic_function_typedef_test.dart
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.generic_function_typedef;
-
-import 'dart:mirrors';
-
-import 'package:expect/expect.dart';
-
-import 'generics_helper.dart';
-
-typedef bool NonGenericPredicate(num n);
-typedef bool GenericPredicate<T>(T t);
-typedef S GenericTransform<S>(S s);
-
-class C<R> {
-  GenericPredicate<num> predicateOfNum;
-  GenericTransform<String> transformOfString;
-  GenericTransform<R> transformOfR;
-}
-
-reflectTypeDeclaration(t) => reflectType(t).originalDeclaration;
-
-main() {
-  TypeMirror dynamicMirror = currentMirrorSystem().dynamicType;
-
-  TypedefMirror predicateOfNum =
-      (reflectClass(C).declarations[#predicateOfNum] as VariableMirror).type;
-  TypedefMirror transformOfString =
-      (reflectClass(C).declarations[#transformOfString] as VariableMirror).type;
-  TypedefMirror transformOfR =
-      (reflectClass(C).declarations[#transformOfR] as VariableMirror).type;
-  TypedefMirror transformOfDouble = (reflect(new C<double>())
-          .type
-          .declarations[#transformOfR] as VariableMirror)
-      .type;
-
-  TypeVariableMirror tFromGenericPredicate =
-      reflectTypeDeclaration(GenericPredicate).typeVariables[0];
-  TypeVariableMirror sFromGenericTransform =
-      reflectTypeDeclaration(GenericTransform).typeVariables[0];
-  TypeVariableMirror rFromC = reflectClass(C).typeVariables[0];
-
-  // Typedefs.
-  typeParameters(reflectTypeDeclaration(NonGenericPredicate), []);
-  typeParameters(reflectTypeDeclaration(GenericPredicate), [#T]);
-  typeParameters(reflectTypeDeclaration(GenericTransform), [#S]);
-  typeParameters(predicateOfNum, [#T]);
-  typeParameters(transformOfString, [#S]);
-  typeParameters(transformOfR, [#S]);
-  typeParameters(transformOfDouble, [#S]);
-
-  typeArguments(reflectTypeDeclaration(NonGenericPredicate), []);
-  typeArguments(reflectTypeDeclaration(GenericPredicate), []);
-  typeArguments(reflectTypeDeclaration(GenericTransform), []);
-  typeArguments(predicateOfNum, [reflectClass(num)]);
-  typeArguments(transformOfString, [reflectClass(String)]);
-  typeArguments(transformOfR, [rFromC]);
-  typeArguments(transformOfDouble, [reflectClass(double)]);
-
-  Expect.isTrue(
-      reflectTypeDeclaration(NonGenericPredicate).isOriginalDeclaration);
-  Expect.isTrue(reflectTypeDeclaration(GenericPredicate).isOriginalDeclaration);
-  Expect.isTrue(reflectTypeDeclaration(GenericTransform).isOriginalDeclaration);
-  Expect.isFalse(predicateOfNum.isOriginalDeclaration);
-  Expect.isFalse(transformOfString.isOriginalDeclaration);
-  Expect.isFalse(transformOfR.isOriginalDeclaration);
-  Expect.isFalse(transformOfDouble.isOriginalDeclaration);
-
-  // Function types.
-  typeParameters(reflectTypeDeclaration(NonGenericPredicate).referent, []);
-  typeParameters(reflectTypeDeclaration(GenericPredicate).referent, []);
-  typeParameters(reflectTypeDeclaration(GenericTransform).referent, []);
-  typeParameters(predicateOfNum.referent, []);
-  typeParameters(transformOfString.referent, []);
-  typeParameters(transformOfR.referent, []);
-  typeParameters(transformOfDouble.referent, []);
-
-  typeArguments(reflectTypeDeclaration(NonGenericPredicate).referent, []);
-  typeArguments(reflectTypeDeclaration(GenericPredicate).referent, []);
-  typeArguments(reflectTypeDeclaration(GenericTransform).referent, []);
-  typeArguments(predicateOfNum.referent, []);
-  typeArguments(transformOfString.referent, []);
-  typeArguments(transformOfR.referent, []);
-  typeArguments(transformOfDouble.referent, []);
-
-  // Function types are always non-generic. Only the typedef is generic.
-  Expect.isTrue(reflectTypeDeclaration(NonGenericPredicate)
-      .referent
-      .isOriginalDeclaration);
-  Expect.isTrue(
-      reflectTypeDeclaration(GenericPredicate).referent.isOriginalDeclaration);
-  Expect.isTrue(
-      reflectTypeDeclaration(GenericTransform).referent.isOriginalDeclaration);
-  Expect.isTrue(predicateOfNum.referent.isOriginalDeclaration);
-  Expect.isTrue(transformOfString.referent.isOriginalDeclaration);
-  Expect.isTrue(transformOfR.referent.isOriginalDeclaration);
-  Expect.isTrue(transformOfDouble.referent.isOriginalDeclaration);
-
-  Expect.equals(reflectClass(num),
-      reflectTypeDeclaration(NonGenericPredicate).referent.parameters[0].type);
-  Expect.equals(tFromGenericPredicate,
-      reflectTypeDeclaration(GenericPredicate).referent.parameters[0].type);
-  Expect.equals(sFromGenericTransform,
-      reflectTypeDeclaration(GenericTransform).referent.parameters[0].type);
-
-  Expect.equals(reflectClass(num), predicateOfNum.referent.parameters[0].type);
-  Expect.equals(
-      reflectClass(String), transformOfString.referent.parameters[0].type);
-  Expect.equals(rFromC, transformOfR.referent.parameters[0].type);
-  Expect.equals(
-      reflectClass(double), transformOfDouble.referent.parameters[0].type);
-
-  Expect.equals(reflectClass(bool),
-      reflectTypeDeclaration(NonGenericPredicate).referent.returnType);
-  Expect.equals(reflectClass(bool),
-      reflectTypeDeclaration(GenericPredicate).referent.returnType);
-  Expect.equals(sFromGenericTransform,
-      reflectTypeDeclaration(GenericTransform).referent.returnType);
-  Expect.equals(reflectClass(bool), predicateOfNum.referent.returnType);
-  Expect.equals(reflectClass(String), transformOfString.referent.returnType);
-  Expect.equals(rFromC, transformOfR.referent.returnType);
-  Expect.equals(reflectClass(double), transformOfDouble.referent.returnType);
-}
diff --git a/tests/lib_strong/mirrors/generic_interface_test.dart b/tests/lib_strong/mirrors/generic_interface_test.dart
deleted file mode 100644
index 053569c..0000000
--- a/tests/lib_strong/mirrors/generic_interface_test.dart
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.generic_bounded;
-
-import 'dart:mirrors';
-
-import 'package:expect/expect.dart';
-
-import 'generics_helper.dart';
-
-class Interface<T> {}
-
-class Bounded<S extends num> {}
-
-class Fixed implements Interface<int> {}
-
-class Generic<R> implements Interface<R> {}
-
-class Bienbounded implements Bounded<int> {}
-
-class Malbounded implements Bounded<String> {} // //# 01: static type warning
-class FBounded implements Interface<FBounded> {}
-
-class Mixin {}
-
-class FixedMixinApplication = Object with Mixin implements Interface<int>;
-class GenericMixinApplication<X> = Object with Mixin implements Interface<X>;
-
-class FixedClass extends Object with Mixin implements Interface<int> {}
-
-class GenericClass<Y> extends Object with Mixin implements Interface<Y> {}
-
-main() {
-  TypeMirror dynamicMirror = currentMirrorSystem().dynamicType;
-
-  ClassMirror interfaceDecl = reflectClass(Interface);
-  ClassMirror boundedDecl = reflectClass(Bounded);
-
-  ClassMirror interfaceOfInt = reflectClass(Fixed).superinterfaces.single;
-  ClassMirror interfaceOfR = reflectClass(Generic).superinterfaces.single;
-  ClassMirror interfaceOfBool =
-      reflect(new Generic<bool>()).type.superinterfaces.single;
-
-  ClassMirror boundedOfInt = reflectClass(Bienbounded).superinterfaces.single;
-  ClassMirror boundedOfString = reflectClass(Malbounded).superinterfaces.single; // //# 01: continued
-  ClassMirror interfaceOfFBounded =
-      reflectClass(FBounded).superinterfaces.single;
-
-  ClassMirror interfaceOfInt2 =
-      reflectClass(FixedMixinApplication).superinterfaces.single;
-  ClassMirror interfaceOfX =
-      reflectClass(GenericMixinApplication).superinterfaces.single;
-  ClassMirror interfaceOfDouble = reflect(new GenericMixinApplication<double>())
-      .type
-      .superinterfaces
-      .single;
-  ClassMirror interfaceOfInt3 = reflectClass(FixedClass).superinterfaces.single;
-  ClassMirror interfaceOfY = reflectClass(GenericClass).superinterfaces.single;
-  ClassMirror interfaceOfDouble2 =
-      reflect(new GenericClass<double>()).type.superinterfaces.single;
-
-  Expect.isTrue(interfaceDecl.isOriginalDeclaration);
-  Expect.isTrue(boundedDecl.isOriginalDeclaration);
-
-  Expect.isFalse(interfaceOfInt.isOriginalDeclaration);
-  Expect.isFalse(interfaceOfR.isOriginalDeclaration);
-  Expect.isFalse(interfaceOfBool.isOriginalDeclaration);
-  Expect.isFalse(boundedOfInt.isOriginalDeclaration);
-  Expect.isFalse(boundedOfString.isOriginalDeclaration); // //# 01: continued
-  Expect.isFalse(interfaceOfFBounded.isOriginalDeclaration);
-  Expect.isFalse(interfaceOfInt2.isOriginalDeclaration);
-  Expect.isFalse(interfaceOfX.isOriginalDeclaration);
-  Expect.isFalse(interfaceOfDouble.isOriginalDeclaration);
-  Expect.isFalse(interfaceOfInt3.isOriginalDeclaration);
-  Expect.isFalse(interfaceOfY.isOriginalDeclaration);
-  Expect.isFalse(interfaceOfDouble2.isOriginalDeclaration);
-
-  TypeVariableMirror tFromInterface = interfaceDecl.typeVariables.single;
-  TypeVariableMirror sFromBounded = boundedDecl.typeVariables.single;
-  TypeVariableMirror rFromGeneric = reflectClass(Generic).typeVariables.single;
-  TypeVariableMirror xFromGenericMixinApplication =
-      reflectClass(GenericMixinApplication).typeVariables.single;
-  TypeVariableMirror yFromGenericClass =
-      reflectClass(GenericClass).typeVariables.single;
-
-  Expect.equals(reflectClass(Object), tFromInterface.upperBound);
-  Expect.equals(reflectClass(num), sFromBounded.upperBound);
-  Expect.equals(reflectClass(Object), rFromGeneric.upperBound);
-  Expect.equals(reflectClass(Object), xFromGenericMixinApplication.upperBound);
-  Expect.equals(reflectClass(Object), yFromGenericClass.upperBound);
-
-  typeParameters(interfaceDecl, [#T]);
-  typeParameters(boundedDecl, [#S]);
-  typeParameters(interfaceOfInt, [#T]);
-  typeParameters(interfaceOfR, [#T]);
-  typeParameters(interfaceOfBool, [#T]);
-  typeParameters(boundedOfInt, [#S]);
-  typeParameters(boundedOfString, [#S]); // //# 01: continued
-  typeParameters(interfaceOfFBounded, [#T]);
-  typeParameters(interfaceOfInt2, [#T]);
-  typeParameters(interfaceOfX, [#T]);
-  typeParameters(interfaceOfDouble, [#T]);
-  typeParameters(interfaceOfInt3, [#T]);
-  typeParameters(interfaceOfY, [#T]);
-  typeParameters(interfaceOfDouble2, [#T]);
-
-  typeArguments(interfaceDecl, []);
-  typeArguments(boundedDecl, []);
-  typeArguments(interfaceOfInt, [reflectClass(int)]);
-  typeArguments(interfaceOfR, [rFromGeneric]);
-  typeArguments(interfaceOfBool, [reflectClass(bool)]);
-  typeArguments(boundedOfInt, [reflectClass(int)]);
-  typeArguments(boundedOfString, [reflectClass(String)]); // //# 01: continued
-  typeArguments(interfaceOfFBounded, [reflectClass(FBounded)]);
-  typeArguments(interfaceOfInt2, [reflectClass(int)]);
-  typeArguments(interfaceOfX, [xFromGenericMixinApplication]);
-  typeArguments(interfaceOfDouble, [reflectClass(double)]);
-  typeArguments(interfaceOfInt3, [reflectClass(int)]);
-  typeArguments(interfaceOfY, [yFromGenericClass]);
-  typeArguments(interfaceOfDouble2, [reflectClass(double)]);
-}
diff --git a/tests/lib_strong/mirrors/generics_helper.dart b/tests/lib_strong/mirrors/generics_helper.dart
deleted file mode 100644
index da10962..0000000
--- a/tests/lib_strong/mirrors/generics_helper.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library generics_helper;
-
-import 'package:expect/expect.dart';
-
-typeParameters(mirror, parameterNames) {
-  Expect.listEquals(
-      parameterNames, mirror.typeVariables.map((v) => v.simpleName).toList());
-}
-
-typeArguments(mirror, argumentMirrors) {
-  Expect.listEquals(argumentMirrors, mirror.typeArguments);
-}
diff --git a/tests/lib_strong/mirrors/library_with_annotated_declaration.dart b/tests/lib_strong/mirrors/library_with_annotated_declaration.dart
deleted file mode 100644
index 07a498b..0000000
--- a/tests/lib_strong/mirrors/library_with_annotated_declaration.dart
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-@metadata
-library library_with_annotated_declaration;
-
-const metadata = 'metadata';
-
-class ClassInLibraryWithAnnotatedDeclaration {}
diff --git a/tests/lib_strong/mirrors/library_without_declaration.dart b/tests/lib_strong/mirrors/library_without_declaration.dart
deleted file mode 100644
index d9e1fe4..0000000
--- a/tests/lib_strong/mirrors/library_without_declaration.dart
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// NO LIBRARY DECLARATION
-
-class ClassInLibraryWithoutDeclaration {}
diff --git a/tests/lib_strong/mirrors/metadata_test.dart b/tests/lib_strong/mirrors/metadata_test.dart
deleted file mode 100644
index 2fe04fa..0000000
--- a/tests/lib_strong/mirrors/metadata_test.dart
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.metadata_test;
-
-import 'dart:mirrors';
-
-const string = 'a metadata string';
-
-const symbol = const Symbol('symbol');
-
-const hest = 'hest';
-
-@symbol
-@string
-class MyClass {
-  @hest
-  @hest
-  @symbol
-  var x;
-  var y;
-
-  @string
-  @symbol
-  @string
-  myMethod() => 1;
-  myOtherMethod() => 2;
-}
-
-checkMetadata(DeclarationMirror mirror, List expectedMetadata) {
-  List metadata = mirror.metadata.map((m) => m.reflectee).toList();
-  if (metadata == null) {
-    throw 'Null metadata on $mirror';
-  }
-  int expectedLength = expectedMetadata.length;
-  int actualLength = metadata.length;
-  if (expectedLength != actualLength) {
-    throw 'Expected length = $expectedLength, but got length = $actualLength.';
-  }
-  for (int i = 0; i < expectedLength; i++) {
-    if (metadata[i] != expectedMetadata[i]) {
-      throw '${metadata[i]} is not "${expectedMetadata[i]}"'
-          ' in $mirror at index $i';
-    }
-  }
-  print(metadata);
-}
-
-@symbol
-@string
-@symbol
-main() {
-  if (MirrorSystem.getName(symbol) != 'symbol') {
-    // This happened in dart2js due to how early library metadata is
-    // computed.
-    throw 'Bad constant: $symbol';
-  }
-
-  MirrorSystem mirrors = currentMirrorSystem();
-  ClassMirror myClassMirror = reflectClass(MyClass);
-  checkMetadata(myClassMirror, [symbol, string]);
-  LibraryMirror lib = mirrors.findLibrary(#test.metadata_test);
-  MethodMirror function = lib.declarations[#main];
-  checkMetadata(function, [symbol, string, symbol]);
-  MethodMirror method = myClassMirror.declarations[#myMethod];
-  checkMetadata(method, [string, symbol, string]);
-  method = myClassMirror.declarations[#myOtherMethod];
-  checkMetadata(method, []);
-
-  VariableMirror xMirror = myClassMirror.declarations[#x];
-  checkMetadata(xMirror, [hest, hest, symbol]);
-
-  VariableMirror yMirror = myClassMirror.declarations[#y];
-  checkMetadata(yMirror, []);
-
-  // TODO(ahe): Test local functions.
-}
diff --git a/tests/lib_strong/mirrors/mirrors_test.dart b/tests/lib_strong/mirrors/mirrors_test.dart
deleted file mode 100644
index ccd6f50..0000000
--- a/tests/lib_strong/mirrors/mirrors_test.dart
+++ /dev/null
@@ -1,247 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library MirrorsTest;
-
-import 'dart:mirrors';
-
-import '../../light_unittest.dart';
-
-bool isDart2js = false; // TODO(ahe): Remove this field.
-
-var topLevelField;
-u(a, b, c) => {"a": a, "b": b, "c": c};
-_v(a, b) => a + b;
-
-class Class<T> {
-  Class() {
-    this.field = "default value";
-  }
-  Class.withInitialValue(this.field);
-  var field;
-
-  Class.generative(this.field);
-  Class.redirecting(y) : this.generative(y * 2);
-  factory Class.faktory(y) => new Class.withInitialValue(y * 3);
-  factory Class.redirectingFactory(y) = Class.faktory;
-
-  m(a, b, c) => {"a": a, "b": b, "c": c};
-  _n(a, b) => a + b;
-  noSuchMethod(invocation) => "DNU";
-
-  static var staticField;
-  static s(a, b, c) => {"a": a, "b": b, "c": c};
-  static _t(a, b) => a + b;
-}
-
-typedef Typedef();
-
-testInvoke(mirrors) {
-  var instance = new Class();
-  var instMirror = reflect(instance);
-
-  expect(instMirror.invoke(#m, ['A', 'B', instance]).reflectee,
-      equals({"a": 'A', "b": 'B', "c": instance}));
-  expect(instMirror.invoke(#notDefined, []).reflectee, equals("DNU"));
-  expect(instMirror.invoke(#m, []).reflectee, equals("DNU")); // Wrong arity.
-
-  var classMirror = instMirror.type;
-  expect(classMirror.invoke(#s, ['A', 'B', instance]).reflectee,
-      equals({"a": 'A', "b": 'B', "c": instance}));
-  expect(() => classMirror.invoke(#notDefined, []).reflectee, throws);
-  expect(() => classMirror.invoke(#s, []).reflectee, throws); // Wrong arity.
-
-  var libMirror = classMirror.owner;
-  expect(libMirror.invoke(#u, ['A', 'B', instance]).reflectee,
-      equals({"a": 'A', "b": 'B', "c": instance}));
-  expect(() => libMirror.invoke(#notDefined, []).reflectee, throws);
-  expect(() => libMirror.invoke(#u, []).reflectee, throws); // Wrong arity.
-}
-
-/// In dart2js, lists, numbers, and other objects are treated special
-/// and their methods are invoked through a techique called interceptors.
-testIntercepted(mirrors) {
-  var instance = 1;
-  var instMirror = reflect(instance);
-
-  expect(instMirror.invoke(#toString, []).reflectee, equals('1'));
-
-  instance = [];
-  instMirror = reflect(instance);
-  instMirror.setField(#length, 44);
-  var resultMirror = instMirror.getField(#length);
-  expect(resultMirror.reflectee, equals(44));
-  expect(instance.length, equals(44));
-
-  expect(
-      instMirror.invoke(#toString, []).reflectee,
-      equals('[null, null, null, null, null, null, null, null, null, null,'
-          ' null, null, null, null, null, null, null, null, null, null,'
-          ' null, null, null, null, null, null, null, null, null, null,'
-          ' null, null, null, null, null, null, null, null, null, null,'
-          ' null, null, null, null]'));
-}
-
-testFieldAccess(mirrors) {
-  var instance = new Class();
-
-  var libMirror = mirrors.findLibrary(#MirrorsTest);
-  var classMirror = libMirror.declarations[#Class];
-  var instMirror = reflect(instance);
-  var fieldMirror = classMirror.declarations[#field];
-  var future;
-
-  expect(fieldMirror is VariableMirror, isTrue);
-  expect(fieldMirror.type, equals(mirrors.dynamicType));
-
-  libMirror.setField(#topLevelField, [91]);
-  expect(libMirror.getField(#topLevelField).reflectee, equals([91]));
-  expect(topLevelField, equals([91]));
-}
-
-testClosureMirrors(mirrors) {
-  // TODO(ahe): Test optional parameters (named or not).
-  var closure = (x, y, z) {
-    return x + y + z;
-  };
-
-  var mirror = reflect(closure);
-  expect(mirror is ClosureMirror, equals(true));
-
-  var funcMirror = mirror.function;
-  expect(funcMirror is MethodMirror, equals(true));
-  expect(funcMirror.parameters.length, equals(3));
-
-  expect(mirror.apply([7, 8, 9]).reflectee, equals(24));
-}
-
-testInvokeConstructor(mirrors) {
-  var classMirror = reflectClass(Class);
-
-  var instanceMirror = classMirror.newInstance(const Symbol(''), []);
-  expect(instanceMirror.reflectee is Class, equals(true));
-  expect(instanceMirror.reflectee.field, equals("default value"));
-
-  instanceMirror = classMirror.newInstance(#withInitialValue, [45]);
-  expect(instanceMirror.reflectee is Class, equals(true));
-  expect(instanceMirror.reflectee.field, equals(45));
-
-  instanceMirror = classMirror.newInstance(#generative, [7]);
-  expect(instanceMirror.reflectee is Class, equals(true));
-  expect(instanceMirror.reflectee.field, equals(7));
-
-  instanceMirror = classMirror.newInstance(#redirecting, [8]);
-  expect(instanceMirror.reflectee is Class, equals(true));
-  expect(instanceMirror.reflectee.field, equals(16));
-
-  instanceMirror = classMirror.newInstance(#faktory, [9]);
-  expect(instanceMirror.reflectee is Class, equals(true));
-  expect(instanceMirror.reflectee.field, equals(27));
-
-  instanceMirror = classMirror.newInstance(#redirectingFactory, [10]);
-  expect(instanceMirror.reflectee is Class, equals(true));
-  expect(instanceMirror.reflectee.field, equals(30));
-}
-
-testReflectClass(mirrors) {
-  var classMirror = reflectClass(Class);
-  expect(classMirror is ClassMirror, equals(true));
-  var symbolClassMirror = reflectClass(Symbol);
-  var symbolMirror =
-      symbolClassMirror.newInstance(const Symbol(''), ['withInitialValue']);
-  var objectMirror = classMirror.newInstance(symbolMirror.reflectee, [1234]);
-  expect(objectMirror.reflectee is Class, equals(true));
-  expect(objectMirror.reflectee.field, equals(1234));
-}
-
-testNames(mirrors) {
-  var libMirror = mirrors.findLibrary(#MirrorsTest);
-  var classMirror = libMirror.declarations[#Class];
-  var typedefMirror = libMirror.declarations[#Typedef];
-  var methodMirror = libMirror.declarations[#testNames];
-  var variableMirror = classMirror.declarations[#field];
-
-  expect(libMirror.simpleName, equals(#MirrorsTest));
-  expect(libMirror.qualifiedName, equals(#MirrorsTest));
-
-  expect(classMirror.simpleName, equals(#Class));
-  expect(classMirror.qualifiedName, equals(#MirrorsTest.Class));
-
-  TypeVariableMirror typeVariable = classMirror.typeVariables.single;
-  expect(typeVariable.simpleName, equals(#T));
-  expect(
-      typeVariable.qualifiedName, equals(const Symbol('MirrorsTest.Class.T')));
-
-  if (!isDart2js) {
-    // TODO(ahe): Implement this in dart2js.
-    expect(typedefMirror.simpleName, equals(#Typedef));
-    expect(typedefMirror.qualifiedName,
-        equals(const Symbol('MirrorsTest.Typedef')));
-
-    var typedefMirrorDeNovo = reflectType(Typedef);
-    expect(typedefMirrorDeNovo.simpleName, equals(#Typedef));
-    expect(typedefMirrorDeNovo.qualifiedName,
-        equals(const Symbol('MirrorsTest.Typedef')));
-  }
-
-  expect(methodMirror.simpleName, equals(#testNames));
-  expect(methodMirror.qualifiedName,
-      equals(const Symbol('MirrorsTest.testNames')));
-
-  expect(variableMirror.simpleName, equals(#field));
-  expect(variableMirror.qualifiedName,
-      equals(const Symbol('MirrorsTest.Class.field')));
-}
-
-testLibraryUri(var value, bool check(Uri)) {
-  var valueMirror = reflect(value);
-  ClassMirror valueClass = valueMirror.type;
-  LibraryMirror valueLibrary = valueClass.owner;
-  Uri uri = valueLibrary.uri;
-  if (uri.scheme != "https" ||
-      uri.host != "dartlang.org" ||
-      uri.path != "/dart2js-stripped-uri") {
-    expect(check(uri), isTrue);
-  }
-}
-
-main() {
-  var mirrors = currentMirrorSystem();
-  test("Test reflective method invocation", () {
-    testInvoke(mirrors);
-  });
-  test('Test intercepted objects', () {
-    testIntercepted(mirrors);
-  });
-  test("Test field access", () {
-    testFieldAccess(mirrors);
-  });
-  test("Test closure mirrors", () {
-    testClosureMirrors(mirrors);
-  });
-  test("Test invoke constructor", () {
-    testInvokeConstructor(mirrors);
-  });
-  test("Test current library uri", () {
-    testLibraryUri(
-        new Class(),
-        // TODO(floitsch): change this to "/mirrors_test.dart" when
-        // dart2js_mirrors_test.dart has been removed.
-        (Uri uri) => uri.path.endsWith('mirrors_test.dart'));
-  });
-  test("Test dart library uri", () {
-    testLibraryUri("test", (Uri uri) {
-      if (uri == Uri.parse('dart:core')) return true;
-      // TODO(floitsch): do we want to fake the interceptors to
-      // be in dart:core?
-      return (uri == Uri.parse('dart:_interceptors'));
-    });
-  });
-  test("Test simple and qualifiedName", () {
-    testNames(mirrors);
-  });
-  test("Test reflect type", () {
-    testReflectClass(mirrors);
-  });
-}
diff --git a/tests/lib_strong/mirrors/stringify.dart b/tests/lib_strong/mirrors/stringify.dart
deleted file mode 100644
index 9047c9a..0000000
--- a/tests/lib_strong/mirrors/stringify.dart
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Helper methods for converting a [Mirror] to a [String].
-library test.stringify;
-
-import 'dart:mirrors';
-
-import 'package:expect/expect.dart';
-
-name(DeclarationMirror mirror) {
-  return (mirror == null) ? '<null>' : stringify(mirror.simpleName);
-}
-
-stringifyMap(Map map) {
-  var buffer = new StringBuffer();
-  bool first = true;
-  for (String key in map.keys.map(MirrorSystem.getName).toList()..sort()) {
-    if (!first) buffer.write(', ');
-    first = false;
-    buffer.write(key);
-    buffer.write(': ');
-    buffer.write(stringify(map[new Symbol(key)]));
-  }
-  return '{$buffer}';
-}
-
-stringifyIterable(Iterable list) {
-  var buffer = new StringBuffer();
-  bool first = true;
-  for (String value in list.map(stringify)) {
-    if (!first) buffer.write(', ');
-    first = false;
-    buffer.write(value);
-  }
-  return '[$buffer]';
-}
-
-stringifyInstance(InstanceMirror instance) {
-  var buffer = new StringBuffer();
-  if (instance.hasReflectee) {
-    buffer.write('value = ${stringify(instance.reflectee)}');
-  }
-  return 'Instance(${buffer})';
-}
-
-stringifySymbol(Symbol symbol) => 's(${MirrorSystem.getName(symbol)})';
-
-writeDeclarationOn(DeclarationMirror mirror, StringBuffer buffer) {
-  buffer.write(stringify(mirror.simpleName));
-  if (mirror.owner != null) {
-    buffer.write(' in ');
-    buffer.write(name(mirror.owner));
-  }
-  if (mirror.isPrivate) buffer.write(', private');
-  if (mirror.isTopLevel) buffer.write(', top-level');
-}
-
-writeVariableOn(VariableMirror variable, StringBuffer buffer) {
-  writeDeclarationOn(variable, buffer);
-  if (variable.isStatic) buffer.write(', static');
-  if (variable.isFinal) buffer.write(', final');
-}
-
-stringifyVariable(VariableMirror variable) {
-  var buffer = new StringBuffer();
-  writeVariableOn(variable, buffer);
-  return 'Variable($buffer)';
-}
-
-stringifyParameter(ParameterMirror parameter) {
-  var buffer = new StringBuffer();
-  writeVariableOn(parameter, buffer);
-  if (parameter.isOptional) buffer.write(', optional');
-  if (parameter.isNamed) buffer.write(', named');
-  // TODO(6490): dart2js always returns false for hasDefaultValue.
-  if (parameter.hasDefaultValue) {
-    buffer.write(', value = ${stringify(parameter.defaultValue)}');
-  }
-  // TODO(ahe): Move to writeVariableOn.
-  buffer.write(', type = ${stringify(parameter.type)}');
-  return 'Parameter($buffer)';
-}
-
-stringifyTypeVariable(TypeVariableMirror typeVariable) {
-  var buffer = new StringBuffer();
-  writeDeclarationOn(typeVariable, buffer);
-  buffer.write(', upperBound = ${stringify(typeVariable.upperBound)}');
-  return 'TypeVariable($buffer)';
-}
-
-stringifyType(TypeMirror type) {
-  var buffer = new StringBuffer();
-  writeDeclarationOn(type, buffer);
-  return 'Type($buffer)';
-}
-
-stringifyClass(ClassMirror cls) {
-  var buffer = new StringBuffer();
-  writeDeclarationOn(cls, buffer);
-  return 'Class($buffer)';
-}
-
-stringifyMethod(MethodMirror method) {
-  var buffer = new StringBuffer();
-  writeDeclarationOn(method, buffer);
-  if (method.isAbstract) buffer.write(', abstract');
-  if (method.isSynthetic) buffer.write(', synthetic');
-  if (method.isStatic) buffer.write(', static');
-  if (method.isGetter) buffer.write(', getter');
-  if (method.isSetter) buffer.write(', setter');
-  if (method.isConstructor) buffer.write(', constructor');
-  return 'Method($buffer)';
-}
-
-stringifyDependencies(LibraryMirror l) {
-  n(s) => s is Symbol ? MirrorSystem.getName(s) : s;
-  compareDep(a, b) {
-    if (a.targetLibrary == b.targetLibrary) {
-      if ((a.prefix != null) && (b.prefix != null)) {
-        return n(a.prefix).compareTo(n(b.prefix));
-      }
-      return a.prefix == null ? 1 : -1;
-    }
-    return n(a.targetLibrary.simpleName)
-        .compareTo(n(b.targetLibrary.simpleName));
-  }
-
-  compareCom(a, b) => n(a.identifier).compareTo(n(b.identifier));
-  compareFirst(a, b) => a[0].compareTo(b[0]);
-  sortBy(c, p) => new List.from(c)..sort(p);
-
-  var buffer = new StringBuffer();
-  sortBy(l.libraryDependencies, compareDep).forEach((dep) {
-    if (dep.isImport) buffer.write('import ');
-    if (dep.isExport) buffer.write('export ');
-    buffer.write(n(dep.targetLibrary.simpleName));
-    if (dep.isDeferred) buffer.write(' deferred');
-    if (dep.prefix != null) buffer.write(' as ${n(dep.prefix)}');
-    buffer.write('\n');
-
-    List flattenedCombinators = new List();
-    dep.combinators.forEach((com) {
-      com.identifiers.forEach((ident) {
-        flattenedCombinators.add([n(ident), com.isShow, com.isHide]);
-      });
-    });
-    sortBy(flattenedCombinators, compareFirst).forEach((triple) {
-      buffer.write(' ');
-      if (triple[1]) buffer.write('show ');
-      if (triple[2]) buffer.write('hide ');
-      buffer.write(triple[0]);
-      buffer.write('\n');
-    });
-  });
-  return buffer.toString();
-}
-
-stringify(value) {
-  if (value is Map) return stringifyMap(value);
-  if (value is Iterable) return stringifyIterable(value);
-  if (value is InstanceMirror) return stringifyInstance(value);
-  if (value is ParameterMirror) return stringifyParameter(value);
-  if (value is VariableMirror) return stringifyVariable(value);
-  if (value is MethodMirror) return stringifyMethod(value);
-  if (value is num) return value.toString();
-  if (value is String) return value;
-  if (value is Symbol) return stringifySymbol(value);
-  if (value is ClassMirror) return stringifyClass(value);
-  if (value is TypeVariableMirror) return stringifyTypeVariable(value);
-  if (value is TypeMirror) return stringifyType(value);
-  if (value == null) return '<null>';
-  throw 'Unexpected value: $value';
-}
-
-expect(expected, actual, [String reason]) {
-  Expect.stringEquals(expected, stringify(actual), reason);
-}
-
-compareSymbols(Symbol a, Symbol b) {
-  return MirrorSystem.getName(a).compareTo(MirrorSystem.getName(b));
-}
-
-simpleNames(Iterable<Mirror> i) => i.map((e) => e.simpleName);
-
-sort(Iterable<Symbol> symbols) => symbols.toList()..sort(compareSymbols);
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index b863bd1..44429ad 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -16,11 +16,6 @@
 io/raw_secure_server_socket_argument_test: StaticWarning
 io/stdout_bad_argument_test: StaticWarning
 
-[ $compiler == dartkp ]
-dwarf_stack_trace_test: RuntimeError
-io/https_bad_certificate_test: Skip # Flaky.
-io/raw_datagram_socket_test: Skip # Flaky.
-
 # Overriding these flags are not supported in product mode.
 [ $mode == product ]
 verbose_gc_to_bmu_test: SkipByDesign # No verbose_gc in product mode
@@ -74,8 +69,10 @@
 [ $compiler == dart2js || $compiler == dartdevc ]
 *: SkipByDesign
 
+# We skip all the Dart 1.0 tests in dartk and dartkp mode as these
+# modes are intended only for Dart 2.0 with strong mode enabled.
 [ $compiler == dartk || $compiler == dartkp ]
-io/raw_datagram_socket_test: Skip # Flaky.
+*: Skip
 
 [ $compiler != none || $runtime != vm ]
 script_snapshot_depfile_test: SkipByDesign # Only makes sense running from source.
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index c65cb4b..1b4afc1 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -65,6 +65,25 @@
 regress_29350_test: MissingCompileTimeError
 regress_29350_test/none: Pass # Issue 31537
 
+# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
+# are to be triaged.  Isolate tests are skipped on purpose due to the usage of
+# batch mode.
+[ $compiler == dartk && $strong && ($arch == simarm || $arch == simarm64) ]
+bytedata_test: CompileTimeError # Please triage.
+map_insert_remove_oom_test: Pass # Please triage.
+package/scenarios/invalid/invalid_utf8_test: Pass # Please triage.
+package/scenarios/invalid/non_existent_packages_file_test: Pass # Please triage.
+package/scenarios/packages_file_strange_formatting/empty_lines_test: CompileTimeError # Please triage.
+package/scenarios/packages_file_strange_formatting/mixed_line_ends_test: CompileTimeError # Please triage.
+package/scenarios/packages_option_only/packages_option_only_test: CompileTimeError # Please triage.
+regress_26031_test: RuntimeError # Please triage.
+regress_28854_1_test: RuntimeError # Please triage.
+regress_28854_2_test: RuntimeError # Please triage.
+typed_array_int64_uint64_test: CompileTimeError # Please triage.
+typed_array_test: RuntimeError # Please triage.
+typed_data_isolate_test: RuntimeError # Please triage.
+typed_data_view_test: CompileTimeError # Please triage.
+
 # ===== Skip dartk and darkp in !$strong mode ====
 [ $compiler == dartk && !$strong ]
 *: SkipByDesign
diff --git a/tools/VERSION b/tools/VERSION
index 17092b6..508d185 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 0
 PATCH 0
-PRERELEASE 12
+PRERELEASE 13
 PRERELEASE_PATCH 0
diff --git a/tools/bots/dart2js_d8_hostchecked_tests.isolate b/tools/bots/dart2js_d8_hostchecked_tests.isolate
index 9be6fb1..5b5db4d 100644
--- a/tools/bots/dart2js_d8_hostchecked_tests.isolate
+++ b/tools/bots/dart2js_d8_hostchecked_tests.isolate
@@ -14,6 +14,7 @@
               'tests/',
               'pkg/async_helper/',
               'pkg/compiler/',
+              'pkg/dart_internal/',
               'pkg/expect/',
               'pkg/front_end/',
               'pkg/js/',
diff --git a/tools/bots/dart_tests.isolate b/tools/bots/dart_tests.isolate
index bd529b6..5f635b6 100644
--- a/tools/bots/dart_tests.isolate
+++ b/tools/bots/dart_tests.isolate
@@ -15,6 +15,7 @@
               'tests/',
               'pkg/async_helper/',
               'pkg/browser/',
+              'pkg/dart_internal/',
               'pkg/expect/',
               'pkg/js/',
               'pkg/meta/',
diff --git a/tools/bots/ddc_tests.py b/tools/bots/ddc_tests.py
index 94ea237..e00602b 100644
--- a/tools/bots/ddc_tests.py
+++ b/tools/bots/ddc_tests.py
@@ -16,9 +16,7 @@
 TARGETS = [
   'language_2',
   'corelib_2',
-  'lib_2',
-  # TODO(rnystrom): Remove this when all tests have been migrated out.
-  'lib_strong'
+  'lib_2'
 ]
 
 FLAGS = [
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index c8b4c40..6e5f830 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -254,6 +254,77 @@
     },
     {
       "builders": [
+        "vm-kernel-linux-debug-simdbc64",
+        "vm-kernel-linux-release-simarm",
+        "vm-kernel-linux-release-simarm64",
+        "vm-kernel-linux-release-simdbc64"
+      ],
+      "meta": {
+        "description": "This configuration is used by the simarm/simdbc vm kernel builders."
+      },
+      "steps": [
+        {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": ["runtime_kernel"]
+        },
+        {
+          "name": "dartk tests",
+          "arguments": ["-cdartk"]
+        },
+        {
+          "name": "dartk strong tests",
+          "arguments": [
+            "-cdartk",
+            "--strong",
+            "language_2",
+            "corelib_2",
+            "lib_2",
+            "standalone_2"
+          ]
+        }
+      ]
+    },
+    {
+      "builders": [
+        "vm-kernel-precomp-linux-release-simarm",
+        "vm-kernel-precomp-linux-release-simarm64"
+      ],
+      "meta": {
+        "description": "This configuration is used by the simarm vm kernel precomp release builders."
+      },
+      "steps": [
+        {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": [
+            "runtime_kernel",
+            "dart_precompiled_runtime"
+          ]
+        },
+        {
+          "name": "dartk tests",
+          "arguments": [
+            "-cdartk",
+            "-rdart_precompiled"
+          ]
+        },
+        {
+          "name": "dartk strong tests",
+          "arguments": [
+            "-cdartk",
+            "-rdart_precompiled",
+            "--strong",
+            "language_2",
+            "corelib_2",
+            "lib_2",
+            "standalone_2"
+          ]
+        }
+      ]
+    },
+    {
+      "builders": [
         "vm-kernel-linux-debug-x64",
         "vm-kernel-linux-release-x64",
         "vm-kernel-mac-debug-x64",
@@ -310,8 +381,8 @@
     },
     {
       "builders": [
-        "ddc-linux-release",
-        "ddc-win-release"
+        "ddc-linux-release-chrome",
+        "ddc-win-release-chrome"
       ],
       "meta": {
         "description": "This configuration is used by the ddc builder group."
@@ -326,21 +397,18 @@
           "name": "ddc tests",
           "arguments": [
             "-cdartdevc",
-            "-rchrome",
             "--checked",
             "--strong",
             "--use-sdk",
             "language_2",
             "corelib_2",
-            "lib_2",
-            "lib_strong"
+            "lib_2"
           ]
         },
         {
           "name": "ddc kernel tests",
           "arguments": [
             "-cdartdevk",
-            "-rchrome",
             "--checked",
             "--strong",
             "--use-sdk",
@@ -351,35 +419,39 @@
           "name": "ddc sourcemap tests",
           "script": "out/ReleaseX64/dart",
           "arguments": [
-            "pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart"
+            "pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart",
+            "-rnone"
           ]
         },
         {
           "name": "ddk sourcemap tests",
           "script": "out/ReleaseX64/dart",
           "arguments": [
-            "pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart"
+            "pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart",
+            "-rnone"
           ]
         },
         {
           "name": "ddc sourcemap stacktrace tests",
           "script": "out/ReleaseX64/dart",
           "arguments": [
-            "pkg/dev_compiler/test/sourcemap/stacktrace_ddc_suite.dart"
+            "pkg/dev_compiler/test/sourcemap/stacktrace_ddc_suite.dart",
+            "-rnone"
           ]
         },
         {
           "name": "ddk sourcemap stacktrace tests",
           "script": "out/ReleaseX64/dart",
           "arguments": [
-            "pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart"
+            "pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart",
+            "-rnone"
           ]
         }
       ]
     },
     {
       "builders": [
-        "ddc-mac-release"
+        "ddc-mac-release-chrome"
       ],
       "meta": {
         "description": "This configuration is used by the ddc builder group."
@@ -394,7 +466,6 @@
           "name": "ddc tests",
           "arguments": [
             "-cdartdevc",
-            "-rchrome",
             "--checked",
             "--strong",
             "--use-sdk",
@@ -408,7 +479,6 @@
           "name": "ddc kernel tests",
           "arguments": [
             "-cdartdevk",
-            "-rchrome",
             "--checked",
             "--strong",
             "--use-sdk",
@@ -419,28 +489,32 @@
           "name": "ddc sourcemap tests",
           "script": "out/xcodebuild/dart",
           "arguments": [
-            "pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart"
+            "pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart",
+            "-rnone"
           ]
         },
         {
           "name": "ddk sourcemap tests",
           "script": "out/xcodebuild/dart",
           "arguments": [
-            "pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart"
+            "pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart",
+            "-rnone"
           ]
         },
         {
           "name": "ddc sourcemap stacktrace tests",
           "script": "out/xcodebuild/dart",
           "arguments": [
-            "pkg/dev_compiler/test/sourcemap/stacktrace_ddc_suite.dart"
+            "pkg/dev_compiler/test/sourcemap/stacktrace_ddc_suite.dart",
+            "-rnone"
           ]
         },
         {
           "name": "ddk sourcemap stacktrace tests",
           "script": "out/xcodebuild/dart",
           "arguments": [
-            "pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart"
+            "pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart",
+            "-rnone"
           ]
         }
       ]
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index 53be964..10647b0 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -12,8 +12,9 @@
     TypeOrNothing, ConvertToFuture, GetCallbackInfo
 from copy import deepcopy
 from htmlrenamer import convert_to_future_members, custom_html_constructors, \
-    keep_overloaded_members, overloaded_and_renamed, private_html_members, \
-    renamed_html_members, renamed_overloads, removed_html_members
+    GetDDC_Extension, keep_overloaded_members, overloaded_and_renamed,\
+    private_html_members, renamed_html_members, renamed_overloads, \
+    removed_html_members
 from generator import TypeOrVar
 import logging
 import monitored
@@ -671,6 +672,12 @@
     callback_info = GetCallbackInfo(
         self._database.GetInterface(info.callback_args[0].type_id))
 
+    extensions = GetDDC_Extension(self._interface, info.declared_name)
+    if extensions:
+      ddc_extensions = "\n".join(extensions);
+    else:
+      ddc_extensions = ''
+
     param_list = info.ParametersAsArgumentList()
     metadata = ''
     if '_RenamingAnnotation' in dir(self):
@@ -682,6 +689,7 @@
         '    var completer = new Completer$(FUTURE_GENERIC)();\n'
         '    $ORIGINAL_FUNCTION($PARAMS_LIST\n'
         '        $NAMED_PARAM($VARIABLE_NAME) { '
+        '$DDC_EXTENSION\n'
         'completer.complete($VARIABLE_NAME); }'
         '$ERROR_CALLBACK);\n'
         '    return completer.future;\n'
@@ -697,6 +705,7 @@
             if info.requires_named_arguments and
               info.callback_args[0].is_optional else ''),
         VARIABLE_NAME= '' if len(callback_info.param_infos) == 0 else 'value',
+        DDC_EXTENSION=ddc_extensions,
         ERROR_CALLBACK=('' if len(info.callback_args) == 1 else
             (',\n        %s(error) { completer.completeError(error); }' %
             ('%s : ' % info.callback_args[1].name
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index c3f7a9d..ad6b9b2 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -198,6 +198,38 @@
   'WorkerGlobalScope.webkitResolveLocalFileSystemURL',
 ])
 
+# DDC Exposed Classes
+ddc_extensions = monitored.Dict('ddcextensions.ddc_extensions', {
+  'DirectoryEntry': {
+      'getFile': [
+          'applyExtension(\'FileEntry\', value);',
+      ]
+  },
+  'FileEntry': {
+      'createWriter': [
+          'applyExtension(\'FileWriter\', value);'
+      ],
+      'file': [
+          'applyExtension(\'Blob\', value);'
+      ]
+  },
+  'Window': {
+      'webkitRequestFileSystem':[
+          'applyExtension(\'DOMFileSystem\', value);',
+          'applyExtension(\'DirectoryEntry\', value.root);',
+      ]
+  },
+})
+
+# DDC Extension for this interface operation?
+def GetDDC_Extension(interface, operationName):
+  if interface.id in ddc_extensions:
+    entry = ddc_extensions[interface.id]
+    if operationName in entry:
+      return entry[operationName]
+  return None
+
+
 # Classes where we have customized constructors, but we need to keep the old
 # constructor for dispatch purposes.
 custom_html_constructors = monitored.Set(
diff --git a/tools/dom/src/dart2js_KeyEvent.dart b/tools/dom/src/dart2js_KeyEvent.dart
index b9c627b..92534a1a 100644
--- a/tools/dom/src/dart2js_KeyEvent.dart
+++ b/tools/dom/src/dart2js_KeyEvent.dart
@@ -104,61 +104,41 @@
     }
 
     var eventObj;
-    // In these two branches we create an underlying native KeyboardEvent, but
-    // we set it with our specified values. Because we are doing custom setting
-    // of certain values (charCode/keyCode, etc) only in this class (as opposed
-    // to KeyboardEvent) and the way we set these custom values depends on the
-    // type of underlying JS object, we do all the construction for the
-    // underlying KeyboardEvent here.
-    if (canUseDispatchEvent) {
-      // Currently works in everything but Internet Explorer.
-      eventObj = new Event.eventType('Event', type,
-          canBubble: canBubble, cancelable: cancelable);
 
-      JS('void', '#.keyCode = #', eventObj, keyCode);
-      JS('void', '#.which = #', eventObj, keyCode);
-      JS('void', '#.charCode = #', eventObj, charCode);
+    // Currently this works on everything but Safari. Safari throws an
+    // "Attempting to change access mechanism for an unconfigurable property"
+    // TypeError when trying to do the Object.defineProperty hack, so we avoid
+    // this branch if possible.
+    // Also, if we want this branch to work in FF, we also need to modify
+    // _initKeyboardEvent to also take charCode and keyCode values to
+    // initialize initKeyEvent.
 
-      JS('void', '#.location = #', eventObj, location);
-      JS('void', '#.ctrlKey = #', eventObj, ctrlKey);
-      JS('void', '#.altKey = #', eventObj, altKey);
-      JS('void', '#.shiftKey = #', eventObj, shiftKey);
-      JS('void', '#.metaKey = #', eventObj, metaKey);
-    } else {
-      // Currently this works on everything but Safari. Safari throws an
-      // "Attempting to change access mechanism for an unconfigurable property"
-      // TypeError when trying to do the Object.defineProperty hack, so we avoid
-      // this branch if possible.
-      // Also, if we want this branch to work in FF, we also need to modify
-      // _initKeyboardEvent to also take charCode and keyCode values to
-      // initialize initKeyEvent.
+    eventObj = new Event.eventType('KeyboardEvent', type,
+        canBubble: canBubble, cancelable: cancelable);
 
-      eventObj = new Event.eventType('KeyboardEvent', type,
-          canBubble: canBubble, cancelable: cancelable);
+    // Chromium Hack
+    JS(
+        'void',
+        "Object.defineProperty(#, 'keyCode', {"
+        "  get : function() { return this.keyCodeVal; } })",
+        eventObj);
+    JS(
+        'void',
+        "Object.defineProperty(#, 'which', {"
+        "  get : function() { return this.keyCodeVal; } })",
+        eventObj);
+    JS(
+        'void',
+        "Object.defineProperty(#, 'charCode', {"
+        "  get : function() { return this.charCodeVal; } })",
+        eventObj);
 
-      // Chromium Hack
-      JS(
-          'void',
-          "Object.defineProperty(#, 'keyCode', {"
-          "  get : function() { return this.keyCodeVal; } })",
-          eventObj);
-      JS(
-          'void',
-          "Object.defineProperty(#, 'which', {"
-          "  get : function() { return this.keyCodeVal; } })",
-          eventObj);
-      JS(
-          'void',
-          "Object.defineProperty(#, 'charCode', {"
-          "  get : function() { return this.charCodeVal; } })",
-          eventObj);
+    var keyIdentifier = _convertToHexString(charCode, keyCode);
+    eventObj._initKeyboardEvent(type, canBubble, cancelable, view,
+        keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey);
+    JS('void', '#.keyCodeVal = #', eventObj, keyCode);
+    JS('void', '#.charCodeVal = #', eventObj, charCode);
 
-      var keyIdentifier = _convertToHexString(charCode, keyCode);
-      eventObj._initKeyboardEvent(type, canBubble, cancelable, view,
-          keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey);
-      JS('void', '#.keyCodeVal = #', eventObj, keyCode);
-      JS('void', '#.charCodeVal = #', eventObj, charCode);
-    }
     // Tell dart2js that it smells like a KeyboardEvent!
     setDispatchProperty(eventObj, _keyboardEventDispatchRecord);
 
diff --git a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
index 830921c..380bece 100644
--- a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
@@ -54,7 +54,7 @@
     convertDartClosureToJS, Creates, JavaScriptIndexingBehavior,
     JSName, Native, Returns, ForceInline,
     findDispatchTagForInterceptorClass, setNativeSubclassDispatchRecord,
-    makeLeafDispatchRecord, registerGlobalObject;
+    makeLeafDispatchRecord, registerGlobalObject, applyExtension;
 import 'dart:_interceptors' show
     Interceptor, JSExtendableArray, JSUInt31,
     findInterceptorConstructorForType,
diff --git a/tools/dom/templates/html/impl/impl_MessageEvent.darttemplate b/tools/dom/templates/html/impl/impl_MessageEvent.darttemplate
index aa1616b..826f607 100644
--- a/tools/dom/templates/html/impl/impl_MessageEvent.darttemplate
+++ b/tools/dom/templates/html/impl/impl_MessageEvent.darttemplate
@@ -10,7 +10,7 @@
   factory $CLASSNAME(String type,
       {bool canBubble: false, bool cancelable: false, Object data,
       String origin, String lastEventId,
-      Window source, List<MessagePort> messagePorts}) {
+      Window source, List<MessagePort> messagePorts: const []}) {
     if (source == null) {
       source = window;
     }
diff --git a/tools/infra/config/cq.cfg b/tools/infra/config/cq.cfg
index b68a277..da718ee 100644
--- a/tools/infra/config/cq.cfg
+++ b/tools/infra/config/cq.cfg
@@ -26,7 +26,7 @@
       builders { name: "dart2js-linux-none-only-unittest-try"}
       builders { name: "pkg-linux-release-try"}
       builders { name: "dart2js-linux-chrome-try"}
-      builders { name: "ddc-linux-release-try"}
+      builders { name: "ddc-linux-release-chrome-try"}
       builders { name: "vm-linux-product-x64-try"}
       builders { name: "dart-sdk-windows-try"}
       builders { name: "vm-kernel-mac-release-x64-try"}
diff --git a/tools/status_clean.dart b/tools/status_clean.dart
index e5c11e2..1c47633 100644
--- a/tools/status_clean.dart
+++ b/tools/status_clean.dart
@@ -310,7 +310,7 @@
         var tests = new Map<String, String>();
         var outcomes = new Map<String, Set<String>>();
         if (multiTestRegExp.hasMatch(new File(file).readAsStringSync())) {
-          ExtractTestsFromMultitest(new Path(file), tests, outcomes);
+          extractTestsFromMultitest(new Path(file), tests, outcomes);
         }
         return tests.keys.toList();
       } catch (error) {
diff --git a/tools/testing/dart/command_output.dart b/tools/testing/dart/command_output.dart
index e5593be..8a885ac 100644
--- a/tools/testing/dart/command_output.dart
+++ b/tools/testing/dart/command_output.dart
@@ -876,15 +876,44 @@
   }
 
   Expectation result(TestCase testCase) {
-    Expectation result = super.result(testCase);
-    if (result.canBeOutcomeOf(Expectation.crash)) {
+    // TODO(kustermann): Currently the batch mode runner (which can be found
+    // in `test_runner.dart:BatchRunnerProcess`) does not really distinguish
+    // between different kinds of failures and will mark a failed
+    // compilation to just an exit code of "1".  So we treat all `exitCode ==
+    // 1`s as compile-time errors as well.
+    const int kBatchModeCompileTimeErrorExit = 1;
+
+    // Handle crashes and timeouts first.
+    if (hasCrashed) return Expectation.dartkCrash;
+    if (hasTimedOut) return Expectation.timeout;
+    if (hasNonUtf8) return Expectation.nonUtf8Error;
+
+    // If the frontend had an uncaught exception, then we'll consider this a
+    // crash.
+    if (exitCode == VMCommandOutput._uncaughtExceptionExitCode) {
       return Expectation.dartkCrash;
-    } else if (result.canBeOutcomeOf(Expectation.timeout)) {
-      return Expectation.dartkTimeout;
-    } else if (result.canBeOutcomeOf(Expectation.compileTimeError)) {
-      return Expectation.dartkCompileTimeError;
     }
-    return result;
+
+    // Multitests are handled specially.
+    if (testCase.expectCompileError) {
+      if (exitCode == VMCommandOutput._compileErrorExitCode ||
+          exitCode == kBatchModeCompileTimeErrorExit) {
+        return Expectation.pass;
+      }
+      return Expectation.missingCompileTimeError;
+    }
+
+    // The actual outcome depends on the exitCode.
+    var outcome = Expectation.pass;
+    if (exitCode == VMCommandOutput._compileErrorExitCode ||
+        exitCode == kBatchModeCompileTimeErrorExit) {
+      outcome = Expectation.compileTimeError;
+    } else if (exitCode != 0) {
+      // This is a general fail, in case we get an unknown nonzero exitcode.
+      outcome = Expectation.fail;
+    }
+
+    return _negateOutcomeIfNegativeTest(outcome, testCase.isNegative);
   }
 
   /// If the compiler was able to produce a Kernel IR file we want to run the
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index f5bb536..268d96e 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -46,6 +46,10 @@
     throw new UnsupportedError("This compiler does not support DFE.");
   }
 
+  /// Whether to run the runtime on the compilation result of a test which
+  /// expects a compile-time error and the compiler did not emit one.
+  bool get runRuntimeDespiteMissingCompileTimeError => false;
+
   factory CompilerConfiguration(Configuration configuration) {
     switch (configuration.compiler) {
       case Compiler.dart2analyzer:
@@ -67,6 +71,11 @@
         return new PrecompilerCompilerConfiguration(configuration);
 
       case Compiler.dartk:
+        if (configuration.architecture == Architecture.simdbc64 ||
+            configuration.architecture == Architecture.simarm ||
+            configuration.architecture == Architecture.simarm64) {
+          return new VMKernelCompilerConfiguration(configuration);
+        }
         return new NoneCompilerConfiguration(configuration, useDfe: true);
 
       case Compiler.dartkp:
@@ -101,8 +110,8 @@
   List<Uri> bootstrapDependencies() => const <Uri>[];
 
   /// Creates a [Command] to compile [inputFile] to [outputFile].
-  Command createCommand(
-      String inputFile, String outputFile, List<String> sharedOptions) {
+  Command createCommand(String inputFile, String outputFile,
+      List<String> sharedOptions, Map<String, String> environment) {
     // TODO(rnystrom): See if this method can be unified with
     // computeCompilationArtifact() and/or computeCompilerArguments() for the
     // other compilers.
@@ -132,6 +141,8 @@
 
 /// The "none" compiler.
 class NoneCompilerConfiguration extends CompilerConfiguration {
+  // This boolean is used by the [VMTestSuite] for running cc tests via
+  // run_vm_tests.
   final bool useDfe;
 
   NoneCompilerConfiguration(Configuration configuration, {this.useDfe: false})
@@ -186,6 +197,71 @@
   }
 }
 
+class VMKernelCompilerConfiguration extends CompilerConfiguration
+    with VMKernelCompilerMixin {
+  VMKernelCompilerConfiguration(Configuration configuration)
+      : super._subclass(configuration);
+
+  // This boolean is used by the [VMTestSuite] for running cc tests via
+  // run_vm_tests.  We enable it here, so the cc tests continue to use the
+  // kernel-isolate.  All the remaining tests will use a separate compilation
+  // command (which this class represents).
+  bool get useDfe => true;
+
+  bool get _isAot => false;
+
+  // Issue(http://dartbug.com/29840): Currently fasta sometimes does not emit a
+  // compile-time error (even though it should).  The VM will emit some of these
+  // compile-time errors (e.g. in constant evaluator, class finalizer, ...).
+  //
+  //   => Since this distinction between fasta and vm reported compile-time
+  //      errors do not exist when running dart with the kernel-service, we will
+  //      also not make this distinction when compiling to .dill and then run.
+  //
+  // The corresponding http://dartbug.com/29840 tracks to get the frontend to
+  // emit all necessary compile-time errors (and *additionally* encode them
+  // in the AST in certain cases).
+  bool get runRuntimeDespiteMissingCompileTimeError => true;
+
+  CommandArtifact computeCompilationArtifact(String tempDir,
+      List<String> arguments, Map<String, String> environmentOverrides) {
+    final commands = <Command>[
+      computeCompileToKernelCommand(tempDir, arguments, environmentOverrides),
+    ];
+    return new CommandArtifact(commands, tempKernelFile(tempDir),
+        'application/kernel-ir-fully-linked');
+  }
+
+  List<String> computeRuntimeArguments(
+      RuntimeConfiguration runtimeConfiguration,
+      TestInformation info,
+      List<String> vmOptions,
+      List<String> sharedOptions,
+      List<String> originalArguments,
+      CommandArtifact artifact) {
+    var args = <String>[];
+    if (_isStrong) {
+      args.add('--strong');
+      args.add('--reify-generic-functions');
+      args.add('--limit-ints-to-64-bits');
+    }
+    if (_isChecked) {
+      args.add('--enable_asserts');
+      args.add('--enable_type_checks');
+    }
+    if (_configuration.hotReload) {
+      args.add('--hot-reload-test-mode');
+    } else if (_configuration.hotReloadRollback) {
+      args.add('--hot-reload-rollback-test-mode');
+    }
+
+    return args
+      ..addAll(vmOptions)
+      ..addAll(sharedOptions)
+      ..addAll(_replaceDartFiles(originalArguments, artifact.filename));
+  }
+}
+
 typedef List<String> CompilerArgumentsFunction(
     List<String> globalArguments, String previousCompilerOutput);
 
@@ -403,9 +479,8 @@
     return result;
   }
 
-  Command createCommand(
-      String inputFile, String outputFile, List<String> sharedOptions,
-      [Map<String, String> environment = const {}]) {
+  Command createCommand(String inputFile, String outputFile,
+      List<String> sharedOptions, Map<String, String> environment) {
     var moduleRoot =
         new Path(outputFile).directoryPath.directoryPath.toNativePath();
 
@@ -487,9 +562,8 @@
     return result;
   }
 
-  Command createCommand(
-      String inputFile, String outputFile, List<String> sharedOptions,
-      [Map<String, String> environment = const {}]) {
+  Command createCommand(String inputFile, String outputFile,
+      List<String> sharedOptions, Map<String, String> environment) {
     var args = sharedOptions.toList();
 
     var sdkSummary = new Path(_configuration.buildDirectory)
@@ -548,13 +622,18 @@
   }
 }
 
-class PrecompilerCompilerConfiguration extends CompilerConfiguration {
+class PrecompilerCompilerConfiguration extends CompilerConfiguration
+    with VMKernelCompilerMixin {
+  // This boolean is used by the [VMTestSuite] for running cc tests via
+  // run_vm_tests.
   final bool useDfe;
 
   bool get _isAndroid => _configuration.system == System.android;
   bool get _isArm => _configuration.architecture == Architecture.arm;
   bool get _isArm64 => _configuration.architecture == Architecture.arm64;
 
+  bool get _isAot => true;
+
   PrecompilerCompilerConfiguration(Configuration configuration,
       {this.useDfe: false})
       : super._subclass(configuration);
@@ -574,15 +653,15 @@
       List<String> arguments, Map<String, String> environmentOverrides) {
     var commands = <Command>[];
 
-    if (_isStrong) {
+    if (useDfe) {
       commands.add(computeCompileToKernelCommand(
           tempDir, arguments, environmentOverrides));
     }
 
     commands.add(
-        computeCompilationCommand(tempDir, arguments, environmentOverrides));
+        computeDartBootstrapCommand(tempDir, arguments, environmentOverrides));
 
-    if (_isStrong) {
+    if (useDfe) {
       commands.add(computeRemoveKernelFileCommand(
           tempDir, arguments, environmentOverrides));
     }
@@ -598,25 +677,6 @@
         commands, '$tempDir', 'application/dart-precompiled');
   }
 
-  String tempKernelFile(String tempDir) => '$tempDir/out.dill';
-
-  Command computeCompileToKernelCommand(String tempDir, List<String> arguments,
-      Map<String, String> environmentOverrides) {
-    final genKernel =
-        Platform.script.resolve('../../../pkg/vm/tool/gen_kernel').toFilePath();
-    final dillFile = tempKernelFile(tempDir);
-    var args = [
-      '--packages=.packages',
-      '--aot',
-      '--platform=${_configuration.buildDirectory}/vm_platform_strong.dill',
-      '-o',
-      dillFile,
-    ];
-    args.add(arguments.where((name) => name.endsWith('.dart')).single);
-    return Command.vmKernelCompilation(dillFile, true, bootstrapDependencies(),
-        genKernel, args, environmentOverrides);
-  }
-
   /// Creates a command to clean up large temporary kernel files.
   ///
   /// Warning: this command removes temporary file and violates tracking of
@@ -632,7 +692,7 @@
         alwaysCompile: !_useSdk);
   }
 
-  Command computeCompilationCommand(String tempDir, List<String> arguments,
+  Command computeDartBootstrapCommand(String tempDir, List<String> arguments,
       Map<String, String> environmentOverrides) {
     var buildDir = _configuration.buildDirectory;
     String exec;
@@ -646,18 +706,7 @@
       exec = "$buildDir/dart_bootstrap";
     }
 
-    var args = <String>[];
-    if (useDfe) {
-      if (!_isStrong) {
-        args.add('--dfe=pkg/vm/bin/kernel_service.dart');
-      }
-      // TODO(dartbug.com/30480): avoid using additional kernel binaries
-      args.add('--kernel-binaries=' +
-          (_useSdk
-              ? '${_configuration.buildDirectory}/dart-sdk/lib/_internal'
-              : '${buildDir}'));
-    }
-
+    final args = <String>[];
     args.add("--snapshot-kind=app-aot");
     if (_configuration.useBlobs) {
       args.add("--snapshot=$tempDir/out.aotsnapshot");
@@ -680,8 +729,9 @@
 
     if (_isStrong) {
       args.add('--strong');
-      args.addAll(arguments.where((name) => !name.endsWith('.dart')));
-      args.add(tempKernelFile(tempDir));
+    }
+    if (useDfe) {
+      args.addAll(_replaceDartFiles(arguments, tempKernelFile(tempDir)));
     } else {
       args.addAll(arguments);
     }
@@ -880,12 +930,10 @@
       args.add('--enable_asserts');
       args.add('--enable_type_checks');
     }
-    args..addAll(vmOptions)..addAll(sharedOptions)..addAll(originalArguments);
-    for (var i = 0; i < args.length; i++) {
-      if (args[i].endsWith(".dart")) {
-        args[i] = artifact.filename;
-      }
-    }
+    args
+      ..addAll(vmOptions)
+      ..addAll(sharedOptions)
+      ..addAll(_replaceDartFiles(originalArguments, artifact.filename));
     return args;
   }
 }
@@ -969,3 +1017,42 @@
     return <String>[];
   }
 }
+
+abstract class VMKernelCompilerMixin {
+  Configuration get _configuration;
+  bool get _useSdk;
+  bool get _isStrong;
+  bool get _isAot;
+
+  List<Uri> bootstrapDependencies();
+
+  String tempKernelFile(String tempDir) => '$tempDir/out.dill';
+
+  Command computeCompileToKernelCommand(String tempDir, List<String> arguments,
+      Map<String, String> environmentOverrides) {
+    final genKernel =
+        Platform.script.resolve('../../../pkg/vm/tool/gen_kernel').toFilePath();
+
+    final kernelBinariesFolder = _useSdk
+        ? '${_configuration.buildDirectory}/dart-sdk/lib/_internal'
+        : '${_configuration.buildDirectory}';
+
+    final vmPlatform = _isStrong
+        ? '$kernelBinariesFolder/vm_platform_strong.dill'
+        : '$kernelBinariesFolder/vm_platform.dill';
+
+    final dillFile = tempKernelFile(tempDir);
+
+    final args = [
+      _isAot ? '--aot' : '--no-aot',
+      _isStrong ? '--strong-mode' : '--no-strong-mode',
+      '--platform=$vmPlatform',
+      '-o',
+      dillFile,
+    ];
+    args.add(arguments.where((name) => name.endsWith('.dart')).single);
+
+    return Command.vmKernelCompilation(dillFile, true, bootstrapDependencies(),
+        genKernel, args, environmentOverrides);
+  }
+}
diff --git a/tools/testing/dart/multitest.dart b/tools/testing/dart/multitest.dart
index 5e5e170..ed10d09 100644
--- a/tools/testing/dart/multitest.dart
+++ b/tools/testing/dart/multitest.dart
@@ -2,8 +2,77 @@
 // 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 multitest;
-
+/// Multitests are Dart test scripts containing lines of the form
+/// " [some dart code] //# [key]: [error type]"
+///
+/// To support legacy multi tests we also handle lines of the form
+/// " [some dart code] /// [key]: [error type]"
+///
+/// For each key in the file, a new test file is made containing all the normal
+/// lines of the file, and all of the multitest lines containing that key, in
+/// the same order as in the source file. The new test is expected to pass if
+/// the error type listed is 'ok', and to fail if the error type is 'syntax
+/// error', 'compile-time error', 'runtime error', 'static type warning',
+/// 'dynamic type error', or 'checked mode compile-time error'. The type error
+/// tests fail only in checked mode. There is also a test created from only the
+/// untagged lines of the file, with key "none", which is expected to pass. This
+/// library extracts these tests, writes them into a temporary directory, and
+/// passes them to the test runner. These tests may be referred to in the status
+/// files with the pattern [test name]/[key].
+///
+/// For example, file i_am_a_multitest.dart:
+///
+/// ```dart
+/// aaa
+/// bbb //# 02: runtime error
+/// ccc //# 02: continued
+/// ddd //# 07: static type warning
+/// eee //# 10: ok
+/// fff
+/// ```
+///
+/// Create four test files:
+///
+/// i_am_a_multitest_none.dart:
+///
+/// ```dart
+/// aaa
+/// fff
+/// ```
+///
+/// i_am_a_multitest_02.dart:
+///
+/// ```dart
+/// aaa
+/// bbb //# 02: runtime error
+/// ccc //# 02: continued
+/// fff
+/// ```
+///
+/// i_am_a_multitest_07.dart:
+///
+/// ```dart
+/// aaa
+/// ddd //# 07: static type warning
+/// fff
+/// ```
+///
+/// i_am_a_multitest_10.dart:
+///
+/// ```dart
+/// aaa
+/// eee //# 10: ok
+/// fff
+/// ```
+///
+/// Note that it is possible to indicate more than one acceptable outcome in
+/// the case of dynamic and static type warnings
+///
+/// ```dart
+/// aaa
+/// ddd //# 07: static type warning, dynamic type error
+/// fff
+/// ```
 import "dart:async";
 import "dart:io";
 
@@ -11,85 +80,33 @@
 import "test_suite.dart";
 import "utils.dart";
 
-// Multitests are Dart test scripts containing lines of the form
-// " [some dart code] //# [key]: [error type]"
-//
-// To support legacy multi tests we also handle lines of the form
-// " [some dart code] /// [key]: [error type]"
-//
-// For each key in the file, a new test file is made containing all
-// the normal lines of the file, and all of the multitest lines containing
-// that key, in the same order as in the source file.  The new test is expected
-// to pass if the error type listed is 'ok', and to fail if the error type is
-// 'syntax error', 'compile-time error', 'runtime error', 'static type warning',
-// 'dynamic type error', or 'checked mode compile-time error'.  The type error
-// tests fail only in checked mode. There is also a test created from only the
-// untagged lines of the file, with key "none", which is expected to pass.  This
-// library extracts these tests, writes them into a temporary directory, and
-// passes them to the test runner.  These tests may be referred to in the status
-// files with the pattern [test name]/[key].
-//
-// For example: file I_am_a_multitest.dart
-//   aaa
-//   bbb //# 02: runtime error
-//   ccc //# 02: continued
-//   ddd //# 07: static type warning
-//   eee //# 10: ok
-//   fff
-//
-// should create four tests:
-// I_am_a_multitest_none.dart
-//   aaa
-//   fff
-//
-// I_am_a_multitest_02.dart
-//   aaa
-//   bbb //# 02: runtime error
-//   ccc //# 02: continued
-//   fff
-//
-// I_am_a_multitest_07.dart
-//   aaa
-//   ddd //# 07: static type warning
-//   fff
-//
-// and I_am_a_multitest_10.dart
-//   aaa
-//   eee //# 10: ok
-//   fff
-//
-// Note that it is possible to indicate more than one acceptable outcome
-// in the case of dynamic and static type warnings
-//   aaa
-//   ddd //# 07: static type warning, dynamic type error
-//   fff
-
 /// Until legacy multitests are ported we need to support both /// and //#
 final _multitestMarker = new RegExp(r"//[/#]");
 
-void ExtractTestsFromMultitest(Path filePath, Map<String, String> tests,
+final _multitestOutcomes = [
+  'ok',
+  'syntax error',
+  'compile-time error',
+  'runtime error',
+  // TODO(rnystrom): Remove these after Dart 1.0 tests are removed.
+  'static type warning',
+  'dynamic type error',
+  'checked mode compile-time error'
+].toSet();
+
+// Note: This function is called directly by:
+//
+//     tests/compiler/dart2js/frontend_checker.dart
+//     tools/status_clean.dart
+void extractTestsFromMultitest(Path filePath, Map<String, String> tests,
     Map<String, Set<String>> outcomes) {
-  // Read the entire file into a byte buffer and transform it to a
-  // String. This will treat the file as ascii but the only parts
-  // we are interested in will be ascii in any case.
-  var bytes = new File(filePath.toNativePath()).readAsBytesSync();
-  var contents = decodeUtf8(bytes);
+  var contents = new File(filePath.toNativePath()).readAsStringSync();
+
   var firstNewline = contents.indexOf('\n');
   var lineSeparator =
       (firstNewline == 0 || contents[firstNewline - 1] != '\r') ? '\n' : '\r\n';
   var lines = contents.split(lineSeparator);
   if (lines.last == '') lines.removeLast();
-  bytes = null;
-  contents = null;
-  var validMultitestOutcomes = [
-    'ok',
-    'syntax error',
-    'compile-time error',
-    'runtime error',
-    'static type warning',
-    'dynamic type error',
-    'checked mode compile-time error'
-  ].toSet();
 
   // Create the set of multitests, which will have a new test added each
   // time we see a multitest line with a new key.
@@ -102,7 +119,7 @@
   var lineCount = 0;
   for (var line in lines) {
     lineCount++;
-    var annotation = new _Annotation.from(line);
+    var annotation = _Annotation.tryParse(line);
     if (annotation != null) {
       testsAsLines.putIfAbsent(
           annotation.key, () => new List<String>.from(testsAsLines["none"]));
@@ -112,13 +129,13 @@
       }
       outcomes.putIfAbsent(annotation.key, () => new Set<String>());
       if (annotation.rest != 'continued') {
-        for (String nextOutcome in annotation.outcomesList) {
-          if (validMultitestOutcomes.contains(nextOutcome)) {
+        for (var nextOutcome in annotation.outcomes) {
+          if (_multitestOutcomes.contains(nextOutcome)) {
             outcomes[annotation.key].add(nextOutcome);
           } else {
-            DebugLogger.warning(
-                "Warning: Invalid test directive '$nextOutcome' on line "
-                "${lineCount}:\n${annotation.rest} ");
+            DebugLogger
+                .warning("Warning: Invalid expectation '$nextOutcome' on line "
+                    "$lineCount:\n${annotation.rest} ");
           }
         }
       }
@@ -126,6 +143,7 @@
       for (var test in testsAsLines.values) test.add(line);
     }
   }
+
   // End marker, has a final line separator so we don't need to add it after
   // joining the lines.
   var marker =
@@ -133,21 +151,17 @@
       '$lineSeparator';
   for (var test in testsAsLines.values) test.add(marker);
 
-  var keysToDelete = <String>[];
-  // Check that every key (other than the none case) has at least one outcome
-  for (var outcomeKey in outcomes.keys) {
-    if (outcomeKey != 'none' && outcomes[outcomeKey].isEmpty) {
-      DebugLogger.warning(
-          "Warning: Test ${outcomeKey} has no valid annotated outcomes.\n"
-          "Expected one of: ${validMultitestOutcomes.toString()}");
-      // If this multitest doesn't have an outcome, mark the multitest for
-      // deletion.
-      keysToDelete.add(outcomeKey);
-    }
+  // Check that every test (other than the none case) has at least one outcome.
+  var invalidTests = outcomes.keys
+      .where((test) => test != 'none' && outcomes[test].isEmpty)
+      .toList();
+  for (var test in invalidTests) {
+    DebugLogger.warning("Warning: Test $test has no valid expectation.\n"
+        "Expected one of: ${_multitestOutcomes.toString()}");
+
+    outcomes.remove(test);
+    testsAsLines.remove(test);
   }
-  // If a key/multitest was marked for deletion, do the necessary cleanup.
-  keysToDelete.forEach(outcomes.remove);
-  keysToDelete.forEach(testsAsLines.remove);
 
   // Copy all the tests into the output map tests, as multiline strings.
   for (var key in testsAsLines.keys) {
@@ -155,34 +169,115 @@
   }
 }
 
-// Represents a mutlitest annotation in the special //# comment.
+Future doMultitest(Path filePath, String outputDir, Path suiteDir,
+    CreateTest doTest, bool hotReload) {
+  void writeFile(String filepath, String content) {
+    final File file = new File(filepath);
+
+    if (file.existsSync()) {
+      var oldContent = file.readAsStringSync();
+      if (oldContent == content) {
+        // Don't write to the file if the content is the same
+        return;
+      }
+    }
+    file.writeAsStringSync(content);
+  }
+
+  // Each new test is a single String value in the Map tests.
+  var tests = <String, String>{};
+  var outcomes = <String, Set<String>>{};
+  extractTestsFromMultitest(filePath, tests, outcomes);
+
+  var sourceDir = filePath.directoryPath;
+  var targetDir = _createMultitestDirectory(outputDir, suiteDir, sourceDir);
+  assert(targetDir != null);
+
+  // Copy all the relative imports of the multitest.
+  var importsToCopy = _findAllRelativeImports(filePath);
+  var futureCopies = <Future>[];
+  for (var relativeImport in importsToCopy) {
+    var importPath = new Path(relativeImport);
+    // Make sure the target directory exists.
+    var importDir = importPath.directoryPath;
+    if (!importDir.isEmpty) {
+      TestUtils.mkdirRecursive(targetDir, importDir);
+    }
+
+    // Copy file.
+    futureCopies.add(TestUtils.copyFile(
+        sourceDir.join(importPath), targetDir.join(importPath)));
+  }
+
+  // Wait until all imports are copied before scheduling test cases.
+  return Future.wait(futureCopies).then((_) {
+    var baseFilename = filePath.filenameWithoutExtension;
+    for (var key in tests.keys) {
+      var multitestFilename = targetDir.append('${baseFilename}_$key.dart');
+      writeFile(multitestFilename.toNativePath(), tests[key]);
+
+      var outcome = outcomes[key];
+      var hasStaticWarning = outcome.contains('static type warning');
+      var hasRuntimeError = outcome.contains('runtime error');
+      var hasSyntaxError = outcome.contains('syntax error');
+      var hasCompileError =
+          hasSyntaxError || outcome.contains('compile-time error');
+      var isNegativeIfChecked = outcome.contains('dynamic type error');
+      var hasCompileErrorIfChecked =
+          outcome.contains('checked mode compile-time error');
+
+      if (hotReload) {
+        if (hasCompileError || hasCompileErrorIfChecked) {
+          // Running a test that expects a compilation error with hot reloading
+          // is redundant with a regular run of the test.
+          continue;
+        }
+      }
+
+      doTest(multitestFilename, filePath,
+          hasSyntaxError: hasSyntaxError,
+          hasCompileError: hasCompileError,
+          hasRuntimeError: hasRuntimeError,
+          isNegativeIfChecked: isNegativeIfChecked,
+          hasCompileErrorIfChecked: hasCompileErrorIfChecked,
+          hasStaticWarning: hasStaticWarning,
+          multitestKey: key);
+    }
+
+    return null;
+  });
+}
+
+/// A multitest annotation in the special `//#` comment.
 class _Annotation {
-  String key;
-  String rest;
-  List<String> outcomesList;
-  _Annotation() {}
-  factory _Annotation.from(String line) {
+  /// Parses the annotation in [line] or returns `null` if the line isn't a
+  /// multitest annotation.
+  static _Annotation tryParse(String line) {
     // Do an early return with "null" if this is not a valid multitest
     // annotation.
-    if (!line.contains(_multitestMarker)) {
-      return null;
-    }
+    if (!line.contains(_multitestMarker)) return null;
+
     var parts = line
         .split(_multitestMarker)[1]
         .split(':')
         .map((s) => s.trim())
         .where((s) => s.length > 0)
         .toList();
-    if (parts.length <= 1) {
-      return null;
-    }
 
-    var annotation = new _Annotation();
-    annotation.key = parts[0];
-    annotation.rest = parts[1];
-    annotation.outcomesList =
-        annotation.rest.split(',').map((s) => s.trim()).toList();
-    return annotation;
+    if (parts.length <= 1) return null;
+
+    return new _Annotation._(parts[0], parts[1]);
+  }
+
+  final String key;
+  final String rest;
+
+  // TODO(rnystrom): After Dart 1.0 is no longer supported, I don't think we
+  // need to support more than a single outcome for each test.
+  final List<String> outcomes = [];
+
+  _Annotation._(this.key, this.rest) {
+    outcomes.addAll(rest.split(',').map((s) => s.trim()));
   }
 }
 
@@ -202,121 +297,50 @@
   while (!toSearch.isEmpty) {
     var thisPass = toSearch;
     toSearch = new Set<Path>();
-    for (Path filename in thisPass) {
-      File f = new File(filename.toNativePath());
-      for (String line in f.readAsLinesSync()) {
-        Match match = relativeImportRegExp.firstMatch(line);
+    for (var filename in thisPass) {
+      var f = new File(filename.toNativePath());
+      for (var line in f.readAsLinesSync()) {
+        var match = relativeImportRegExp.firstMatch(line);
+
         if (match != null) {
-          Path relativePath = new Path(match.group(3));
+          var relativePath = new Path(match.group(3));
           if (foundImports.contains(relativePath.toString())) {
             continue;
           }
+
           if (relativePath.toString().contains('..')) {
             // This is just for safety reasons, we don't want
             // to unintentionally clobber files relative to the destination
-            // dir when copying them ove.
-            print("relative paths containing .. are not allowed.");
+            // dir when copying them over.
+            print("relative paths containing '..' are not allowed.");
             exit(1);
           }
+
           foundImports.add(relativePath.toString());
           toSearch.add(libraryDir.join(relativePath));
         }
       }
     }
   }
+
   return foundImports;
 }
 
-Future doMultitest(Path filePath, String outputDir, Path suiteDir,
-    CreateTest doTest, bool hotReload) {
-  void writeFile(String filepath, String content) {
-    final File file = new File(filepath);
-
-    if (file.existsSync()) {
-      var oldContent = file.readAsStringSync();
-      if (oldContent == content) {
-        // Don't write to the file if the content is the same
-        return;
-      }
-    }
-    file.writeAsStringSync(content);
-  }
-
-  // Each new test is a single String value in the Map tests.
-  Map<String, String> tests = new Map<String, String>();
-  Map<String, Set<String>> outcomes = new Map<String, Set<String>>();
-  ExtractTestsFromMultitest(filePath, tests, outcomes);
-
-  Path sourceDir = filePath.directoryPath;
-  Path targetDir = createMultitestDirectory(outputDir, suiteDir, sourceDir);
-  assert(targetDir != null);
-
-  // Copy all the relative imports of the multitest.
-  Set<String> importsToCopy = _findAllRelativeImports(filePath);
-  List<Future> futureCopies = [];
-  for (String relativeImport in importsToCopy) {
-    Path importPath = new Path(relativeImport);
-    // Make sure the target directory exists.
-    Path importDir = importPath.directoryPath;
-    if (!importDir.isEmpty) {
-      TestUtils.mkdirRecursive(targetDir, importDir);
-    }
-    // Copy file.
-    futureCopies.add(TestUtils.copyFile(
-        sourceDir.join(importPath), targetDir.join(importPath)));
-  }
-
-  // Wait until all imports are copied before scheduling test cases.
-  return Future.wait(futureCopies).then((_) {
-    String baseFilename = filePath.filenameWithoutExtension;
-    for (String key in tests.keys) {
-      final Path multitestFilename =
-          targetDir.append('${baseFilename}_$key.dart');
-      writeFile(multitestFilename.toNativePath(), tests[key]);
-      Set<String> outcome = outcomes[key];
-      bool hasStaticWarning = outcome.contains('static type warning');
-      bool hasRuntimeError = outcome.contains('runtime error');
-      bool hasSyntaxError = outcome.contains('syntax error');
-      bool hasCompileError =
-          hasSyntaxError || outcome.contains('compile-time error');
-      bool isNegativeIfChecked = outcome.contains('dynamic type error');
-      bool hasCompileErrorIfChecked =
-          outcome.contains('checked mode compile-time error');
-      if (hotReload) {
-        if (hasCompileError || hasCompileErrorIfChecked) {
-          // Running a test that expects a compilation error with hot reloading
-          // is redundant with a regular run of the test.
-          continue;
-        }
-      }
-      doTest(multitestFilename, filePath,
-          hasSyntaxError: hasSyntaxError,
-          hasCompileError: hasCompileError,
-          hasRuntimeError: hasRuntimeError,
-          isNegativeIfChecked: isNegativeIfChecked,
-          hasCompileErrorIfChecked: hasCompileErrorIfChecked,
-          hasStaticWarning: hasStaticWarning,
-          multitestKey: key);
-    }
-
-    return null;
-  });
-}
-
-String suiteNameFromPath(Path suiteDir) {
+String _suiteNameFromPath(Path suiteDir) {
   var split = suiteDir.segments();
+
   // co19 test suite is at tests/co19/src.
-  if (split.last == 'src') {
-    split.removeLast();
-  }
+  if (split.last == 'src') split.removeLast();
+
   return split.last;
 }
 
-Path createMultitestDirectory(String outputDir, Path suiteDir, Path sourceDir) {
-  Path relative = sourceDir.relativeTo(suiteDir);
-  Path path = new Path(outputDir)
+Path _createMultitestDirectory(
+    String outputDir, Path suiteDir, Path sourceDir) {
+  var relative = sourceDir.relativeTo(suiteDir);
+  var path = new Path(outputDir)
       .append('generated_tests')
-      .append(suiteNameFromPath(suiteDir))
+      .append(_suiteNameFromPath(suiteDir))
       .join(relative);
   TestUtils.mkdirRecursive(Path.workingDirectory, path);
   return new Path(new File(path.toNativePath()).absolute.path);
diff --git a/tools/testing/dart/runtime_configuration.dart b/tools/testing/dart/runtime_configuration.dart
index bffb352..9f43481 100644
--- a/tools/testing/dart/runtime_configuration.dart
+++ b/tools/testing/dart/runtime_configuration.dart
@@ -225,10 +225,20 @@
     String type = artifact.mimeType;
     if (script != null &&
         type != 'application/dart' &&
-        type != 'application/dart-snapshot') {
+        type != 'application/dart-snapshot' &&
+        type != 'application/kernel-ir' &&
+        type != 'application/kernel-ir-fully-linked') {
       throw "Dart VM cannot run files of type '$type'.";
     }
+
     String executable = suite.dartVmBinaryFileName;
+    if (type == 'application/kernel-ir-fully-linked') {
+      // We don't use the pkg/vm/tool/dart2 wrapper script for fully linked
+      // kernel files, since we don't want to pass the --dfe/--kernel-binaries
+      // flags to the VM (the vm cannot distinguish fully-linked vs
+      // not-fully-linked, see http://dartbug.com/31545)
+      executable = suite.dartVmExecutableFileName;
+    }
     return [Command.vm(executable, arguments, environmentOverrides)];
   }
 }
diff --git a/tools/testing/dart/test_configurations.dart b/tools/testing/dart/test_configurations.dart
index 34c9527..77ac9f5 100644
--- a/tools/testing/dart/test_configurations.dart
+++ b/tools/testing/dart/test_configurations.dart
@@ -43,7 +43,6 @@
   new Path('tests/language'),
   new Path('tests/language_2'),
   new Path('tests/lib'),
-  new Path('tests/lib_strong'),
   new Path('tests/lib_2'),
   new Path('tests/standalone'),
   new Path('tests/standalone_2'),
diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
index ac8b5df..2cb2950 100644
--- a/tools/testing/dart/test_runner.dart
+++ b/tools/testing/dart/test_runner.dart
@@ -790,6 +790,7 @@
   bool _dictEquals(Map a, Map b) {
     if (a == null) return b == null;
     if (b == null) return false;
+    if (a.length != b.length) return false;
     for (var key in a.keys) {
       if (a[key] != b[key]) return false;
     }
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 0b9cb56..6d71dc0 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -128,8 +128,12 @@
 
   TestSuite(this.configuration, this.suiteName, this.statusFilePaths) {
     _environmentOverrides = {
-      'DART_CONFIGURATION': configuration.configurationDirectory
+      'DART_CONFIGURATION': configuration.configurationDirectory,
     };
+
+    if (useSdk && configuration.usingDart2VMWrapper) {
+      _environmentOverrides['DART_USE_SDK'] = '1';
+    }
   }
 
   Map<String, String> get environmentOverrides => _environmentOverrides;
@@ -173,16 +177,19 @@
     }
 
     if (dartExecutable == null) {
-      var suffix = executableBinarySuffix;
-      dartExecutable = useSdk
-          ? '$buildDir/dart-sdk/bin/dart$suffix'
-          : '$buildDir/dart$suffix';
+      dartExecutable = dartVmExecutableFileName;
     }
 
     TestUtils.ensureExists(dartExecutable, configuration);
     return dartExecutable;
   }
 
+  String get dartVmExecutableFileName {
+    return useSdk
+        ? '$buildDir/dart-sdk/bin/dart$executableBinarySuffix'
+        : '$buildDir/dart$executableBinarySuffix';
+  }
+
   /// Returns the name of the flutter engine executable.
   String get flutterEngineBinaryFileName {
     // Controlled by user with the option "--flutter".
@@ -269,12 +276,14 @@
       [TestInformation info]) {
     var displayName = '$suiteName/$testName';
 
-    // If the test is not going to be run at all, then a RuntimeError will
-    // never occur. Instead, treat that as Pass.
-    if (configuration.runtime == Runtime.none &&
-        expectations.contains(Expectation.runtimeError)) {
+    // If the test is not going to be run at all, then a RuntimeError,
+    // MissingRuntimeError or Timeout will never occur.
+    // Instead, treat that as Pass.
+    if (configuration.runtime == Runtime.none) {
       expectations = expectations.toSet();
       expectations.remove(Expectation.runtimeError);
+      expectations.remove(Expectation.missingRuntimeError);
+      expectations.remove(Expectation.timeout);
       if (expectations.isEmpty) expectations.add(Expectation.pass);
     }
 
@@ -873,7 +882,9 @@
       commands.addAll(compilationArtifact.commands);
     }
 
-    if (expectCompileError(info) && compilerConfiguration.hasCompiler) {
+    if (expectCompileError(info) &&
+        compilerConfiguration.hasCompiler &&
+        !compilerConfiguration.runRuntimeDespiteMissingCompileTimeError) {
       // Do not attempt to run the compiled result. A compilation
       // error should be reported by the compilation command.
       return commands;
@@ -1037,8 +1048,11 @@
       case Compiler.dartdevk:
         var toPath =
             new Path('$compilationTempDir/$nameNoExt.js').toNativePath();
-        commands.add(configuration.compilerConfiguration.createCommand(fileName,
-            toPath, optionsFromFile["sharedOptions"] as List<String>));
+        commands.add(configuration.compilerConfiguration.createCommand(
+            fileName,
+            toPath,
+            optionsFromFile["sharedOptions"] as List<String>,
+            environmentOverrides));
         break;
 
       default:
@@ -1062,7 +1076,8 @@
           commands.add(configuration.compilerConfiguration.createCommand(
               fromPath.toNativePath(),
               toPath,
-              optionsFromFile["sharedOptions"] as List<String>));
+              optionsFromFile["sharedOptions"] as List<String>,
+              environmentOverrides));
           break;
       }
     }
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index 6a91fb1..7a9cf2f 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -47,7 +47,9 @@
   training_args = [
     "--dart-sdk-summary",
     rebase_path(sdk_dill),
-    "--help",
+    "-o",
+    "dartdevk.js",
+    rebase_path("../../pkg/dev_compiler/test/codegen/sunflower/sunflower.dart"),
   ]
 
   deps = [
@@ -217,7 +219,7 @@
     ]
   }
 
-  args = [
+  args += [
     "--quiet",
     rebase_path("../../pkg/dev_compiler/tool/build_sdk.dart"),
     "--dart-sdk",
diff --git a/utils/dartdevk/BUILD.gn b/utils/dartdevk/BUILD.gn
deleted file mode 100644
index 43d904c..0000000
--- a/utils/dartdevk/BUILD.gn
+++ /dev/null
@@ -1,318 +0,0 @@
-# Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-import("../../build/prebuilt_dart_sdk.gni")
-import("../application_snapshot.gni")
-import("../create_timestamp.gni")
-
-patched_sdk_dir = "$target_gen_dir/patched_sdk"
-sdk_summary = "$target_gen_dir/ddc_sdk.sum"
-dart_root = rebase_path("../..")
-
-sdk_lib_files = exec_script("../../tools/list_dart_files.py",
-                            [
-                              "absolute",
-                              rebase_path("../../sdk/lib"),
-                            ],
-                            "list lines")
-
-compiler_files = exec_script("../../tools/list_dart_files.py",
-                             [
-                               "absolute",
-                               rebase_path("../../pkg/compiler"),
-                             ],
-                             "list lines")
-
-dev_compiler_files = exec_script("../../tools/list_dart_files.py",
-                                 [
-                                   "absolute",
-                                   rebase_path("../../pkg/dev_compiler"),
-                                 ],
-                                 "list lines")
-
-template("dart2js_compile") {
-  assert(defined(invoker.main), "Must specify the main file")
-  main = invoker.main
-  assert(defined(invoker.out), "Must specify the out file")
-  out = invoker.out
-  abs_main = rebase_path(main)
-  abs_output = rebase_path(out)
-
-  compiled_action(target_name) {
-    tool = "../../runtime/bin:dart"
-    inputs = sdk_lib_files + compiler_files + dev_compiler_files
-    outputs = [
-      out,
-    ]
-
-    dot_packages = rebase_path("../../.packages")
-    compiler = rebase_path("../../pkg/compiler/lib/src/dart2js.dart")
-
-    args = [
-      "--packages=$dot_packages",
-      compiler,
-      "--packages=$dot_packages",
-      "$abs_main",
-      "-m",
-      "-o$abs_output",
-    ]
-  }
-}
-
-dart2js_compile("dartdevk_web") {
-  main = rebase_path("../../pkg/dev_compiler/web/main.dart")
-  out = "$root_out_dir/dev_compiler/build/web/ddk_web_compiler.js"
-}
-
-#dart2js_compile("stack_trace_mapper") {
-#  main = rebase_path("../../pkg/dev_compiler/web/stack_trace_mapper.dart")
-#  out = "$root_out_dir/dev_compiler/build/web/dart_stack_trace_mapper.js"
-#}
-
-# Apply dev_compiler's patch files to create the Dart version of the dartdevk
-# SDK.
-action("dartdevk_patch_sdk") {
-  # TODO(rnystrom): Unfork DDC's patch_sdk.dart script with the
-  # tools/patch_sdk.dart and then change this to use generate_patch_sdk().
-  deps = [
-    ":dartdevk_files_stamp",
-
-    # The patch script uses several packages, including analyzer, so consider
-    # it dirty if any of those change.
-    "../../pkg:pkg_files_stamp",
-  ]
-
-  if (!prebuilt_dart_exe_works) {
-    deps += [ "$dart_root/runtime/bin:dart_bootstrap($dart_host_toolchain)" ]
-  }
-
-  script = "../../tools/patch_sdk.py"
-
-  # We list the `patch_sdk.dart` tool here because the [script] (which is
-  # implicitly an input) will call it.
-  inputs = [
-    "../../pkg/dev_compiler/tool/patch_sdk.dart",
-  ]
-
-  # The main SDK library sources.
-  inputs += sdk_lib_files
-
-  # dev_compiler's additional sources and patch files.
-  inputs += exec_script("../../tools/list_dart_files.py",
-                        [
-                          "absolute",
-                          rebase_path("../../pkg/dev_compiler/tool/input_sdk"),
-                        ],
-                        "list lines")
-
-  # Arbitrarily use the version file as a token file to check against to see if
-  # the sources have changed.
-  # TODO(rnystrom): List the outputs more precisely?
-  outputs = [
-    "$patched_sdk_dir/version",
-  ]
-
-  args = []
-  if (!prebuilt_dart_exe_works) {
-    dart_out_dir = get_label_info(
-            "$dart_root/runtime/bin:dart_bootstrap($dart_host_toolchain)",
-            "root_out_dir")
-    dart_bootstrap =
-        rebase_path("$dart_out_dir/dart_bootstrap$executable_suffix")
-    args += [
-      "--dart-executable",
-      dart_bootstrap,
-    ]
-  }
-
-  args += [
-  "--script",
-    rebase_path("../../pkg/dev_compiler/tool/patch_sdk.dart"),
-    rebase_path("../../"),
-    rebase_path("../../pkg/dev_compiler/tool/input_sdk"),
-    rebase_path(patched_sdk_dir),
-  ]
-}
-
-# Compiles the Dart core libraries and DDC runtime to an analyzer summary and
-# JS.
-action("dartdevk_sdk") {
-  deps = [
-    ":dartdevk_files_stamp",
-    ":dartdevk_patch_sdk",
-    "../../pkg:pkg_files_stamp",
-  ]
-
-  if (!prebuilt_dart_exe_works) {
-    deps += [ "$dart_root/runtime/bin:dart_bootstrap($dart_host_toolchain)" ]
-  }
-
-  script = "../../tools/run_dart.py"
-
-  args = []
-  if (!prebuilt_dart_exe_works) {
-    dart_out_dir = get_label_info(
-            "$dart_root/runtime/bin:dart_bootstrap($dart_host_toolchain)",
-            "root_out_dir")
-    dart_bootstrap =
-        rebase_path("$dart_out_dir/dart_bootstrap$executable_suffix")
-    args += [
-      "--dart",
-      dart_bootstrap,
-    ]
-  }
-
-  args = [
-    "--quiet",
-    rebase_path("../../pkg/dev_compiler/tool/build_sdk.dart"),
-    "--dart-sdk-summary=build",
-    "--summary-out",
-    rebase_path(sdk_summary),
-    "--source-map",
-    "--source-map-comment",
-    "--inline-source-map",
-    "--modules=amd",
-    "-o",
-    rebase_path("$target_gen_dir/js/amd/dart_sdk.js"),
-    "--modules=es6",
-    "-o",
-    rebase_path("$target_gen_dir/js/es6/dart_sdk.js"),
-    "--modules=common",
-    "-o",
-    rebase_path("$target_gen_dir/js/common/dart_sdk.js"),
-    "--modules=legacy",
-    "-o",
-    rebase_path("$target_gen_dir/js/legacy/dart_sdk.js"),
-  ]
-
-  inputs = [
-    "../../pkg/dev_compiler/tool/build_sdk.dart",
-
-    # Since the entire patched SDK is built in one step, if any file changes,
-    # they all will. Instead of listing them all as outputs of
-    # dartdevk_patch_sdk (which would require something like a depfile), just
-    # use version as the token file whose timestamp we track.
-    # TODO(rnystrom): Do something better?
-    "$patched_sdk_dir/version",
-
-    # If dev_compiler itself changes, it can affect the generated SDK.
-    "$target_gen_dir/dartdevk_files.stamp",
-
-    # Likewise, the packages dev_compiler depends on may affect its output.
-    "$root_gen_dir/pkg_files.stamp",
-  ]
-
-  outputs = [
-    sdk_summary,
-    "$target_gen_dir/js/amd/dart_sdk.js",
-    "$target_gen_dir/js/amd/dart_sdk.js.map",
-    "$target_gen_dir/js/common/dart_sdk.js",
-    "$target_gen_dir/js/common/dart_sdk.js.map",
-    "$target_gen_dir/js/es6/dart_sdk.js",
-    "$target_gen_dir/js/es6/dart_sdk.js.map",
-    "$target_gen_dir/js/legacy/dart_sdk.js",
-    "$target_gen_dir/js/legacy/dart_sdk.js.map",
-  ]
-}
-
-# Builds everything needed to run dartdevk and dartdevk tests using test.dart.
-group("dartdevk_test") {
-  deps = [
-    ":dartdevk",
-    ":dartdevk_sdk",
-    ":dartdevk_sdk_kernel_summary",
-    ":dartdevk_test_pkg",
-    "../../sdk:create_sdk",
-  ]
-}
-
-create_timestamp_file("dartdevk_files_stamp") {
-  path = rebase_path("../../pkg/dev_compiler/lib")
-  output = "$target_gen_dir/dartdevk_files.stamp"
-}
-
-# Compiles the packages used by the tests to JS with dartdevk so that they are
-# available for loading by the tests.
-compiled_action("dartdevk_test_pkg") {
-  tool = "../../runtime/bin:dart"
-
-  deps = [
-    ":dartdevk_files_stamp",
-    ":dartdevk_sdk",
-    ":dartdevk_sdk_kernel_summary",
-    "../../pkg:pkg_files_stamp",
-  ]
-
-  inputs = [
-    "$target_gen_dir/ddc_sdk.dill",
-    sdk_summary,
-    "$target_gen_dir/dartdevk_files.stamp",
-    "$root_gen_dir/pkg_files.stamp",
-  ]
-
-  outputs = [
-    "$target_gen_dir/pkg/async_helper.dill",
-    "$target_gen_dir/pkg/async_helper.js",
-    "$target_gen_dir/pkg/async_helper.sum",
-    "$target_gen_dir/pkg/collection.dill",
-    "$target_gen_dir/pkg/collection.js",
-    "$target_gen_dir/pkg/collection.sum",
-    "$target_gen_dir/pkg/expect.dill",
-    "$target_gen_dir/pkg/expect.js",
-    "$target_gen_dir/pkg/expect.sum",
-    "$target_gen_dir/pkg/js.dill",
-    "$target_gen_dir/pkg/js.js",
-    "$target_gen_dir/pkg/js.sum",
-    "$target_gen_dir/pkg/matcher.dill",
-    "$target_gen_dir/pkg/matcher.js",
-    "$target_gen_dir/pkg/matcher.sum",
-    "$target_gen_dir/pkg/meta.dill",
-    "$target_gen_dir/pkg/meta.js",
-    "$target_gen_dir/pkg/meta.sum",
-    "$target_gen_dir/pkg/path.dill",
-    "$target_gen_dir/pkg/path.js",
-    "$target_gen_dir/pkg/path.sum",
-    "$target_gen_dir/pkg/stack_trace.dill",
-    "$target_gen_dir/pkg/stack_trace.js",
-    "$target_gen_dir/pkg/stack_trace.sum",
-
-    # TODO(rnystrom): Remove this when unittest is no longer used. Also remove
-    # any of the above packages that are only here because unittest uses them.
-    "$target_gen_dir/pkg/unittest.dill",
-    "$target_gen_dir/pkg/unittest.js",
-    "$target_gen_dir/pkg/unittest.sum",
-  ]
-
-  args = [
-    rebase_path("../../pkg/dev_compiler/tool/build_pkgs.dart"),
-    "--analyzer-sdk",
-    rebase_path(sdk_summary),
-    "--kernel-sdk",
-    rebase_path("$target_gen_dir/ddc_sdk.dill"),
-    "--output",
-    rebase_path("$target_gen_dir"),
-  ]
-}
-
-# Compiles the DDC SDK's kernel summary.
-compiled_action("dartdevk_sdk_kernel_summary") {
-  tool = "../../runtime/bin:dart"
-
-  deps = [
-    ":dartdevk_files_stamp",
-  ]
-
-  inputs = [
-    "$target_gen_dir/dartdevk_files.stamp",
-  ]
-
-  outputs = [
-    "$target_gen_dir/ddc_sdk.dill",
-  ]
-
-  args = [
-    rebase_path("../../pkg/dev_compiler/tool/kernel_sdk.dart"),
-    rebase_path("$target_gen_dir/ddc_sdk.dill"),
-  ]
-}
