diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1c96bf6..a579da2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,9 +8,25 @@
   This allows libraries with no library declarations (and therefore no name)
   to have parts, and it allows tools to easily find the library of a part
   file.
+* Added support for starting `async` functions synchronously. All tools (VM,
+  dart2js, DDC) have now a flag `--sync-async` to enable this behavior.
+  Currently this behavior is opt-in. It will become the default.
 
 #### Strong Mode
 
+* Future flattening is now done only as specified in the Dart 2.0 spec, rather
+than more broadly.  This means that the following code will now have an error on
+the assignment to `y`.
+
+  ```dart
+    test() {
+      Future<int> f;
+      var x = f.then<Future<List<int>>>((x) => []);
+      Future<List<int>> y = x;
+    }
+    ```
+
+
 ### Core library changes
 
 * `dart:async`
@@ -51,6 +67,7 @@
     `MINUTES_PER_DAY` to `minutesPerDay`, and
     `ZERO` to `zero`.
   * Added `Provisional` annotation to `dart:core`.
+  * Added static `escape` function to `RegExp` class.
 
 * `dart:convert`
   * `Utf8Decoder` when compiled with dart2js uses the browser's `TextDecoder` in
diff --git a/DEPS b/DEPS
index dca297c..b14f921 100644
--- a/DEPS
+++ b/DEPS
@@ -36,6 +36,7 @@
   "fuchsia_git": "https://fuchsia.googlesource.com",
 
   "co19_rev": "@dec2b67aaab3bb7339b9764049707e71e601da3d",
+  "co19_2_rev": "@d8cdc47f759b0e89a517403ffa13eccd874bbbc0",
 
   # As Flutter does, we pull buildtools, including the clang toolchain, from
   # Fuchsia. This revision should be kept up to date with the revision pulled
@@ -50,7 +51,7 @@
 
   # Revisions of /third_party/* dependencies.
   "args_tag": "@0.13.7",
-  "async_tag": "@2.0.2",
+  "async_tag": "@corelib_2_2_1",
   "barback-0.13.0_rev": "@34853",
   "barback-0.14.0_rev": "@36398",
   "barback-0.14.1_rev": "@38525",
@@ -87,7 +88,7 @@
   "func_rev": "@25eec48146a58967d75330075ab376b3838b18a8",
   "glob_tag": "@1.1.5",
   "html_tag" : "@0.13.2+2",
-  "http_io_tag": "@bea7f236fbd62f6e1b47d4806a889f628c58d114",
+  "http_io_tag": "@35dc43c9144cf7ed4236843dacd62ebaf89df21a",
   "http_multi_server_tag" : "@2.0.4",
   "http_parser_tag" : "@3.1.1",
   "http_retry_tag": "@0.1.0",
@@ -102,7 +103,7 @@
   "logging_tag": "@0.11.3+1",
   "markdown_tag": "@1.0.0",
   "matcher_tag": "@0.12.1+4",
-  "mime_tag": "@0.9.4",
+  "mime_tag": "@0.9.6",
   "mockito_tag": "@2.0.2",
   "mustache4dart_tag" : "@v2.1.0",
   "oauth2_tag": "@1.1.0",
@@ -139,9 +140,9 @@
   "tuple_tag": "@v1.0.1",
   "typed_data_tag": "@1.1.3",
   "usage_tag": "@3.3.0",
-  "utf_tag": "@0.9.0+3",
-  "watcher_tag": "@0.9.7+4",
-  "web_socket_channel_tag": "@1.0.6",
+  "utf_tag": "@0.9.0+4",
+  "watcher_tag": "@0.9.7+7",
+  "web_socket_channel_tag": "@corelib_2_2_1",
   "WebCore_rev": "@3c45690813c112373757bbef53de1602a62af609",
   "yaml_tag": "@2.1.13",
   "zlib_rev": "@c3d0a6190f2f8c924a05ab6cc97b8f975bddd33f",
@@ -158,6 +159,10 @@
   Var("dart_root") + "/tests/co19/src":
       Var("dart_git") + "co19.git" + Var("co19_rev"),
 
+Var("dart_root") + "/tests/co19_2/src":
+      Var("chromium_git") + "/external/github.com/dart-lang/co19.git" +
+      Var("co19_2_rev"),
+
   Var("dart_root") + "/third_party/zlib":
       Var("chromium_git") + "/chromium/src/third_party/zlib.git" +
       Var("zlib_rev"),
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index 6923a31..210a22d 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -109,7 +109,7 @@
 <body>
 <h1>Analysis Server API Specification</h1>
 <h1 style="color:#999999">Version
-  1.18.4
+  1.18.5
 </h1>
 <p>
   This document contains a specification of the API provided by the
diff --git a/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart b/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
index 1027255..30c42f7 100644
--- a/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
+++ b/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
@@ -129,12 +129,15 @@
         element.parameters.isEmpty) {
       return null;
     }
-    parameters = element.parameters;
+    parameters = element.parameters.toList();
   } else if (element is engine.FunctionTypeAliasElement) {
-    parameters = element.parameters;
+    parameters = element.parameters.toList();
   } else {
     return null;
   }
+
+  parameters.sort(_preferRequiredParams);
+
   StringBuffer sb = new StringBuffer();
   String closeOptionalString = '';
   for (engine.ParameterElement parameter in parameters) {
@@ -214,3 +217,15 @@
   }
   return false;
 }
+
+// Sort @required named parameters before optional ones.
+int _preferRequiredParams(
+    engine.ParameterElement e1, engine.ParameterElement e2) {
+  int rank1 = e1.isRequired
+      ? 0
+      : e1.parameterKind != engine.ParameterKind.NAMED ? -1 : 1;
+  int rank2 = e2.isRequired
+      ? 0
+      : e2.parameterKind != engine.ParameterKind.NAMED ? -1 : 1;
+  return rank1 - rank2;
+}
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 369bb62..0ce8a02 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -108,7 +108,7 @@
    * The version of the analysis server. The value should be replaced
    * automatically during the build.
    */
-  static final String VERSION = '1.18.4';
+  static final String VERSION = '1.18.5';
 
   /**
    * The options of this server instance.
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index c1fd4e5..7e96426 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -177,6 +177,7 @@
       try {
         AssistProcessor processor = new AssistProcessor(dartAssistContext);
         List<Assist> assists = await processor.compute();
+        assists.sort(Assist.SORT_BY_RELEVANCE);
         for (Assist assist in assists) {
           changes.add(assist.change);
         }
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart b/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
index 5abb20f..819655d 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
@@ -138,12 +138,39 @@
         variableName = node.name;
       }
 
+      String label;
+      if (kind == protocol.FlutterOutlineKind.GENERIC) {
+        label = _getShortLabel(node);
+      }
+
       return new protocol.FlutterOutline(kind, node.offset, node.length,
-          className: className, variableName: variableName);
+          className: className, variableName: variableName, label: label);
     }
 
     return null;
   }
+
+  String _getShortLabel(AstNode node) {
+    if (node is MethodInvocation) {
+      var buffer = new StringBuffer();
+
+      if (node.target != null) {
+        buffer.write(_getShortLabel(node.target));
+        buffer.write('.');
+      }
+
+      buffer.write(node.methodName.name);
+
+      if (node.argumentList == null || node.argumentList.arguments.isEmpty) {
+        buffer.write('()');
+      } else {
+        buffer.write('(…)');
+      }
+
+      return buffer.toString();
+    }
+    return node.toString();
+  }
 }
 
 class _FlutterOutlineBuilder extends GeneralizingAstVisitor<void> {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
index 7cba458..d33a4eb 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
@@ -92,8 +92,6 @@
       new LocalLibraryContributor(),
       new LocalReferenceContributor(),
       new NamedConstructorContributor(),
-      // Revisit this contributor and these tests
-      // once DartChangeBuilder API has solidified.
       // new OverrideContributor(),
       new StaticMemberContributor(),
       new TypeMemberContributor(),
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
index 492567f..c13b677 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
@@ -12,9 +12,11 @@
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/resolver/inheritance_manager.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
 
 /**
  * A completion contributor used to suggest replacing partial identifiers inside
@@ -48,7 +50,7 @@
       // Gracefully degrade if the overridden element has not been resolved.
       if (element.returnType != null) {
         CompletionSuggestion suggestion =
-            _buildSuggestion(request, targetId, element);
+            await _buildSuggestion(request, targetId, element);
         if (suggestion != null) {
           suggestions.add(suggestion);
         }
@@ -58,33 +60,29 @@
   }
 
   /**
-   * Return a template for an override of the given [element] in the given
-   * [source]. If selected, the template will replace [targetId].
+   * Return a template for an override of the given [element]. If selected, the
+   * template will replace [targetId].
    */
-  String _buildRepacementText(Source source, SimpleIdentifier targetId,
-      CompilationUnit unit, ExecutableElement element) {
-    // AnalysisContext context = element.context;
-    // Inject partially resolved unit for use by change builder
-    // DartChangeBuilder builder = new DartChangeBuilder(context, unit);
-    // builder.addFileEdit(source, context.getModificationStamp(source),
-    //     (DartFileEditBuilder builder) {
-    //   builder.addReplacement(targetId.offset, targetId.length,
-    //       (DartEditBuilder builder) {
-    //     builder.writeOverrideOfInheritedMember(element);
-    //   });
-    // });
-    // return builder.sourceChange.edits[0].edits[0].replacement.trim();
-    return '';
+  Future<String> _buildReplacementText(AnalysisResult result,
+      SimpleIdentifier targetId, ExecutableElement element) async {
+    DartChangeBuilder builder =
+        new DartChangeBuilder(result.driver.currentSession);
+    await builder.addFileEdit(result.path, (DartFileEditBuilder builder) {
+      builder.addReplacement(range.node(targetId), (DartEditBuilder builder) {
+        builder.writeOverrideOfInheritedMember(element);
+      });
+    });
+    return builder.sourceChange.edits[0].edits[0].replacement.trim();
   }
 
   /**
    * Build a suggestion to replace [targetId] in the given [unit]
    * with an override of the given [element].
    */
-  CompletionSuggestion _buildSuggestion(DartCompletionRequest request,
-      SimpleIdentifier targetId, ExecutableElement element) {
-    String completion = _buildRepacementText(
-        request.source, targetId, request.target.unit, element);
+  Future<CompletionSuggestion> _buildSuggestion(DartCompletionRequest request,
+      SimpleIdentifier targetId, ExecutableElement element) async {
+    String completion =
+        await _buildReplacementText(request.result, targetId, element);
     if (completion == null || completion.length == 0) {
       return null;
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/assist.dart b/pkg/analysis_server/lib/src/services/correction/assist.dart
index 013e7ce..5bb126d 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist.dart
@@ -47,6 +47,8 @@
       "Convert into line documentation comment");
   static const CONVERT_FLUTTER_CHILD =
       const AssistKind('CONVERT_FLUTTER_CHILD', 30, "Convert to children:");
+  static const CONVERT_INTO_ASYNC_BODY = const AssistKind(
+      'CONVERT_INTO_ASYNC_BODY', 30, "Convert into async function body");
   static const CONVERT_INTO_BLOCK_BODY = const AssistKind(
       'CONVERT_INTO_BLOCK_BODY', 30, "Convert into block body");
   static const CONVERT_INTO_EXPRESSION_BODY = const AssistKind(
@@ -93,6 +95,10 @@
       const AssistKind("REPARENT_FLUTTER_LIST", 30, "Wrap with new widget");
   static const REPARENT_FLUTTER_WIDGET =
       const AssistKind("REPARENT_FLUTTER_WIDGET", 30, "Wrap with new widget");
+  static const REPARENT_FLUTTER_WIDGET_CENTER =
+      const AssistKind("REPARENT_FLUTTER_WIDGET_CENTER", 29, "Center widget");
+  static const REPARENT_FLUTTER_WIDGET_PADDING = const AssistKind(
+      "REPARENT_FLUTTER_WIDGET_CENTER", 29, "Add widget padding");
   static const REMOVE_TYPE_ANNOTATION =
       const AssistKind('REMOVE_TYPE_ANNOTATION', 29, "Remove type annotation");
   static const REPLACE_CONDITIONAL_WITH_IF_ELSE = const AssistKind(
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index 16e29bf..1238735 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -125,6 +125,7 @@
     await _addProposal_convertIntoGetter();
     await _addProposal_convertDocumentationIntoBlock();
     await _addProposal_convertDocumentationIntoLine();
+    await _addProposal_convertToAsyncFunctionBody();
     await _addProposal_convertToBlockFunctionBody();
     await _addProposal_convertToExpressionFunctionBody();
     await _addProposal_convertFlutterChild();
@@ -159,6 +160,8 @@
   }
 
   FunctionBody getEnclosingFunctionBody() {
+    // TODO(brianwilkerson) Determine whether there is a reason why this method
+    // isn't just "return node.getAncestor((node) => node is FunctionBody);"
     {
       FunctionExpression function =
           node.getAncestor((node) => node is FunctionExpression);
@@ -674,6 +677,37 @@
     _addAssistFromBuilder(changeBuilder, DartAssistKind.CONVERT_PART_OF_TO_URI);
   }
 
+  Future<Null> _addProposal_convertToAsyncFunctionBody() async {
+    FunctionBody body = getEnclosingFunctionBody();
+    if (body == null || body.isAsynchronous || body.isGenerator) {
+      _coverageMarker();
+      return;
+    }
+
+    // Function bodies can be quite large, e.g. Flutter build() methods.
+    // It is surprising to see this Quick Assist deep in a function body.
+    if (body is BlockFunctionBody &&
+        selectionOffset > body.block.beginToken.end) {
+      return;
+    }
+    if (body is ExpressionFunctionBody &&
+        selectionOffset > body.beginToken.end) {
+      return;
+    }
+
+    AstNode parent = body.parent;
+    if (parent is ConstructorDeclaration) {
+      return;
+    }
+
+    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.convertFunctionFromSyncToAsync(body, typeProvider);
+    });
+    _addAssistFromBuilder(
+        changeBuilder, DartAssistKind.CONVERT_INTO_ASYNC_BODY);
+  }
+
   Future<Null> _addProposal_convertToBlockFunctionBody() async {
     FunctionBody body = getEnclosingFunctionBody();
     // prepare expression body
@@ -1831,6 +1865,23 @@
   }
 
   Future<Null> _addProposal_reparentFlutterWidget() async {
+    await _addProposal_reparentFlutterWidgetImpl();
+    await _addProposal_reparentFlutterWidgetImpl(
+        kind: DartAssistKind.REPARENT_FLUTTER_WIDGET_CENTER,
+        parentLibraryUri: 'package:flutter/widgets.dart',
+        parentClassName: 'Center');
+    await _addProposal_reparentFlutterWidgetImpl(
+        kind: DartAssistKind.REPARENT_FLUTTER_WIDGET_PADDING,
+        parentLibraryUri: 'package:flutter/widgets.dart',
+        parentClassName: 'Padding',
+        leadingLines: ['padding: const EdgeInsets.all(8.0),']);
+  }
+
+  Future<Null> _addProposal_reparentFlutterWidgetImpl(
+      {AssistKind kind: DartAssistKind.REPARENT_FLUTTER_WIDGET,
+      String parentLibraryUri,
+      String parentClassName,
+      List<String> leadingLines: const []}) async {
     InstanceCreationExpression newExpr = flutter.identifyNewExpression(node);
     if (newExpr == null || !flutter.isWidgetCreation(newExpr)) {
       _coverageMarker();
@@ -1838,36 +1889,56 @@
     }
     String newExprSrc = utils.getNodeText(newExpr);
 
+    // If the wrapper class is specified, find its element.
+    ClassElement parentClassElement;
+    if (parentLibraryUri != null && parentClassName != null) {
+      var parentLibrary = await session.getLibraryByUri(parentLibraryUri);
+      var element = parentLibrary.exportNamespace.get(parentClassName);
+      if (element is ClassElement) {
+        parentClassElement = element;
+      } else {
+        return;
+      }
+    }
+
     DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addReplacement(range.node(newExpr), (DartEditBuilder builder) {
         builder.write('new ');
-        builder.addSimpleLinkedEdit('WIDGET', 'widget');
+        if (parentClassElement == null) {
+          builder.addSimpleLinkedEdit('WIDGET', 'widget');
+        } else {
+          builder.writeType(parentClassElement.type);
+        }
         builder.write('(');
-        if (newExprSrc.contains(eol)) {
-          int newlineIdx = newExprSrc.lastIndexOf(eol);
-          int eolLen = eol.length;
-          if (newlineIdx == newExprSrc.length - eolLen) {
-            newlineIdx -= eolLen;
-          }
-          String indentOld =
-              utils.getLinePrefix(newExpr.offset + eolLen + newlineIdx);
+        if (newExprSrc.contains(eol) || leadingLines.isNotEmpty) {
+          String indentOld = utils.getLinePrefix(newExpr.offset);
           String indentNew = '$indentOld${utils.getIndent(1)}';
+
+          for (var leadingLine in leadingLines) {
+            builder.write(eol);
+            builder.write(indentNew);
+            builder.write(leadingLine);
+          }
+
           builder.write(eol);
           builder.write(indentNew);
           newExprSrc = newExprSrc.replaceAll(
               new RegExp("^$indentOld", multiLine: true), indentNew);
           newExprSrc += ",$eol$indentOld";
         }
-        builder.addSimpleLinkedEdit('CHILD', 'child');
+        if (parentClassElement == null) {
+          builder.addSimpleLinkedEdit('CHILD', 'child');
+        } else {
+          builder.write('child');
+        }
         builder.write(': ');
         builder.write(newExprSrc);
         builder.write(')');
         builder.selectHere();
       });
     });
-    _addAssistFromBuilder(
-        changeBuilder, DartAssistKind.REPARENT_FLUTTER_WIDGET);
+    _addAssistFromBuilder(changeBuilder, kind);
   }
 
   Future<Null> _addProposal_replaceConditionalWithIfElse() async {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index bfcd0dc..ab6d4ac 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -78,6 +78,7 @@
             errorCode.name == LintNames.avoid_init_to_null ||
             errorCode.name == LintNames.prefer_collection_literals ||
             errorCode.name == LintNames.prefer_conditional_assignment ||
+            errorCode.name == LintNames.prefer_const_declarations ||
             errorCode.name == LintNames.unnecessary_brace_in_string_interp ||
             errorCode.name == LintNames.unnecessary_lambdas ||
             errorCode.name == LintNames.unnecessary_this));
@@ -205,6 +206,8 @@
       const FixKind('REMOVE_UNUSED_IMPORT', 50, "Remove unused import");
   static const REPLACE_BOOLEAN_WITH_BOOL = const FixKind(
       'REPLACE_BOOLEAN_WITH_BOOL', 50, "Replace 'boolean' with 'bool'");
+  static const REPLACE_FINAL_WITH_CONST = const FixKind(
+      'REPLACE_FINAL_WITH_CONST', 50, "Replace 'final' with 'const'");
   static const REPLACE_VAR_WITH_DYNAMIC = const FixKind(
       'REPLACE_VAR_WITH_DYNAMIC', 50, "Replace 'var' with 'dynamic'");
   static const REPLACE_RETURN_TYPE_FUTURE = const FixKind(
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 853962e..fcba496 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -444,6 +444,9 @@
       if (name == LintNames.prefer_conditional_assignment) {
         await _addFix_replaceWithConditionalAssignment();
       }
+      if (errorCode.name == LintNames.prefer_const_declarations) {
+        await _addFix_replaceFinalWithConst();
+      }
       if (name == LintNames.prefer_is_not_empty) {
         await _addFix_isNotEmpty();
       }
@@ -1578,7 +1581,8 @@
     }
     // name
     builder.write(element.displayName);
-    builder.writeTypeParameters(element.typeParameters);
+    builder.writeTypeParameters(element.typeParameters,
+        methodBeingCopied: element);
     // parameters + body
     if (isGetter) {
       builder.write(' => null;');
@@ -2199,6 +2203,17 @@
     _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_UNUSED_IMPORT);
   }
 
+  Future<Null> _addFix_replaceFinalWithConst() async {
+    if (node is VariableDeclarationList) {
+      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addSimpleReplacement(
+            range.token((node as VariableDeclarationList).keyword), 'const');
+      });
+      _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_FINAL_WITH_CONST);
+    }
+  }
+
   Future<Null> _addFix_replaceVarWithDynamic() async {
     DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
@@ -3250,6 +3265,7 @@
   static const String prefer_collection_literals = 'prefer_collection_literals';
   static const String prefer_conditional_assignment =
       'prefer_conditional_assignment';
+  static const String prefer_const_declarations = 'prefer_const_declarations';
   static const String prefer_is_not_empty = 'prefer_is_not_empty';
   static const String type_init_formals = 'type_init_formals';
   static const String unnecessary_brace_in_string_interp =
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
index 59153af..60c9475 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
@@ -450,8 +450,7 @@
       return node.constKeyword != null;
     }
     if (node is InstanceCreationExpression) {
-      InstanceCreationExpression creation = node;
-      return creation.isConst;
+      return node.isConst;
     }
     if (node is ArgumentList ||
         node is ConditionalExpression ||
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index 934dc07..069e2b0 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -21,6 +21,7 @@
 import 'package:front_end/src/base/performance_logger.dart';
 
 import 'mock_sdk.dart';
+import 'src/utilities/flutter_util.dart';
 
 /**
  * Finds an [Element] with the given [name].
@@ -55,6 +56,11 @@
 
   AnalysisDriver get driver => _driver;
 
+  void addFlutterPackage() {
+    Folder libFolder = configureFlutterPackage(resourceProvider);
+    packageMap['flutter'] = [libFolder];
+  }
+
   Source addMetaPackageSource() => addPackageSource('meta', 'meta.dart', r'''
 library meta;
 
diff --git a/pkg/analysis_server/test/plugin/protocol_dart_test.dart b/pkg/analysis_server/test/plugin/protocol_dart_test.dart
index 9a1717a..3e486d5 100644
--- a/pkg/analysis_server/test/plugin/protocol_dart_test.dart
+++ b/pkg/analysis_server/test/plugin/protocol_dart_test.dart
@@ -168,6 +168,56 @@
     expect(element.flags, Element.FLAG_CONST);
   }
 
+  test_fromElement_CONSTRUCTOR_required_parameters_1() async {
+    addMetaPackageSource();
+    engine.Source source = addSource('/test.dart', '''
+import 'package:meta/meta.dart';    
+class A {
+  const A.myConstructor(int a, {int b, @required int c});
+}''');
+
+    engine.CompilationUnit unit = await resolveLibraryUnit(source);
+    engine.ConstructorElement engineElement =
+        findElementInUnit(unit, 'myConstructor');
+    // create notification Element
+    Element element = convertElement(engineElement);
+    expect(element.parameters, '(int a, {int c, int b})');
+  }
+
+  // Verify parameter re-ordering for required params
+  test_fromElement_CONSTRUCTOR_required_parameters_2() async {
+    addMetaPackageSource();
+    engine.Source source = addSource('/test.dart', '''
+import 'package:meta/meta.dart';    
+class A {
+  const A.myConstructor(int a, {int b, @required int d, @required int c});
+}''');
+
+    engine.CompilationUnit unit = await resolveLibraryUnit(source);
+    engine.ConstructorElement engineElement =
+        findElementInUnit(unit, 'myConstructor');
+    // create notification Element
+    Element element = convertElement(engineElement);
+    expect(element.parameters, '(int a, {int d, int c, int b})');
+  }
+
+  // Verify parameter re-ordering for required params
+  test_fromElement_CONSTRUCTOR_required_parameters_3() async {
+    addMetaPackageSource();
+    engine.Source source = addSource('/test.dart', '''
+import 'package:meta/meta.dart';    
+class A {
+  const A.myConstructor(int a, {int b, @required int d, @required int c, int a});
+}''');
+
+    engine.CompilationUnit unit = await resolveLibraryUnit(source);
+    engine.ConstructorElement engineElement =
+        findElementInUnit(unit, 'myConstructor');
+    // create notification Element
+    Element element = convertElement(engineElement);
+    expect(element.parameters, '(int a, {int d, int c, int b, int a})');
+  }
+
   void test_fromElement_dynamic() {
     var engineElement = engine.DynamicElementImpl.instance;
     // create notification Element
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 3cf0ef7..05c1b3d 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
@@ -8,7 +8,6 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../../src/utilities/flutter_util.dart';
 import 'completion_contributor_util.dart';
 
 main() {
@@ -252,12 +251,10 @@
   }
 
   test_ArgumentList_Flutter_InstanceCreationExpression_0() async {
-    configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
 
     addTestSource('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/widgets.dart';
 
 build() => new Row(
     ^
@@ -275,12 +272,10 @@
   }
 
   test_ArgumentList_Flutter_InstanceCreationExpression_01() async {
-    configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
 
     addTestSource('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/material.dart';
 
   build() => new Scaffold(
         appBar: new AppBar(
@@ -291,20 +286,18 @@
 
     await computeSuggestions();
 
-    assertSuggest('color: ,',
+    assertSuggest('backgroundColor: ,',
         csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
         relevance: DART_RELEVANCE_NAMED_PARAMETER,
         defaultArgListString: null, // No default values.
-        selectionOffset: 7);
+        selectionOffset: 17);
   }
 
   test_ArgumentList_Flutter_InstanceCreationExpression_1() async {
-    configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
 
     addTestSource('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/material.dart';
 
 build() => new Row(
     key: null,
@@ -323,12 +316,10 @@
   }
 
   test_ArgumentList_Flutter_InstanceCreationExpression_2() async {
-    configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
 
     addTestSource('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/material.dart';
 
 build() => new Row(
     ^
@@ -349,17 +340,18 @@
   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.
-    configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code +
-          '\nclass DynamicRow extends Widget { DynamicRow({List children: null}){}}'
-    });
+    addFlutterPackage();
 
     addTestSource('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/material.dart';
 
 build() => new Container(
     child: new DynamicRow(^);
   );
+
+class DynamicRow extends Widget {
+  DynamicRow({List children: null});
+}
 ''');
 
     await computeSuggestions();
@@ -374,17 +366,18 @@
 
   test_ArgumentList_Flutter_InstanceCreationExpression_children_Map() async {
     // Ensure we don't generate Map params for a future API
-    configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code +
-          '\nclass MapRow extends Widget { MapRow({Map<Object,Object> children: null}){}}'
-    });
+    addFlutterPackage();
 
     addTestSource('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/material.dart';
 
 build() => new Container(
     child: new MapRow(^);
   );
+
+class MapRow extends Widget {
+  MapRow({Map<Object, Object> children: null});
+}
 ''');
 
     await computeSuggestions();
@@ -397,18 +390,18 @@
   }
 
   test_ArgumentList_Flutter_InstanceCreationExpression_slivers() async {
-    configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code +
-          '\nclass CustomScrollView extends Widget { CustomScrollView('
-          '\n{List<Widget> slivers}){}}'
-    });
+    addFlutterPackage();
 
     addTestSource('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/material.dart';
 
 build() => new CustomScrollView(
     ^
   );
+
+class CustomScrollView extends Widget {
+  CustomScrollView({List<Widget> slivers});
+}
 ''');
 
     await computeSuggestions();
@@ -423,16 +416,15 @@
 
   test_ArgumentList_Flutter_MethodExpression_children() async {
     // Ensure we don't generate params for a method call
-    configureFlutterPkg({
-      'src/widgets/framework.dart':
-          flutter_framework_code + '\nfoo({String children})'
-    });
+    addFlutterPackage();
 
     addTestSource('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/material.dart';
 
 main() {
 foo(^);
+
+foo({String children}) {}
 ''');
 
     await computeSuggestions();
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
index f368461..14f2fca 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
@@ -9,8 +9,6 @@
 import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart'
     show DartCompletionRequestImpl;
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/generated/parser.dart' as analyzer;
 import 'package:analyzer/src/generated/source.dart';
@@ -18,7 +16,6 @@
 import 'package:test/test.dart';
 
 import '../../../abstract_context.dart';
-import '../../../src/utilities/flutter_util.dart';
 
 int suggestionComparator(CompletionSuggestion s1, CompletionSuggestion s2) {
   String c1 = s1.completion.toLowerCase();
@@ -497,30 +494,6 @@
     expect(suggestions, isNotNull, reason: 'expected suggestions');
   }
 
-  /**
-   * Configures the [SourceFactory] to have the `flutter` package in
-   * `/packages/flutter/lib` folder.
-   */
-  void configureFlutterPkg(Map<String, String> pathToCode) {
-    pathToCode.forEach((path, code) {
-      newFile('$flutterPkgLibPath/$path', content: code);
-    });
-    // configure SourceFactory
-    Folder myPkgFolder = getFolder(flutterPkgLibPath);
-    UriResolver pkgResolver = new PackageMapUriResolver(resourceProvider, {
-      'flutter': [myPkgFolder]
-    });
-    SourceFactory sourceFactory = new SourceFactory(
-        [new DartUriResolver(sdk), pkgResolver, resourceResolver]);
-    driver.configure(sourceFactory: sourceFactory);
-    // force 'flutter' resolution
-    addSource(
-        '/tmp/other.dart',
-        pathToCode.keys
-            .map((path) => "import 'package:flutter/$path';")
-            .join('\n'));
-  }
-
   DartCompletionContributor createContributor();
 
   void failedCompletion(String message,
diff --git a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
index e0d356c..25178e7 100644
--- a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
@@ -11,10 +11,7 @@
 import 'completion_contributor_util.dart';
 
 main() {
-  // Revisit this contributor and these tests
-  // once DartChangeBuilder API has solidified.
-  // initializeTestEnvironment();
-  // defineReflectiveTests(InheritedContributorTest);
+  defineReflectiveTests(OverrideContributorTest);
 }
 
 @reflectiveTest
diff --git a/pkg/analysis_server/test/services/correction/assist_test.dart b/pkg/analysis_server/test/services/correction/assist_test.dart
index a307b98..09ec41d 100644
--- a/pkg/analysis_server/test/services/correction/assist_test.dart
+++ b/pkg/analysis_server/test/services/correction/assist_test.dart
@@ -11,8 +11,6 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/dart/analysis/ast_provider_driver.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/element/ast_provider.dart';
@@ -25,7 +23,6 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../abstract_single_unit.dart';
-import '../../src/utilities/flutter_util.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -917,11 +914,9 @@
   }
 
   test_convertFlutterChild_OK_multiLine() async {
-    _configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
     await resolveTestUnit('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/material.dart';
 build() {
   return new Scaffold(
 // start
@@ -938,7 +933,7 @@
 ''');
     _setCaretLocation();
     await assertHasAssist(DartAssistKind.CONVERT_FLUTTER_CHILD, '''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/material.dart';
 build() {
   return new Scaffold(
 // start
@@ -959,11 +954,9 @@
 
   test_convertFlutterChild_OK_newlineChild() async {
     // This case could occur with deeply nested constructors, common in Flutter.
-    _configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
     await resolveTestUnit('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/material.dart';
 build() {
   return new Scaffold(
 // start
@@ -981,7 +974,7 @@
 ''');
     _setCaretLocation();
     await assertHasAssist(DartAssistKind.CONVERT_FLUTTER_CHILD, '''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/material.dart';
 build() {
   return new Scaffold(
 // start
@@ -1001,11 +994,9 @@
   }
 
   test_convertFlutterChild_OK_singleLine() async {
-    _configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
     await resolveTestUnit('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/material.dart';
 build() {
   return new Scaffold(
 // start
@@ -1019,7 +1010,7 @@
 ''');
     _setCaretLocation();
     await assertHasAssist(DartAssistKind.CONVERT_FLUTTER_CHILD, '''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/material.dart';
 build() {
   return new Scaffold(
 // start
@@ -1061,6 +1052,119 @@
 ''');
   }
 
+  test_convertToAsyncBody_BAD_async() async {
+    await resolveTestUnit('''
+import 'dart:async';
+Future<String> f() async => '';
+''');
+    await assertNoAssistAt('=>', DartAssistKind.CONVERT_INTO_ASYNC_BODY);
+  }
+
+  test_convertToAsyncBody_BAD_asyncStar() async {
+    await resolveTestUnit('''
+import 'dart:async';
+Stream<String> f() async* {}
+''');
+    await assertNoAssistAt('{}', DartAssistKind.CONVERT_INTO_ASYNC_BODY);
+  }
+
+  test_convertToAsyncBody_BAD_constructor() async {
+    await resolveTestUnit('''
+class C {
+  C() {}
+}
+''');
+    await assertNoAssistAt('{}', DartAssistKind.CONVERT_INTO_ASYNC_BODY);
+  }
+
+  test_convertToAsyncBody_BAD_inBody_block() async {
+    await resolveTestUnit('''
+class C {
+  void foo() {
+    print(42);
+  }
+}
+''');
+    await assertNoAssistAt('print', DartAssistKind.CONVERT_INTO_ASYNC_BODY);
+  }
+
+  test_convertToAsyncBody_BAD_inBody_expression() async {
+    await resolveTestUnit('''
+class C {
+  void foo() => print(42);
+}
+''');
+    await assertNoAssistAt('print', DartAssistKind.CONVERT_INTO_ASYNC_BODY);
+  }
+
+  test_convertToAsyncBody_BAD_syncStar() async {
+    await resolveTestUnit('''
+Iterable<String> f() sync* {}
+''');
+    await assertNoAssistAt('{}', DartAssistKind.CONVERT_INTO_ASYNC_BODY);
+  }
+
+  test_convertToAsyncBody_OK_closure() async {
+    await resolveTestUnit('''
+main() {
+  f(() => 123);
+}
+f(g) {}
+''');
+    await assertHasAssistAt('=>', DartAssistKind.CONVERT_INTO_ASYNC_BODY, '''
+main() {
+  f(() async => 123);
+}
+f(g) {}
+''');
+  }
+
+  test_convertToAsyncBody_OK_function() async {
+    // TODO(brianwilkerson) Remove the "class C {}" when the bug in the builder
+    // is fixed that causes the import to be incorrectly inserted when the first
+    // character in the file is also being modified.
+    await resolveTestUnit('''
+class C {}
+String f() => '';
+''');
+    await assertHasAssistAt('=>', DartAssistKind.CONVERT_INTO_ASYNC_BODY, '''
+import 'dart:async';
+
+class C {}
+Future<String> f() async => '';
+''');
+  }
+
+  test_convertToAsyncBody_OK_method() async {
+    await resolveTestUnit('''
+class C {
+  int m() { return 0; }
+}
+''');
+    await assertHasAssistAt(
+        '{ return', DartAssistKind.CONVERT_INTO_ASYNC_BODY, '''
+import 'dart:async';
+
+class C {
+  Future<int> m() async { return 0; }
+}
+''');
+  }
+
+  test_convertToAsyncBody_OK_method_noReturnType() async {
+    await resolveTestUnit('''
+class C {
+  m() { return 0; }
+}
+''');
+    await assertHasAssistAt(
+        '{ return', DartAssistKind.CONVERT_INTO_ASYNC_BODY, '''
+class C {
+  m() async { return 0; }
+}
+''');
+  }
+
   test_convertToBlockBody_BAD_inExpression() async {
     await resolveTestUnit('''
 main() => 123;
@@ -3347,11 +3451,9 @@
   }
 
   test_moveFlutterWidgetDown_OK() async {
-    _configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
     await resolveTestUnit('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/material.dart';
 build() {
   return new Scaffold(
 // start
@@ -3372,7 +3474,7 @@
 ''');
     _setCaretLocation();
     await assertHasAssist(DartAssistKind.MOVE_FLUTTER_WIDGET_DOWN, '''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/material.dart';
 build() {
   return new Scaffold(
 // start
@@ -3394,11 +3496,9 @@
   }
 
   test_moveFlutterWidgetUp_OK() async {
-    _configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
     await resolveTestUnit('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/material.dart';
 build() {
   return new Scaffold(
 // start
@@ -3419,7 +3519,7 @@
 ''');
     _setCaretLocation();
     await assertHasAssist(DartAssistKind.MOVE_FLUTTER_WIDGET_UP, '''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/material.dart';
 build() {
   return new Scaffold(
 // start
@@ -3568,11 +3668,9 @@
 
   test_reparentFlutterList_BAD_multiLine() async {
     verifyNoTestUnitErrors = false;
-    _configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
     await resolveTestUnit('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/widgets.dart';
 build() {
   return new Container(
     child: new Row(
@@ -3592,11 +3690,9 @@
   }
 
   test_reparentFlutterList_BAD_singleLine() async {
-    _configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
     await resolveTestUnit('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/widgets.dart';
 class FakeFlutter {
   main() {
   var obj;
@@ -3611,11 +3707,9 @@
   }
 
   test_reparentFlutterList_OK_multiLine() async {
-    _configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
     await resolveTestUnit('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/widgets.dart';
 build() {
   return new Container(
     child: new Row(
@@ -3632,7 +3726,7 @@
 ''');
     _setCaretLocation();
     await assertHasAssist(DartAssistKind.REPARENT_FLUTTER_LIST, '''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/widgets.dart';
 build() {
   return new Container(
     child: new Row(
@@ -3654,9 +3748,7 @@
   }
 
   test_reparentFlutterWidget_BAD_minimal() async {
-    _configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
     await resolveTestUnit('''
 /*caret*/x(){}
 ''');
@@ -3665,11 +3757,9 @@
   }
 
   test_reparentFlutterWidget_BAD_singleLine() async {
-    _configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
     await resolveTestUnit('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/widgets.dart';
 class FakeFlutter {
   main() {
   var obj;
@@ -3684,11 +3774,9 @@
   }
 
   test_reparentFlutterWidget_OK_multiLines() async {
-    _configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
     await resolveTestUnit('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/widgets.dart';
 class FakeFlutter {
   main() {
     return new Container(
@@ -3708,7 +3796,7 @@
 ''');
     _setCaretLocation();
     await assertHasAssist(DartAssistKind.REPARENT_FLUTTER_WIDGET, '''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/widgets.dart';
 class FakeFlutter {
   main() {
     return new Container(
@@ -3731,11 +3819,9 @@
   }
 
   test_reparentFlutterWidget_OK_multiLines_eol2() async {
-    _configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
     await resolveTestUnit('''
-import 'package:flutter/src/widgets/framework.dart';\r
+import 'package:flutter/widgets.dart';
 class FakeFlutter {\r
   main() {\r
     return new Container(\r
@@ -3755,7 +3841,7 @@
 ''');
     _setCaretLocation();
     await assertHasAssist(DartAssistKind.REPARENT_FLUTTER_WIDGET, '''
-import 'package:flutter/src/widgets/framework.dart';\r
+import 'package:flutter/widgets.dart';
 class FakeFlutter {\r
   main() {\r
     return new Container(\r
@@ -3778,11 +3864,9 @@
   }
 
   test_reparentFlutterWidget_OK_singleLine1() async {
-    _configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
     await resolveTestUnit('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/widgets.dart';
 class FakeFlutter {
   main() {
 // start
@@ -3793,7 +3877,7 @@
 ''');
     _setCaretLocation();
     await assertHasAssist(DartAssistKind.REPARENT_FLUTTER_WIDGET, '''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/widgets.dart';
 class FakeFlutter {
   main() {
 // start
@@ -3805,27 +3889,66 @@
   }
 
   test_reparentFlutterWidget_OK_singleLine2() async {
-    _configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
     await resolveTestUnit('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/widgets.dart';
 class FakeFlutter {
   main() {
-// start
     return new ClipRect./*caret*/rect();
-// end
   }
 }
 ''');
     _setCaretLocation();
     await assertHasAssist(DartAssistKind.REPARENT_FLUTTER_WIDGET, '''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/widgets.dart';
 class FakeFlutter {
   main() {
-// start
     return new widget(child: new ClipRect./*caret*/rect());
-// end
+  }
+}
+''');
+  }
+
+  test_reparentFlutterWidgetCenter_OK() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    return /*caret*/new Container();
+  }
+}
+''');
+    _setCaretLocation();
+    await assertHasAssist(DartAssistKind.REPARENT_FLUTTER_WIDGET_CENTER, '''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    return /*caret*/new Center(child: new Container());
+  }
+}
+''');
+  }
+
+  test_reparentFlutterWidgetPadding_OK() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    return /*caret*/new Container();
+  }
+}
+''');
+    _setCaretLocation();
+    await assertHasAssist(DartAssistKind.REPARENT_FLUTTER_WIDGET_PADDING, '''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    return /*caret*/new Padding(
+      padding: const EdgeInsets.all(8.0),
+      child: new Container(),
+    );
   }
 }
 ''');
@@ -4390,30 +4513,6 @@
     return await processor.compute();
   }
 
-  /**
-   * Configures the [SourceFactory] to have the `flutter` package in
-   * `/packages/flutter/lib` folder.
-   */
-  void _configureFlutterPkg(Map<String, String> pathToCode) {
-    pathToCode.forEach((path, code) {
-      newFile('$flutterPkgLibPath/$path', content: code);
-    });
-    // configure SourceFactory
-    Folder myPkgFolder = getFolder(flutterPkgLibPath);
-    UriResolver pkgResolver = new PackageMapUriResolver(resourceProvider, {
-      'flutter': [myPkgFolder]
-    });
-    SourceFactory sourceFactory = new SourceFactory(
-        [new DartUriResolver(sdk), pkgResolver, resourceResolver]);
-    driver.configure(sourceFactory: sourceFactory);
-    // force 'flutter' resolution
-    addSource(
-        '/tmp/other.dart',
-        pathToCode.keys
-            .map((path) => "import 'package:flutter/$path';")
-            .join('\n'));
-  }
-
   List<Position> _findResultPositions(List<String> searchStrings) {
     List<Position> positions = <Position>[];
     for (String search in searchStrings) {
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index 5a13acd..a38a0d0 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -26,7 +26,6 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../abstract_single_unit.dart';
-import '../../src/utilities/flutter_util.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -211,6 +210,190 @@
 
 @reflectiveTest
 class FixProcessorTest extends BaseFixProcessorTest {
+  test_addAsync_asyncFor() async {
+    await resolveTestUnit('''
+import 'dart:async';
+void main(Stream<String> names) {
+  await for (String name in names) {
+    print(name);
+  }
+}
+''');
+    await assertHasFix(DartFixKind.ADD_ASYNC, '''
+import 'dart:async';
+Future main(Stream<String> names) async {
+  await for (String name in names) {
+    print(name);
+  }
+}
+''');
+  }
+
+  test_addAsync_BAD_nullFunctionBody() async {
+    await resolveTestUnit('''
+var F = await;
+''');
+    await assertNoFix(DartFixKind.ADD_ASYNC);
+  }
+
+  test_addAsync_blockFunctionBody() async {
+    await resolveTestUnit('''
+foo() {}
+main() {
+  await foo();
+}
+''');
+    List<AnalysisError> errors = await _computeErrors();
+    expect(errors, hasLength(2));
+    errors.sort((a, b) => a.message.compareTo(b.message));
+    // No fix for ";".
+    {
+      AnalysisError error = errors[0];
+      expect(error.message, "Expected to find ';'.");
+      List<Fix> fixes = await _computeFixes(error);
+      expect(fixes, isEmpty);
+    }
+    // Has fix for "await".
+    {
+      AnalysisError error = errors[1];
+      expect(error.message, startsWith("Undefined name 'await' in function"));
+      List<Fix> fixes = await _computeFixes(error);
+      // has exactly one fix
+      expect(fixes, hasLength(1));
+      Fix fix = fixes[0];
+      expect(fix.kind, DartFixKind.ADD_ASYNC);
+      // apply to "file"
+      List<SourceFileEdit> fileEdits = fix.change.edits;
+      expect(fileEdits, hasLength(1));
+      resultCode = SourceEdit.applySequence(testCode, fileEdits[0].edits);
+      // verify
+      expect(resultCode, '''
+foo() {}
+main() async {
+  await foo();
+}
+''');
+    }
+  }
+
+  test_addAsync_closure() async {
+    errorFilter = (AnalysisError error) {
+      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
+    };
+    await resolveTestUnit('''
+import 'dart:async';
+
+void takeFutureCallback(Future callback()) {}
+
+void doStuff() => takeFutureCallback(() => await 1);
+''');
+    await assertHasFix(DartFixKind.ADD_ASYNC, '''
+import 'dart:async';
+
+void takeFutureCallback(Future callback()) {}
+
+void doStuff() => takeFutureCallback(() async => await 1);
+''');
+  }
+
+  test_addAsync_expressionFunctionBody() async {
+    errorFilter = (AnalysisError error) {
+      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
+    };
+    await resolveTestUnit('''
+foo() {}
+main() => await foo();
+''');
+    await assertHasFix(DartFixKind.ADD_ASYNC, '''
+foo() {}
+main() async => await foo();
+''');
+  }
+
+  test_addAsync_returnFuture() async {
+    errorFilter = (AnalysisError error) {
+      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
+    };
+    await resolveTestUnit('''
+foo() {}
+int main() {
+  await foo();
+  return 42;
+}
+''');
+    await assertHasFix(DartFixKind.ADD_ASYNC, '''
+import 'dart:async';
+
+foo() {}
+Future<int> main() async {
+  await foo();
+  return 42;
+}
+''');
+  }
+
+  test_addAsync_returnFuture_alreadyFuture() async {
+    errorFilter = (AnalysisError error) {
+      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
+    };
+    await resolveTestUnit('''
+import 'dart:async';
+foo() {}
+Future<int> main() {
+  await foo();
+  return 42;
+}
+''');
+    await assertHasFix(DartFixKind.ADD_ASYNC, '''
+import 'dart:async';
+foo() {}
+Future<int> main() async {
+  await foo();
+  return 42;
+}
+''');
+  }
+
+  test_addAsync_returnFuture_dynamic() async {
+    errorFilter = (AnalysisError error) {
+      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
+    };
+    await resolveTestUnit('''
+foo() {}
+dynamic main() {
+  await foo();
+  return 42;
+}
+''');
+    await assertHasFix(DartFixKind.ADD_ASYNC, '''
+foo() {}
+dynamic main() async {
+  await foo();
+  return 42;
+}
+''');
+  }
+
+  test_addAsync_returnFuture_noType() async {
+    errorFilter = (AnalysisError error) {
+      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
+    };
+    await resolveTestUnit('''
+foo() {}
+main() {
+  await foo();
+  return 42;
+}
+''');
+    await assertHasFix(DartFixKind.ADD_ASYNC, '''
+foo() {}
+main() async {
+  await foo();
+  return 42;
+}
+''');
+  }
+
   test_addFieldFormalParameters_hasRequiredParameter() async {
     await resolveTestUnit('''
 class Test {
@@ -415,13 +598,11 @@
   }
 
   test_addMissingRequiredArg_cons_flutter_children() async {
-    addPackageSource(
-        'flutter', 'src/widgets/framework.dart', flutter_framework_code);
-
+    addFlutterPackage();
     _addMetaPackageSource();
 
     await resolveTestUnit('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/widgets.dart';
 import 'package:meta/meta.dart';
 
 class MyWidget extends Widget {
@@ -436,7 +617,7 @@
     await assertHasFix(
         DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT,
         '''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/widgets.dart';
 import 'package:meta/meta.dart';
 
 class MyWidget extends Widget {
@@ -767,170 +948,6 @@
 ''');
   }
 
-  test_addSync_asyncFor() async {
-    await resolveTestUnit('''
-import 'dart:async';
-void main(Stream<String> names) {
-  await for (String name in names) {
-    print(name);
-  }
-}
-''');
-    await assertHasFix(DartFixKind.ADD_ASYNC, '''
-import 'dart:async';
-Future main(Stream<String> names) async {
-  await for (String name in names) {
-    print(name);
-  }
-}
-''');
-  }
-
-  test_addSync_BAD_nullFunctionBody() async {
-    await resolveTestUnit('''
-var F = await;
-''');
-    await assertNoFix(DartFixKind.ADD_ASYNC);
-  }
-
-  test_addSync_blockFunctionBody() async {
-    await resolveTestUnit('''
-foo() {}
-main() {
-  await foo();
-}
-''');
-    List<AnalysisError> errors = await _computeErrors();
-    expect(errors, hasLength(2));
-    errors.sort((a, b) => a.message.compareTo(b.message));
-    // No fix for ";".
-    {
-      AnalysisError error = errors[0];
-      expect(error.message, "Expected to find ';'.");
-      List<Fix> fixes = await _computeFixes(error);
-      expect(fixes, isEmpty);
-    }
-    // Has fix for "await".
-    {
-      AnalysisError error = errors[1];
-      expect(error.message, startsWith("Undefined name 'await' in function"));
-      List<Fix> fixes = await _computeFixes(error);
-      // has exactly one fix
-      expect(fixes, hasLength(1));
-      Fix fix = fixes[0];
-      expect(fix.kind, DartFixKind.ADD_ASYNC);
-      // apply to "file"
-      List<SourceFileEdit> fileEdits = fix.change.edits;
-      expect(fileEdits, hasLength(1));
-      resultCode = SourceEdit.applySequence(testCode, fileEdits[0].edits);
-      // verify
-      expect(resultCode, '''
-foo() {}
-main() async {
-  await foo();
-}
-''');
-    }
-  }
-
-  test_addSync_expressionFunctionBody() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
-    };
-    await resolveTestUnit('''
-foo() {}
-main() => await foo();
-''');
-    await assertHasFix(DartFixKind.ADD_ASYNC, '''
-foo() {}
-main() async => await foo();
-''');
-  }
-
-  test_addSync_returnFuture() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
-    };
-    await resolveTestUnit('''
-foo() {}
-int main() {
-  await foo();
-  return 42;
-}
-''');
-    await assertHasFix(DartFixKind.ADD_ASYNC, '''
-import 'dart:async';
-
-foo() {}
-Future<int> main() async {
-  await foo();
-  return 42;
-}
-''');
-  }
-
-  test_addSync_returnFuture_alreadyFuture() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
-    };
-    await resolveTestUnit('''
-import 'dart:async';
-foo() {}
-Future<int> main() {
-  await foo();
-  return 42;
-}
-''');
-    await assertHasFix(DartFixKind.ADD_ASYNC, '''
-import 'dart:async';
-foo() {}
-Future<int> main() async {
-  await foo();
-  return 42;
-}
-''');
-  }
-
-  test_addSync_returnFuture_dynamic() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
-    };
-    await resolveTestUnit('''
-foo() {}
-dynamic main() {
-  await foo();
-  return 42;
-}
-''');
-    await assertHasFix(DartFixKind.ADD_ASYNC, '''
-foo() {}
-dynamic main() async {
-  await foo();
-  return 42;
-}
-''');
-  }
-
-  test_addSync_returnFuture_noType() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
-    };
-    await resolveTestUnit('''
-foo() {}
-main() {
-  await foo();
-  return 42;
-}
-''');
-    await assertHasFix(DartFixKind.ADD_ASYNC, '''
-foo() {}
-main() async {
-  await foo();
-  return 42;
-}
-''');
-  }
-
   test_boolean() async {
     await resolveTestUnit('''
 main() {
@@ -2685,7 +2702,6 @@
 ''');
   }
 
-  @failingTest
   test_createMissingOverrides_functionTypedParameter() async {
     await resolveTestUnit('''
 abstract class A {
@@ -2970,6 +2986,30 @@
 ''');
   }
 
+  test_createMissingOverrides_method_generic_withBounds() async {
+    // https://github.com/dart-lang/sdk/issues/31199
+    await resolveTestUnit('''
+abstract class A<K, V> {
+  List<T> foo<T extends V>(K key);
+}
+
+class B<K, V> implements A<K, V> {
+}
+''');
+    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
+abstract class A<K, V> {
+  List<T> foo<T extends V>(K key);
+}
+
+class B<K, V> implements A<K, V> {
+  @override
+  List<T> foo<T extends V>(K key) {
+    // TODO: implement foo
+  }
+}
+''');
+  }
+
   test_createMissingOverrides_method_notEmptyClassBody() async {
     await resolveTestUnit('''
 abstract class A {
@@ -5351,11 +5391,9 @@
   }
 
   test_undefinedParameter_convertFlutterChild_invalidList() async {
-    _configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
     await resolveTestUnit('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/widgets.dart';
 build() {
   return new Container(
     child: new Row(
@@ -5372,11 +5410,9 @@
   }
 
   test_undefinedParameter_convertFlutterChild_OK_hasList() async {
-    _configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
     await resolveTestUnit('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/widgets.dart';
 build() {
   return new Container(
     child: new Row(
@@ -5390,7 +5426,7 @@
 }
 ''');
     await assertHasFix(DartFixKind.CONVERT_FLUTTER_CHILD, '''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/widgets.dart';
 build() {
   return new Container(
     child: new Row(
@@ -5406,11 +5442,9 @@
   }
 
   test_undefinedParameter_convertFlutterChild_OK_hasTypedList() async {
-    _configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
     await resolveTestUnit('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/widgets.dart';
 build() {
   return new Container(
     child: new Row(
@@ -5424,7 +5458,7 @@
 }
 ''');
     await assertHasFix(DartFixKind.CONVERT_FLUTTER_CHILD, '''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/widgets.dart';
 build() {
   return new Container(
     child: new Row(
@@ -5440,11 +5474,9 @@
   }
 
   test_undefinedParameter_convertFlutterChild_OK_multiLine() async {
-    _configureFlutterPkg({
-      'src/widgets/framework.dart': flutter_framework_code,
-    });
+    addFlutterPackage();
     await resolveTestUnit('''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/material.dart';
 build() {
   return new Scaffold(
     body: new Row(
@@ -5457,7 +5489,7 @@
 }
 ''');
     await assertHasFix(DartFixKind.CONVERT_FLUTTER_CHILD, '''
-import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter/material.dart';
 build() {
   return new Scaffold(
     body: new Row(
@@ -5595,30 +5627,6 @@
 }
 ''');
   }
-
-  /**
-   * Configures the [SourceFactory] to have the `flutter` package in
-   * `/packages/flutter/lib` folder.
-   */
-  void _configureFlutterPkg(Map<String, String> pathToCode) {
-    pathToCode.forEach((path, code) {
-      newFile('$flutterPkgLibPath/$path', content: code);
-    });
-    // configure SourceFactory
-    Folder myPkgFolder = getFolder(flutterPkgLibPath);
-    UriResolver pkgResolver = new PackageMapUriResolver(resourceProvider, {
-      'flutter': [myPkgFolder]
-    });
-    SourceFactory sourceFactory = new SourceFactory(
-        [new DartUriResolver(sdk), pkgResolver, resourceResolver]);
-    driver.configure(sourceFactory: sourceFactory);
-    // force 'flutter' resolution
-    addSource(
-        '/tmp/other.dart',
-        pathToCode.keys
-            .map((path) => "import 'package:flutter/$path';")
-            .join('\n'));
-  }
 }
 
 @reflectiveTest
@@ -6426,6 +6434,19 @@
 ''');
   }
 
+  test_replaceFinalWithConst_method() async {
+    String src = '''
+/*LINT*/final int a = 1;
+''';
+    await findLint(src, LintNames.prefer_const_declarations);
+
+    await applyFix(DartFixKind.REPLACE_FINAL_WITH_CONST);
+
+    verifyResult('''
+const int a = 1;
+''');
+  }
+
   test_replaceWithConditionalAssignment_withCodeBeforeAndAfter() async {
     String src = '''
 class Person {
diff --git a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
index 18eb7d2..6cbfdff 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
@@ -126,6 +126,31 @@
     assertRefactoringStatusOK(status);
   }
 
+  test_checkFinalConditions_OK_noShadow_nullVisibleRange() async {
+    await indexTestUnit('''
+class A {
+  int foo;
+
+  A(this.foo);
+}
+
+class B {
+  int bar; // declaration
+
+  B(this.bar);
+
+  void referenceField() {
+    bar;
+  }
+}
+''');
+    createRenameRefactoringAtString('bar; // declaration');
+    // check status
+    refactoring.newName = 'foo';
+    RefactoringStatus status = await refactoring.checkFinalConditions();
+    assertRefactoringStatusOK(status);
+  }
+
   test_checkFinalConditions_publicToPrivate_usedInOtherLibrary() async {
     await indexTestUnit('''
 class A {
diff --git a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
index 80085b4..1da0f30 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
@@ -516,6 +516,30 @@
 ''');
   }
 
+  test_createChange_FunctionTypeAliasElement() async {
+    await indexTestUnit('''
+typedef void F();
+void foo<T>() {}
+void main() {
+  foo<F>();
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('F()');
+    expect(refactoring.refactoringName, 'Rename Function Type Alias');
+    expect(refactoring.elementKindName, 'function type alias');
+    expect(refactoring.oldName, 'F');
+    refactoring.newName = 'G';
+    // validate change
+    return assertSuccessfulRefactoring('''
+typedef void G();
+void foo<T>() {}
+void main() {
+  foo<G>();
+}
+''');
+  }
+
   test_createChange_PropertyAccessorElement_getter_declaration() async {
     await _test_createChange_PropertyAccessorElement("test {}");
   }
diff --git a/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart b/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
index 53d69f8..45a6435 100644
--- a/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
+++ b/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
@@ -206,6 +206,62 @@
     }
   }
 
+  test_genericLabel_invocation() async {
+    FlutterOutline unitOutline = await _computeOutline(r'''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+  @override
+  Widget build(BuildContext context) {
+    return new Row(children: [
+      createText(0),
+      createEmptyText(),
+      WidgetFactory.createMyText(),
+    ]);
+  }
+  Text createEmptyText() {
+    return new Text('');
+  }
+  Text createText(int index) {
+    return new Text('index: $index');
+  }
+}
+
+class WidgetFactory {
+  static Text createMyText() => new Text('');
+}
+''');
+    var myWidget = unitOutline.children[0];
+    var build = myWidget.children[0];
+    expect(build.children, hasLength(1));
+
+    var row = build.children[0];
+    expect(row.kind, FlutterOutlineKind.NEW_INSTANCE);
+    expect(row.className, 'Row');
+    expect(row.children, hasLength(3));
+
+    {
+      var text = row.children[0];
+      expect(text.kind, FlutterOutlineKind.GENERIC);
+      expect(text.className, 'Text');
+      expect(text.label, 'createText(…)');
+    }
+
+    {
+      var text = row.children[1];
+      expect(text.kind, FlutterOutlineKind.GENERIC);
+      expect(text.className, 'Text');
+      expect(text.label, 'createEmptyText()');
+    }
+
+    {
+      var text = row.children[2];
+      expect(text.kind, FlutterOutlineKind.GENERIC);
+      expect(text.className, 'Text');
+      expect(text.label, 'WidgetFactory.createMyText()');
+    }
+  }
+
   test_parentAssociationLabel() async {
     newFile('/a.dart', content: r'''
 import 'package:flutter/widgets.dart';
diff --git a/pkg/analysis_server/test/src/utilities/flutter_util.dart b/pkg/analysis_server/test/src/utilities/flutter_util.dart
index 6d1cd55..6a3167c 100644
--- a/pkg/analysis_server/test/src/utilities/flutter_util.dart
+++ b/pkg/analysis_server/test/src/utilities/flutter_util.dart
@@ -7,25 +7,6 @@
 
 String flutterPkgLibPath = '/packages/flutter/lib';
 
-String get flutter_framework_code => '''
-class Widget {}
-class RenderObjectWidget extends Widget {}
-class StatelessWidget extends Widget {}
-abstract class StatefulWidget extends Widget { }
-class SingleChildRenderObjectWidget extends RenderObjectWidget {}
-class Transform extends SingleChildRenderObjectWidget {}
-class ClipRect extends SingleChildRenderObjectWidget { ClipRect.rect(){} }
-class AspectRatio extends SingleChildRenderObjectWidget {}
-class Container extends StatelessWidget { Container({child: null, width: null, height: null}){}}
-class Center extends StatelessWidget { Center({child: null, key: null}){}}
-class DefaultTextStyle extends StatelessWidget { DefaultTextStyle({child: null}){}}
-class Row extends Widget { Row({List<Widget> children: null, key: null}){}}
-class GestureDetector extends SingleChildRenderObjectWidget { GestureDetector({child: null, onTap: null}){}}
-class AppBar extends StatefulWidget implements PreferredSizeWidget { AppBar(title: null, color: null, key: null) }
-class Scaffold extends Widget { Scaffold({body: null, PreferredSizeWidget appBar: null}){}}
-class PreferredSizeWidget implements Widget {}
-''';
-
 /**
  * Add some Flutter libraries and types to the given [provider] and return
  * the `lib` folder.
@@ -37,12 +18,15 @@
   Folder newFolder(String path) =>
       provider.newFolder(provider.convertPath(path));
 
-  newFile('/flutter/lib/material.dart', r'''
+  newFile('$flutterPkgLibPath/material.dart', r'''
 export 'widgets.dart';
+export 'src/material/app_bar.dart';
+export 'src/material/gesture_detector.dart';
 export 'src/material/icons.dart';
+export 'src/material/scaffold.dart';
 ''');
 
-  newFile('/flutter/lib/widgets.dart', r'''
+  newFile('$flutterPkgLibPath/widgets.dart', r'''
 export 'src/widgets/basic.dart';
 export 'src/widgets/center.dart';
 export 'src/widgets/container.dart';
@@ -52,7 +36,19 @@
 ''');
 
   void createSrcMaterial() {
-    newFile('/flutter/lib/src/material/icons.dart', r'''
+    newFile('$flutterPkgLibPath/src/material/app_bar.dart', r'''
+import 'package:flutter/widgets.dart';
+
+class AppBar extends StatefulWidget {
+  AppBar({
+    Key key,
+    title,
+    backgroundColor,
+  });
+}
+''');
+
+    newFile('$flutterPkgLibPath/src/material/icons.dart', r'''
 import 'package:flutter/widgets.dart';
 
 class Icons {
@@ -63,11 +59,76 @@
   Icons._();
 }
 ''');
+
+    newFile('$flutterPkgLibPath/src/material/scaffold.dart', r'''
+import 'package:flutter/widgets.dart';
+
+class Scaffold extends StatefulWidget {
+  const Scaffold({
+    Key key,
+    Widget body,
+  });
+}
+''');
+
+    newFile('$flutterPkgLibPath/src/material/gesture_detector.dart', r'''
+import 'package:flutter/widgets.dart';
+
+class GestureDetector extends StatelessWidget {
+  GestureDetector({
+    Key key,
+    Widget child,
+    onTap,
+  });
+''');
+  }
+
+  void createRendering() {
+    newFile('$flutterPkgLibPath/rendering.dart', r'''
+export 'painting.dart';
+''');
+  }
+
+  void createPainting() {
+    newFile('$flutterPkgLibPath/painting.dart', r'''
+export 'src/painting/edge_insets.dart';
+''');
+
+    newFile('$flutterPkgLibPath/src/painting/edge_insets.dart', r'''
+abstract class EdgeInsetsGeometry {
+  const EdgeInsetsGeometry();
+}
+
+class EdgeInsets extends EdgeInsetsGeometry {
+  const EdgeInsets.fromLTRB(this.left, this.top, this.right, this.bottom);
+
+  const EdgeInsets.all(double value)
+      : left = value, top = value, right = value, bottom = value;
+
+  const EdgeInsets.only({
+    this.left: 0.0,
+    this.top: 0.0,
+    this.right: 0.0,
+    this.bottom: 0.0
+  });
+
+  const EdgeInsets.symmetric({ double vertical: 0.0,
+                             double horizontal: 0.0 })
+    : left = horizontal, top = vertical, right = horizontal, bottom = vertical;
+}
+''');
   }
 
   void createSrcWidgets() {
-    newFile('/flutter/lib/src/widgets/basic.dart', r'''
+    newFile('$flutterPkgLibPath/src/widgets/basic.dart', r'''
 import 'framework.dart';
+import 'rendering.dart';
+
+export 'painting.dart';
+
+class Center extends StatelessWidget {
+  const Center({Widget child, Key key});
+}
 
 class Column extends Flex {
   Column({
@@ -89,9 +150,47 @@
     List<Widget> children: const <Widget>[],
   });
 }
+
+class ClipRect extends SingleChildRenderObjectWidget {
+  const ClipRect({Key key, Widget child}) :
+    super(key: key, child: child);
+    
+  /// Does not actually exist in Flutter.
+  const ClipRect.rect({Key key, Widget child}) :
+    super(key: key, child: child);
+}
+
+class Transform extends SingleChildRenderObjectWidget {
+  const Transform({
+    Key key,
+    @required transform,
+    origin,
+    alignment,
+    transformHitTests: true,
+    Widget child,
+  });
+}
+
+class AspectRatio extends SingleChildRenderObjectWidget {
+  const AspectRatio({
+    Key key,
+    @required aspectRatio,
+    Widget child,
+  });
+}
+
+class Padding extends SingleChildRenderObjectWidget {
+  final EdgeInsetsGeometry padding;
+
+  const Padding({
+    Key key,
+    this.padding,
+    Widget child,
+  });
+}
 ''');
 
-    newFile('/flutter/lib/src/widgets/container.dart', r'''
+    newFile('$flutterPkgLibPath/src/widgets/container.dart', r'''
 import 'framework.dart';
 
 class Container extends StatelessWidget {
@@ -109,7 +208,7 @@
 }
 ''');
 
-    newFile('/flutter/lib/src/widgets/framework.dart', r'''
+    newFile('$flutterPkgLibPath/src/widgets/framework.dart', r'''
 typedef void VoidCallback();
 
 abstract class BuildContext {
@@ -161,9 +260,19 @@
 
   const Widget({this.key});
 }
+
+abstract class SingleChildRenderObjectWidget extends RenderObjectWidget {
+  final Widget child;
+
+  const SingleChildRenderObjectWidget({Key key, this.child}) : super(key: key);
+}
+
+abstract class RenderObjectWidget extends Widget {
+  const RenderObjectWidget({Key key}) : super(key: key);
+}
 ''');
 
-    newFile('/flutter/lib/src/widgets/icon.dart', r'''
+    newFile('$flutterPkgLibPath/src/widgets/icon.dart', r'''
 import 'framework.dart';
 
 class Icon extends StatelessWidget {
@@ -185,9 +294,13 @@
 }
 ''');
 
-    newFile('/flutter/lib/src/widgets/text.dart', r'''
+    newFile('$flutterPkgLibPath/src/widgets/text.dart', r'''
 import 'framework.dart';
 
+class DefaultTextStyle extends StatelessWidget {
+  DefaultTextStyle({Widget child});
+}
+
 class Text extends StatelessWidget {
   final String data;
   const Text(
@@ -197,18 +310,12 @@
       : super(key: key);
 }
 ''');
-
-    newFile('/flutter/lib/src/widgets/center.dart', r'''
-import 'framework.dart';
-
-class Center extends StatelessWidget {
-  const Center({Widget child, Key key});
-}
-''');
   }
 
-  createSrcMaterial();
+  createPainting();
+  createRendering();
   createSrcWidgets();
+  createSrcMaterial();
 
-  return newFolder('/flutter/lib');
+  return newFolder(flutterPkgLibPath);
 }
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index 17bd6ac..3459953 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -7,7 +7,7 @@
 <body>
 <h1>Analysis Server API Specification</h1>
 <h1 style="color:#999999">Version
-  <version>1.18.4</version>
+  <version>1.18.5</version>
 </h1>
 <p>
   This document contains a specification of the API provided by the
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index f39f2a5..1cf5070 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,3 +1,14 @@
+## 0.31.0+1
+
+* Update SDK constraint to require Dart v2-dev release.
+
+## 0.31.0
+
+* **NOTE** This release was pulled from the package site due to an invalid SDK
+  constraint that was fixed in `0.31.0+1`.
+
+* A number of updates, including support for the new Function syntax.
+
 ## 0.30.0-alpha.0
 * Changed the API for creating BazelWorkspace.  It should now be constructed using BazelWorkspace.find().  Note that this might return `null` in the event that the given path is not part of a BazelWorkspace.
 * Added an AST structure to support asserts in constructor initializers (AssertInitializer).  AstVisitor classes must now implement visitAssertInitializer().
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index ba811b3d..e49bab4 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -4195,9 +4195,11 @@
  * An instance creation expression.
  *
  *    newExpression ::=
- *        ('new' | 'const') [TypeName] ('.' [SimpleIdentifier])? [ArgumentList]
+ *        ('new' | 'const')? [TypeName] ('.' [SimpleIdentifier])? [ArgumentList]
  *
  * Clients may not extend, implement or mix-in this class.
+ *
+ * 'new' | 'const' are only optional if the previewDart2 option is enabled.
  */
 abstract class InstanceCreationExpression extends Expression
     implements ConstructorReferenceNode {
@@ -4223,7 +4225,9 @@
 
   /**
    * Return `true` if this creation expression is used to invoke a constant
-   * constructor.
+   * constructor, either because the keyword `const` was explicitly provided or
+   * because no keyword was provided and this expression is in a constant
+   * context.
    */
   bool get isConst;
 
@@ -6609,6 +6613,13 @@
   void set constKeyword(Token token);
 
   /**
+   * Return `true` if this literal is a constant expression, either because the
+   * keyword `const` was explicitly provided or because no keyword was provided
+   * and this expression is in a constant context.
+   */
+  bool get isConst;
+
+  /**
    * Return the type argument associated with this literal, or `null` if no type
    * arguments were declared.
    */
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 4ccf24f..65314c8 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -147,6 +147,7 @@
   CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY,
   CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC,
   CompileTimeErrorCode.INSTANTIATE_ENUM,
+  CompileTimeErrorCode.INTEGER_LITERAL_OUT_OF_RANGE,
   CompileTimeErrorCode.INVALID_ANNOTATION,
   CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY,
   CompileTimeErrorCode.INVALID_CONSTANT,
@@ -567,7 +568,6 @@
   StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAMED,
   StaticWarningCode.IMPORT_OF_NON_LIBRARY,
   StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD,
-  StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC,
   StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE,
   StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE,
   StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE,
diff --git a/pkg/analyzer/lib/src/context/builder.dart b/pkg/analyzer/lib/src/context/builder.dart
index 8b78044..2efe773 100644
--- a/pkg/analyzer/lib/src/context/builder.dart
+++ b/pkg/analyzer/lib/src/context/builder.dart
@@ -157,9 +157,10 @@
   AnalysisContext buildContext(String path) {
     InternalAnalysisContext context =
         AnalysisEngine.instance.createAnalysisContext();
-    AnalysisOptions options = getAnalysisOptions(path);
+    AnalysisOptionsImpl options = getAnalysisOptions(path);
     context.contentCache = contentCache;
     context.sourceFactory = createSourceFactory(path, options);
+    options.previewDart2 = previewDart2;
     context.analysisOptions = options;
     context.name = path;
     //_processAnalysisOptions(context, optionMap);
diff --git a/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart
index 6050b2fb..b444188 100644
--- a/pkg/analyzer/lib/src/context/context.dart
+++ b/pkg/analyzer/lib/src/context/context.dart
@@ -323,6 +323,7 @@
     }
     this._options.strongMode = options.strongMode;
     this._options.useFastaParser = options.useFastaParser;
+    this._options.previewDart2 = options.previewDart2;
     this._options.trackCacheDependencies = options.trackCacheDependencies;
     this._options.disableCacheFlushing = options.disableCacheFlushing;
     this._options.patchPaths = options.patchPaths;
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index d4f4af8..0bb7bbe 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -598,6 +598,7 @@
 
     bool useFasta = analysisOptions.useFastaParser;
     Parser parser = new Parser(source, errorListener, useFasta: useFasta);
+    parser.enableOptionalNewAndConst = analysisOptions.previewDart2;
     parser.parseGenericMethodComments = analysisOptions.strongMode;
     CompilationUnit unit = parser.parseCompilationUnit(token);
     unit.lineInfo = lineInfo;
@@ -785,7 +786,7 @@
       // We are given all required unlinked and linked summaries for it.
       if (externalSummaries != null) {
         String uriStr = uri.toString();
-        if (externalSummaries.hasUnlinkedUnit(uriStr)) {
+        if (externalSummaries.hasLinkedLibrary(uriStr)) {
           file = new FileState._external(this, uri);
           _uriToFile[uri] = file;
           return file;
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index 17edccb..66337bb 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -612,6 +612,7 @@
         : IndexRelationKind.IS_INVOKED_BY;
     recordRelation(element, kind, name, isQualified);
     node.target?.accept(this);
+    node.typeArguments?.accept(this);
     node.argumentList?.accept(this);
   }
 
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index fbc951e..5c10748 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -4113,6 +4113,61 @@
     return DynamicTypeImpl.instance;
   }
 
+  /**
+   * An expression _e_ is said to _occur in a constant context_,
+   * * if _e_ is an element of a constant list literal, or a key or value of an
+   *   entry of a constant map literal.
+   * * if _e_ is an actual argument of a constant object expression or of a
+   *   metadata annotation.
+   * * if _e_ is the initializing expression of a constant variable declaration.
+   * * if _e_ is a switch case expression.
+   * * if _e_ is an immediate subexpression of an expression _e1_ which occurs
+   *   in a constant context, unless _e1_ is a `throw` expression or a function
+   *   literal.
+   *
+   * This roughly means that everything which is inside a syntactically constant
+   * expression is in a constant context. A `throw` expression is currently not
+   * allowed in a constant expression, but extensions affecting that status may
+   * be considered. A similar situation arises for function literals.
+   *
+   * Note that the default value of an optional formal parameter is _not_ a
+   * constant context. This choice reserves some freedom to modify the semantics
+   * of default values.
+   */
+  bool get inConstantContext {
+    AstNode child = this;
+    while (child is Expression ||
+        child is ArgumentList ||
+        child is MapLiteralEntry) {
+      AstNode parent = child.parent;
+      if (parent is TypedLiteralImpl && parent.constKeyword != null) {
+        // Inside an explicitly `const` list or map literal.
+        return true;
+      } else if (parent is InstanceCreationExpression) {
+        if (parent.keyword?.keyword == Keyword.CONST) {
+          // Inside an explicitly `const` instance creation expression.
+          return true;
+        } else if (parent.keyword?.keyword == Keyword.NEW) {
+          // Inside an explicitly non-`const` instance creation expression.
+          return false;
+        }
+      } else if (parent is Annotation) {
+        // Inside an annotation.
+        return true;
+      } else if (parent is VariableDeclaration) {
+        AstNode grandParent = parent.parent;
+        // Inside the initializer for a `const` variable declaration.
+        return grandParent is VariableDeclarationList &&
+            grandParent.keyword?.keyword == Keyword.CONST;
+      } else if (parent is SwitchCase) {
+        // Inside a switch case.
+        return true;
+      }
+      child = parent;
+    }
+    return false;
+  }
+
   @override
   bool get isAssignable => false;
 
@@ -6367,7 +6422,9 @@
  * An instance creation expression.
  *
  *    newExpression ::=
- *        ('new' | 'const') [TypeName] ('.' [SimpleIdentifier])? [ArgumentList]
+ *        ('new' | 'const')? [TypeName] ('.' [SimpleIdentifier])? [ArgumentList]
+ *
+ * 'new' | 'const' are only optional if the previewDart2 option is enabled.
  */
 class InstanceCreationExpressionImpl extends ExpressionImpl
     implements InstanceCreationExpression {
@@ -6434,7 +6491,20 @@
   Token get endToken => _argumentList.endToken;
 
   @override
-  bool get isConst => keyword?.keyword == Keyword.CONST;
+  bool get isConst {
+    if (!isImplicit) {
+      return keyword.keyword == Keyword.CONST;
+    } else {
+      return inConstantContext;
+    }
+  }
+
+  /**
+   * Return `true` if this is an implicit constructor invocations.
+   *
+   * This can only be `true` when the previewDart2 option is enabled.
+   */
+  bool get isImplicit => keyword == null;
 
   @override
   int get precedence => 16;
@@ -10649,6 +10719,11 @@
   }
 
   @override
+  bool get isConst {
+    return constKeyword != null || inConstantContext;
+  }
+
+  @override
   TypeArgumentList get typeArguments => _typeArguments;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 96d278c..d0a69b7 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -7290,7 +7290,9 @@
   Object visitDefaultFormalParameter(DefaultFormalParameter node) {
     _visitNode(node.parameter);
     if (node.separator != null) {
-      _writer.print(" ");
+      if (node.separator.lexeme != ":") {
+        _writer.print(" ");
+      }
       _writer.print(node.separator.lexeme);
       _visitNodeWithPrefix(" ", node.defaultValue);
     }
@@ -8603,7 +8605,9 @@
   Object visitDefaultFormalParameter(DefaultFormalParameter node) {
     safelyVisitNode(node.parameter);
     if (node.separator != null) {
-      sink.write(" ");
+      if (node.separator.lexeme != ":") {
+        sink.write(" ");
+      }
       sink.write(node.separator.lexeme);
       safelyVisitNodeWithPrefix(" ", node.defaultValue);
     }
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index 992a468..79a8383 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer.src.dart.constant.evaluation;
-
 import 'dart:collection';
 
 import 'package:analyzer/context/declared_variables.dart';
@@ -752,6 +750,22 @@
           reportLocalErrorForRecordedExternalErrors();
           return result;
         }
+      } else if (initializer is AssertInitializer) {
+        Expression condition = initializer.condition;
+        if (condition == null) {
+          errorReporter.reportErrorForNode(
+              CheckedModeCompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
+              node);
+        }
+        DartObjectImpl evaluationResult = condition.accept(initializerVisitor);
+        if (evaluationResult == null ||
+            !evaluationResult.isBool ||
+            evaluationResult.toBoolValue() != true) {
+          errorReporter.reportErrorForNode(
+              CheckedModeCompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
+              node);
+          return null;
+        }
       }
     }
     // Evaluate explicit or implicit call to super().
@@ -1241,30 +1255,24 @@
 
   @override
   DartObjectImpl visitBinaryExpression(BinaryExpression node) {
-    DartObjectImpl leftResult = node.leftOperand.accept(this);
-    DartObjectImpl rightResult = node.rightOperand.accept(this);
     TokenType operatorType = node.operator.type;
-    // 'null' is almost never good operand
-    if (operatorType != TokenType.BANG_EQ &&
-        operatorType != TokenType.EQ_EQ &&
-        operatorType != TokenType.QUESTION_QUESTION) {
-      if (leftResult != null && leftResult.isNull ||
-          rightResult != null && rightResult.isNull) {
-        _error(node, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
-        return null;
-      }
+    DartObjectImpl leftResult = node.leftOperand.accept(this);
+    // evaluate lazy operators
+    if (operatorType == TokenType.AMPERSAND_AMPERSAND) {
+      return _dartObjectComputer.logicalAnd(
+          node, leftResult, () => node.rightOperand.accept(this));
+    } else if (operatorType == TokenType.BAR_BAR) {
+      return _dartObjectComputer.logicalOr(
+          node, leftResult, () => node.rightOperand.accept(this));
     }
-    // evaluate operator
+    // evaluate eager operators
+    DartObjectImpl rightResult = node.rightOperand.accept(this);
     if (operatorType == TokenType.AMPERSAND) {
       return _dartObjectComputer.bitAnd(node, leftResult, rightResult);
-    } else if (operatorType == TokenType.AMPERSAND_AMPERSAND) {
-      return _dartObjectComputer.logicalAnd(node, leftResult, rightResult);
     } else if (operatorType == TokenType.BANG_EQ) {
       return _dartObjectComputer.notEqual(node, leftResult, rightResult);
     } else if (operatorType == TokenType.BAR) {
       return _dartObjectComputer.bitOr(node, leftResult, rightResult);
-    } else if (operatorType == TokenType.BAR_BAR) {
-      return _dartObjectComputer.logicalOr(node, leftResult, rightResult);
     } else if (operatorType == TokenType.CARET) {
       return _dartObjectComputer.bitXor(node, leftResult, rightResult);
     } else if (operatorType == TokenType.EQ_EQ) {
@@ -1880,10 +1888,10 @@
   }
 
   DartObjectImpl logicalAnd(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
-    if (leftOperand != null && rightOperand != null) {
+      DartObjectImpl rightOperandComputer()) {
+    if (leftOperand != null) {
       try {
-        return leftOperand.logicalAnd(_typeProvider, rightOperand);
+        return leftOperand.logicalAnd(_typeProvider, rightOperandComputer);
       } on EvaluationException catch (exception) {
         _errorReporter.reportErrorForNode(exception.errorCode, node);
       }
@@ -1903,10 +1911,10 @@
   }
 
   DartObjectImpl logicalOr(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
-    if (leftOperand != null && rightOperand != null) {
+      DartObjectImpl rightOperandComputer()) {
+    if (leftOperand != null) {
       try {
-        return leftOperand.logicalOr(_typeProvider, rightOperand);
+        return leftOperand.logicalOr(_typeProvider, rightOperandComputer);
       } on EvaluationException catch (exception) {
         _errorReporter.reportErrorForNode(exception.errorCode, node);
       }
diff --git a/pkg/analyzer/lib/src/dart/constant/utilities.dart b/pkg/analyzer/lib/src/dart/constant/utilities.dart
index b097c0e..e4bcf2a 100644
--- a/pkg/analyzer/lib/src/dart/constant/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/constant/utilities.dart
@@ -8,8 +8,10 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/handle.dart'
@@ -37,7 +39,9 @@
  * constants to be evaluated.
  */
 class ConstantAstCloner extends AstCloner {
-  ConstantAstCloner() : super(true);
+  final bool previewDart2;
+
+  ConstantAstCloner(this.previewDart2) : super(true);
 
   @override
   Annotation visitAnnotation(Annotation node) {
@@ -65,11 +69,32 @@
       InstanceCreationExpression node) {
     InstanceCreationExpression expression =
         super.visitInstanceCreationExpression(node);
+    if (previewDart2 && node.keyword == null && node.isConst) {
+      expression.keyword = new KeywordToken(Keyword.CONST, node.offset);
+    }
     expression.staticElement = node.staticElement;
     return expression;
   }
 
   @override
+  ListLiteral visitListLiteral(ListLiteral node) {
+    ListLiteral literal = super.visitListLiteral(node);
+    if (previewDart2 && node.constKeyword == null && node.isConst) {
+      literal.constKeyword = new KeywordToken(Keyword.CONST, node.offset);
+    }
+    return literal;
+  }
+
+  @override
+  MapLiteral visitMapLiteral(MapLiteral node) {
+    MapLiteral literal = super.visitMapLiteral(node);
+    if (previewDart2 && node.constKeyword == null && node.isConst) {
+      literal.constKeyword = new KeywordToken(Keyword.CONST, node.offset);
+    }
+    return literal;
+  }
+
+  @override
   RedirectingConstructorInvocation visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
     RedirectingConstructorInvocation invocation =
diff --git a/pkg/analyzer/lib/src/dart/constant/value.dart b/pkg/analyzer/lib/src/dart/constant/value.dart
index 91d79cf..ea4f84d 100644
--- a/pkg/analyzer/lib/src/dart/constant/value.dart
+++ b/pkg/analyzer/lib/src/dart/constant/value.dart
@@ -100,12 +100,13 @@
   }
 
   @override
-  BoolState logicalAnd(InstanceState rightOperand) {
-    assertBool(rightOperand);
-    if (value == null) {
-      return UNKNOWN_VALUE;
+  BoolState logicalAnd(InstanceState rightOperandComputer()) {
+    if (value == false) {
+      return FALSE_STATE;
     }
-    return value ? rightOperand.convertToBool() : FALSE_STATE;
+    InstanceState rightOperand = rightOperandComputer();
+    assertBool(rightOperand);
+    return value == null ? UNKNOWN_VALUE : rightOperand.convertToBool();
   }
 
   @override
@@ -117,12 +118,13 @@
   }
 
   @override
-  BoolState logicalOr(InstanceState rightOperand) {
-    assertBool(rightOperand);
-    if (value == null) {
-      return UNKNOWN_VALUE;
+  BoolState logicalOr(InstanceState rightOperandComputer()) {
+    if (value == true) {
+      return TRUE_STATE;
     }
-    return value ? TRUE_STATE : rightOperand.convertToBool();
+    InstanceState rightOperand = rightOperandComputer();
+    assertBool(rightOperand);
+    return value == null ? UNKNOWN_VALUE : rightOperand.convertToBool();
   }
 
   @override
@@ -493,9 +495,9 @@
    * object of this kind.
    */
   DartObjectImpl logicalAnd(
-          TypeProvider typeProvider, DartObjectImpl rightOperand) =>
-      new DartObjectImpl(
-          typeProvider.boolType, _state.logicalAnd(rightOperand._state));
+          TypeProvider typeProvider, DartObjectImpl rightOperandComputer()) =>
+      new DartObjectImpl(typeProvider.boolType,
+          _state.logicalAnd(() => rightOperandComputer()?._state));
 
   /**
    * Return the result of invoking the '!' operator on this object. The
@@ -516,9 +518,9 @@
    * object of this kind.
    */
   DartObjectImpl logicalOr(
-          TypeProvider typeProvider, DartObjectImpl rightOperand) =>
-      new DartObjectImpl(
-          typeProvider.boolType, _state.logicalOr(rightOperand._state));
+          TypeProvider typeProvider, DartObjectImpl rightOperandComputer()) =>
+      new DartObjectImpl(typeProvider.boolType,
+          _state.logicalOr(() => rightOperandComputer()?._state));
 
   /**
    * Return the result of invoking the '-' operator on this object with the
@@ -1198,8 +1200,8 @@
   }
 
   @override
-  BoolState logicalAnd(InstanceState rightOperand) {
-    assertBool(rightOperand);
+  BoolState logicalAnd(InstanceState rightOperandComputer()) {
+    assertBool(rightOperandComputer());
     return BoolState.UNKNOWN_VALUE;
   }
 
@@ -1207,7 +1209,8 @@
   BoolState logicalNot() => BoolState.UNKNOWN_VALUE;
 
   @override
-  BoolState logicalOr(InstanceState rightOperand) {
+  BoolState logicalOr(InstanceState rightOperandComputer()) {
+    InstanceState rightOperand = rightOperandComputer();
     assertBool(rightOperand);
     return rightOperand.convertToBool();
   }
@@ -1485,7 +1488,8 @@
     }
     assertNumOrNull(this);
     assertNumOrNull(rightOperand);
-    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
   /**
@@ -1560,7 +1564,8 @@
   IntState bitAnd(InstanceState rightOperand) {
     assertIntOrNull(this);
     assertIntOrNull(rightOperand);
-    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
   /**
@@ -1571,7 +1576,8 @@
    */
   IntState bitNot() {
     assertIntOrNull(this);
-    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
   /**
@@ -1584,7 +1590,8 @@
   IntState bitOr(InstanceState rightOperand) {
     assertIntOrNull(this);
     assertIntOrNull(rightOperand);
-    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
   /**
@@ -1597,7 +1604,8 @@
   IntState bitXor(InstanceState rightOperand) {
     assertIntOrNull(this);
     assertIntOrNull(rightOperand);
-    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
   /**
@@ -1609,7 +1617,8 @@
    */
   StringState concatenate(InstanceState rightOperand) {
     assertString(rightOperand);
-    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
   /**
@@ -1638,7 +1647,8 @@
   NumState divide(InstanceState rightOperand) {
     assertNumOrNull(this);
     assertNumOrNull(rightOperand);
-    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
   /**
@@ -1660,7 +1670,8 @@
   BoolState greaterThan(InstanceState rightOperand) {
     assertNumOrNull(this);
     assertNumOrNull(rightOperand);
-    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
   /**
@@ -1673,7 +1684,8 @@
   BoolState greaterThanOrEqual(InstanceState rightOperand) {
     assertNumOrNull(this);
     assertNumOrNull(rightOperand);
-    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
   /**
@@ -1686,7 +1698,8 @@
   IntState integerDivide(InstanceState rightOperand) {
     assertNumOrNull(this);
     assertNumOrNull(rightOperand);
-    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
   /**
@@ -1705,7 +1718,8 @@
   BoolState lessThan(InstanceState rightOperand) {
     assertNumOrNull(this);
     assertNumOrNull(rightOperand);
-    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
   /**
@@ -1718,7 +1732,8 @@
   BoolState lessThanOrEqual(InstanceState rightOperand) {
     assertNumOrNull(this);
     assertNumOrNull(rightOperand);
-    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
   /**
@@ -1728,10 +1743,14 @@
    * Throws an [EvaluationException] if the operator is not appropriate for an
    * object of this kind.
    */
-  BoolState logicalAnd(InstanceState rightOperand) {
+  BoolState logicalAnd(InstanceState rightOperandComputer()) {
     assertBool(this);
+    if (convertToBool() == BoolState.FALSE_STATE) {
+      return this;
+    }
+    InstanceState rightOperand = rightOperandComputer();
     assertBool(rightOperand);
-    return BoolState.FALSE_STATE;
+    return rightOperand.convertToBool();
   }
 
   /**
@@ -1752,8 +1771,12 @@
    * Throws an [EvaluationException] if the operator is not appropriate for an
    * object of this kind.
    */
-  BoolState logicalOr(InstanceState rightOperand) {
+  BoolState logicalOr(InstanceState rightOperandComputer()) {
     assertBool(this);
+    if (convertToBool() == BoolState.TRUE_STATE) {
+      return this;
+    }
+    InstanceState rightOperand = rightOperandComputer();
     assertBool(rightOperand);
     return rightOperand.convertToBool();
   }
@@ -1768,7 +1791,8 @@
   NumState minus(InstanceState rightOperand) {
     assertNumOrNull(this);
     assertNumOrNull(rightOperand);
-    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
   /**
@@ -1779,7 +1803,8 @@
    */
   NumState negated() {
     assertNumOrNull(this);
-    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
   /**
@@ -1792,7 +1817,8 @@
   NumState remainder(InstanceState rightOperand) {
     assertNumOrNull(this);
     assertNumOrNull(rightOperand);
-    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
   /**
@@ -1805,7 +1831,8 @@
   IntState shiftLeft(InstanceState rightOperand) {
     assertIntOrNull(this);
     assertIntOrNull(rightOperand);
-    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
   /**
@@ -1818,7 +1845,8 @@
   IntState shiftRight(InstanceState rightOperand) {
     assertIntOrNull(this);
     assertIntOrNull(rightOperand);
-    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
   /**
@@ -1829,7 +1857,8 @@
    */
   IntState stringLength() {
     assertString(this);
-    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
   /**
@@ -1842,7 +1871,8 @@
   NumState times(InstanceState rightOperand) {
     assertNumOrNull(this);
     assertNumOrNull(rightOperand);
-    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 }
 
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 744a53d..67fe7c13 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -2127,33 +2127,6 @@
       return this;
     }
 
-    if (isDartAsyncFuture && newTypeArguments.isNotEmpty) {
-      //
-      // In strong mode interpret Future< T > as Future< flatten(T) >
-      //
-      // For example, Future<Future<T>> will flatten to Future<T>.
-      //
-      // In the Dart 3rd edition spec, this flatten operation is used for
-      // `async` and `await`. In strong mode, we extend it to all Future<T>
-      // instantiations. This allows typing of Future-related operations
-      // in dart:async in a way that matches their runtime behavior and provides
-      // precise return types for users of these APIs.
-      //
-      // For example:
-      //
-      //     abstract class Future<T> {
-      //       Future<S> then<S>(S onValue(T value), ...);
-      //     }
-      //
-      // Given a call where S <: Future<R> for some R, we will need to flatten
-      // the return type so it is Future< flatten(S) >, yielding Future<R>.
-      //
-      if (element.library.context.analysisOptions.strongMode) {
-        TypeImpl t = newTypeArguments[0];
-        newTypeArguments[0] = t.flattenFutures(new StrongTypeSystemImpl(null));
-      }
-    }
-
     InterfaceTypeImpl newType = new InterfaceTypeImpl(element, prune);
     newType.typeArguments = newTypeArguments;
     return newType;
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 29d2e48..dc4b398 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -1407,6 +1407,13 @@
           "Enums can't be instantiated.",
           "Try using one of the defined constants.");
 
+  static const CompileTimeErrorCode INTEGER_LITERAL_OUT_OF_RANGE =
+      const CompileTimeErrorCode(
+          'INTEGER_LITERAL_OUT_OF_RANGE',
+          "The integer literal {0} can't be represented in 64 bits.",
+          "Try using the BigInt class if you need an integer larger than "
+          "9,223,372,036,854,775,807 or less than -9,223,372,036,854,775,808.");
+
   /**
    * 15 Metadata: Metadata consists of a series of annotations, each of which
    * begin with the character @, followed by a constant expression that must be
@@ -2813,13 +2820,13 @@
           "Try changing the condition.");
 
   /**
-   * 13.15 Assert: It is a static type warning if the type of <i>e</i> may not
-   * be assigned to either bool or () &rarr; bool
+   * 17.17 Assert: It is a static type warning if the type of <i>e</i> may not
+   * be assigned to bool.
    */
   static const StaticTypeWarningCode NON_BOOL_EXPRESSION =
       const StaticTypeWarningCode(
           'NON_BOOL_EXPRESSION',
-          "Assertions must be on either a 'bool' or '() -> bool'.",
+          "The expression in an assert must be of type 'bool'.",
           "Try changing the expression.");
 
   /**
@@ -3803,22 +3810,6 @@
           "inconsistency.");
 
   /**
-   * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares
-   * an instance method named <i>n</i> and an accessible static member named
-   * <i>n</i> is declared in a superclass of <i>C</i>.
-   *
-   * Parameters:
-   * 0: the name of the member with the name conflict
-   * 1: the name of the enclosing class that has the static member
-   */
-  static const StaticWarningCode
-      INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC =
-      const StaticWarningCode(
-          'INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC',
-          "'{0}' collides with a static member in the superclass '{1}'.",
-          "Try renaming either the method or the inherited member.");
-
-  /**
    * 7.2 Getters: It is a static warning if a getter <i>m1</i> overrides a
    * getter <i>m2</i> and the type of <i>m1</i> is not a subtype of the type of
    * <i>m2</i>.
diff --git a/pkg/analyzer/lib/src/fasta/error_converter.dart b/pkg/analyzer/lib/src/fasta/error_converter.dart
index 1a944e0..9b0220a 100644
--- a/pkg/analyzer/lib/src/fasta/error_converter.dart
+++ b/pkg/analyzer/lib/src/fasta/error_converter.dart
@@ -50,6 +50,10 @@
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, offset, length);
         return;
+      case "BREAK_OUTSIDE_OF_LOOP":
+        errorReporter?.reportErrorForOffset(
+            ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, offset, length);
+        return;
       case "BUILT_IN_IDENTIFIER_AS_TYPE":
         String name = stringOrTokenLexeme();
         errorReporter?.reportErrorForOffset(
@@ -95,6 +99,14 @@
         errorReporter?.reportErrorForOffset(
             CompileTimeErrorCode.CONST_NOT_INITIALIZED, offset, length, [name]);
         return;
+      case "CONTINUE_OUTSIDE_OF_LOOP":
+        errorReporter?.reportErrorForOffset(
+            ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, offset, length);
+        return;
+      case "CONTINUE_WITHOUT_LABEL_IN_CASE":
+        errorReporter?.reportErrorForOffset(
+            ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE, offset, length);
+        return;
       case "COVARIANT_AFTER_FINAL":
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.COVARIANT_AFTER_FINAL, offset, length);
diff --git a/pkg/analyzer/lib/src/fasta/resolution_storer.dart b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
index 8416c84..b3774e2 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_storer.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
@@ -737,7 +737,7 @@
   /// Otherwise return the given [member].
   static Member _getRealTarget(Member member) {
     if (member is Procedure && member.isForwardingStub) {
-      return member.forwardingStubInterfaceTarget.node;
+      return member.forwardingStubInterfaceTarget;
     }
     return member;
   }
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index abf9bae..cc8dc80 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -7,6 +7,7 @@
 import 'dart:collection';
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/ast_factory.dart';
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
@@ -19,12 +20,15 @@
         IdentifierImpl,
         PrefixedIdentifierImpl,
         SimpleIdentifierImpl;
+import 'package:analyzer/src/dart/ast/ast_factory.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
+import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/testing/token_factory.dart';
 import 'package:analyzer/src/task/strong/checker.dart';
 
 /**
@@ -129,6 +133,11 @@
   TypePromotionManager _promoteManager;
 
   /**
+   * Gets an instance of [AstFactory] based on the standard AST implementation.
+   */
+  AstFactory _astFactory;
+
+  /**
    * Initialize a newly created visitor to work for the given [_resolver] to
    * resolve the nodes in a compilation unit.
    */
@@ -141,6 +150,7 @@
     _typeType = _resolver.typeProvider.typeType;
     _subtypeManager = new SubtypeManager();
     _promoteManager = _resolver.promoteManager;
+    _astFactory = new AstFactoryImpl();
   }
 
   /**
@@ -615,9 +625,23 @@
     }
     Element staticElement;
     Element propagatedElement;
+    bool previewDart2 = _definingLibrary.context.analysisOptions.previewDart2;
     if (target == null) {
       staticElement = _resolveInvokedElement(methodName);
       propagatedElement = null;
+
+      if (previewDart2 &&
+          staticElement != null &&
+          staticElement is ClassElement) {
+        // cases: C() or C<>()
+        InstanceCreationExpression instanceCreationExpression =
+            _handleImplicitConstructorCase(node, staticElement);
+        if (instanceCreationExpression != null) {
+          // If a non-null is returned, the node was created, replaced, so we
+          // can return here.
+          return null;
+        }
+      }
     } else if (methodName.name == FunctionElement.LOAD_LIBRARY_NAME &&
         _isDeferredPrefix(target)) {
       if (node.operator.type == TokenType.QUESTION_PERIOD) {
@@ -641,6 +665,29 @@
       //
       bool isConditional = node.operator.type == TokenType.QUESTION_PERIOD;
       ClassElement typeReference = getTypeReference(target);
+
+      if (previewDart2) {
+        InstanceCreationExpression instanceCreationExpression;
+        if ((target is SimpleIdentifier &&
+                target.staticElement is PrefixElement) ||
+            (target is PrefixedIdentifier &&
+                target.prefix.staticElement is PrefixElement)) {
+          // case: p.C(), p.C<>() or p.C.n()
+          instanceCreationExpression =
+              _handlePrefixedImplicitConstructorCase(node, target);
+        } else if (typeReference is ClassElement) {
+          // case: C.n()
+          instanceCreationExpression =
+              _handleImplicitConstructorCase(node, typeReference);
+        }
+
+        if (instanceCreationExpression != null) {
+          // If a non-null is returned, the node was created, replaced, so we
+          // can return here.
+          return null;
+        }
+      }
+
       if (typeReference != null) {
         if (node.isCascaded) {
           typeReference = _typeType.element;
@@ -1567,6 +1614,187 @@
   }
 
   /**
+   * Return the newly created and replaced [InstanceCreationExpression], or
+   * `null` if this is not an implicit constructor case.
+   *
+   * This method covers the "ClassName()" and "ClassName.namedConstructor()"
+   * cases for the prefixed cases, i.e. "libraryPrefix.ClassName()" and
+   * "libraryPrefix.ClassName.namedConstructor()" see
+   * [_handlePrefixedImplicitConstructorCase].
+   */
+  InstanceCreationExpression _handleImplicitConstructorCase(
+      MethodInvocation node, ClassElement classElement) {
+    // If target == null, then this is the unnamed constructor, A(), case,
+    // otherwise it is the named constructor A.name() case.
+    Expression target = node.realTarget;
+    bool isNamedConstructorCase = target != null;
+
+    // If we are in the named constructor case, verify that the target is a
+    // SimpleIdentifier and that the operator is '.'
+    SimpleIdentifier targetSimpleId;
+    if (isNamedConstructorCase) {
+      if (target is SimpleIdentifier &&
+          node.operator.type == TokenType.PERIOD) {
+        targetSimpleId = target;
+      } else {
+        // Return null as this is not an implicit constructor case.
+        return null;
+      }
+    }
+
+    // Before any ASTs are created, look up ConstructorElement to see if we
+    // should construct an [InstanceCreationExpression] to replace this
+    // [MethodInvocation].
+    InterfaceType classType = classElement.type;
+    if (node.typeArguments != null) {
+      int parameterCount = classType.typeParameters.length;
+      int argumentCount = node.typeArguments.length;
+      if (parameterCount == argumentCount) {
+        // TODO(brianwilkerson) More gracefully handle the case where the counts
+        // are different.
+        List<DartType> typeArguments = node.typeArguments.arguments
+            .map((TypeAnnotation type) => type.type)
+            .toList();
+        classType = classType.instantiate(typeArguments);
+      }
+    } else {
+      int parameterCount = classType.typeParameters.length;
+      if (parameterCount > 0) {
+        List<DartType> typeArguments =
+            new List<DartType>.filled(parameterCount, _dynamicType);
+        classType = classType.instantiate(typeArguments);
+      }
+    }
+    ConstructorElement constructorElt;
+    if (isNamedConstructorCase) {
+      constructorElt =
+          classType.lookUpConstructor(node.methodName.name, _definingLibrary);
+    } else {
+      constructorElt = classType.lookUpConstructor(null, _definingLibrary);
+    }
+    // If the constructor was not looked up, return `null` so resulting
+    // resolution, such as error messages, will proceed as a [MethodInvocation].
+    if (constructorElt == null) {
+      return null;
+    }
+
+    // Create the Constructor name, in each case: A[.named]()
+    TypeName typeName;
+    ConstructorName constructorName;
+    if (isNamedConstructorCase) {
+      // A.named()
+      typeName = _astFactory.typeName(targetSimpleId, node.typeArguments);
+      typeName.type = classType;
+      constructorName =
+          _astFactory.constructorName(typeName, node.operator, node.methodName);
+    } else {
+      // A()
+      typeName = _astFactory.typeName(node.methodName, node.typeArguments);
+      typeName.type = classType;
+      constructorName = _astFactory.constructorName(typeName, null, null);
+    }
+    InstanceCreationExpression instanceCreationExpression = _astFactory
+        .instanceCreationExpression(null, constructorName, node.argumentList);
+
+    if (isNamedConstructorCase) {
+      constructorName.name.staticElement = constructorElt;
+    }
+    constructorName.staticElement = constructorElt;
+    instanceCreationExpression.staticElement = constructorElt;
+    instanceCreationExpression.staticType = classType;
+
+    // Finally, do the node replacement, true is returned iff the replacement
+    // was successful, only return the new node if it was successful.
+    if (NodeReplacer.replace(node, instanceCreationExpression)) {
+      return instanceCreationExpression;
+    }
+    return null;
+  }
+
+  /**
+   * Return the newly created and replaced [InstanceCreationExpression], or
+   * `null` if this is not an implicit constructor case.
+   *
+   * This method covers the "libraryPrefix.ClassName()" and
+   * "libraryPrefix.ClassName.namedConstructor()" cases for the non-prefixed
+   * cases, i.e. "ClassName()" and "ClassName.namedConstructor()" see
+   * [_handleImplicitConstructorCase].
+   */
+  InstanceCreationExpression _handlePrefixedImplicitConstructorCase(
+      MethodInvocation node, Identifier libraryPrefixId) {
+    bool isNamedConstructorCase = libraryPrefixId is PrefixedIdentifier;
+    ClassElement classElement;
+    if (isNamedConstructorCase) {
+      var elt = (libraryPrefixId as PrefixedIdentifier).staticElement;
+      if (elt is ClassElement) {
+        classElement = elt;
+      }
+    } else {
+      LibraryElementImpl libraryElementImpl = _getImportedLibrary(node.target);
+      classElement = libraryElementImpl.getType(node.methodName.name);
+    }
+
+    // Before any ASTs are created, look up ConstructorElement to see if we
+    // should construct an [InstanceCreationExpression] to replace this
+    // [MethodInvocation].
+    if (classElement == null) {
+      return null;
+    }
+    ConstructorElement constructorElt;
+    if (isNamedConstructorCase) {
+      constructorElt = classElement.type
+          .lookUpConstructor(node.methodName.name, _definingLibrary);
+    } else {
+      constructorElt =
+          classElement.type.lookUpConstructor(null, _definingLibrary);
+    }
+    // If the constructor was not looked up, return `null` so resulting
+    // resolution, such as error messages, will proceed as a [MethodInvocation].
+    if (constructorElt == null) {
+      return null;
+    }
+
+    // Create the Constructor name, in each case: A[.named]()
+    TypeName typeName;
+    ConstructorName constructorName;
+    if (isNamedConstructorCase) {
+      // p.A.n()
+      // libraryPrefixId is a PrefixedIdentifier in this case
+      typeName = _astFactory.typeName(libraryPrefixId, node.typeArguments);
+      typeName.type = classElement.type;
+      constructorName =
+          _astFactory.constructorName(typeName, node.operator, node.methodName);
+    } else {
+      // p.A()
+      // libraryPrefixId is a SimpleIdentifier in this case
+      PrefixedIdentifier prefixedIdentifier = _astFactory.prefixedIdentifier(
+          libraryPrefixId,
+          TokenFactory.tokenFromType(TokenType.PERIOD),
+          node.methodName);
+      typeName = _astFactory.typeName(prefixedIdentifier, node.typeArguments);
+      typeName.type = classElement.type;
+      constructorName = _astFactory.constructorName(typeName, null, null);
+    }
+    InstanceCreationExpression instanceCreationExpression = _astFactory
+        .instanceCreationExpression(null, constructorName, node.argumentList);
+
+    if (isNamedConstructorCase) {
+      constructorName.name.staticElement = constructorElt;
+    }
+    constructorName.staticElement = constructorElt;
+    instanceCreationExpression.staticElement = constructorElt;
+    instanceCreationExpression.staticType = classElement.type;
+
+    // Finally, do the node replacement, true is returned iff the replacement
+    // was successful, only return the new node if it was successful.
+    if (NodeReplacer.replace(node, instanceCreationExpression)) {
+      return instanceCreationExpression;
+    } else {
+      return null;
+    }
+  }
+
+  /**
    * Return `true` if the given [element] is or inherits from a class marked
    * with `@proxy`.
    *
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 75a93ec..e0802f5 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -1297,6 +1297,11 @@
   bool get preserveComments;
 
   /**
+   * Return `true` if analyzer should enable the use of Dart 2.0 features.
+   */
+  bool get previewDart2;
+
+  /**
    * Return the opaque signature of the options.
    *
    * The length of the list is guaranteed to equal [signatureLength].
@@ -1466,6 +1471,9 @@
   bool useFastaParser = false;
 
   @override
+  bool previewDart2 = false;
+
+  @override
   bool disableCacheFlushing = false;
 
   /**
@@ -1522,6 +1530,7 @@
     preserveComments = options.preserveComments;
     strongMode = options.strongMode;
     useFastaParser = options.useFastaParser;
+    previewDart2 = options.previewDart2;
     if (options is AnalysisOptionsImpl) {
       declarationCasts = options.declarationCasts;
       strongModeHints = options.strongModeHints;
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 4158b0d..f7d851f 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer.src.generated.error_verifier;
-
 import 'dart:collection';
 import "dart:math" as math;
 
@@ -16,6 +14,7 @@
 import 'package:analyzer/dart/element/visitor.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
@@ -917,6 +916,12 @@
   }
 
   @override
+  Object visitIntegerLiteral(IntegerLiteral node) {
+    _checkForOutOfRange(node);
+    return super.visitIntegerLiteral(node);
+  }
+
+  @override
   Object visitIsExpression(IsExpression node) {
     _checkForTypeAnnotationDeferredClass(node.type);
     return super.visitIsExpression(node);
@@ -1720,8 +1725,7 @@
    * overriding. The [parameters] is the parameters of the executable element.
    * The [errorNameTarget] is the node to report problems on.
    *
-   * See [StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC],
-   * [CompileTimeErrorCode.INVALID_OVERRIDE_REQUIRED],
+   * See [CompileTimeErrorCode.INVALID_OVERRIDE_REQUIRED],
    * [CompileTimeErrorCode.INVALID_OVERRIDE_POSITIONAL],
    * [CompileTimeErrorCode.INVALID_OVERRIDE_NAMED],
    * [StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE],
@@ -2087,10 +2091,6 @@
     //
     List<ExecutableElement> overriddenExecutables = _inheritanceManager
         .lookupOverrides(_enclosingClass, executableElement.name);
-    if (_checkForInstanceMethodNameCollidesWithSuperclassStatic(
-        executableElement, errorNameTarget)) {
-      return;
-    }
     for (ExecutableElement overriddenElement in overriddenExecutables) {
       if (_checkForAllInvalidOverrideErrorCodes(executableElement,
           overriddenElement, parameters, parameterLocations, errorNameTarget)) {
@@ -3270,10 +3270,17 @@
     if (type.element.isAbstract) {
       ConstructorElement element = expression.staticElement;
       if (element != null && !element.isFactory) {
-        if (expression.isConst) {
+        bool isImplicit =
+            (expression as InstanceCreationExpressionImpl).isImplicit;
+        if (!isImplicit) {
           _errorReporter.reportErrorForNode(
-              StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, typeName);
+              expression.isConst
+                  ? StaticWarningCode.CONST_WITH_ABSTRACT_CLASS
+                  : StaticWarningCode.NEW_WITH_ABSTRACT_CLASS,
+              typeName);
         } else {
+          // TODO(brianwilkerson/jwren) Create a new different StaticWarningCode
+          // which does not call out the new keyword so explicitly.
           _errorReporter.reportErrorForNode(
               StaticWarningCode.NEW_WITH_ABSTRACT_CLASS, typeName);
         }
@@ -4340,81 +4347,6 @@
   }
 
   /**
-   * Check whether the given [executableElement] collides with the name of a
-   * static method in one of its superclasses, and reports the appropriate
-   * warning if it does. The [errorNameTarget] is the node to report problems
-   * on.
-   *
-   * See [StaticTypeWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC].
-   */
-  bool _checkForInstanceMethodNameCollidesWithSuperclassStatic(
-      ExecutableElement executableElement, SimpleIdentifier errorNameTarget) {
-    String executableElementName = executableElement.name;
-    if (executableElement is! PropertyAccessorElement &&
-        !executableElement.isOperator) {
-      HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
-      InterfaceType superclassType = _enclosingClass.supertype;
-      ClassElement superclassElement = superclassType?.element;
-      bool executableElementPrivate =
-          Identifier.isPrivateName(executableElementName);
-      while (superclassElement != null &&
-          !visitedClasses.contains(superclassElement)) {
-        visitedClasses.add(superclassElement);
-        LibraryElement superclassLibrary = superclassElement.library;
-        // Check fields.
-        FieldElement fieldElt =
-            superclassElement.getField(executableElementName);
-        if (fieldElt != null) {
-          // Ignore if private in a different library - cannot collide.
-          if (executableElementPrivate &&
-              _currentLibrary != superclassLibrary) {
-            continue;
-          }
-          // instance vs. static
-          if (fieldElt.isStatic) {
-            _errorReporter.reportErrorForNode(
-                StaticWarningCode
-                    .INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC,
-                errorNameTarget,
-                [executableElementName, fieldElt.enclosingElement.displayName]);
-            return true;
-          }
-        }
-        // Check methods.
-        List<MethodElement> methodElements = superclassElement.methods;
-        int length = methodElements.length;
-        for (int i = 0; i < length; i++) {
-          MethodElement methodElement = methodElements[i];
-          // We need the same name.
-          if (methodElement.name != executableElementName) {
-            continue;
-          }
-          // Ignore if private in a different library - cannot collide.
-          if (executableElementPrivate &&
-              _currentLibrary != superclassLibrary) {
-            continue;
-          }
-          // instance vs. static
-          if (methodElement.isStatic) {
-            _errorReporter.reportErrorForNode(
-                StaticWarningCode
-                    .INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC,
-                errorNameTarget,
-                [
-                  executableElementName,
-                  methodElement.enclosingElement.displayName
-                ]);
-            return true;
-          }
-        }
-        superclassType = superclassElement.supertype;
-        superclassElement = superclassType?.element;
-      }
-    }
-    return false;
-  }
-
-  /**
    * Verify that an 'int' can be assigned to the parameter corresponding to the
    * given [argument]. This is used for prefix and postfix expressions where
    * the argument value is implicit.
@@ -5244,11 +5176,8 @@
             StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression);
       }
     } else if (type is FunctionType) {
-      if (type.typeArguments.length == 0 &&
-          !_typeSystem.isAssignableTo(type.returnType, _boolType)) {
-        _errorReporter.reportErrorForNode(
-            StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression);
-      }
+      _errorReporter.reportErrorForNode(
+          StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression);
     }
   }
 
@@ -5360,6 +5289,20 @@
     }
   }
 
+  void _checkForOutOfRange(IntegerLiteral node) {
+    String lexeme = node.literal.lexeme;
+    AstNode parent = node.parent;
+    bool isNegated =
+        parent is PrefixExpression && parent.operator.type == TokenType.MINUS;
+    if (!IntegerLiteralImpl.isValidLiteral(lexeme, isNegated)) {
+      if (isNegated) {
+        lexeme = '-$lexeme';
+      }
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.INTEGER_LITERAL_OUT_OF_RANGE, node, [lexeme]);
+    }
+  }
+
   /**
    * Check that the given named optional [parameter] does not begin with '_'.
    *
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index d03c13e..01ac085 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -210,6 +210,12 @@
   bool _enableNnbd = false;
 
   /**
+   * A flag indicating whether the parser should parse instance creation
+   * expressions that lack either the `new` or `const` keyword.
+   */
+  bool _enableOptionalNewAndConst = false;
+
+  /**
    * A flag indicating whether the parser is to allow URI's in part-of
    * directives.
    */
@@ -329,6 +335,20 @@
   }
 
   /**
+   * Return `true` if the parser should parse instance creation expressions that
+   * lack either the `new` or `const` keyword.
+   */
+  bool get enableOptionalNewAndConst => _enableOptionalNewAndConst;
+
+  /**
+   * Set whether the parser should parse instance creation expressions that lack
+   * either the `new` or `const` keyword.
+   */
+  void set enableOptionalNewAndConst(bool enable) {
+    _enableOptionalNewAndConst = enable;
+  }
+
+  /**
    * Return `true` if the parser is to allow URI's in part-of directives.
    */
   bool get enableUriInPartOf => _enableUriInPartOf;
@@ -4464,6 +4484,16 @@
             operand = astFactory.functionExpressionInvocation(
                 operand, typeArguments, argumentList);
           }
+        } else if (enableOptionalNewAndConst &&
+            operand is Identifier &&
+            _isLikelyNamedInstanceCreation()) {
+          TypeArgumentList typeArguments = _parseOptionalTypeArguments();
+          Token period = _expect(TokenType.PERIOD);
+          SimpleIdentifier name = parseSimpleIdentifier();
+          ArgumentList argumentList = parseArgumentList();
+          TypeName typeName = astFactory.typeName(operand, typeArguments);
+          operand = astFactory.instanceCreationExpression(null,
+              astFactory.constructorName(typeName, period, name), argumentList);
         } else {
           operand = parseAssignableSelector(operand, true);
         }
@@ -6253,6 +6283,24 @@
   }
 
   /**
+   * Return `true` if it looks like we have found the invocation of a named
+   * constructor following the name of the type:
+   * ```
+   * typeArguments? '.' identifier '('
+   * ```
+   */
+  bool _isLikelyNamedInstanceCreation() {
+    Token token = skipTypeArgumentList(_currentToken);
+    if (token != null && _tokenMatches(token, TokenType.PERIOD)) {
+      token = skipSimpleIdentifier(token.next);
+      if (token != null && _tokenMatches(token, TokenType.OPEN_PAREN)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
    * Given that we have just found bracketed text within the given [comment],
    * look to see whether that text is (a) followed by a parenthesized link
    * address, (b) followed by a colon, or (c) followed by optional whitespace
@@ -7810,6 +7858,7 @@
     Parser parser = new Parser(_source, listener);
     parser._currentToken = _cloneTokens(startToken);
     parser._enableNnbd = _enableNnbd;
+    parser._enableOptionalNewAndConst = _enableOptionalNewAndConst;
     parser._inAsync = _inAsync;
     parser._inGenerator = _inGenerator;
     parser._inInitializer = _inInitializer;
diff --git a/pkg/analyzer/lib/src/generated/parser_fasta.dart b/pkg/analyzer/lib/src/generated/parser_fasta.dart
index 98b88b7..4e03662 100644
--- a/pkg/analyzer/lib/src/generated/parser_fasta.dart
+++ b/pkg/analyzer/lib/src/generated/parser_fasta.dart
@@ -4,22 +4,6 @@
 
 part of analyzer.parser;
 
-class _Builder implements Builder {
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-class _KernelLibraryBuilder implements KernelLibraryBuilder {
-  @override
-  final uri;
-
-  _KernelLibraryBuilder(this.uri);
-
-  @override
-  Uri get fileUri => uri;
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
 /**
  * Proxy implementation of the analyzer parser, implemented in terms of the
  * Fasta parser.
@@ -57,6 +41,17 @@
   }
 
   @override
+  bool get enableOptionalNewAndConst => false;
+
+  @override
+  void set enableOptionalNewAndConst(bool enable) {}
+
+  @override
+  void set parseFunctionBodies(bool parseFunctionBodies) {
+    // ignored
+  }
+
+  @override
   bool get parseGenericMethodComments => astBuilder.parseGenericMethodComments;
 
   @override
@@ -65,9 +60,7 @@
   }
 
   @override
-  void set parseFunctionBodies(bool parseFunctionBodies) {
-    // ignored
-  }
+  Expression parseAdditiveExpression() => parseExpression2();
 
   @override
   Annotation parseAnnotation() {
@@ -91,9 +84,6 @@
       parseExpression2();
 
   @override
-  Expression parseAdditiveExpression() => parseExpression2();
-
-  @override
   Expression parseBitwiseAndExpression() => parseExpression2();
 
   @override
@@ -337,6 +327,22 @@
   Expression parseUnaryExpression() => parseExpression2();
 }
 
+class _Builder implements Builder {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+class _KernelLibraryBuilder implements KernelLibraryBuilder {
+  @override
+  final uri;
+
+  _KernelLibraryBuilder(this.uri);
+
+  @override
+  Uri get fileUri => uri;
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
 /**
  * Replacement parser based on Fasta.
  */
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 29b0f99..21e168c 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1075,6 +1075,7 @@
           DartType futureArgument = returnTypeType.typeArguments[0];
           if (futureArgument.isDynamic ||
               futureArgument.isDartCoreNull ||
+              futureArgument.isVoid ||
               futureArgument.isObject) {
             return;
           }
@@ -5196,8 +5197,7 @@
       // Analyzer ignores annotations on "part of" directives.
       assert(parent is PartOfDirective);
     } else {
-      elementAnnotationImpl.annotationAst =
-          new ConstantAstCloner().cloneNode(node);
+      elementAnnotationImpl.annotationAst = _createCloner().cloneNode(node);
     }
     return null;
   }
@@ -5550,7 +5550,7 @@
     }
     ConstructorElementImpl constructor = node.element;
     constructor.constantInitializers =
-        new ConstantAstCloner().cloneNodeList(node.initializers);
+        _createCloner().cloneNodeList(node.initializers);
     return null;
   }
 
@@ -5617,7 +5617,7 @@
     // during constant evaluation.
     if (!_hasSerializedConstantInitializer(element)) {
       (element as ConstVariableElement).constantInitializer =
-          new ConstantAstCloner().cloneNode(node.defaultValue);
+          _createCloner().cloneNode(node.defaultValue);
     }
     return null;
   }
@@ -6256,7 +6256,7 @@
     // evaluate the const constructor).
     if (element is ConstVariableElement) {
       (element as ConstVariableElement).constantInitializer =
-          new ConstantAstCloner().cloneNode(node.initializer);
+          _createCloner().cloneNode(node.initializer);
     }
     return null;
   }
@@ -6407,6 +6407,15 @@
   }
 
   /**
+   * Return a newly created cloner that can be used to clone constant
+   * expressions.
+   */
+  ConstantAstCloner _createCloner() {
+    return new ConstantAstCloner(
+        definingLibrary.context.analysisOptions.previewDart2);
+  }
+
+  /**
    * Creates a union of `T | Future<T>`, unless `T` is already a
    * future-union, in which case it simply returns `T`.
    */
diff --git a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
index 486e00c..543f95c 100644
--- a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
+++ b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
@@ -614,9 +614,6 @@
       ElementFactory.methodElement(">", _boolType, [_numType]),
       ElementFactory.methodElement(">=", _boolType, [_numType]),
       ElementFactory.methodElement("==", _boolType, [_objectType]),
-      ElementFactory.methodElement("isNaN", _boolType),
-      ElementFactory.methodElement("isNegative", _boolType),
-      ElementFactory.methodElement("isInfinite", _boolType),
       ElementFactory.methodElement("abs", _numType),
       ElementFactory.methodElement("floor", _numType),
       ElementFactory.methodElement("ceil", _numType),
@@ -631,6 +628,11 @@
           .methodElement("toStringAsPrecision", _stringType, [_intType]),
       ElementFactory.methodElement("toRadixString", _stringType, [_intType])
     ];
+    numElement.accessors = [
+      ElementFactory.getterElement('isInfinite', false, _boolType),
+      ElementFactory.getterElement('isNaN', false, _boolType),
+      ElementFactory.getterElement('isNegative', false, _boolType),
+    ];
     intElement.methods = <MethodElement>[
       ElementFactory.methodElement("&", _intType, [_intType]),
       ElementFactory.methodElement("|", _intType, [_intType]),
diff --git a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
index c586717..1b88697 100644
--- a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
@@ -475,6 +475,14 @@
   }
 
   /**
+   * Return `true` if the store contains the linked summary for the library
+   * with the given absolute [uri].
+   */
+  bool hasLinkedLibrary(String uri) {
+    return linkedMap.containsKey(uri);
+  }
+
+  /**
    * Return `true` if the store contains the unlinked summary for the unit
    * with the given absolute [uri].
    */
diff --git a/pkg/analyzer/lib/src/summary/summary_file_builder.dart b/pkg/analyzer/lib/src/summary/summary_file_builder.dart
index 7cabe97..3028abf 100644
--- a/pkg/analyzer/lib/src/summary/summary_file_builder.dart
+++ b/pkg/analyzer/lib/src/summary/summary_file_builder.dart
@@ -140,6 +140,7 @@
     LineInfo lineInfo = new LineInfo(scanner.lineStarts);
     Parser parser = new Parser(source, errorListener,
         useFasta: context.analysisOptions.useFastaParser);
+    parser.enableOptionalNewAndConst = context.analysisOptions.previewDart2;
     parser.parseGenericMethodComments = strong;
     CompilationUnit unit = parser.parseCompilationUnit(token);
     unit.lineInfo = lineInfo;
diff --git a/pkg/analyzer/lib/src/task/dart.dart b/pkg/analyzer/lib/src/task/dart.dart
index 98aaf75..c95f382 100644
--- a/pkg/analyzer/lib/src/task/dart.dart
+++ b/pkg/analyzer/lib/src/task/dart.dart
@@ -3769,6 +3769,7 @@
     parser.parseFunctionBodies =
         options.analyzeFunctionBodiesPredicate(_source);
     parser.parseGenericMethodComments = options.strongMode;
+    parser.enableOptionalNewAndConst = options.previewDart2;
     parser.enableUriInPartOf = options.enableUriInPartOf;
     CompilationUnit unit = parser.parseCompilationUnit(tokenStream);
     unit.lineInfo = lineInfo;
diff --git a/pkg/analyzer/lib/src/task/options.dart b/pkg/analyzer/lib/src/task/options.dart
index b38c3ad..aed9461 100644
--- a/pkg/analyzer/lib/src/task/options.dart
+++ b/pkg/analyzer/lib/src/task/options.dart
@@ -48,6 +48,7 @@
       'enableInitializingFormalAccess';
   static const String enableStrictCallChecks = 'enableStrictCallChecks';
   static const String enableSuperMixins = 'enableSuperMixins';
+  static const String enablePreviewDart2 = 'enablePreviewDart2';
 
   static const String errors = 'errors';
   static const String exclude = 'exclude';
@@ -88,7 +89,8 @@
     enableAsync,
     enableGenericMethods,
     enableStrictCallChecks,
-    enableSuperMixins
+    enableSuperMixins,
+    enablePreviewDart2
   ];
 }
 
@@ -578,6 +580,8 @@
         options.enableStrictCallChecks = boolValue;
       } else if (feature == AnalyzerOptions.enableSuperMixins) {
         options.enableSuperMixins = boolValue;
+      } else if (feature == AnalyzerOptions.enablePreviewDart2) {
+        options.previewDart2 = boolValue;
       }
     }
   }
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 19fb41c..7c25bb8 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,21 +1,21 @@
 name: analyzer
-version: 0.31.0-alpha.2
+version: 0.31.0+1
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
 environment:
-  sdk: '>=1.20.0 <2.0.0'
+  sdk: '>=2.0.0-dev <2.0.0'
 dependencies:
   args: '>=0.12.1 <2.0.0'
   charcode: ^1.1.0
   collection: ^1.10.1
   convert: ^2.0.0
   crypto: '>=1.1.1 <3.0.0'
-  front_end: 0.1.0-alpha.7
+  front_end: 0.1.0-alpha.8
   glob: ^1.0.3
   html: '>=0.12.0 <1.14.0'
   isolate: '>=0.2.2 <2.0.0'
-  kernel: 0.3.0-alpha.4
+  kernel: 0.3.0-alpha.5
   meta: ^1.0.2
   package_config: '>=0.1.5 <2.0.0'
   path: '>=0.9.0 <2.0.0'
diff --git a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
index 1a4f23f..7ffdcb3 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
@@ -23,6 +23,13 @@
 
   @failingTest
   @override
+  test_assertion_throws() async {
+    // Not yet generating errors in kernel mode.
+    await super.test_assertion_throws();
+  }
+
+  @failingTest
+  @override
   test_fieldFormalParameterAssignableToField_fieldType_unresolved_null() async {
     // Expected 1 errors of type StaticWarningCode.UNDEFINED_CLASS, found 0
     await super
diff --git a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart
index 37920c3..746ca53 100644
--- a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart
@@ -23,6 +23,19 @@
   AnalysisOptions get defaultAnalysisOptions =>
       new AnalysisOptionsImpl()..strongMode = true;
 
+  test_assertion_throws() async {
+    Source source = addSource(r'''
+class A {
+  const A(int x, int y) : assert(x < y);
+}
+var v = const A(3, 2);
+''');
+    await computeAnalysisResult(source);
+    assertErrors(
+        source, [CheckedModeCompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+    verify([source]);
+  }
+
   test_fieldFormalParameterAssignableToField_extends() async {
     // According to checked-mode type checking rules, a value of type B is
     // assignable to a field of type A, because B extends A (and hence is a
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 42274d3..c78e97e 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
@@ -1340,6 +1340,20 @@
 
   @override
   @failingTest
+  test_integerLiteralOutOfRange_negative() async {
+    // Expected 1 errors of type CompileTimeErrorCode.INTEGER_LITERAL_OUT_OF_RANGE, found 0
+    await super.test_integerLiteralOutOfRange_negative();
+  }
+
+  @override
+  @failingTest
+  test_integerLiteralOutOfRange_positive() async {
+    // Expected 1 errors of type CompileTimeErrorCode.INTEGER_LITERAL_OUT_OF_RANGE, found 0
+    await super.test_integerLiteralOutOfRange_positive();
+  }
+
+  @override
+  @failingTest
   test_invalidAnnotation_getter() async {
     // Expected 1 errors of type CompileTimeErrorCode.INVALID_ANNOTATION, found 0
     await super.test_invalidAnnotation_getter();
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 8551fdc..3079a45 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -1180,11 +1180,21 @@
   test_constEvalTypeBool_binary_leftTrue() async {
     Source source = addSource("const C = (true || 0);");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL,
-      StaticTypeWarningCode.NON_BOOL_OPERAND,
-      HintCode.DEAD_CODE
-    ]);
+    assertErrors(
+        source, [StaticTypeWarningCode.NON_BOOL_OPERAND, HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  test_constEvalTypeBool_logicalOr_trueLeftOperand() async {
+    Source source = addSource(r'''
+class C {
+  final int x;
+  const C({this.x}) : assert(x == null || x >= 0);
+}
+const c = const C();
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
     verify([source]);
   }
 
@@ -3210,6 +3220,18 @@
     verify([source]);
   }
 
+  test_integerLiteralOutOfRange_negative() async {
+    Source source = addSource('int x = -9223372036854775809;');
+    await computeAnalysisResult(source);
+    assertErrors(source, [CompileTimeErrorCode.INTEGER_LITERAL_OUT_OF_RANGE]);
+  }
+
+  test_integerLiteralOutOfRange_positive() async {
+    Source source = addSource('int x = 9223372036854775808;');
+    await computeAnalysisResult(source);
+    assertErrors(source, [CompileTimeErrorCode.INTEGER_LITERAL_OUT_OF_RANGE]);
+  }
+
   test_invalidAnnotation_getter() async {
     Source source = addSource(r'''
 get V => 0;
diff --git a/pkg/analyzer/test/generated/constant_test.dart b/pkg/analyzer/test/generated/constant_test.dart
index c267a84..f94b026 100644
--- a/pkg/analyzer/test/generated/constant_test.dart
+++ b/pkg/analyzer/test/generated/constant_test.dart
@@ -25,13 +25,6 @@
 
 @reflectiveTest
 class ConstantEvaluatorTest extends ResolverTestCase {
-  void fail_constructor() {
-    EvaluationResult result = _getExpressionValue("?");
-    expect(result.isValid, isTrue);
-    DartObject value = result.value;
-    expect(value, null);
-  }
-
   void fail_identifier_class() {
     EvaluationResult result = _getExpressionValue("?");
     expect(result.isValid, isTrue);
@@ -132,6 +125,88 @@
     _assertValue3(74 ^ 42, "74 ^ 42");
   }
 
+  void test_constructorInvocation_assert_false() {
+    EvaluationResult result = _getExpressionValue("const C(0)", context: '''
+class C {
+  const C(int x) : assert(x > 0);
+}
+''');
+    expect(result.isValid, isFalse);
+  }
+
+  test_constructorInvocation_assert_inherited() async {
+    EvaluationResult result =
+        _getExpressionValue("const Center(name: 'v')", context: '''
+class Align {
+  final double widthFactor;
+  const Align({String name, this.widthFactor})
+        assert(widthFactor == null || widthFactor >= 0.0);
+}
+class Center extends Align {
+  const Center({String name})
+    : super(name: name);
+}
+''');
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value, isNotNull);
+    expect(value.type.name, 'Center');
+    DartObject superclassFields = value.getField(GenericState.SUPERCLASS_FIELD);
+    DartObject widthFactor = superclassFields.getField('widthFactor');
+    expect(widthFactor, isNotNull);
+    expect(widthFactor.isNull, isTrue);
+  }
+
+  void test_constructorInvocation_assert_true() {
+    EvaluationResult result = _getExpressionValue("const C(3)", context: '''
+class C {
+  const C(int x) : assert(x > 0);
+}
+''');
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value, isNotNull);
+    expect(value.type.name, 'C');
+  }
+
+  void test_constructorInvocation_fieldInitializer() {
+    EvaluationResult result = _getExpressionValue("const C(2)", context: '''
+class C {
+  final int x;
+  const C(this.x);
+}
+''');
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value, isNotNull);
+    expect(value.type.name, 'C');
+    DartObject x = value.getField('x');
+    expect(x, isNotNull);
+    expect(x.type.name, 'int');
+    expect(x.toIntValue(), 2);
+  }
+
+  void test_constructorInvocation_noArgs() {
+    EvaluationResult result =
+        _getExpressionValue("const C()", context: 'class C {}');
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value, isNotNull);
+    expect(value.type.name, 'C');
+  }
+
+  void test_constructorInvocation_simpleArgs() {
+    EvaluationResult result = _getExpressionValue("const C(1)", context: '''
+class C {
+  const C(int x);
+}
+''');
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value, isNotNull);
+    expect(value.type.name, 'C');
+  }
+
   void test_divide_double_double() {
     _assertValue2(3.2 / 2.3, "3.2 / 2.3");
   }
@@ -388,14 +463,13 @@
     expect(value.toStringValue(), expectedValue);
   }
 
-  EvaluationResult _getExpressionValue(String contents) {
-    Source source = addSource("var x = $contents;");
+  EvaluationResult _getExpressionValue(String contents, {String context: ''}) {
+    Source source = addSource("var x = $contents;$context");
     LibraryElement library = resolve2(source);
     CompilationUnit unit =
         analysisContext.resolveCompilationUnit(source, library);
     expect(unit, isNotNull);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
-    expect(declarations, hasLength(1));
     CompilationUnitMember declaration = declarations[0];
     EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration,
         TopLevelVariableDeclaration, declaration);
diff --git a/pkg/analyzer/test/generated/element_resolver_test.dart b/pkg/analyzer/test/generated/element_resolver_test.dart
index b9454b3..aaf88b9 100644
--- a/pkg/analyzer/test/generated/element_resolver_test.dart
+++ b/pkg/analyzer/test/generated/element_resolver_test.dart
@@ -33,6 +33,7 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(ElementResolverCodeTest);
     defineReflectiveTests(ElementResolverTest);
+    defineReflectiveTests(PreviewDart2Test);
   });
 }
 
@@ -1296,3 +1297,249 @@
     }
   }
 }
+
+@reflectiveTest
+class PreviewDart2Test extends ResolverTestCase {
+  @override
+  void setUp() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl()
+      ..previewDart2 = true;
+    resetWith(options: options);
+  }
+
+  /**
+   * Tests and verifies that even with a explicit 'new' keyword, the
+   * construction of the InstanceCreationExpression node with types and elements
+   * is all correct.
+   */
+  test_visitMethodInvocations_explicit() async {
+    String code = '''
+class A {
+  A() {}
+}
+main() {
+  var v = new A(); // marker
+}
+    ''';
+    CompilationUnit unit = await resolveSource(code);
+    AstNode constructorName = findMarkedIdentifier(code, unit, "(); // marker");
+    InstanceCreationExpression instanceCreationExpression =
+        constructorName.parent.parent.parent;
+    expect(instanceCreationExpression, isNotNull);
+    expect(instanceCreationExpression.constructorName.type.type, isNotNull);
+    expect(instanceCreationExpression.constructorName.staticElement, isNotNull);
+    expect(instanceCreationExpression.staticElement, isNotNull);
+    expect(instanceCreationExpression.staticType, isNotNull);
+    // unnamed constructor:
+    expect(instanceCreationExpression.constructorName.name, isNull);
+  }
+
+  /**
+   * Test that the call to a constructor with an implicit unnamed constructor is
+   * re-written as an InstanceCreationExpression AST node from a
+   * MethodInvocation.
+   *
+   * C()
+   */
+  test_visitMethodInvocations_implicit() async {
+    String code = '''
+class A {
+  A() {}
+}
+main() {
+  var v = A(); // marker
+}
+    ''';
+    CompilationUnit unit = await resolveSource(code);
+    AstNode constructorName = findMarkedIdentifier(code, unit, "(); // marker");
+    InstanceCreationExpression instanceCreationExpression =
+        constructorName.parent.parent.parent;
+    expect(instanceCreationExpression, isNotNull);
+    expect(instanceCreationExpression.constructorName.type.type, isNotNull);
+    expect(instanceCreationExpression.constructorName.staticElement, isNotNull);
+    expect(instanceCreationExpression.staticElement, isNotNull);
+    expect(instanceCreationExpression.staticType, isNotNull);
+    // unnamed constructor:
+    expect(instanceCreationExpression.constructorName.name, isNull);
+  }
+
+  /**
+   * Test that the call to a constructor with an implicit named constructor is
+   * re-written as an InstanceCreationExpression AST node from a
+   * MethodInvocation.
+   *
+   * C.n()
+   */
+  test_visitMethodInvocations_implicit_named() async {
+    String code = '''
+class A {
+  A.named() {}
+}
+main() {
+  var v = A.named(); // marker
+}
+    ''';
+    CompilationUnit unit = await resolveSource(code);
+    AstNode constructorName = findMarkedIdentifier(code, unit, "(); // marker");
+    InstanceCreationExpression instanceCreationExpression =
+        constructorName.parent.parent;
+    expect(instanceCreationExpression, isNotNull);
+    expect(instanceCreationExpression.constructorName.type.type, isNotNull);
+    expect(instanceCreationExpression.constructorName.staticElement, isNotNull);
+    expect(instanceCreationExpression.staticElement, isNotNull);
+    expect(instanceCreationExpression.staticType, isNotNull);
+    // named constructor:
+    expect(instanceCreationExpression.constructorName.name.staticElement,
+        isNotNull);
+  }
+
+  /**
+   * Test that the call to a constructor with a prefixed implicit constructor is
+   * re-written as an InstanceCreationExpression AST node from a
+   * MethodInvocation.
+   *
+   * p.C()
+   */
+  test_visitMethodInvocations_implicit_prefixed() async {
+    addNamedSource("/fileOne.dart", r'''
+class A {
+  A() {}
+}
+''');
+    String code = '''
+import 'fileOne.dart' as one;
+
+main() {
+  var v = one.A(); // marker
+}
+    ''';
+    CompilationUnit unit = await resolveSource(code);
+    AstNode constructorName = findMarkedIdentifier(code, unit, "(); // marker");
+    InstanceCreationExpression instanceCreationExpression =
+        constructorName.parent.parent.parent.parent;
+    expect(instanceCreationExpression, isNotNull);
+    expect(instanceCreationExpression.constructorName.type.type, isNotNull);
+    expect(instanceCreationExpression.constructorName.staticElement, isNotNull);
+    expect(instanceCreationExpression.staticElement, isNotNull);
+    expect(instanceCreationExpression.staticType, isNotNull);
+    // unnamed constructor:
+    expect(instanceCreationExpression.constructorName.name, isNull);
+  }
+
+  /**
+   * Test that the call to a constructor with a prefixed implicit named constructor is
+   * re-written as an InstanceCreationExpression AST node from a
+   * MethodInvocation.
+   *
+   * p.C.n()
+   */
+  test_visitMethodInvocations_implicit_prefixed_named() async {
+    addNamedSource("/fileOne.dart", r'''
+class A {
+  A.named() {}
+}
+''');
+    String code = '''
+import 'fileOne.dart' as one;
+main() {
+  var v = one.A.named(); // marker
+}
+    ''';
+    CompilationUnit unit = await resolveSource(code);
+    AstNode constructorName = findMarkedIdentifier(code, unit, "(); // marker");
+    InstanceCreationExpression instanceCreationExpression =
+        constructorName.parent.parent;
+    expect(instanceCreationExpression, isNotNull);
+    expect(instanceCreationExpression.constructorName.type.type, isNotNull);
+    expect(instanceCreationExpression.constructorName.staticElement, isNotNull);
+    expect(instanceCreationExpression.staticElement, isNotNull);
+    expect(instanceCreationExpression.staticType, isNotNull);
+    // named constructor:
+    expect(instanceCreationExpression.constructorName.name.staticElement,
+        isNotNull);
+  }
+
+  /**
+   * Test that the call to a constructor with a prefixed implicit constructor is
+   * re-written as an InstanceCreationExpression AST node from a
+   * MethodInvocation.
+   *
+   * p.C<>()
+   */
+  test_visitMethodInvocations_implicit_prefixed_typeArgs() async {
+    addNamedSource("/fileOne.dart", r'''
+class A<T> {
+  final T x;
+  A(this.x) {}
+}
+''');
+    String code = '''
+import 'fileOne.dart' as one;
+
+main() {
+  var v = one.A<int>(42); // marker
+}
+    ''';
+    CompilationUnit unit = await resolveSource(code);
+    AstNode constructorName =
+        findMarkedIdentifier(code, unit, "<int>(42); // marker");
+    InstanceCreationExpression instanceCreationExpression =
+        constructorName.parent.parent.parent.parent;
+    expect(instanceCreationExpression, isNotNull);
+    expect(instanceCreationExpression.constructorName.type.type, isNotNull);
+    expect(instanceCreationExpression.constructorName.staticElement, isNotNull);
+    expect(instanceCreationExpression.staticElement, isNotNull);
+    expect(instanceCreationExpression.staticType, isNotNull);
+    // unnamed constructor:
+    expect(instanceCreationExpression.constructorName.name, isNull);
+  }
+
+  /**
+   * Test that the call to a constructor with an implicit unnamed constructor is
+   * re-written as an InstanceCreationExpression AST node from a
+   * MethodInvocation.
+   *
+   * C<>()
+   */
+  test_visitMethodInvocations_implicit_typeArgs() async {
+    String code = '''
+class A<T> {
+  final T x;
+  A(this.x) {}
+}
+main() {
+  var v = A<int>(42); // marker
+}
+    ''';
+    CompilationUnit unit = await resolveSource(code);
+    AstNode constructorName =
+        findMarkedIdentifier(code, unit, "<int>(42); // marker");
+    InstanceCreationExpression instanceCreationExpression =
+        constructorName.parent.parent.parent;
+    expect(instanceCreationExpression, isNotNull);
+    expect(instanceCreationExpression.constructorName.type.type, isNotNull);
+    expect(instanceCreationExpression.constructorName.staticElement, isNotNull);
+    expect(instanceCreationExpression.staticElement, isNotNull);
+    expect(instanceCreationExpression.staticType, isNotNull);
+    // unnamed constructor:
+    expect(instanceCreationExpression.constructorName.name, isNull);
+  }
+
+  /**
+   * Test that the call to a static method will not be re-written as a
+   * InstanceCreationExpression AST node.
+   */
+  test_visitMethodInvocations_not_implicit_constructor() async {
+    String code = '''
+class A {
+  static staticMethod() {}
+}
+main() {
+  A.staticMethod(); // marker
+}
+    ''';
+    CompilationUnit unit = await resolveSource(code);
+    AstNode node = findMarkedIdentifier(code, unit, "(); // marker");
+    assert(node.parent is MethodInvocation);
+  }
+}
diff --git a/pkg/analyzer/test/generated/hint_code_kernel_test.dart b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
index 530eb78..76f0dc1 100644
--- a/pkg/analyzer/test/generated/hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
@@ -490,4 +490,10 @@
   test_importDeferredLibraryWithLoadFunction() async {
     await super.test_importDeferredLibraryWithLoadFunction();
   }
+
+  @failingTest
+  @override
+  test_no_missingReturn_async_futureOrVoid() async {
+    await super.test_no_missingReturn_async_futureOrVoid();
+  }
 }
diff --git a/pkg/analyzer/test/generated/hint_code_test.dart b/pkg/analyzer/test/generated/hint_code_test.dart
index dae6056..5e8fcea 100644
--- a/pkg/analyzer/test/generated/hint_code_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_test.dart
@@ -2253,6 +2253,26 @@
     verify([source]);
   }
 
+  test_no_missingReturn_async_futureVoid() async {
+    Source source = addSource('''
+import 'dart:async';
+Future<void> f() async {}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  test_no_missingReturn_async_futureOrVoid() async {
+    Source source = addSource('''
+import 'dart:async';
+FutureOr<void> f(Future f) async {}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_missingReturn_factory() async {
     Source source = addSource(r'''
 class A {
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 9c424a9..e7bf2d5 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
@@ -142,6 +142,13 @@
 
   @override
   @failingTest
+  @potentialAnalyzerProblem
+  test_constDeferredClass_new() async {
+    return super.test_constDeferredClass_new();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
   test_constructorDeclaration_scope_signature() async {
     return super.test_constructorDeclaration_scope_signature();
@@ -191,6 +198,13 @@
 
   @override
   @failingTest
+  @potentialAnalyzerProblem
+  test_integerLiteralOutOfRange_negative_valid() async {
+    return super.test_integerLiteralOutOfRange_negative_valid();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31641')
   test_invalidAnnotation_constantVariable_field() async {
     return super.test_invalidAnnotation_constantVariable_field();
@@ -240,36 +254,12 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/30834')
-  test_memberWithClassName_setter() async {
-    return super.test_memberWithClassName_setter();
-  }
-
-  @override
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
   test_methodDeclaration_scope_signature() async {
     return super.test_methodDeclaration_scope_signature();
   }
 
   @override
-  test_nativeConstConstructor() async {
-    return super.test_nativeConstConstructor();
-  }
-
-  @override
-  test_nativeFunctionBodyInNonSDKCode_function() async {
-    return super.test_nativeFunctionBodyInNonSDKCode_function();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_nonBoolExpression_functionType() async {
-    return super.test_nonBoolExpression_functionType();
-  }
-
-  @override
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31628')
   test_nonConstCaseExpression_constField() async {
@@ -338,19 +328,4 @@
   test_undefinedIdentifier_synthetic_whenMethodName() async {
     return super.test_undefinedIdentifier_synthetic_whenMethodName();
   }
-
-  @override
-  test_uriDoesNotExist_dll() async {
-    return super.test_uriDoesNotExist_dll();
-  }
-
-  @override
-  test_uriDoesNotExist_dylib() async {
-    return super.test_uriDoesNotExist_dylib();
-  }
-
-  @override
-  test_uriDoesNotExist_so() async {
-    return super.test_uriDoesNotExist_so();
-  }
 }
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index cfb31c2..cb9fca4 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -1169,18 +1169,6 @@
     verify([source]);
   }
 
-  test_forEach_genericFunctionType() async {
-    Source source = addSource(r'''
-main() {
-  for (Null Function<T>(T, Null) e in []) {
-    e;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   test_caseBlockNotTerminated() async {
     Source source = addSource(r'''
 f(int p) {
@@ -2410,6 +2398,18 @@
     verify([source]);
   }
 
+  test_forEach_genericFunctionType() async {
+    Source source = addSource(r'''
+main() {
+  for (Null Function<T>(T, Null) e in []) {
+    e;
+  }
+}''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_functionDeclaration_scope_returnType() async {
     Source source = addSource("int f(int) { return 0; }");
     await computeAnalysisResult(source);
@@ -3105,6 +3105,36 @@
     verify([source]);
   }
 
+  test_integerLiteralOutOfRange_negative_leadingZeros() async {
+    Source source = addSource('int x = -000923372036854775809;');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+  }
+
+  test_integerLiteralOutOfRange_negative_valid() async {
+    Source source = addSource('int x = -9223372036854775808;');
+    await computeAnalysisResult(source);
+    assertErrors(source);
+  }
+
+  test_integerLiteralOutOfRange_positive_leadingZeros() async {
+    Source source = addSource('int x = 000923372036854775808;');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+  }
+
+  test_integerLiteralOutOfRange_positive_valid() async {
+    Source source = addSource('int x = 9223372036854775807;');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+  }
+
+  test_integerLiteralOutOfRange_positive_zero() async {
+    Source source = addSource('int x = 0;');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+  }
+
   test_invalidAnnotation_constantVariable_field() async {
     Source source = addSource(r'''
 @A.C
@@ -4370,17 +4400,6 @@
     verify([source]);
   }
 
-  test_nonBoolExpression_functionType() async {
-    Source source = addSource(r'''
-bool makeAssertion() => true;
-f() {
-  assert(makeAssertion);
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   test_nonBoolExpression_interfaceType() async {
     Source source = addSource(r'''
 f() {
@@ -5413,6 +5432,13 @@
     verify([source]);
   }
 
+  test_typeArgument_boundToFunctionType() async {
+    Source source = addSource("class A<T extends void Function<T>(T)>{}");
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_typeArgumentNotMatchingBounds_const() async {
     Source source = addSource(r'''
 class A {}
@@ -6399,13 +6425,6 @@
     verify([source]);
   }
 
-  test_typeArgument_boundToFunctionType() async {
-    Source source = addSource("class A<T extends void Function<T>(T)>{}");
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   Future<Null> _check_wrongNumberOfParametersForOperator(
       String name, String parameters) async {
     Source source = addSource("""
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index bd0444f..cce7def 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -115,22 +115,6 @@
     with ErrorParserTestMixin {
   @override
   @failingTest
-  void test_breakOutsideOfLoop_breakInIfStatement() {
-    // TODO(brianwilkerson) Wrong errors:
-    // Expected 1 errors of type ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, found 0
-    super.test_breakOutsideOfLoop_breakInIfStatement();
-  }
-
-  @override
-  @failingTest
-  void test_breakOutsideOfLoop_functionExpression_inALoop() {
-    // TODO(brianwilkerson) Wrong errors:
-    // Expected 1 errors of type ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, found 0
-    super.test_breakOutsideOfLoop_functionExpression_inALoop();
-  }
-
-  @override
-  @failingTest
   void test_constConstructorWithBody() {
     // TODO(brianwilkerson) Wrong errors:
     // Expected 1 errors of type ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY, found 0
@@ -165,30 +149,6 @@
 
   @override
   @failingTest
-  void test_continueOutsideOfLoop_continueInIfStatement() {
-    // TODO(brianwilkerson) Wrong errors:
-    // Expected 1 errors of type ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, found 0
-    super.test_continueOutsideOfLoop_continueInIfStatement();
-  }
-
-  @override
-  @failingTest
-  void test_continueOutsideOfLoop_functionExpression_inALoop() {
-    // TODO(brianwilkerson) Wrong errors:
-    // Expected 1 errors of type ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, found 0
-    super.test_continueOutsideOfLoop_functionExpression_inALoop();
-  }
-
-  @override
-  @failingTest
-  void test_continueWithoutLabelInCase_error() {
-    // TODO(brianwilkerson) Wrong errors:
-    // Expected 1 errors of type ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE, found 0
-    super.test_continueWithoutLabelInCase_error();
-  }
-
-  @override
-  @failingTest
   void test_duplicateLabelInSwitchStatement() {
     // TODO(brianwilkerson) Wrong errors:
     // Expected 1 errors of type ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT, found 0
@@ -1381,17 +1341,6 @@
 
   @override
   @failingTest
-  void test_typedef_namedFunction() {
-    // TODO(brianwilkerson) Wrong errors:
-    // Expected 1 errors of type ParserErrorCode.MISSING_TYPEDEF_PARAMETERS, found 0;
-    // 1 errors of type ParserErrorCode.MISSING_IDENTIFIER, found 0;
-    // 1 errors of type ParserErrorCode.UNEXPECTED_TOKEN, found 0;
-    // 1 errors of type ParserErrorCode.EXPECTED_EXECUTABLE, found 0
-    super.test_typedef_namedFunction();
-  }
-
-  @override
-  @failingTest
   void test_unexpectedToken_endOfFieldDeclarationStatement() {
     // TODO(brianwilkerson) Wrong errors:
     // Expected 1 errors of type ParserErrorCode.UNEXPECTED_TOKEN, found 0
@@ -1654,6 +1603,10 @@
     }
   }
 
+  set enableOptionalNewAndConst(bool enable) {
+    // ignored
+  }
+
   @override
   set enableUriInPartOf(bool value) {
     if (value == false) {
@@ -1769,19 +1722,10 @@
   @override
   CompilationUnit parseCompilationUnit(String content,
       {List<ErrorCode> codes, List<ExpectedError> errors}) {
-    // Scan tokens
-    var source = new StringSource(content, 'parser_test_StringSource.dart');
     GatheringErrorListener listener =
         new GatheringErrorListener(checkRanges: true);
-    var scanner = new Scanner.fasta(source, listener);
-    scanner.scanGenericMethodComments = enableGenericMethodComments;
-    _fastaTokens = scanner.tokenize();
 
-    // Run parser
-    analyzer.Parser parser =
-        new analyzer.Parser(source, listener, useFasta: true);
-    CompilationUnit unit = parser.parseCompilationUnit(_fastaTokens);
-    expect(unit, isNotNull);
+    CompilationUnit unit = parseCompilationUnit2(content, listener);
 
     // Assert and return result
     if (codes != null) {
@@ -1795,6 +1739,22 @@
     return unit;
   }
 
+  CompilationUnit parseCompilationUnit2(
+      String content, GatheringErrorListener listener) {
+    // Scan tokens
+    var source = new StringSource(content, 'parser_test_StringSource.dart');
+    var scanner = new Scanner.fasta(source, listener);
+    scanner.scanGenericMethodComments = enableGenericMethodComments;
+    _fastaTokens = scanner.tokenize();
+
+    // Run parser
+    analyzer.Parser parser =
+        new analyzer.Parser(source, listener, useFasta: true);
+    CompilationUnit unit = parser.parseCompilationUnit(_fastaTokens);
+    expect(unit, isNotNull);
+    return unit;
+  }
+
   @override
   ConditionalExpression parseConditionalExpression(String code) {
     return _parseExpression(code);
@@ -2492,6 +2452,18 @@
     with SimpleParserTestMixin {
   @override
   @failingTest
+  void test_parseInstanceCreation_noKeyword_noPrefix() {
+    super.test_parseInstanceCreation_noKeyword_noPrefix();
+  }
+
+  @override
+  @failingTest
+  void test_parseInstanceCreation_noKeyword_prefix() {
+    super.test_parseInstanceCreation_noKeyword_prefix();
+  }
+
+  @override
+  @failingTest
   void test_parseTypeParameterList_single() {
     // TODO(brianwilkerson) Does not use all tokens.
     super.test_parseTypeParameterList_single();
@@ -2505,30 +2477,6 @@
 class StatementParserTest_Fasta extends FastaParserTestCase
     with StatementParserTestMixin {
   @override
-  @failingTest
-  void test_parseBreakStatement_noLabel() {
-    // TODO(brianwilkerson)
-    // Expected 1 errors of type ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, found 0
-    super.test_parseBreakStatement_noLabel();
-  }
-
-  @override
-  @failingTest
-  void test_parseContinueStatement_label() {
-    // TODO(brianwilkerson)
-    // Expected 1 errors of type ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, found 0
-    super.test_parseContinueStatement_label();
-  }
-
-  @override
-  @failingTest
-  void test_parseContinueStatement_noLabel() {
-    // TODO(brianwilkerson)
-    // Expected 1 errors of type ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, found 0
-    super.test_parseContinueStatement_noLabel();
-  }
-
-  @override
   void test_parseFunctionDeclarationStatement_typeParameterComments() {
     // Ignored: Fasta does not support the generic comment syntax.
   }
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 4a8c1d4b..857d40e 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -55,6 +55,12 @@
   void set enableNnbd(bool value);
 
   /**
+   * Set a flag indicating whether the parser should parse instance creation
+   * expressions that lack either the `new` or `const` keyword.
+   */
+  void set enableOptionalNewAndConst(bool value);
+
+  /**
    * Set a flag indicating whether the parser is to parse part-of directives
    * that specify a URI rather than a library name.
    */
@@ -2463,7 +2469,7 @@
     IfStatement statement = parseStatement('if (x) {break;}');
     expectNotNullIfNoErrors(statement);
     listener.assertErrors(
-        [expectedError(ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, 8, 6)]);
+        [expectedError(ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, 8, 5)]);
   }
 
   void test_breakOutsideOfLoop_breakInSwitchStatement() {
@@ -2481,7 +2487,7 @@
   void test_breakOutsideOfLoop_functionExpression_inALoop() {
     parseStatement("for(; x;) {() {break;};}");
     listener.assertErrors(
-        [expectedError(ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, 15, 6)]);
+        [expectedError(ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, 15, 5)]);
   }
 
   void test_breakOutsideOfLoop_functionExpression_withALoop() {
@@ -2616,7 +2622,7 @@
     IfStatement statement = parseStatement('if (x) {continue;}');
     expectNotNullIfNoErrors(statement);
     listener.assertErrors(
-        [expectedError(ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, 8, 9)]);
+        [expectedError(ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, 8, 8)]);
   }
 
   void test_continueOutsideOfLoop_continueInSwitchStatement() {
@@ -2635,7 +2641,7 @@
   void test_continueOutsideOfLoop_functionExpression_inALoop() {
     parseStatement("for(; x;) {() {continue;};}");
     listener.assertErrors(
-        [expectedError(ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, 15, 9)]);
+        [expectedError(ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, 15, 8)]);
   }
 
   void test_continueOutsideOfLoop_functionExpression_withALoop() {
@@ -2647,7 +2653,7 @@
         parseStatement('switch (x) {case 1: continue;}');
     expectNotNullIfNoErrors(statement);
     listener.assertErrors(
-        [expectedError(ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE, 20, 9)]);
+        [expectedError(ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE, 20, 8)]);
   }
 
   void test_continueWithoutLabelInCase_noError() {
@@ -2687,6 +2693,15 @@
         [expectedError(ParserErrorCode.COVARIANT_AND_STATIC, 10, 6)]);
   }
 
+  void test_covariantAndType_local() {
+    // This is currently reporting EXPECTED_TOKEN for a missing semicolon, but
+    // this would be a better error message.
+    parseStatement("covariant int x;");
+    listener.assertErrors(usingFastaParser
+        ? [expectedError(ParserErrorCode.EXTRANEOUS_MODIFIER, 0, 9)]
+        : [expectedError(ParserErrorCode.EXPECTED_TOKEN, 0, 9)]);
+  }
+
   void test_covariantConstructor() {
     createParser('class C { covariant C(); }');
     ClassDeclaration member = parseFullCompilationUnitMember();
@@ -2701,15 +2716,6 @@
     ]);
   }
 
-  void test_covariantAndType_local() {
-    // This is currently reporting EXPECTED_TOKEN for a missing semicolon, but
-    // this would be a better error message.
-    parseStatement("covariant int x;");
-    listener.assertErrors(usingFastaParser
-        ? [expectedError(ParserErrorCode.EXTRANEOUS_MODIFIER, 0, 9)]
-        : [expectedError(ParserErrorCode.EXPECTED_TOKEN, 0, 9)]);
-  }
-
   void test_covariantMember_getter_noReturnType() {
     createParser('static covariant get x => 0;');
     ClassMember member = parser.parseClassMember('C');
@@ -2952,7 +2958,9 @@
     CompilationUnit unit = parseCompilationUnit('heart 2 heart',
         errors: usingFastaParser
             ? [
-                expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 0, 5),
+                expectedError(
+                    ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 0, 5),
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 6, 1),
                 expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 6, 1),
                 expectedError(
                     ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 8, 5),
@@ -2971,9 +2979,11 @@
     CompilationUnit unit = parseCompilationUnit('void 2 void',
         errors: usingFastaParser
             ? [
-                expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 0, 4),
+                expectedError(ParserErrorCode.MISSING_IDENTIFIER, 5, 1),
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 5, 1),
                 expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 5, 1),
-                expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 7, 4),
+                expectedError(ParserErrorCode.MISSING_IDENTIFIER, 11, 0),
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 11, 0),
               ]
             : [
                 expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 6, 1),
@@ -3145,13 +3155,6 @@
         errors: [expectedError(ParserErrorCode.EXPECTED_TYPE_NAME, 4, 4)]);
   }
 
-  void test_exportDirectiveAfterPartDirective() {
-    parseCompilationUnit("part 'a.dart'; export 'b.dart';", errors: [
-      expectedError(
-          ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, 15, 6)
-    ]);
-  }
-
   void test_exportAsType() {
     parseCompilationUnit('export<dynamic> foo;',
         errors: usingFastaParser
@@ -3172,6 +3175,13 @@
             : []);
   }
 
+  void test_exportDirectiveAfterPartDirective() {
+    parseCompilationUnit("part 'a.dart'; export 'b.dart';", errors: [
+      expectedError(
+          ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, 15, 6)
+    ]);
+  }
+
   void test_externalAfterConst() {
     createParser('const external C();');
     ClassMember member = parser.parseClassMember('C');
@@ -3549,6 +3559,31 @@
     ]);
   }
 
+  void test_genericFunctionType_asIdentifier() {
+    createParser('final int Function = 0;');
+    CompilationUnit unit = parser.parseCompilationUnit2();
+    expectNotNullIfNoErrors(unit);
+    listener.assertErrors([]);
+  }
+
+  void test_genericFunctionType_asIdentifier2() {
+    if (usingFastaParser) {
+      createParser('int Function() {}');
+      CompilationUnit unit = parser.parseCompilationUnit2();
+      expectNotNullIfNoErrors(unit);
+      listener.assertErrors([]);
+    }
+  }
+
+  void test_genericFunctionType_asIdentifier3() {
+    if (usingFastaParser) {
+      createParser('int Function() => 0;');
+      CompilationUnit unit = parser.parseCompilationUnit2();
+      expectNotNullIfNoErrors(unit);
+      listener.assertErrors([]);
+    }
+  }
+
   void test_genericFunctionType_extraLessThan() {
     createParser('''
 class Wrong<T> {
@@ -3818,6 +3853,16 @@
     listener.assertErrors([expectedError(ParserErrorCode.INVALID_SYNC, 0, 4)]);
   }
 
+  void test_invalidTopLevelSetter() {
+    parseCompilationUnit("var set foo; main(){}", errors: [
+      expectedError(ParserErrorCode.VAR_RETURN_TYPE, 0, 3),
+      usingFastaParser
+          ? expectedError(ParserErrorCode.MISSING_FUNCTION_PARAMETERS, 8, 3)
+          : expectedError(ParserErrorCode.MISSING_FUNCTION_PARAMETERS, 11, 1),
+      expectedError(ParserErrorCode.MISSING_FUNCTION_BODY, 11, 1)
+    ]);
+  }
+
   void test_invalidTopLevelVar() {
     parseCompilationUnit("var Function(var arg);", errors: [
       expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 21, 2),
@@ -3825,18 +3870,6 @@
     ]);
   }
 
-  void test_invalidTopLevelSetter() {
-    parseCompilationUnit("var set foo; main(){}",
-        errors: usingFastaParser
-            ? [expectedError(ParserErrorCode.EXTRANEOUS_MODIFIER, 4, 3)]
-            : [
-                expectedError(ParserErrorCode.VAR_RETURN_TYPE, 0, 3),
-                expectedError(
-                    ParserErrorCode.MISSING_FUNCTION_PARAMETERS, 11, 1),
-                expectedError(ParserErrorCode.MISSING_FUNCTION_BODY, 11, 1)
-              ]);
-  }
-
   void test_invalidTypedef() {
     parseCompilationUnit("typedef var Function(var arg);",
         errors: usingFastaParser
@@ -4990,19 +5023,19 @@
     expect(function.functionExpression.parameters, isNull);
   }
 
+  void test_topLevelFactory_withFunction() {
+    parseCompilationUnit('factory Function() x = null;', errors: [
+      expectedError(ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION, 0, 7)
+    ]);
+  }
+
   void test_topLevelOperator_withFunction() {
-    createParser('operator Function() x = null;');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    if (usingFastaParser) {
-      listener.assertErrors([
-        expectedError(ParserErrorCode.TOP_LEVEL_OPERATOR, 0, 8),
-        expectedError(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 20, 1)
-      ]);
-    } else {
-      // Should be generating an error here.
-      listener.assertErrorsWithCodes([]);
-    }
+    parseCompilationUnit('operator Function() x = null;',
+        errors: usingFastaParser
+            ? [expectedError(ParserErrorCode.TOP_LEVEL_OPERATOR, 0, 8)]
+            : [
+                // Should be generating an error here.
+              ]);
   }
 
   void test_topLevelOperator_withoutOperator() {
@@ -5015,44 +5048,18 @@
   }
 
   void test_topLevelOperator_withoutType() {
-    createParser('operator +(bool x, bool y) => x | y;');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    if (usingFastaParser) {
-      listener.assertErrors(usingFastaParser
-          ? [expectedError(ParserErrorCode.TOP_LEVEL_OPERATOR, 0, 8)]
-          : [
-              expectedError(ParserErrorCode.MISSING_IDENTIFIER, 0, 0),
-              expectedError(ParserErrorCode.TOP_LEVEL_OPERATOR, 0, 8)
-            ]);
-    } else {
-      listener.assertErrorsWithCodes([ParserErrorCode.TOP_LEVEL_OPERATOR]);
-    }
+    parseCompilationUnit('operator +(bool x, bool y) => x | y;',
+        errors: [expectedError(ParserErrorCode.TOP_LEVEL_OPERATOR, 0, 8)]);
   }
 
   void test_topLevelOperator_withType() {
-    createParser('bool operator +(bool x, bool y) => x | y;');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertErrors(
-        [expectedError(ParserErrorCode.TOP_LEVEL_OPERATOR, 5, 8)]);
+    parseCompilationUnit('bool operator +(bool x, bool y) => x | y;',
+        errors: [expectedError(ParserErrorCode.TOP_LEVEL_OPERATOR, 5, 8)]);
   }
 
   void test_topLevelOperator_withVoid() {
-    createParser('void operator +(bool x, bool y) => x | y;');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    if (usingFastaParser) {
-      listener.assertErrors(usingFastaParser
-          ? [expectedError(ParserErrorCode.TOP_LEVEL_OPERATOR, 5, 8)]
-          : [
-              expectedError(ParserErrorCode.EXTRANEOUS_MODIFIER, 0, 0),
-              expectedError(ParserErrorCode.MISSING_IDENTIFIER, 0, 0),
-              expectedError(ParserErrorCode.TOP_LEVEL_OPERATOR, 5, 8)
-            ]);
-    } else {
-      listener.assertErrorsWithCodes([ParserErrorCode.TOP_LEVEL_OPERATOR]);
-    }
+    parseCompilationUnit('void operator +(bool x, bool y) => x | y;',
+        errors: [expectedError(ParserErrorCode.TOP_LEVEL_OPERATOR, 5, 8)]);
   }
 
   void test_topLevelVariable_withMetadata() {
@@ -5083,12 +5090,18 @@
 
   void test_typedef_namedFunction() {
     // TODO(brianwilkerson) Improve recovery for this case.
-    parseCompilationUnit('typedef void Function();', codes: [
-      ParserErrorCode.UNEXPECTED_TOKEN,
-      ParserErrorCode.MISSING_IDENTIFIER,
-      ParserErrorCode.EXPECTED_EXECUTABLE,
-      ParserErrorCode.MISSING_TYPEDEF_PARAMETERS
-    ]);
+    parseCompilationUnit('typedef void Function();',
+        codes: usingFastaParser
+            ? [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_TYPEDEF_PARAMETERS
+              ]
+            : [
+                ParserErrorCode.UNEXPECTED_TOKEN,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_EXECUTABLE,
+                ParserErrorCode.MISSING_TYPEDEF_PARAMETERS
+              ]);
   }
 
   void test_typedefInClass_withoutReturnType() {
@@ -9307,6 +9320,12 @@
   bool enableNnbd = false;
 
   /**
+   * A flag indicating whether the parser should parse instance creation
+   * expressions that lack either the `new` or `const` keyword.
+   */
+  bool enableOptionalNewAndConst = false;
+
+  /**
    * A flag indicating whether the parser is to parse part-of directives that
    * specify a URI rather than a library name.
    */
@@ -9359,6 +9378,7 @@
     parser.parseGenericMethodComments = enableGenericMethodComments;
     parser.parseFunctionBodies = parseFunctionBodies;
     parser.enableNnbd = enableNnbd;
+    parser.enableOptionalNewAndConst = enableOptionalNewAndConst;
     parser.enableUriInPartOf = enableUriInPartOf;
     parser.currentToken = tokenStream;
   }
@@ -9469,6 +9489,7 @@
     listener.setLineInfo(testSource, scanner.lineStarts);
     Token token = scanner.tokenize();
     Parser parser = new Parser(testSource, listener);
+    parser.enableOptionalNewAndConst = enableOptionalNewAndConst;
     CompilationUnit unit = parser.parseCompilationUnit(token);
     expect(unit, isNotNull);
     if (codes != null) {
@@ -9490,6 +9511,7 @@
     Scanner scanner = new Scanner(null, new CharSequenceReader(code), listener);
     Token token = scanner.tokenize();
     Parser parser = new Parser(null, listener);
+    parser.enableOptionalNewAndConst = enableOptionalNewAndConst;
     CompilationUnit unit = parser.parseCompilationUnit(token);
     unit.lineInfo = new LineInfo(scanner.lineStarts);
     return unit;
@@ -9818,6 +9840,7 @@
     Token token = scanner.tokenize();
     Parser parser = new Parser(testSource, listener);
     parser.parseGenericMethodComments = enableGenericMethodComments;
+    parser.enableOptionalNewAndConst = enableOptionalNewAndConst;
     Statement statement = parser.parseStatement(token);
     expect(statement, isNotNull);
     return statement;
@@ -9843,6 +9866,7 @@
     listener.setLineInfo(testSource, scanner.lineStarts);
     Token token = scanner.tokenize();
     Parser parser = new Parser(testSource, listener);
+    parser.enableOptionalNewAndConst = enableOptionalNewAndConst;
     List<Statement> statements = parser.parseStatements(token);
     expect(statements, hasLength(expectedCount));
     listener.assertErrorsWithCodes(errorCodes);
@@ -11020,7 +11044,9 @@
     // TODO(brianwilkerson) We could do better with this.
     parseCompilationUnit("do() {}",
         codes: usingFastaParser
-            ? [ParserErrorCode.UNEXPECTED_TOKEN]
+            // fasta reports ExpectedIdentifier
+            // which gets mapped to MISSING_IDENTIFIER
+            ? [ParserErrorCode.MISSING_IDENTIFIER]
             : [
                 ParserErrorCode.EXPECTED_EXECUTABLE,
                 ParserErrorCode.UNEXPECTED_TOKEN
@@ -11198,30 +11224,26 @@
       VariableDeclaration variable = variables[0];
       expect(variableList.type.toString(), expectedTypeName);
       expect(variable.name.name, expectedName);
-      expect(declaration.semicolon.lexeme, expectedSemicolon);
+      if (expectedSemicolon.isEmpty) {
+        expect(declaration.semicolon.isSynthetic, isTrue);
+      } else {
+        expect(declaration.semicolon.lexeme, expectedSemicolon);
+      }
     }
 
     // Fasta considers the `n` an extraneous modifier
     // and parses this as a single top level declaration.
     // TODO(danrubel): A better recovery
     // would be to insert a synthetic comma after the `n`.
-    CompilationUnit unit = parseCompilationUnit('String n x = "";',
-        codes: usingFastaParser
-            ? [ParserErrorCode.UNEXPECTED_TOKEN]
-            : [
-                ParserErrorCode.EXPECTED_TOKEN,
-                ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE
-              ]);
+    CompilationUnit unit = parseCompilationUnit('String n x = "";', codes: [
+      ParserErrorCode.EXPECTED_TOKEN,
+      ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE
+    ]);
     expect(unit, isNotNull);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
-    if (usingFastaParser) {
-      expect(declarations, hasLength(1));
-      verify(declarations[0], 'n', 'x', ';');
-    } else {
-      expect(declarations, hasLength(2));
-      verify(declarations[0], 'String', 'n', '');
-      verify(declarations[1], 'null', 'x', ';');
-    }
+    expect(declarations, hasLength(2));
+    verify(declarations[0], 'String', 'n', '');
+    verify(declarations[1], 'null', 'x', ';');
   }
 
   void test_multiplicativeExpression_missing_LHS() {
@@ -11308,8 +11330,10 @@
             ? [
                 expectedError(ParserErrorCode.EXPECTED_STRING_LITERAL, 7, 4),
                 expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 4),
-                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 7, 4),
-                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 11, 1),
+                expectedError(
+                    ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 7, 4),
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 11, 1),
+                expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 11, 1),
                 expectedError(
                     ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 12, 2)
               ]
@@ -13386,17 +13410,47 @@
     expect(clause.implementsKeyword, isNotNull);
   }
 
+  void test_parseInstanceCreation_noKeyword_noPrefix() {
+    enableOptionalNewAndConst = true;
+    createParser('f() => C<E>.n();');
+    CompilationUnit unit = parser.parseCompilationUnit2();
+    expect(unit, isNotNull);
+    FunctionDeclaration f = unit.declarations[0];
+    ExpressionFunctionBody body = f.functionExpression.body;
+    expect(body.expression, new isInstanceOf<InstanceCreationExpression>());
+    InstanceCreationExpression creation = body.expression;
+    expect(creation.keyword, isNull);
+    ConstructorName constructorName = creation.constructorName;
+    expect(constructorName.type.toSource(), 'C<E>');
+    expect(constructorName.period, isNotNull);
+    expect(constructorName.name, isNotNull);
+    expect(creation.argumentList, isNotNull);
+  }
+
+  void test_parseInstanceCreation_noKeyword_prefix() {
+    enableOptionalNewAndConst = true;
+    createParser('f() => p.C<E>.n();');
+    CompilationUnit unit = parser.parseCompilationUnit2();
+    expect(unit, isNotNull);
+    FunctionDeclaration f = unit.declarations[0];
+    ExpressionFunctionBody body = f.functionExpression.body;
+    expect(body.expression, new isInstanceOf<InstanceCreationExpression>());
+    InstanceCreationExpression creation = body.expression;
+    expect(creation.keyword, isNull);
+    ConstructorName constructorName = creation.constructorName;
+    expect(constructorName.type.toSource(), 'p.C<E>');
+    expect(constructorName.period, isNotNull);
+    expect(constructorName.name, isNotNull);
+    expect(creation.argumentList, isNotNull);
+  }
+
   void test_parseLibraryIdentifier_invalid() {
     parseCompilationUnit('library <myLibId>;',
         errors: usingFastaParser
             ? [
                 expectedError(
-                    ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 0, 7),
-                expectedError(ParserErrorCode.EXPECTED_TOKEN, 8, 1),
-                expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 8, 1),
-                expectedError(
-                    ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 9, 7),
-                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 16, 1),
+                    ParserErrorCode.MISSING_FUNCTION_PARAMETERS, 0, 7),
+                expectedError(ParserErrorCode.MISSING_FUNCTION_BODY, 17, 1),
               ]
             : [expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 8, 1)]);
   }
@@ -14055,6 +14109,22 @@
     expect(forStatement.body, isNotNull);
   }
 
+  void test_parseForStatement_each_genericFunctionType() {
+    var forStatement =
+        parseStatement('for (void Function<T>(T) element in list) {}')
+            as ForEachStatement;
+    assertNoErrors();
+    expect(forStatement.awaitKeyword, isNull);
+    expect(forStatement.forKeyword, isNotNull);
+    expect(forStatement.leftParenthesis, isNotNull);
+    expect(forStatement.loopVariable, isNotNull);
+    expect(forStatement.identifier, isNull);
+    expect(forStatement.inKeyword, isNotNull);
+    expect(forStatement.iterable, isNotNull);
+    expect(forStatement.rightParenthesis, isNotNull);
+    expect(forStatement.body, isNotNull);
+  }
+
   void test_parseForStatement_each_identifier() {
     var forStatement =
         parseStatement('for (element in list) {}') as ForEachStatement;
@@ -14116,22 +14186,6 @@
     expect(forStatement.body, isNotNull);
   }
 
-  void test_parseForStatement_each_genericFunctionType() {
-    var forStatement =
-        parseStatement('for (void Function<T>(T) element in list) {}')
-            as ForEachStatement;
-    assertNoErrors();
-    expect(forStatement.awaitKeyword, isNull);
-    expect(forStatement.forKeyword, isNotNull);
-    expect(forStatement.leftParenthesis, isNotNull);
-    expect(forStatement.loopVariable, isNotNull);
-    expect(forStatement.identifier, isNull);
-    expect(forStatement.inKeyword, isNotNull);
-    expect(forStatement.iterable, isNotNull);
-    expect(forStatement.rightParenthesis, isNotNull);
-    expect(forStatement.body, isNotNull);
-  }
-
   void test_parseForStatement_loop_c() {
     var forStatement = parseStatement('for (; i < count;) {}') as ForStatement;
     assertNoErrors();
@@ -15455,7 +15509,6 @@
   }
 
   void test_parseCompilationUnit_builtIn_asFunctionName_withTypeParameter() {
-    // Fasta correctly parses these, while analyzer does not.
     if (usingFastaParser) {
       for (Keyword keyword in Keyword.values) {
         if (keyword.isBuiltIn) {
@@ -15466,6 +15519,15 @@
     }
   }
 
+  void test_parseCompilationUnit_builtIn_asGetter() {
+    for (Keyword keyword in Keyword.values) {
+      if (keyword.isBuiltIn) {
+        String lexeme = keyword.lexeme;
+        parseCompilationUnit('get $lexeme => 0;');
+      }
+    }
+  }
+
   void test_parseCompilationUnit_directives_multiple() {
     createParser("library l;\npart 'a.dart';");
     CompilationUnit unit = parser.parseCompilationUnit2();
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 d48655d..689dda8 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
@@ -366,9 +366,16 @@
 
   @override
   @failingTest
-  test_nonBoolExpression_functionType() async {
+  test_nonBoolExpression_functionType_bool() async {
     // Expected 1 errors of type StaticTypeWarningCode.NON_BOOL_EXPRESSION, found 0
-    await super.test_nonBoolExpression_functionType();
+    await super.test_nonBoolExpression_functionType_bool();
+  }
+
+  @override
+  @failingTest
+  test_nonBoolExpression_functionType_int() async {
+    // Expected 1 errors of type StaticTypeWarningCode.NON_BOOL_EXPRESSION, found 0
+    await super.test_nonBoolExpression_functionType_int();
   }
 
   @override
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
index 2e1a353..b7c8fd2 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
@@ -854,7 +854,18 @@
 }''', [StaticTypeWarningCode.NON_BOOL_CONDITION]);
   }
 
-  test_nonBoolExpression_functionType() async {
+  test_nonBoolExpression_functionType_bool() async {
+    Source source = addSource(r'''
+bool makeAssertion() => true;
+f() {
+  assert(makeAssertion);
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_EXPRESSION]);
+    verify([source]);
+  }
+
+  test_nonBoolExpression_functionType_int() async {
     await assertErrorsInCode(r'''
 int makeAssertion() => 1;
 f() {
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 8aeb8ba..e28d5ae 100644
--- a/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
@@ -835,70 +835,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_instanceMethodNameCollidesWithSuperclassStatic_field() async {
-    return super.test_instanceMethodNameCollidesWithSuperclassStatic_field();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_instanceMethodNameCollidesWithSuperclassStatic_field2() async {
-    return super.test_instanceMethodNameCollidesWithSuperclassStatic_field2();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_instanceMethodNameCollidesWithSuperclassStatic_getter() async {
-    return super.test_instanceMethodNameCollidesWithSuperclassStatic_getter();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_instanceMethodNameCollidesWithSuperclassStatic_getter2() async {
-    return super.test_instanceMethodNameCollidesWithSuperclassStatic_getter2();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_instanceMethodNameCollidesWithSuperclassStatic_interface() async {
-    return super
-        .test_instanceMethodNameCollidesWithSuperclassStatic_interface();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_instanceMethodNameCollidesWithSuperclassStatic_method() async {
-    return super.test_instanceMethodNameCollidesWithSuperclassStatic_method();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_instanceMethodNameCollidesWithSuperclassStatic_method2() async {
-    return super.test_instanceMethodNameCollidesWithSuperclassStatic_method2();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_instanceMethodNameCollidesWithSuperclassStatic_setter() async {
-    return super.test_instanceMethodNameCollidesWithSuperclassStatic_setter();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_instanceMethodNameCollidesWithSuperclassStatic_setter2() async {
-    return super.test_instanceMethodNameCollidesWithSuperclassStatic_setter2();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_invalidGetterOverrideReturnType() async {
     return super.test_invalidGetterOverrideReturnType();
   }
@@ -1660,27 +1596,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_typeAnnotationDeferredClass_asExpression() async {
-    return super.test_typeAnnotationDeferredClass_asExpression();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_typeAnnotationDeferredClass_catchClause() async {
-    return super.test_typeAnnotationDeferredClass_catchClause();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_typeAnnotationDeferredClass_fieldFormalParameter() async {
-    return super.test_typeAnnotationDeferredClass_fieldFormalParameter();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_typeAnnotationDeferredClass_functionDeclaration_returnType() async {
     return super
         .test_typeAnnotationDeferredClass_functionDeclaration_returnType();
@@ -1689,21 +1604,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_typeAnnotationDeferredClass_functionTypedFormalParameter_returnType() async {
-    return super
-        .test_typeAnnotationDeferredClass_functionTypedFormalParameter_returnType();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_typeAnnotationDeferredClass_isExpression() async {
-    return super.test_typeAnnotationDeferredClass_isExpression();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_typeAnnotationDeferredClass_methodDeclaration_returnType() async {
     return super
         .test_typeAnnotationDeferredClass_methodDeclaration_returnType();
@@ -1712,27 +1612,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_typeAnnotationDeferredClass_simpleFormalParameter() async {
-    return super.test_typeAnnotationDeferredClass_simpleFormalParameter();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_typeAnnotationDeferredClass_typeArgumentList() async {
-    return super.test_typeAnnotationDeferredClass_typeArgumentList();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_typeAnnotationDeferredClass_typeArgumentList2() async {
-    return super.test_typeAnnotationDeferredClass_typeArgumentList2();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_typeAnnotationDeferredClass_typeParameter_bound() async {
     return super.test_typeAnnotationDeferredClass_typeParameter_bound();
   }
@@ -1740,13 +1619,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_typeAnnotationDeferredClass_variableDeclarationList() async {
-    return super.test_typeAnnotationDeferredClass_variableDeclarationList();
-  }
-
-  @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 ec5d8eb..3319dcb 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -1559,153 +1559,6 @@
     verify([source]);
   }
 
-  test_instanceMethodNameCollidesWithSuperclassStatic_field() async {
-    Source source = addSource(r'''
-class A {
-  static var n;
-}
-class B extends A {
-  void n() {}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [
-      StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
-    ]);
-    verify([source]);
-  }
-
-  test_instanceMethodNameCollidesWithSuperclassStatic_field2() async {
-    Source source = addSource(r'''
-class A {
-  static var n;
-}
-class B extends A {
-}
-class C extends B {
-  void n() {}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [
-      StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
-    ]);
-    verify([source]);
-  }
-
-  test_instanceMethodNameCollidesWithSuperclassStatic_getter() async {
-    Source source = addSource(r'''
-class A {
-  static get n {return 0;}
-}
-class B extends A {
-  void n() {}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [
-      StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
-    ]);
-    verify([source]);
-  }
-
-  test_instanceMethodNameCollidesWithSuperclassStatic_getter2() async {
-    Source source = addSource(r'''
-class A {
-  static get n {return 0;}
-}
-class B extends A {
-}
-class C extends B {
-  void n() {}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [
-      StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
-    ]);
-    verify([source]);
-  }
-
-  test_instanceMethodNameCollidesWithSuperclassStatic_interface() async {
-    Source source = addSource(r'''
-class Base {
-  static foo() {}
-}
-abstract class Ifc {
-  foo();
-}
-class C extends Base implements Ifc {
-  foo() {}
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [
-      StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
-    ]);
-    verify([source]);
-  }
-
-  test_instanceMethodNameCollidesWithSuperclassStatic_method() async {
-    Source source = addSource(r'''
-class A {
-  static n () {}
-}
-class B extends A {
-  void n() {}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [
-      StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
-    ]);
-    verify([source]);
-  }
-
-  test_instanceMethodNameCollidesWithSuperclassStatic_method2() async {
-    Source source = addSource(r'''
-class A {
-  static n () {}
-}
-class B extends A {
-}
-class C extends B {
-  void n() {}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [
-      StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
-    ]);
-    verify([source]);
-  }
-
-  test_instanceMethodNameCollidesWithSuperclassStatic_setter() async {
-    Source source = addSource(r'''
-class A {
-  static set n(int x) {}
-}
-class B extends A {
-  void n() {}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [
-      StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
-    ]);
-    verify([source]);
-  }
-
-  test_instanceMethodNameCollidesWithSuperclassStatic_setter2() async {
-    Source source = addSource(r'''
-class A {
-  static set n(int x) {}
-}
-class B extends A {
-}
-class C extends B {
-  void n() {}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [
-      StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
-    ]);
-    verify([source]);
-  }
-
   test_invalidGetterOverrideReturnType() async {
     Source source = addSource(r'''
 class A {
diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart
index e7de210..b43805a 100644
--- a/pkg/analyzer/test/generated/utilities_test.dart
+++ b/pkg/analyzer/test/generated/utilities_test.dart
@@ -390,7 +390,7 @@
   }
 
   void test_visitDefaultFormalParameter_named_value() {
-    _assertCloneUnitMember('main({p : 0}) {}');
+    _assertCloneUnitMember('main({p: 0}) {}');
   }
 
   void test_visitDefaultFormalParameter_positional_noValue() {
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 deeac1d..4e92154 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
@@ -129,6 +129,11 @@
     // Skipped by design.
   }
 
+  @override
+  test_externalSummaries_partReuse() {
+    // Skipped by design.
+  }
+
   @failingTest
   @potentialAnalyzerProblem
   @override
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 15773b5..3af39cd 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -6806,6 +6806,53 @@
     expect(result.errors, isEmpty);
   }
 
+  test_externalSummaries_partReuse() async {
+    var a = _p('/a.dart');
+    var b = _p('/b.dart');
+    var c = _p('/c.dart');
+    provider.newFile(a, r'''
+library a;
+part 'b.dart';
+class A {}
+''');
+    provider.newFile(b, r'''
+part of a;
+class _B {}
+''');
+    provider.newFile(c, r'''
+library a;
+import 'a.dart';
+part 'b.dart';
+var a = new A();
+var b = new _B();
+''');
+
+    // Prepare the store with a.dart and everything it needs.
+    SummaryDataStore summaryStore =
+        await createAnalysisDriver().test.getSummaryStore(a);
+
+    String aUri = provider.pathContext.toUri(a).toString();
+    String bUri = provider.pathContext.toUri(b).toString();
+    // There are unlinked units for a.dart and b.dart files.
+    expect(summaryStore.hasUnlinkedUnit(aUri), isTrue);
+    expect(summaryStore.hasUnlinkedUnit(bUri), isTrue);
+    // Only a.dart is linked, because b.dart is not a library.
+    expect(summaryStore.hasLinkedLibrary(aUri), isTrue);
+    expect(summaryStore.hasLinkedLibrary(bUri), isFalse);
+
+    // Remove a.dart from the file system.
+    // Keep b.dart, because we (re)use it as a part.
+    provider.deleteFile(a);
+
+    // We don't need a.dart file when we analyze with the summary store.
+    // We can instantiate the class A the library a.dart.
+    // We can instantiate the class _A the part b.dart.
+    AnalysisDriver driver =
+        createAnalysisDriver(externalSummaries: summaryStore);
+    AnalysisResult result = await driver.getResult(c);
+    expect(result.errors, isEmpty);
+  }
+
   test_generatedFile() async {
     Uri uri = Uri.parse('package:aaa/foo.dart');
     String templatePath = _p('/aaa/lib/foo.dart');
diff --git a/pkg/analyzer/test/src/dart/analysis/index_test.dart b/pkg/analyzer/test/src/dart/analysis/index_test.dart
index a8b1309..33f75d7 100644
--- a/pkg/analyzer/test/src/dart/analysis/index_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/index_test.dart
@@ -414,6 +414,18 @@
     assertThat(element).isReferencedAt('A();', true);
   }
 
+  test_isReferencedBy_ClassElement_invocationTypeArgument() async {
+    await _indexTestUnit('''
+class A {}
+void f<T>() {}
+main() {
+  f<A>();
+}
+''');
+    Element element = findElement('A');
+    assertThat(element)..isReferencedAt('A>();', false);
+  }
+
   test_isReferencedBy_ClassTypeAlias() async {
     await _indexTestUnit('''
 class A {}
diff --git a/pkg/analyzer/test/src/dart/ast/ast_test.dart b/pkg/analyzer/test/src/dart/ast/ast_test.dart
index d2b842a..92d0663 100644
--- a/pkg/analyzer/test/src/dart/ast/ast_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/ast_test.dart
@@ -3,185 +3,577 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../generated/parser_test.dart';
+
 main() {
   defineReflectiveSuite(() {
+    defineReflectiveTests(ExpressionImplTest);
     defineReflectiveTests(IntegerLiteralImplTest);
   });
 }
 
 @reflectiveTest
+class ExpressionImplTest extends ParserTestCase {
+  String testSource;
+  CompilationUnitImpl testUnit;
+
+  void assertInContext(String snippet, bool isInContext) {
+    int index = testSource.indexOf(snippet);
+    expect(index >= 0, isTrue);
+    NodeLocator visitor = new NodeLocator(index);
+    AstNodeImpl node = visitor.searchWithin(testUnit);
+    expect(node, new isInstanceOf<ExpressionImpl>());
+    expect((node as ExpressionImpl).inConstantContext,
+        isInContext ? isTrue : isFalse);
+  }
+
+  void parse(String source) {
+    testSource = source;
+    testUnit = parseCompilationUnit(source);
+  }
+
+  test_inConstantContext_instanceCreation_annotation_true() {
+    parse('''
+@C(C(0))
+class C {
+  const C(_);
+}
+''');
+    assertInContext("C(0", true);
+  }
+
+  test_inConstantContext_instanceCreation_initializer_false() {
+    parse('''
+var c = C();
+class C {
+  const C();
+}
+''');
+    assertInContext("C()", false);
+  }
+
+  test_inConstantContext_instanceCreation_initializer_true() {
+    parse('''
+const c = C();
+class C {
+  const C();
+}
+''');
+    assertInContext("C()", true);
+  }
+
+  test_inConstantContext_instanceCreation_instanceCreation_false() {
+    parse('''
+f() {
+  return new C(C());
+}
+class C {
+  const C(_);
+}
+''');
+    assertInContext("C())", false);
+  }
+
+  test_inConstantContext_instanceCreation_instanceCreation_true() {
+    parse('''
+f() {
+  return new C(C());
+}
+class C {
+  const C(_);
+}
+''');
+    assertInContext("C())", false);
+  }
+
+  test_inConstantContext_instanceCreation_listLiteral_false() {
+    parse('''
+f() {
+  return [C()];
+}
+class C {
+  const C();
+}
+''');
+    assertInContext("C()]", false);
+  }
+
+  test_inConstantContext_instanceCreation_listLiteral_true() {
+    parse('''
+f() {
+  return const [C()];
+}
+class C {
+  const C();
+}
+''');
+    assertInContext("C()]", true);
+  }
+
+  test_inConstantContext_instanceCreation_mapLiteral_false() {
+    parse('''
+f() {
+  return {'a' : C()};
+}
+class C {
+  const C();
+}
+''');
+    assertInContext("C()}", false);
+  }
+
+  test_inConstantContext_instanceCreation_mapLiteral_true() {
+    parse('''
+f() {
+  return const {'a' : C()};
+}
+class C {
+  const C();
+}
+''');
+    assertInContext("C()}", true);
+  }
+
+  test_inConstantContext_instanceCreation_nestedListLiteral_false() {
+    parse('''
+f() {
+  return [[''], [C()]];
+}
+class C {
+  const C();
+}
+''');
+    assertInContext("C()]", false);
+  }
+
+  test_inConstantContext_instanceCreation_nestedListLiteral_true() {
+    parse('''
+f() {
+  return const [[''], [C()]];
+}
+class C {
+  const C();
+}
+''');
+    assertInContext("C()]", true);
+  }
+
+  test_inConstantContext_instanceCreation_nestedMapLiteral_false() {
+    parse('''
+f() {
+  return {'a' : {C() : C()}};
+}
+class C {
+  const C();
+}
+''');
+    assertInContext("C() :", false);
+    assertInContext("C()}", false);
+  }
+
+  test_inConstantContext_instanceCreation_nestedMapLiteral_true() {
+    parse('''
+f() {
+  return const {'a' : {C() : C()}};
+}
+class C {
+  const C();
+}
+''');
+    assertInContext("C() :", true);
+    assertInContext("C()}", true);
+  }
+
+  test_inConstantContext_instanceCreation_switch_true() {
+    parse('''
+f(v) {
+  switch (v) {
+  case C():
+    break;
+  }
+}
+class C {
+  const C();
+}
+''');
+    assertInContext("C()", true);
+  }
+
+  test_inConstantContext_listLiteral_annotation_true() {
+    parse('''
+@C([])
+class C {
+  const C(_);
+}
+''');
+    assertInContext("[]", true);
+  }
+
+  test_inConstantContext_listLiteral_initializer_false() {
+    parse('''
+var c = [];
+''');
+    assertInContext("[]", false);
+  }
+
+  test_inConstantContext_listLiteral_initializer_true() {
+    parse('''
+const c = [];
+''');
+    assertInContext("[]", true);
+  }
+
+  test_inConstantContext_listLiteral_instanceCreation_false() {
+    parse('''
+f() {
+  return new C([]);
+}
+class C {
+  const C(_);
+}
+''');
+    assertInContext("[]", false);
+  }
+
+  test_inConstantContext_listLiteral_instanceCreation_true() {
+    parse('''
+f() {
+  return const C([]);
+}
+class C {
+  const C(_);
+}
+''');
+    assertInContext("[]", true);
+  }
+
+  test_inConstantContext_listLiteral_listLiteral_false() {
+    parse('''
+f() {
+  return [[''], []];
+}
+''');
+    assertInContext("['']", false);
+    assertInContext("[]", false);
+  }
+
+  test_inConstantContext_listLiteral_listLiteral_true() {
+    parse('''
+f() {
+  return const [[''], []];
+}
+''');
+    assertInContext("['']", true);
+    assertInContext("[]", true);
+  }
+
+  test_inConstantContext_listLiteral_mapLiteral_false() {
+    parse('''
+f() {
+  return {'a' : [''], 'b' : []};
+}
+''');
+    assertInContext("['']", false);
+    assertInContext("[]", false);
+  }
+
+  test_inConstantContext_listLiteral_mapLiteral_true() {
+    parse('''
+f() {
+  return const {'a' : [''], 'b' : []};
+}
+''');
+    assertInContext("['']", true);
+    assertInContext("[]", true);
+  }
+
+  test_inConstantContext_listLiteral_switch_true() {
+    parse('''
+f(v) {
+  switch (v) {
+  case []:
+    break;
+  }
+}
+''');
+    assertInContext("[]", true);
+  }
+
+  test_inConstantContext_mapLiteral_annotation_true() {
+    parse('''
+@C({})
+class C {
+  const C(_);
+}
+''');
+    assertInContext("{}", true);
+  }
+
+  test_inConstantContext_mapLiteral_initializer_false() {
+    parse('''
+var c = {};
+''');
+    assertInContext("{}", false);
+  }
+
+  test_inConstantContext_mapLiteral_initializer_true() {
+    parse('''
+const c = {};
+''');
+    assertInContext("{}", true);
+  }
+
+  test_inConstantContext_mapLiteral_instanceCreation_false() {
+    parse('''
+f() {
+  return new C({});
+}
+class C {
+  const C(_);
+}
+''');
+    assertInContext("{}", false);
+  }
+
+  test_inConstantContext_mapLiteral_instanceCreation_true() {
+    parse('''
+f() {
+  return const C({});
+}
+class C {
+  const C(_);
+}
+''');
+    assertInContext("{}", true);
+  }
+
+  test_inConstantContext_mapLiteral_listLiteral_false() {
+    parse('''
+f() {
+  return [{'a' : 1}, {'b' : 2}];
+}
+''');
+    assertInContext("{'a", false);
+    assertInContext("{'b", false);
+  }
+
+  test_inConstantContext_mapLiteral_listLiteral_true() {
+    parse('''
+f() {
+  return const [{'a' : 1}, {'b' : 2}];
+}
+''');
+    assertInContext("{'a", true);
+    assertInContext("{'b", true);
+  }
+
+  test_inConstantContext_mapLiteral_mapLiteral_false() {
+    parse('''
+f() {
+  return {'a' : {'b' : 0}, 'c' : {'d' : 1}};
+}
+''');
+    assertInContext("{'b", false);
+    assertInContext("{'d", false);
+  }
+
+  test_inConstantContext_mapLiteral_mapLiteral_true() {
+    parse('''
+f() {
+  return const {'a' : {'b' : 0}, 'c' : {'d' : 1}};
+}
+''');
+    assertInContext("{'b", true);
+    assertInContext("{'d", true);
+  }
+
+  test_inConstantContext_mapLiteral_switch_true() {
+    parse('''
+f(v) {
+  switch (v) {
+  case {}:
+    break;
+  }
+}
+''');
+    assertInContext("{}", true);
+  }
+}
+
+@reflectiveTest
 class IntegerLiteralImplTest {
-  test_isValidLiteral_dec_negative_equalMax() async {
+  test_isValidLiteral_dec_negative_equalMax() {
     expect(
         IntegerLiteralImpl.isValidLiteral('9223372036854775808', true), true);
   }
 
-  test_isValidLiteral_dec_negative_fewDigits() async {
+  test_isValidLiteral_dec_negative_fewDigits() {
     expect(IntegerLiteralImpl.isValidLiteral('24', true), true);
   }
 
-  test_isValidLiteral_dec_negative_leadingZeros_overMax() async {
+  test_isValidLiteral_dec_negative_leadingZeros_overMax() {
     expect(IntegerLiteralImpl.isValidLiteral('009923372036854775807', true),
         false);
   }
 
-  test_isValidLiteral_dec_negative_leadingZeros_underMax() async {
+  test_isValidLiteral_dec_negative_leadingZeros_underMax() {
     expect(
         IntegerLiteralImpl.isValidLiteral('004223372036854775807', true), true);
   }
 
-  test_isValidLiteral_dec_negative_oneOverMax() async {
+  test_isValidLiteral_dec_negative_oneOverMax() {
     expect(
         IntegerLiteralImpl.isValidLiteral('9223372036854775809', true), false);
   }
 
-  test_isValidLiteral_dec_negative_tooManyDigits() async {
+  test_isValidLiteral_dec_negative_tooManyDigits() {
     expect(
         IntegerLiteralImpl.isValidLiteral('10223372036854775808', true), false);
   }
 
-  test_isValidLiteral_dec_positive_equalMax() async {
+  test_isValidLiteral_dec_positive_equalMax() {
     expect(
         IntegerLiteralImpl.isValidLiteral('9223372036854775807', false), true);
   }
 
-  test_isValidLiteral_dec_positive_fewDigits() async {
+  test_isValidLiteral_dec_positive_fewDigits() {
     expect(IntegerLiteralImpl.isValidLiteral('42', false), true);
   }
 
-  test_isValidLiteral_dec_positive_leadingZeros_overMax() async {
+  test_isValidLiteral_dec_positive_leadingZeros_overMax() {
     expect(IntegerLiteralImpl.isValidLiteral('009923372036854775807', false),
         false);
   }
 
-  test_isValidLiteral_dec_positive_leadingZeros_underMax() async {
+  test_isValidLiteral_dec_positive_leadingZeros_underMax() {
     expect(IntegerLiteralImpl.isValidLiteral('004223372036854775807', false),
         true);
   }
 
-  test_isValidLiteral_dec_positive_oneOverMax() async {
+  test_isValidLiteral_dec_positive_oneOverMax() {
     expect(
         IntegerLiteralImpl.isValidLiteral('9223372036854775808', false), false);
   }
 
-  test_isValidLiteral_dec_positive_tooManyDigits() async {
+  test_isValidLiteral_dec_positive_tooManyDigits() {
     expect(IntegerLiteralImpl.isValidLiteral('10223372036854775808', false),
         false);
   }
 
-  test_isValidLiteral_hex_negative_equalMax() async {
+  test_isValidLiteral_hex_negative_equalMax() {
     expect(IntegerLiteralImpl.isValidLiteral('0x7FFFFFFFFFFFFFFF', true), true);
   }
 
-  test_isValidLiteral_heX_negative_equalMax() async {
+  test_isValidLiteral_heX_negative_equalMax() {
     expect(IntegerLiteralImpl.isValidLiteral('0X7FFFFFFFFFFFFFFF', true), true);
   }
 
-  test_isValidLiteral_hex_negative_fewDigits() async {
+  test_isValidLiteral_hex_negative_fewDigits() {
     expect(IntegerLiteralImpl.isValidLiteral('0xFF', true), true);
   }
 
-  test_isValidLiteral_heX_negative_fewDigits() async {
+  test_isValidLiteral_heX_negative_fewDigits() {
     expect(IntegerLiteralImpl.isValidLiteral('0XFF', true), true);
   }
 
-  test_isValidLiteral_hex_negative_leadingZeros_overMax() async {
+  test_isValidLiteral_hex_negative_leadingZeros_overMax() {
     expect(IntegerLiteralImpl.isValidLiteral('0x00FFFFFFFFFFFFFFFFF', true),
         false);
   }
 
-  test_isValidLiteral_heX_negative_leadingZeros_overMax() async {
+  test_isValidLiteral_heX_negative_leadingZeros_overMax() {
     expect(IntegerLiteralImpl.isValidLiteral('0X00FFFFFFFFFFFFFFFFF', true),
         false);
   }
 
-  test_isValidLiteral_hex_negative_leadingZeros_underMax() async {
+  test_isValidLiteral_hex_negative_leadingZeros_underMax() {
     expect(
         IntegerLiteralImpl.isValidLiteral('0x007FFFFFFFFFFFFFFF', true), true);
   }
 
-  test_isValidLiteral_heX_negative_leadingZeros_underMax() async {
+  test_isValidLiteral_heX_negative_leadingZeros_underMax() {
     expect(
         IntegerLiteralImpl.isValidLiteral('0X007FFFFFFFFFFFFFFF', true), true);
   }
 
-  test_isValidLiteral_hex_negative_oneOverMax() async {
+  test_isValidLiteral_hex_negative_oneOverMax() {
     expect(
         IntegerLiteralImpl.isValidLiteral('0x8000000000000000', true), false);
   }
 
-  test_isValidLiteral_heX_negative_oneOverMax() async {
+  test_isValidLiteral_heX_negative_oneOverMax() {
     expect(
         IntegerLiteralImpl.isValidLiteral('0X8000000000000000', true), false);
   }
 
-  test_isValidLiteral_hex_negative_tooManyDigits() async {
+  test_isValidLiteral_hex_negative_tooManyDigits() {
     expect(
         IntegerLiteralImpl.isValidLiteral('0x10000000000000000', true), false);
   }
 
-  test_isValidLiteral_heX_negative_tooManyDigits() async {
+  test_isValidLiteral_heX_negative_tooManyDigits() {
     expect(
         IntegerLiteralImpl.isValidLiteral('0X10000000000000000', true), false);
   }
 
-  test_isValidLiteral_hex_positive_equalMax() async {
+  test_isValidLiteral_hex_positive_equalMax() {
     expect(
         IntegerLiteralImpl.isValidLiteral('0x7FFFFFFFFFFFFFFF', false), true);
   }
 
-  test_isValidLiteral_heX_positive_equalMax() async {
+  test_isValidLiteral_heX_positive_equalMax() {
     expect(
         IntegerLiteralImpl.isValidLiteral('0X7FFFFFFFFFFFFFFF', false), true);
   }
 
-  test_isValidLiteral_hex_positive_fewDigits() async {
+  test_isValidLiteral_hex_positive_fewDigits() {
     expect(IntegerLiteralImpl.isValidLiteral('0xFF', false), true);
   }
 
-  test_isValidLiteral_heX_positive_fewDigits() async {
+  test_isValidLiteral_heX_positive_fewDigits() {
     expect(IntegerLiteralImpl.isValidLiteral('0XFF', false), true);
   }
 
-  test_isValidLiteral_hex_positive_leadingZeros_overMax() async {
+  test_isValidLiteral_hex_positive_leadingZeros_overMax() {
     expect(IntegerLiteralImpl.isValidLiteral('0x00FFFFFFFFFFFFFFFFF', false),
         false);
   }
 
-  test_isValidLiteral_heX_positive_leadingZeros_overMax() async {
+  test_isValidLiteral_heX_positive_leadingZeros_overMax() {
     expect(IntegerLiteralImpl.isValidLiteral('0X00FFFFFFFFFFFFFFFFF', false),
         false);
   }
 
-  test_isValidLiteral_hex_positive_leadingZeros_underMax() async {
+  test_isValidLiteral_hex_positive_leadingZeros_underMax() {
     expect(
         IntegerLiteralImpl.isValidLiteral('0x007FFFFFFFFFFFFFFF', false), true);
   }
 
-  test_isValidLiteral_heX_positive_leadingZeros_underMax() async {
+  test_isValidLiteral_heX_positive_leadingZeros_underMax() {
     expect(
         IntegerLiteralImpl.isValidLiteral('0X007FFFFFFFFFFFFFFF', false), true);
   }
 
-  test_isValidLiteral_hex_positive_oneOverMax() async {
+  test_isValidLiteral_hex_positive_oneOverMax() {
     expect(
         IntegerLiteralImpl.isValidLiteral('0x10000000000000000', false), false);
   }
 
-  test_isValidLiteral_heX_positive_oneOverMax() async {
+  test_isValidLiteral_heX_positive_oneOverMax() {
     expect(
         IntegerLiteralImpl.isValidLiteral('0X10000000000000000', false), false);
   }
 
-  test_isValidLiteral_hex_positive_tooManyDigits() async {
+  test_isValidLiteral_hex_positive_tooManyDigits() {
     expect(IntegerLiteralImpl.isValidLiteral('0xFF0000000000000000', false),
         false);
   }
 
-  test_isValidLiteral_heX_positive_tooManyDigits() async {
+  test_isValidLiteral_heX_positive_tooManyDigits() {
     expect(IntegerLiteralImpl.isValidLiteral('0XFF0000000000000000', false),
         false);
   }
diff --git a/pkg/analyzer/test/src/dart/ast/utilities_test.dart b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
index 83a8b97..72483ab 100644
--- a/pkg/analyzer/test/src/dart/ast/utilities_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
@@ -1828,7 +1828,7 @@
 
   void test_visitDefaultFormalParameter_named_value() {
     _assertSource(
-        "p : 0",
+        "p: 0",
         AstTestFactory.namedFormalParameter(
             AstTestFactory.simpleFormalParameter3("p"),
             AstTestFactory.integer(0)));
@@ -2050,7 +2050,7 @@
 
   void test_visitFormalParameterList_n() {
     _assertSource(
-        "({a : 0})",
+        "({a: 0})",
         AstTestFactory.formalParameterList([
           AstTestFactory.namedFormalParameter(
               AstTestFactory.simpleFormalParameter3("a"),
@@ -2060,7 +2060,7 @@
 
   void test_visitFormalParameterList_nn() {
     _assertSource(
-        "({a : 0, b : 1})",
+        "({a: 0, b: 1})",
         AstTestFactory.formalParameterList([
           AstTestFactory.namedFormalParameter(
               AstTestFactory.simpleFormalParameter3("a"),
@@ -2103,7 +2103,7 @@
 
   void test_visitFormalParameterList_rn() {
     _assertSource(
-        "(a, {b : 1})",
+        "(a, {b: 1})",
         AstTestFactory.formalParameterList([
           AstTestFactory.simpleFormalParameter3("a"),
           AstTestFactory.namedFormalParameter(
@@ -2114,7 +2114,7 @@
 
   void test_visitFormalParameterList_rnn() {
     _assertSource(
-        "(a, {b : 1, c : 2})",
+        "(a, {b: 1, c: 2})",
         AstTestFactory.formalParameterList([
           AstTestFactory.simpleFormalParameter3("a"),
           AstTestFactory.namedFormalParameter(
@@ -2162,7 +2162,7 @@
 
   void test_visitFormalParameterList_rrn() {
     _assertSource(
-        "(a, b, {c : 3})",
+        "(a, b, {c: 3})",
         AstTestFactory.formalParameterList([
           AstTestFactory.simpleFormalParameter3("a"),
           AstTestFactory.simpleFormalParameter3("b"),
@@ -2174,7 +2174,7 @@
 
   void test_visitFormalParameterList_rrnn() {
     _assertSource(
-        "(a, b, {c : 3, d : 4})",
+        "(a, b, {c: 3, d: 4})",
         AstTestFactory.formalParameterList([
           AstTestFactory.simpleFormalParameter3("a"),
           AstTestFactory.simpleFormalParameter3("b"),
@@ -3023,7 +3023,7 @@
 
   void test_visitNamedFormalParameter() {
     _assertSource(
-        "var a : 0",
+        "var a: 0",
         AstTestFactory.namedFormalParameter(
             AstTestFactory.simpleFormalParameter(Keyword.VAR, "a"),
             AstTestFactory.integer(0)));
@@ -4204,7 +4204,7 @@
 
   void test_visitDefaultFormalParameter_named_value() {
     _assertSource(
-        "p : 0",
+        "p: 0",
         AstTestFactory.namedFormalParameter(
             AstTestFactory.simpleFormalParameter3("p"),
             AstTestFactory.integer(0)));
@@ -4426,7 +4426,7 @@
 
   void test_visitFormalParameterList_n() {
     _assertSource(
-        "({a : 0})",
+        "({a: 0})",
         AstTestFactory.formalParameterList([
           AstTestFactory.namedFormalParameter(
               AstTestFactory.simpleFormalParameter3("a"),
@@ -4436,7 +4436,7 @@
 
   void test_visitFormalParameterList_nn() {
     _assertSource(
-        "({a : 0, b : 1})",
+        "({a: 0, b: 1})",
         AstTestFactory.formalParameterList([
           AstTestFactory.namedFormalParameter(
               AstTestFactory.simpleFormalParameter3("a"),
@@ -4479,7 +4479,7 @@
 
   void test_visitFormalParameterList_rn() {
     _assertSource(
-        "(a, {b : 1})",
+        "(a, {b: 1})",
         AstTestFactory.formalParameterList([
           AstTestFactory.simpleFormalParameter3("a"),
           AstTestFactory.namedFormalParameter(
@@ -4490,7 +4490,7 @@
 
   void test_visitFormalParameterList_rnn() {
     _assertSource(
-        "(a, {b : 1, c : 2})",
+        "(a, {b: 1, c: 2})",
         AstTestFactory.formalParameterList([
           AstTestFactory.simpleFormalParameter3("a"),
           AstTestFactory.namedFormalParameter(
@@ -4538,7 +4538,7 @@
 
   void test_visitFormalParameterList_rrn() {
     _assertSource(
-        "(a, b, {c : 3})",
+        "(a, b, {c: 3})",
         AstTestFactory.formalParameterList([
           AstTestFactory.simpleFormalParameter3("a"),
           AstTestFactory.simpleFormalParameter3("b"),
@@ -4550,7 +4550,7 @@
 
   void test_visitFormalParameterList_rrnn() {
     _assertSource(
-        "(a, b, {c : 3, d : 4})",
+        "(a, b, {c: 3, d: 4})",
         AstTestFactory.formalParameterList([
           AstTestFactory.simpleFormalParameter3("a"),
           AstTestFactory.simpleFormalParameter3("b"),
@@ -5399,7 +5399,7 @@
 
   void test_visitNamedFormalParameter() {
     _assertSource(
-        "var a : 0",
+        "var a: 0",
         AstTestFactory.namedFormalParameter(
             AstTestFactory.simpleFormalParameter(Keyword.VAR, "a"),
             AstTestFactory.integer(0)));
diff --git a/pkg/analyzer/test/src/dart/constant/value_test.dart b/pkg/analyzer/test/src/dart/constant/value_test.dart
index 891bdd3..be13b52 100644
--- a/pkg/analyzer/test/src/dart/constant/value_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/value_test.dart
@@ -964,16 +964,12 @@
   }
 
   void test_logicalAnd_false_null() {
-    expect(() {
-      _assertLogicalAnd(_boolValue(false), _boolValue(false), _nullValue());
-    }, throwsEvaluationException);
+    _assertLogicalAnd(_boolValue(false), _boolValue(false), _nullValue());
   }
 
   void test_logicalAnd_false_string() {
-    expect(() {
-      _assertLogicalAnd(
-          _boolValue(false), _boolValue(false), _stringValue("false"));
-    }, throwsEvaluationException);
+    _assertLogicalAnd(
+        _boolValue(false), _boolValue(false), _stringValue("false"));
   }
 
   void test_logicalAnd_false_true() {
@@ -1097,16 +1093,11 @@
   }
 
   void test_logicalOr_true_null() {
-    expect(() {
-      _assertLogicalOr(_boolValue(true), _boolValue(true), _nullValue());
-    }, throwsEvaluationException);
+    _assertLogicalOr(_boolValue(true), _boolValue(true), _nullValue());
   }
 
   void test_logicalOr_true_string() {
-    expect(() {
-      _assertLogicalOr(
-          _boolValue(true), _boolValue(true), _stringValue("true"));
-    }, throwsEvaluationException);
+    _assertLogicalOr(_boolValue(true), _boolValue(true), _stringValue("true"));
   }
 
   void test_logicalOr_true_true() {
@@ -1716,10 +1707,10 @@
       DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
-        left.logicalAnd(_typeProvider, right);
+        left.logicalAnd(_typeProvider, () => right);
       }, throwsEvaluationException);
     } else {
-      DartObjectImpl result = left.logicalAnd(_typeProvider, right);
+      DartObjectImpl result = left.logicalAnd(_typeProvider, () => right);
       expect(result, isNotNull);
       expect(result, expected);
     }
@@ -1750,10 +1741,10 @@
       DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
-        left.logicalOr(_typeProvider, right);
+        left.logicalOr(_typeProvider, () => right);
       }, throwsEvaluationException);
     } else {
-      DartObjectImpl result = left.logicalOr(_typeProvider, right);
+      DartObjectImpl result = left.logicalOr(_typeProvider, () => right);
       expect(result, isNotNull);
       expect(result, expected);
     }
diff --git a/pkg/analyzer/test/src/fasta/recovery/code_order_test.dart b/pkg/analyzer/test/src/fasta/recovery/code_order_test.dart
index b53098b..9701fbc 100644
--- a/pkg/analyzer/test/src/fasta/recovery/code_order_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/code_order_test.dart
@@ -86,12 +86,11 @@
 ''');
   }
 
-  @failingTest
   void test_typing_extends_identifier() {
     testRecovery('''
 class Foo extends CurrentlyTypingHere
 class UnrelatedClass extends Bar {}
-''', [ParserErrorCode.MULTIPLE_WITH_CLAUSES], '''
+''', [ParserErrorCode.MISSING_CLASS_BODY], '''
 class Foo extends CurrentlyTypingHere {}
 class UnrelatedClass extends Bar {}
 ''');
diff --git a/pkg/analyzer/test/src/fasta/recovery/extra_code_test.dart b/pkg/analyzer/test/src/fasta/recovery/extra_code_test.dart
index 6e470b7..5dd8b4c 100644
--- a/pkg/analyzer/test/src/fasta/recovery/extra_code_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/extra_code_test.dart
@@ -9,6 +9,7 @@
 
 main() {
   defineReflectiveSuite(() {
+    defineReflectiveTests(AnnotationTest);
     defineReflectiveTests(MiscellaneousTest);
     defineReflectiveTests(ModifiersTest);
     defineReflectiveTests(MultipleTypeTest);
@@ -17,6 +18,34 @@
 }
 
 /**
+ * Test how well the parser recovers when annotations are included in places
+ * where they are not allowed.
+ */
+@reflectiveTest
+class AnnotationTest extends AbstractRecoveryTest {
+  @failingTest
+  void test_typeArgument() {
+    // https://github.com/dart-lang/sdk/issues/22314
+    // Parser crashes
+    // 'package:analyzer/src/fasta/ast_builder.dart': Failed assertion:
+    //     line 256 pos 12: 'token.isKeywordOrIdentifier': is not true.
+    testRecovery('''
+const annotation = null;
+class A<E> {}
+class C {
+  m() => new A<@annotation C>();
+}
+''', [ParserErrorCode.UNEXPECTED_TOKEN, ParserErrorCode.UNEXPECTED_TOKEN], '''
+const annotation = null;
+class A<E> {}
+class C {
+  m() => new A<C>();
+}
+''');
+  }
+}
+
+/**
  * Test how well the parser recovers in other cases.
  */
 @reflectiveTest
@@ -31,6 +60,26 @@
 ''');
   }
 
+  @failingTest
+  void test_extraParenInMapLiteral() {
+    // https://github.com/dart-lang/sdk/issues/12100
+    testRecovery('''
+class C {}
+final Map v = {
+  'a': () => new C(),
+  'b': () => new C()),
+  'c': () => new C(),
+};
+''', [ParserErrorCode.UNEXPECTED_TOKEN], '''
+class C {}
+final Map v = {
+  'a': () => new C(),
+  'b': () => new C(),
+  'c': () => new C(),
+};
+''');
+  }
+
   void test_getter_parameters() {
     testRecovery('''
 int get g() => 0;
@@ -39,6 +88,14 @@
 ''');
   }
 
+  void test_invalidRangeCheck() {
+    parseCompilationUnit('''
+f(x) {
+  while (1 < x < 3) {}
+}
+''', codes: [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
+  }
+
   void test_multipleRedirectingInitializers() {
     testRecovery('''
 class A {
@@ -73,6 +130,10 @@
   }
 }
 
+/**
+ * Test how well the parser recovers when multiple type annotations are
+ * provided.
+ */
 @reflectiveTest
 class MultipleTypeTest extends AbstractRecoveryTest {
   @failingTest
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 29e2e53..7cdabed 100644
--- a/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart
@@ -102,15 +102,11 @@
  */
 @reflectiveTest
 class MissingCodeTest extends AbstractRecoveryTest {
-  @failingTest
   void test_ampersand() {
-    // Parser crashes
     testBinaryExpression('&');
   }
 
-  @failingTest
   void test_ampersand_super() {
-    // Parser crashes
     testUserDefinableOperatorWithSuper('&');
   }
 
@@ -131,15 +127,13 @@
 ''');
   }
 
-  @failingTest
   void test_assignmentExpression() {
-    // Parser crashes
     testRecovery('''
 f() {
   var x;
   x = 
 }
-''', [ParserErrorCode.MISSING_IDENTIFIER], '''
+''', [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN], '''
 f() {
   var x;
   x = _s_;
@@ -147,15 +141,11 @@
 ''');
   }
 
-  @failingTest
   void test_bar() {
-    // Parser crashes
     testBinaryExpression('|');
   }
 
-  @failingTest
   void test_bar_super() {
-    // Parser crashes
     testUserDefinableOperatorWithSuper('|');
   }
 
@@ -189,83 +179,59 @@
 ''');
   }
 
-  @failingTest
   void test_conditionalExpression_else() {
-    // Parser crashes
     testRecovery('''
 f() => x ? y : 
-''', [ParserErrorCode.MISSING_IDENTIFIER], '''
+''', [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN], '''
 f() => x ? y : _s_;
 ''');
   }
 
-  @failingTest
   void test_conditionalExpression_then() {
-    // Parser crashes
     testRecovery('''
 f() => x ? : z
-''', [ParserErrorCode.MISSING_IDENTIFIER], '''
+''', [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN], '''
 f() => x ? _s_ : z;
 ''');
   }
 
-  @failingTest
   void test_equalEqual() {
-    // Parser crashes
     testBinaryExpression('==');
   }
 
-  @failingTest
   void test_equalEqual_super() {
-    // Parser crashes
     testUserDefinableOperatorWithSuper('==');
   }
 
-  @failingTest
   void test_greaterThan() {
-    // Parser crashes
     testBinaryExpression('>');
   }
 
-  @failingTest
   void test_greaterThan_super() {
-    // Parser crashes
     testUserDefinableOperatorWithSuper('>');
   }
 
-  @failingTest
   void test_greaterThanGreaterThan() {
-    // Parser crashes
     testBinaryExpression('>>');
   }
 
-  @failingTest
   void test_greaterThanGreaterThan_super() {
-    // Parser crashes
     testUserDefinableOperatorWithSuper('>>');
   }
 
-  @failingTest
   void test_greaterThanOrEqual() {
-    // Parser crashes
     testBinaryExpression('>=');
   }
 
-  @failingTest
   void test_greaterThanOrEqual_super() {
-    // Parser crashes
     testUserDefinableOperatorWithSuper('>=');
   }
 
-  @failingTest
   void test_hat() {
-    // Parser crashes
     testBinaryExpression('^');
   }
 
-  @failingTest
   void test_hat_super() {
-    // Parser crashes
     testUserDefinableOperatorWithSuper('^');
   }
 
@@ -295,75 +261,51 @@
 ''');
   }
 
-  @failingTest
   void test_lessThan() {
-    // Parser crashes
     testBinaryExpression('<');
   }
 
-  @failingTest
   void test_lessThan_super() {
-    // Parser crashes
     testUserDefinableOperatorWithSuper('<');
   }
 
-  @failingTest
   void test_lessThanLessThan() {
-    // Parser crashes
     testBinaryExpression('<<');
   }
 
-  @failingTest
   void test_lessThanLessThan_super() {
-    // Parser crashes
     testUserDefinableOperatorWithSuper('<<');
   }
 
-  @failingTest
   void test_lessThanOrEqual() {
-    // Parser crashes
     testBinaryExpression('<=');
   }
 
-  @failingTest
   void test_lessThanOrEqual_super() {
-    // Parser crashes
     testUserDefinableOperatorWithSuper('<=');
   }
 
-  @failingTest
   void test_minus() {
-    // Parser crashes
     testBinaryExpression('-');
   }
 
-  @failingTest
   void test_minus_super() {
-    // Parser crashes
     testUserDefinableOperatorWithSuper('-');
   }
 
-  @failingTest
   void test_percent() {
-    // Parser crashes
     testBinaryExpression('%');
   }
 
-  @failingTest
   void test_percent_super() {
-    // Parser crashes
     testUserDefinableOperatorWithSuper('%');
   }
 
-  @failingTest
   void test_plus() {
-    // Parser crashes
     testBinaryExpression('+');
   }
 
-  @failingTest
   void test_plus_super() {
-    // Parser crashes
     testUserDefinableOperatorWithSuper('+');
   }
 
@@ -381,46 +323,56 @@
 ''');
   }
 
-  @failingTest
   void test_slash() {
-    // Parser crashes
     testBinaryExpression('/');
   }
 
-  @failingTest
   void test_slash_super() {
-    // Parser crashes
     testUserDefinableOperatorWithSuper('/');
   }
 
-  @failingTest
   void test_star() {
-    // Parser crashes
     testBinaryExpression('*');
   }
 
-  @failingTest
   void test_star_super() {
-    // Parser crashes
     testUserDefinableOperatorWithSuper('*');
   }
 
-  @failingTest
   void test_tildeSlash() {
-    // Parser crashes
     testBinaryExpression('~/');
   }
 
-  @failingTest
   void test_tildeSlash_super() {
-    // Parser crashes
     testUserDefinableOperatorWithSuper('~/');
   }
 
+  void test_unclosedStringInterpolation() {
+    // https://github.com/dart-lang/sdk/issues/946
+    // TODO(brianwilkerson) Try to recover better. Ideally there would be a
+    // single error about an unterminated interpolation block.
+    testRecovery(r'''
+f() {
+  print("${42");
+}
+''', [
+      ParserErrorCode.EXPECTED_TOKEN,
+      ParserErrorCode.EXPECTED_TOKEN,
+      ScannerErrorCode.EXPECTED_TOKEN,
+      ScannerErrorCode.EXPECTED_TOKEN,
+      ScannerErrorCode.UNTERMINATED_STRING_LITERAL,
+      ScannerErrorCode.UNTERMINATED_STRING_LITERAL
+    ], r'''
+f() {
+  print("${42}");
+}
+''');
+  }
+
   void testBinaryExpression(String operator) {
     testRecovery('''
 f() => x $operator
-''', [ParserErrorCode.MISSING_IDENTIFIER], '''
+''', [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN], '''
 f() => x $operator _s_;
 ''');
   }
@@ -430,7 +382,7 @@
 class C {
   int operator $operator(x) => super $operator
 }
-''', [ParserErrorCode.MISSING_IDENTIFIER], '''
+''', [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN], '''
 class C {
   int operator $operator(x) => super $operator _s_;
 }
@@ -609,6 +561,21 @@
 ''');
   }
 
+  void test_missingComma() {
+    // https://github.com/dart-lang/sdk/issues/22074
+    testRecovery('''
+g(a, b, c) {}
+h(v1, v2, v) {
+  g(v1 == v2 || v1 == v 3, true);
+}
+''', [ParserErrorCode.EXPECTED_TOKEN], '''
+g(a, b, c) {}
+h(v1, v2, v) {
+  g(v1 == v2 || v1 == v, 3, true);
+}
+''');
+  }
+
   void test_missingDefault_named_last() {
     testRecovery('''
 f({a: }) {}
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/break_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/break_statement_test.dart
index fc1a5c58..477bc1c 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/break_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/break_statement_test.dart
@@ -16,7 +16,16 @@
         'break_statement',
         [
           new TestDescriptor(
-              'keyword', 'break', [ParserErrorCode.EXPECTED_TOKEN], "break;",
+              'keyword',
+              'break',
+              [
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.BREAK_OUTSIDE_OF_LOOP
+              ],
+              "break;",
+              expectedErrorsInValidCode: [
+                ParserErrorCode.BREAK_OUTSIDE_OF_LOOP
+              ],
               failing: ['labeled', 'localFunctionNonVoid']),
           new TestDescriptor(
               'label', 'break a', [ParserErrorCode.EXPECTED_TOKEN], "break a;"),
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/class_declaration_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/class_declaration_test.dart
index c424d5f..550eecb 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/class_declaration_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/class_declaration_test.dart
@@ -23,7 +23,6 @@
       'getter',
       'setter'
     ];
-    List<String> onlyConstAndFinal = <String>['const', 'final'];
     buildTests(
         'class_declaration',
         [
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/continue_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/continue_statement_test.dart
index d3999b5..89a70ae 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/continue_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/continue_statement_test.dart
@@ -15,11 +15,29 @@
     buildTests(
         'continue_statement',
         [
-          new TestDescriptor('keyword', 'continue',
-              [ParserErrorCode.EXPECTED_TOKEN], "continue;",
+          new TestDescriptor(
+              'keyword',
+              'continue',
+              [
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP
+              ],
+              "continue;",
+              expectedErrorsInValidCode: [
+                ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP
+              ],
               failing: ['labeled', 'localFunctionNonVoid']),
-          new TestDescriptor('label', 'continue a',
-              [ParserErrorCode.EXPECTED_TOKEN], "continue a;"),
+          new TestDescriptor(
+              'label',
+              'continue a',
+              [
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP
+              ],
+              "continue a;",
+              expectedErrorsInValidCode: [
+                ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP
+              ]),
         ],
         PartialCodeTest.statementSuffixes,
         head: 'f() { ',
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/do_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/do_statement_test.dart
index 302462e..599953c 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/do_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/do_statement_test.dart
@@ -11,6 +11,8 @@
 }
 
 class DoStatementTest extends PartialCodeTest {
+  final allExceptEof =
+      PartialCodeTest.statementSuffixes.map((ts) => ts.name).toList();
   buildAll() {
     buildTests(
         'do_statement',
@@ -70,16 +72,16 @@
               [
                 ParserErrorCode.MISSING_IDENTIFIER,
                 ParserErrorCode.EXPECTED_TOKEN,
-                ParserErrorCode.EXPECTED_TOKEN
+                ScannerErrorCode.EXPECTED_TOKEN
               ],
               "do {} while (_s_);",
-              allFailing: true),
+              failing: allExceptEof),
           new TestDescriptor(
               'condition',
               'do {} while (a',
-              [ParserErrorCode.EXPECTED_TOKEN, ParserErrorCode.EXPECTED_TOKEN],
+              [ParserErrorCode.EXPECTED_TOKEN, ScannerErrorCode.EXPECTED_TOKEN],
               "do {} while (a);",
-              allFailing: true),
+              failing: allExceptEof),
           new TestDescriptor('rightParen', 'do {} while (a)',
               [ParserErrorCode.EXPECTED_TOKEN], "do {} while (a);"),
         ],
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart
index 8ccb281..9cd9192 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart
@@ -26,7 +26,6 @@
       'getter',
       'setter'
     ];
-    List<String> onlyConstAndFinal = <String>['const', 'final'];
     buildTests(
         'export_directive',
         [
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
index 86240ee..d3764ef 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
@@ -12,7 +12,6 @@
 
 class ImportDirectivesTest extends PartialCodeTest {
   buildAll() {
-    List<String> onlyConstAndFinal = <String>['const', 'final'];
     buildTests(
         'import_directive',
         [
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/instance_creation_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/instance_creation_test.dart
index 7c584c8..48660aa 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/instance_creation_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/instance_creation_test.dart
@@ -29,11 +29,10 @@
           '$keyword',
           [
             ParserErrorCode.MISSING_IDENTIFIER,
-            ParserErrorCode.EXPECTED_TOKEN,
+            ParserErrorCode.MISSING_IDENTIFIER,
             ParserErrorCode.EXPECTED_TOKEN,
           ],
-          "$keyword _s_()",
-          allFailing: true),
+          "$keyword _s_()"),
       new TestDescriptor(
           '${keyword}_name_unnamed',
           '$keyword A',
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/library_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/library_directive_test.dart
index b1f0f16..cf68d9c 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/library_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/library_directive_test.dart
@@ -26,7 +26,6 @@
       'getter',
       'setter'
     ];
-    List<String> onlyConstAndFinal = <String>['const', 'final'];
     buildTests(
         'library_directive',
         [
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart
index ff970df..4c2f010 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart
@@ -209,15 +209,8 @@
               ],
               "var a = _s_;",
               failing: allExceptEof),
-          new TestDescriptor(
-              'varNameEqualsExpression',
-              'var a = b',
-              [
-                ParserErrorCode.MISSING_IDENTIFIER,
-                ParserErrorCode.EXPECTED_TOKEN
-              ],
-              "var a = b;",
-              allFailing: true),
+          new TestDescriptor('varNameEqualsExpression', 'var a = b',
+              [ParserErrorCode.EXPECTED_TOKEN], "var a = b;"),
         ],
         PartialCodeTest.statementSuffixes,
         head: 'f() { ',
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_directive_test.dart
index cde7dbb..bed24e2 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_directive_test.dart
@@ -12,7 +12,6 @@
 
 class PartDirectivesTest extends PartialCodeTest {
   buildAll() {
-    List<String> onlyConstAndFinal = <String>['const', 'final'];
     buildTests(
         'part_directive',
         [
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart
index 0fbbd80..7432c7f 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart
@@ -23,7 +23,6 @@
       'getter',
       'setter'
     ];
-    List<String> onlyConstAndFinal = <String>['const', 'final'];
     buildTests(
         'part_of_directive',
         [
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart
index 35c91eb..ebb09d2 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart
@@ -3,8 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/error/error.dart';
+import 'package:analyzer/src/dart/error/syntactic_errors.dart';
 import 'package:test/test.dart';
 
+import '../../../../generated/test_support.dart';
 import '../recovery_test_support.dart';
 
 /**
@@ -131,9 +133,11 @@
       //
       StringBuffer invalid = new StringBuffer();
       StringBuffer valid = new StringBuffer();
+      StringBuffer base = new StringBuffer();
       if (head != null) {
         invalid.write(head);
         valid.write(head);
+        base.write(head);
       }
       invalid.write(descriptor.invalid);
       valid.write(descriptor.valid);
@@ -142,12 +146,43 @@
         invalid.write(suffix.text);
         valid.write(' ');
         valid.write(suffix.text);
+        base.write(' ');
+        base.write(suffix.text);
       }
       if (tail != null) {
         invalid.write(tail);
         valid.write(tail);
+        base.write(tail);
       }
       //
+      // Determine the existing errors in the code
+      // without either valid or invalid code.
+      //
+      GatheringErrorListener listener =
+          new GatheringErrorListener(checkRanges: true);
+      parseCompilationUnit2(base.toString(), listener);
+      var baseErrorCodes = <ErrorCode>[];
+      listener.errors.forEach((AnalysisError error) {
+        if (error.errorCode == ParserErrorCode.BREAK_OUTSIDE_OF_LOOP ||
+            error.errorCode == ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP ||
+            error.errorCode == ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE) {
+          baseErrorCodes.add(error.errorCode);
+        }
+      });
+
+      var expectedValidCodeErrors = <ErrorCode>[];
+      expectedValidCodeErrors.addAll(baseErrorCodes);
+      if (descriptor.expectedErrorsInValidCode != null) {
+        expectedValidCodeErrors.addAll(descriptor.expectedErrorsInValidCode);
+      }
+
+      var expectedInvalidCodeErrors = <ErrorCode>[];
+      expectedInvalidCodeErrors.addAll(baseErrorCodes);
+      if (descriptor.errorCodes != null) {
+        expectedInvalidCodeErrors.addAll(descriptor.errorCodes);
+      }
+
+      //
       // Run the test.
       //
       List<String> failing = descriptor.failing;
@@ -156,7 +191,8 @@
         bool failed = false;
         try {
           testRecovery(
-              invalid.toString(), descriptor.errorCodes, valid.toString());
+              invalid.toString(), expectedInvalidCodeErrors, valid.toString(),
+              expectedErrorsInValidCode: expectedValidCodeErrors);
           failed = true;
         } catch (e) {
           // Expected to fail.
@@ -166,7 +202,8 @@
         }
       } else {
         testRecovery(
-            invalid.toString(), descriptor.errorCodes, valid.toString());
+            invalid.toString(), expectedInvalidCodeErrors, valid.toString(),
+            expectedErrorsInValidCode: expectedValidCodeErrors);
       }
     });
   }
@@ -198,6 +235,11 @@
   final String valid;
 
   /**
+   * Error codes that the parser is expected to produce in the valid code.
+   */
+  final List<ErrorCode> expectedErrorsInValidCode;
+
+  /**
    * A flag indicating whether all of the tests are expected to fail.
    */
   final bool allFailing;
@@ -212,7 +254,7 @@
    * Initialize a newly created test descriptor.
    */
   TestDescriptor(this.name, this.invalid, this.errorCodes, this.valid,
-      {this.allFailing: false, this.failing});
+      {this.allFailing: false, this.failing, this.expectedErrorsInValidCode});
 }
 
 /**
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/switch_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/switch_statement_test.dart
index 750f8d8..8f7502f 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/switch_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/switch_statement_test.dart
@@ -12,6 +12,8 @@
 
 class SwitchStatementTest extends PartialCodeTest {
   buildAll() {
+    final allExceptEof =
+        PartialCodeTest.statementSuffixes.map((ts) => ts.name).toList();
     buildTests(
         'switch_statement',
         [
@@ -22,41 +24,32 @@
                 ParserErrorCode.EXPECTED_TOKEN,
                 ParserErrorCode.MISSING_IDENTIFIER,
                 ParserErrorCode.EXPECTED_TOKEN,
-                ParserErrorCode.EXPECTED_TOKEN,
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "switch (_s_) {}",
-              allFailing: true),
+              failing: ['block']),
           new TestDescriptor(
               'leftParen',
               'switch (',
               [
                 ParserErrorCode.MISSING_IDENTIFIER,
                 ParserErrorCode.EXPECTED_TOKEN,
-                ParserErrorCode.EXPECTED_TOKEN,
-                ParserErrorCode.EXPECTED_TOKEN
+                ScannerErrorCode.EXPECTED_TOKEN
               ],
               "switch (_s_) {}",
-              allFailing: true),
+              failing: allExceptEof),
           new TestDescriptor(
               'expression',
               'switch (a',
-              [
-                ParserErrorCode.EXPECTED_TOKEN,
-                ParserErrorCode.EXPECTED_TOKEN,
-                ParserErrorCode.EXPECTED_TOKEN
-              ],
+              [ParserErrorCode.EXPECTED_TOKEN, ScannerErrorCode.EXPECTED_TOKEN],
               "switch (a) {}",
-              allFailing: true),
-          new TestDescriptor(
-              'rightParen',
-              'switch (a)',
-              [ParserErrorCode.EXPECTED_TOKEN, ParserErrorCode.EXPECTED_TOKEN],
-              "switch (a) {}",
-              allFailing: true),
-          new TestDescriptor('leftBrace', 'switch (a) {',
+              failing: allExceptEof),
+          new TestDescriptor('rightParen', 'switch (a)',
               [ParserErrorCode.EXPECTED_TOKEN], "switch (a) {}",
-              allFailing: true),
+              failing: ['block']),
+          new TestDescriptor('leftBrace', 'switch (a) {',
+              [ScannerErrorCode.EXPECTED_TOKEN], "switch (a) {}",
+              failing: allExceptEof),
         ],
         PartialCodeTest.statementSuffixes,
         head: 'f() { ',
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart
index dc432ec..206cec2 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart
@@ -90,8 +90,7 @@
               "int _s_;",
               allFailing: true),
           new TestDescriptor(
-              'typeName', 'int a', [ParserErrorCode.EXPECTED_TOKEN], "int a;",
-              allFailing: true),
+              'typeName', 'int a', [ParserErrorCode.EXPECTED_TOKEN], "int a;"),
           new TestDescriptor(
               'var',
               'var',
@@ -103,7 +102,7 @@
               failing: allExceptEof),
           new TestDescriptor(
               'varName', 'var a', [ParserErrorCode.EXPECTED_TOKEN], "var a;",
-              failing: allExceptEof),
+              failing: ['typedef', 'functionNonVoid', 'getter', 'setter']),
           new TestDescriptor(
               'varNameEquals',
               'var a =',
@@ -113,15 +112,8 @@
               ],
               "var a = _s_;",
               failing: allExceptEof),
-          new TestDescriptor(
-              'varNameEqualsExpression',
-              'var a = b',
-              [
-                ParserErrorCode.MISSING_IDENTIFIER,
-                ParserErrorCode.EXPECTED_TOKEN
-              ],
-              "var a = b;",
-              allFailing: true),
+          new TestDescriptor('varNameEqualsExpression', 'var a = b',
+              [ParserErrorCode.EXPECTED_TOKEN], "var a = b;"),
         ],
         PartialCodeTest.declarationSuffixes);
   }
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/try_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/try_statement_test.dart
index a6c927d..8b7046d 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/try_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/try_statement_test.dart
@@ -12,6 +12,8 @@
 
 class TryStatementTest extends PartialCodeTest {
   buildAll() {
+    final allExceptEof =
+        PartialCodeTest.statementSuffixes.map((ts) => ts.name).toList();
     buildTests(
         'try_statement',
         [
@@ -37,11 +39,11 @@
               'on',
               'try {} on',
               [
-                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TYPE_NAME,
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "try {} on _s_ {}",
-              allFailing: true),
+              failing: allExceptEof),
           new TestDescriptor('on_identifier', 'try {} on A',
               [ParserErrorCode.EXPECTED_TOKEN], "try {} on A {}",
               failing: ['block']),
@@ -71,9 +73,9 @@
           new TestDescriptor(
               'catch_identifier',
               'try {} catch (e',
-              [ParserErrorCode.EXPECTED_TOKEN, ParserErrorCode.EXPECTED_TOKEN],
+              [ParserErrorCode.EXPECTED_TOKEN, ScannerErrorCode.EXPECTED_TOKEN],
               "try {} catch (e) {}",
-              allFailing: true),
+              failing: allExceptEof),
           new TestDescriptor(
               'catch_identifierComma',
               'try {} catch (e, ',
@@ -87,9 +89,9 @@
           new TestDescriptor(
               'catch_identifierCommaIdentifier',
               'try {} catch (e, s',
-              [ParserErrorCode.EXPECTED_TOKEN, ParserErrorCode.EXPECTED_TOKEN],
+              [ParserErrorCode.EXPECTED_TOKEN, ScannerErrorCode.EXPECTED_TOKEN],
               "try {} catch (e, s) {}",
-              allFailing: true),
+              failing: allExceptEof),
           new TestDescriptor('catch_rightParen', 'try {} catch (e, s)',
               [ParserErrorCode.EXPECTED_TOKEN], "try {} catch (e, s) {}",
               failing: ['block']),
@@ -119,9 +121,9 @@
           new TestDescriptor(
               'on_catch_identifier',
               'try {} on A catch (e',
-              [ParserErrorCode.EXPECTED_TOKEN, ParserErrorCode.EXPECTED_TOKEN],
+              [ParserErrorCode.EXPECTED_TOKEN, ScannerErrorCode.EXPECTED_TOKEN],
               "try {} on A catch (e) {}",
-              allFailing: true),
+              failing: allExceptEof),
           new TestDescriptor(
               'on_catch_identifierComma',
               'try {} on A catch (e, ',
@@ -135,9 +137,9 @@
           new TestDescriptor(
               'on_catch_identifierCommaIdentifier',
               'try {} on A catch (e, s',
-              [ParserErrorCode.EXPECTED_TOKEN, ParserErrorCode.EXPECTED_TOKEN],
+              [ParserErrorCode.EXPECTED_TOKEN, ScannerErrorCode.EXPECTED_TOKEN],
               "try {} on A catch (e, s) {}",
-              allFailing: true),
+              failing: allExceptEof),
           new TestDescriptor('on_catch_rightParen', 'try {} on A catch (e, s)',
               [ParserErrorCode.EXPECTED_TOKEN], "try {} on A catch (e, s) {}",
               failing: ['block']),
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/while_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/while_statement_test.dart
index c57834a..c7aa796 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/while_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/while_statement_test.dart
@@ -24,7 +24,7 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "while (_s_)",
-              failing: ['eof']),
+              failing: ['eof', 'break', 'continue']),
           new TestDescriptor(
               'leftParen',
               'while (',
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 f86a63b..9a48970 100644
--- a/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart
@@ -9,6 +9,7 @@
 import 'package:test/test.dart';
 
 import '../../../generated/parser_fasta_test.dart';
+import '../../../generated/test_support.dart';
 
 /**
  * The base class for tests that test how well the parser recovers from various
@@ -17,15 +18,36 @@
 abstract class AbstractRecoveryTest extends FastaParserTestCase {
   void testRecovery(
       String invalidCode, List<ErrorCode> errorCodes, String validCode,
-      {CompilationUnit adjustValidUnitBeforeComparison(CompilationUnit unit)}) {
-    CompilationUnit invalidUnit =
-        parseCompilationUnit(invalidCode, codes: errorCodes);
+      {CompilationUnit adjustValidUnitBeforeComparison(CompilationUnit unit),
+      List<ErrorCode> expectedErrorsInValidCode}) {
+    CompilationUnit validUnit;
+
+    // Assert that the valid code is indeed valid.
+    try {
+      validUnit =
+          parseCompilationUnit(validCode, codes: expectedErrorsInValidCode);
+    } catch (e) {
+      print('*** Valid code did not parse correctly');
+      print(validCode);
+      rethrow;
+    }
+
+    // Compare the structures before asserting valid errors.
+    GatheringErrorListener listener =
+        new GatheringErrorListener(checkRanges: true);
+    CompilationUnit invalidUnit = parseCompilationUnit2(invalidCode, listener);
     validateTokenStream(invalidUnit.beginToken);
-    CompilationUnit validUnit = parseCompilationUnit(validCode);
     if (adjustValidUnitBeforeComparison != null) {
       validUnit = adjustValidUnitBeforeComparison(validUnit);
     }
     ResultComparator.compare(invalidUnit, validUnit);
+
+    // Assert valid errors.
+    if (errorCodes != null) {
+      listener.assertErrorsWithCodes(errorCodes);
+    } else {
+      listener.assertNoErrors();
+    }
   }
 
   void validateTokenStream(Token token) {
@@ -43,10 +65,10 @@
 class ResultComparator extends AstComparator {
   bool failDifferentLength(List first, List second) {
     StringBuffer buffer = new StringBuffer();
-    buffer.write('Expected a list of length ');
-    buffer.write(second.length);
-    buffer.write('; found a list of length ');
-    buffer.writeln(first.length);
+    buffer.writeln('Expected a list of length ${second.length}');
+    buffer.writeln('  $second');
+    buffer.writeln('But found a list of length ${first.length}');
+    buffer.writeln('  $first');
     if (first is NodeList) {
       _safelyWriteNodePath(buffer, first.owner);
     }
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
index 1204587..fb326f8 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -1642,7 +1642,7 @@
   Future<int> f;
   var x = f.then<Future<List<int>>>(/*info:INFERRED_TYPE_CLOSURE*/
                                     (x) => /*error:RETURN_OF_INVALID_TYPE_FROM_CLOSURE*/[]);
-  Future<List<int>> y = x;
+  Future<List<int>> y = /*error:INVALID_ASSIGNMENT*/x;
 }
 m2() {
   Future<int> f;
diff --git a/pkg/analyzer/tool/generate_files b/pkg/analyzer/tool/generate_files
index 39bb928..0542717 100755
--- a/pkg/analyzer/tool/generate_files
+++ b/pkg/analyzer/tool/generate_files
@@ -43,5 +43,5 @@
 VM_OPTIONS+=("--packages=${ROOT_DIR}/.packages")
 
 cd "${SCRIPT_DIR}"
-"${DART}" "${VM_OPTIONS[@]}" "task_dependency_graph/generate.dart"
 "${DART}" "${VM_OPTIONS[@]}" "summary/generate.dart"
+"${DART}" "${VM_OPTIONS[@]}" "task_dependency_graph/generate.dart"
diff --git a/pkg/analyzer_cli/lib/src/build_mode.dart b/pkg/analyzer_cli/lib/src/build_mode.dart
index b5bfbcd..f7ee91b 100644
--- a/pkg/analyzer_cli/lib/src/build_mode.dart
+++ b/pkg/analyzer_cli/lib/src/build_mode.dart
@@ -266,6 +266,11 @@
                 mode: io.FileMode.WRITE_ONLY);
           }
         });
+      } else {
+        // Build the graph, e.g. associate parts with libraries.
+        for (var file in uriToFileMap.values) {
+          analysisDriver.fsState.getFileForPath(file.path);
+        }
       }
 
       if (options.buildSummaryOnly) {
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 9f298d5..13bcfa4 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -873,6 +873,7 @@
     contextOptions.hint = !options.disableHints;
     contextOptions.generateImplicitErrors = options.showPackageWarnings;
     contextOptions.generateSdkErrors = options.showSdkWarnings;
+    contextOptions.previewDart2 = options.previewDart2;
     if (options.useCFE) {
       contextOptions.useFastaParser = true;
     }
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index cd90779..cead0b7 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -50,12 +50,12 @@
 
   Driver driver;
 
-  /// Normalize text with bullets.
-  String bulletToDash(item) => '$item'.replaceAll('•', '-');
+  bool get useCFE => false;
 
   bool get usePreviewDart2 => false;
 
-  bool get useCFE => false;
+  /// Normalize text with bullets.
+  String bulletToDash(item) => '$item'.replaceAll('•', '-');
 
   /// Start a driver for the given [source], optionally providing additional
   /// [args] and an [options] file path. The value of [options] defaults to an
@@ -436,6 +436,33 @@
     expect(exitCode, 0);
   }
 
+  test_onlyErrors_partFirst() async {
+    await withTempDirAsync((tempDir) async {
+      var aDart = path.join(tempDir, 'a.dart');
+      var bDart = path.join(tempDir, 'b.dart');
+
+      var aUri = 'package:aaa/a.dart';
+      var bUri = 'package:aaa/b.dart';
+
+      new File(aDart).writeAsStringSync(r'''
+library lib;
+part 'b.dart';
+class A {}
+''');
+      new File(bDart).writeAsStringSync('''
+part of lib;
+class B {}
+var a = new A();
+var b = new B();
+''');
+
+      // Analyze b.dart (part) and then a.dart (its library).
+      // No errors should be reported - the part should know its library.
+      await _doDrive(bDart, uri: bUri, additionalArgs: ['$aUri|$aDart']);
+      expect(errorSink, isEmpty);
+    });
+  }
+
   Future<Null> _doDrive(String path,
       {String uri,
       List<String> additionalArgs: const [],
@@ -821,13 +848,6 @@
     expect(driver.context.analysisOptions.useFastaParser, isFalse);
   }
 
-  @failingTest
-  test_useCFE() async {
-    await drive('data/options_tests_project/test_file.dart',
-        args: ['--use-cfe']);
-    expect(driver.context.analysisOptions.useFastaParser, isTrue);
-  }
-
   test_strongSdk() async {
     String testDir = path.join(testDirectory, 'data', 'strong_sdk');
     await drive(path.join(testDir, 'main.dart'), args: ['--strong']);
@@ -841,6 +861,13 @@
     expect(outSink.toString().contains('[info]'), isFalse);
   }
 
+  @failingTest
+  test_useCFE() async {
+    await drive('data/options_tests_project/test_file.dart',
+        args: ['--use-cfe']);
+    expect(driver.context.analysisOptions.useFastaParser, isTrue);
+  }
+
   test_withFlags_overrideFatalWarning() async {
     await drive('data/options_tests_project/test_file.dart',
         args: ['--fatal-warnings'],
@@ -893,12 +920,12 @@
 
   @override
   @failingTest
-  test_withFlags_overrideFatalWarning() =>
-      super.test_withFlags_overrideFatalWarning();
+  test_previewDart2() => super.test_previewDart2();
 
   @override
   @failingTest
-  test_previewDart2() => super.test_previewDart2();
+  test_withFlags_overrideFatalWarning() =>
+      super.test_withFlags_overrideFatalWarning();
 }
 
 class TestSource implements Source {
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
index f773143..ea4e3af 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
@@ -24,6 +24,7 @@
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 import 'package:charcode/ascii.dart';
+import 'package:meta/meta.dart';
 import 'package:path/path.dart' as path;
 
 /**
@@ -357,6 +358,7 @@
     if (isGetter) {
       writeln(' => null;');
     } else {
+      writeTypeParameters(member.typeParameters, methodBeingCopied: member);
       List<ParameterElement> parameters = member.parameters;
       writeParameters(parameters, methodBeingCopied: member);
       writeln(' {');
@@ -474,9 +476,9 @@
       {ExecutableElement methodBeingCopied}) {
     _EnclosingElementFinder finder = new _EnclosingElementFinder();
     finder.find(dartFileEditBuilder.unit, offset);
-    String parameterSource = _getParameterSource(
-        type, name, finder.enclosingClass, finder.enclosingExecutable,
-        methodBeingCopied: methodBeingCopied);
+    String parameterSource = _getTypeSource(
+        type, finder.enclosingClass, finder.enclosingExecutable,
+        parameterName: name, methodBeingCopied: methodBeingCopied);
     write(parameterSource);
   }
 
@@ -514,16 +516,25 @@
   }
 
   @override
-  void writeTypeParameter(TypeParameterElement typeParameter) {
+  void writeTypeParameter(TypeParameterElement typeParameter,
+      {ExecutableElement methodBeingCopied}) {
     write(typeParameter.name);
     if (typeParameter.bound != null) {
-      write(' extends ');
-      writeType(typeParameter.bound);
+      _EnclosingElementFinder finder = new _EnclosingElementFinder();
+      finder.find(dartFileEditBuilder.unit, offset);
+      String bound = _getTypeSource(typeParameter.bound, finder.enclosingClass,
+          finder.enclosingExecutable,
+          methodBeingCopied: methodBeingCopied);
+      if (bound != null) {
+        write(' extends ');
+        write(bound);
+      }
     }
   }
 
   @override
-  void writeTypeParameters(List<TypeParameterElement> typeParameters) {
+  void writeTypeParameters(List<TypeParameterElement> typeParameters,
+      {ExecutableElement methodBeingCopied}) {
     if (typeParameters.isNotEmpty) {
       write('<');
       bool isFirst = true;
@@ -532,7 +543,7 @@
           write(', ');
         }
         isFirst = false;
-        writeTypeParameter(typeParameter);
+        writeTypeParameter(typeParameter, methodBeingCopied: methodBeingCopied);
       }
       write('>');
     }
@@ -755,70 +766,39 @@
   }
 
   /**
-   * Return the source for the parameter with the given [type] and [name].
-   */
-  String _getParameterSource(DartType type, String name,
-      ClassElement enclosingClass, ExecutableElement enclosingExecutable,
-      {ExecutableElement methodBeingCopied}) {
-    // no type
-    if (type == null || type.isDynamic) {
-      return name;
-    }
-    // function type
-    if (type is FunctionType && type.element.isSynthetic) {
-      FunctionType functionType = type;
-      StringBuffer buffer = new StringBuffer();
-      // return type
-      DartType returnType = functionType.returnType;
-      if (returnType != null && !returnType.isDynamic) {
-        String returnTypeSource = _getTypeSource(
-            returnType, enclosingClass, enclosingExecutable,
-            methodBeingCopied: methodBeingCopied);
-        if (returnTypeSource.isNotEmpty) {
-          buffer.write(returnTypeSource);
-          buffer.write(' ');
-        }
-      }
-      // parameter name
-      buffer.write(name);
-      // parameters
-      buffer.write('(');
-      List<ParameterElement> fParameters = functionType.parameters;
-      for (int i = 0; i < fParameters.length; i++) {
-        ParameterElement fParameter = fParameters[i];
-        if (i != 0) {
-          buffer.write(", ");
-        }
-        buffer.write(_getParameterSource(fParameter.type, fParameter.name,
-            enclosingClass, enclosingExecutable));
-      }
-      buffer.write(')');
-      // done
-      return buffer.toString();
-    }
-    // simple type
-    String typeSource = _getTypeSource(
-        type, enclosingClass, enclosingExecutable,
-        methodBeingCopied: methodBeingCopied);
-    if (typeSource.isNotEmpty) {
-      return '$typeSource $name';
-    }
-    return name;
-  }
-
-  /**
-   * Returns the source to reference [type] in this [CompilationUnit].
+   * Returns the source to reference [type] in this compilation unit.
+   *
+   * If an [enclosingClass] is provided then the reference is being generated
+   * within the class and the type parameters of the class will be considered to
+   * be visible.
+   *
+   * If an [enclosingExecutable] is provided, then the reference is being
+   * generated within the class and the type parameters of the method will be
+   * considered to be visible.
+   *
+   * If a [methodBeingCopied] is provided, then the type parameters of that
+   * method will be duplicated in the copy and will therefore be visible.
+   *
+   * If a [parameterName] is given, then the type is the type of a parameter
+   * and the parameter name will be included, either in-line in a function type
+   * or after the type source for other types.
    *
    * Causes any libraries whose elements are used by the generated source, to be
    * imported.
    */
   String _getTypeSource(DartType type, ClassElement enclosingClass,
       ExecutableElement enclosingExecutable,
-      {ExecutableElement methodBeingCopied, StringBuffer parametersBuffer}) {
-    StringBuffer buffer = new StringBuffer();
+      {String parameterName, ExecutableElement methodBeingCopied}) {
     // type parameter
-    if (!_isTypeVisible(type, enclosingClass, enclosingExecutable,
-        methodBeingCopied: methodBeingCopied)) {
+    type = _getVisibleType(type, enclosingClass, enclosingExecutable,
+        methodBeingCopied: methodBeingCopied);
+    if (type == null ||
+        type.isDynamic ||
+        type.isBottom ||
+        type.isDartCoreNull) {
+      if (parameterName != null) {
+        return parameterName;
+      }
       return 'dynamic';
     }
 
@@ -833,43 +813,54 @@
 
     // just a Function, not FunctionTypeAliasElement
     if (type is FunctionType && element is! FunctionTypeAliasElement) {
-      if (parametersBuffer == null) {
+      if (parameterName == null) {
         return 'Function';
       }
-      parametersBuffer.write('(');
-      for (ParameterElement parameter in type.parameters) {
-        String parameterType = _getTypeSource(
-            parameter.type, enclosingClass, enclosingExecutable,
-            methodBeingCopied: methodBeingCopied);
-        if (parametersBuffer.length != 1) {
-          parametersBuffer.write(', ');
-        }
-        parametersBuffer.write(parameterType);
-        parametersBuffer.write(' ');
-        parametersBuffer.write(parameter.name);
-      }
-      parametersBuffer.write(')');
-      return _getTypeSource(
+      StringBuffer buffer = new StringBuffer();
+      String returnType = _getTypeSource(
           type.returnType, enclosingClass, enclosingExecutable,
           methodBeingCopied: methodBeingCopied);
-    }
-    // <Bottom>, Null
-    if (type.isBottom || type.isDartCoreNull) {
-      return 'dynamic';
+      if (returnType != null) {
+        buffer.write(returnType);
+        buffer.write(' ');
+      }
+      buffer.write(parameterName);
+      buffer.write('(');
+      int count = type.parameters.length;
+      for (int i = 0; i < count; i++) {
+        ParameterElement parameter = type.parameters[i];
+        String parameterType = _getTypeSource(
+            parameter.type, enclosingClass, enclosingExecutable,
+            parameterName: parameter.name,
+            methodBeingCopied: methodBeingCopied);
+        if (i > 0) {
+          buffer.write(', ');
+        }
+        buffer.write(parameterType);
+      }
+      buffer.write(')');
+      return buffer.toString();
     }
     // prepare element
     if (element == null) {
       String source = type.toString();
       source = source.replaceAll('<dynamic>', '');
       source = source.replaceAll('<dynamic, dynamic>', '');
+      if (parameterName != null) {
+        return '$source $parameterName';
+      }
       return source;
     }
     // check if imported
+    StringBuffer buffer = new StringBuffer();
     LibraryElement definingLibrary = element.library;
     LibraryElement importingLibrary = dartFileEditBuilder.unit.element.library;
     if (definingLibrary != null && definingLibrary != importingLibrary) {
       // no source, if private
       if (element.isPrivate) {
+        if (parameterName != null) {
+          return parameterName;
+        }
         return '';
       }
       // ensure import
@@ -896,8 +887,9 @@
       for (DartType argument in arguments) {
         hasArguments = hasArguments || !argument.isDynamic;
         allArgumentsVisible = allArgumentsVisible &&
-            _isTypeVisible(argument, enclosingClass, enclosingExecutable,
-                methodBeingCopied: methodBeingCopied);
+            _getVisibleType(argument, enclosingClass, enclosingExecutable,
+                    methodBeingCopied: methodBeingCopied) !=
+                null;
       }
       // append type arguments
       if (hasArguments && allArgumentsVisible) {
@@ -919,6 +911,10 @@
         buffer.write(">");
       }
     }
+    if (parameterName != null) {
+      buffer.write(' ');
+      buffer.write(parameterName);
+    }
     // done
     return buffer.toString();
   }
@@ -963,34 +959,61 @@
   }
 
   /**
-   * Checks if [type] is visible in either the [enclosingExecutable] or
-   * [enclosingClass].
+   * If the given [type] is visible in either the [enclosingExecutable] or
+   * [enclosingClass], or if there is a local equivalent to the type (such as in
+   * the case of a type parameter from a superclass), then return the type that
+   * is locally visible. Otherwise, return `null`.
    */
-  bool _isTypeVisible(DartType type, ClassElement enclosingClass,
+  DartType _getVisibleType(DartType type, ClassElement enclosingClass,
       ExecutableElement enclosingExecutable,
       {ExecutableElement methodBeingCopied}) {
     if (type is TypeParameterType) {
       TypeParameterElement parameterElement = type.element;
       Element parameterParent = parameterElement.enclosingElement;
       // TODO(brianwilkerson) This needs to compare the parameterParent with
-      // each of the parents of the enclosingElement. (That means that we only
-      // need the most closely enclosing element.)
-      return parameterParent == enclosingExecutable ||
+      // each of the parents of the enclosingExecutable. (That means that we
+      // only need the most closely enclosing element.)
+      if (parameterParent == enclosingExecutable ||
           parameterParent == enclosingClass ||
-          parameterParent == methodBeingCopied;
+          parameterParent == methodBeingCopied) {
+        return type;
+      }
+      if (enclosingClass != null &&
+          methodBeingCopied != null &&
+          parameterParent is ClassElement &&
+          parameterParent == methodBeingCopied.enclosingElement) {
+        // The parameter is from the class enclosing the methodBeingCopied. That
+        // means that somewhere along the inheritance chain there must be a type
+        // argument corresponding to the type parameter (either a concrete type
+        // or a type parameter of the enclosingClass). That's the visible type
+        // that needs to be returned.
+        _InheritanceChain chain = new _InheritanceChain(
+            subtype: enclosingClass, supertype: parameterParent);
+        while (chain != null) {
+          DartType mappedType = chain.mapParameter(parameterElement);
+          if (mappedType is TypeParameterType) {
+            parameterElement = mappedType.element;
+            chain = chain.next;
+          } else {
+            return mappedType;
+          }
+        }
+        return parameterElement.type;
+      }
+      return null;
     }
     Element element = type.element;
     if (element == null) {
-      return true;
+      return type;
     }
     LibraryElement definingLibrary = element.library;
     LibraryElement importingLibrary = dartFileEditBuilder.unit.element.library;
-    if (definingLibrary != null && definingLibrary != importingLibrary) {
-      if (element.isPrivate) {
-        return false;
-      }
+    if (definingLibrary != null &&
+        definingLibrary != importingLibrary &&
+        element.isPrivate) {
+      return null;
     }
-    return true;
+    return type;
   }
 }
 
@@ -1348,6 +1371,10 @@
       if (node is FunctionDeclaration) {
         replaceTypeWithFuture(node.returnType, typeProvider);
         return;
+      } else if (node is FunctionExpression &&
+          node.parent is! FunctionDeclaration) {
+        // Closures don't have a return type.
+        return;
       } else if (node is MethodDeclaration) {
         replaceTypeWithFuture(node.returnType, typeProvider);
         return;
@@ -1411,6 +1438,91 @@
   }
 }
 
+class _InheritanceChain {
+  final _InheritanceChain next;
+
+  final InterfaceType supertype;
+
+  /**
+   * Return the shortest inheritance chain from a [subtype] to a [supertype], or
+   * `null` if [subtype] does not inherit from [supertype].
+   */
+  factory _InheritanceChain(
+      {@required ClassElement subtype, @required ClassElement supertype}) {
+    List<_InheritanceChain> allChainsFrom(
+        _InheritanceChain next, ClassElement subtype) {
+      List<_InheritanceChain> chains = <_InheritanceChain>[];
+      InterfaceType supertypeType = subtype.supertype;
+      ClassElement supertypeElement = supertypeType.element;
+      if (supertypeElement == supertype) {
+        chains.add(new _InheritanceChain._(next, supertypeType));
+      } else if (supertypeType.isObject) {
+        // Don't add this chain and don't recurse.
+      } else {
+        chains.addAll(allChainsFrom(
+            new _InheritanceChain._(next, supertypeType), supertypeElement));
+      }
+      for (InterfaceType mixinType in subtype.mixins) {
+        ClassElement mixinElement = mixinType.element;
+        if (mixinElement == supertype) {
+          chains.add(new _InheritanceChain._(next, mixinType));
+        }
+      }
+      for (InterfaceType interfaceType in subtype.interfaces) {
+        ClassElement interfaceElement = interfaceType.element;
+        if (interfaceElement == supertype) {
+          chains.add(new _InheritanceChain._(next, interfaceType));
+        } else if (supertypeType.isObject) {
+          // Don't add this chain and don't recurse.
+        } else {
+          chains.addAll(allChainsFrom(
+              new _InheritanceChain._(next, interfaceType), interfaceElement));
+        }
+      }
+      return chains;
+    }
+
+    List<_InheritanceChain> chains = allChainsFrom(null, subtype);
+    if (chains.isEmpty) {
+      return null;
+    }
+    _InheritanceChain shortestChain = chains.removeAt(0);
+    int shortestLength = shortestChain.length;
+    for (_InheritanceChain chain in chains) {
+      int length = chain.length;
+      if (length < shortestLength) {
+        shortestChain = chain;
+        shortestLength = length;
+      }
+    }
+    return shortestChain;
+  }
+
+  /**
+   * Initialize a newly created link in an inheritance chain.
+   */
+  _InheritanceChain._(this.next, this.supertype);
+
+  /**
+   * Return the number of links in the chain starting with this link.
+   */
+  int get length {
+    if (next == null) {
+      return 1;
+    }
+    return next.length + 1;
+  }
+
+  DartType mapParameter(TypeParameterElement typeParameter) {
+    Element parameterParent = typeParameter.enclosingElement;
+    if (parameterParent is ClassElement) {
+      int index = parameterParent.typeParameters.indexOf(typeParameter);
+      return supertype.typeArguments[index];
+    }
+    return null;
+  }
+}
+
 class _InsertionDescription {
   final int offset;
   final bool insertEmptyLineBefore;
diff --git a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
index b7021d6..2bc7d7d 100644
--- a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
@@ -238,14 +238,24 @@
   /**
    * Write the code to declare the given [typeParameter]. The enclosing angle
    * brackets are not automatically written.
+   *
+   * If a [methodBeingCopied] is provided, then type parameters defined by that
+   * method are assumed to be part of what is being written and hence valid
+   * types.
    */
-  void writeTypeParameter(TypeParameterElement typeParameter);
+  void writeTypeParameter(TypeParameterElement typeParameter,
+      {ExecutableElement methodBeingCopied});
 
   /**
    * Write the code to declare the given list of [typeParameters]. The enclosing
    * angle brackets are automatically written.
+   *
+   * If a [methodBeingCopied] is provided, then type parameters defined by that
+   * method are assumed to be part of what is being written and hence valid
+   * types.
    */
-  void writeTypeParameters(List<TypeParameterElement> typeParameters);
+  void writeTypeParameters(List<TypeParameterElement> typeParameters,
+      {ExecutableElement methodBeingCopied});
 }
 
 /**
diff --git a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
index 04a71c9..b953cf1 100644
--- a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
@@ -887,31 +887,85 @@
     expect(group.positions, hasLength(1));
   }
 
-  test_writeOverrideOfInheritedMember() async {
-    String path = provider.convertPath('/test.dart');
-    String content = '''
+  test_writeOverrideOfInheritedMember_method() async {
+    await _assertWriteOverrideOfInheritedMethod('''
 class A {
   A add(A a) => null;
 }
 class B extends A {
-}''';
-    addSource(path, content);
-    ClassElement classA = await _getClassElement(path, 'A');
-
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
-    await builder.addFileEdit(path, (FileEditBuilder builder) {
-      builder.addInsertion(content.length - 1, (EditBuilder builder) {
-        (builder as DartEditBuilder)
-            .writeOverrideOfInheritedMember(classA.methods[0]);
-      });
-    });
-    SourceEdit edit = getEdit(builder);
-    expect(edit.replacement, equalsIgnoringWhitespace('''
+}
+''', '''
 @override
 A add(A a) {
   // TODO: implement add
   return null;
-}'''));
+}
+''');
+  }
+
+  test_writeOverrideOfInheritedMember_method_functionTypeAlias() async {
+    await _assertWriteOverrideOfInheritedMethod('''
+typedef int F(int left, int right);
+abstract class A {
+  void perform(F f);
+}
+class B extends A {
+}
+''', '''
+@override
+void perform(F f) {
+  // TODO: implement perform
+  return null;
+}
+''');
+  }
+
+  test_writeOverrideOfInheritedMember_method_functionTypedParameter() async {
+    await _assertWriteOverrideOfInheritedMethod('''
+abstract class A {
+  forEach(int f(double p1, String p2));
+}
+
+class B extends A {
+}
+''', '''
+@override
+forEach(int f(double p1, String p2)) {
+  // TODO: implement forEach
+}
+''');
+  }
+
+  test_writeOverrideOfInheritedMember_method_generic_noBounds() async {
+    await _assertWriteOverrideOfInheritedMethod('''
+abstract class A {
+  List<T> get<T>(T key);
+}
+class B implements A {
+}
+''', '''
+@override
+List<T> get<T>(T key) {
+  // TODO: implement get
+  return null;
+}
+''');
+  }
+
+  test_writeOverrideOfInheritedMember_method_generic_withBounds() async {
+    await _assertWriteOverrideOfInheritedMethod('''
+abstract class A<K1, V1> {
+  List<T> get<T extends V1>(K1 key);
+}
+class B<K2, V2> implements A<K2, V2> {
+}
+''', '''
+@override
+List<T> get<T extends V2>(K2 key) {
+  // TODO: implement get
+  return null;
+}
+''');
   }
 
   test_writeParameterMatchingArgument() async {
@@ -1330,6 +1384,28 @@
     expect(resultCode, expectedCode);
   }
 
+  /**
+   * Assuming that the [content] being edited defines a class named 'A' whose
+   * first method is the member to be overridden and ends with a class to which
+   * an inherited method is to be added, assert that the text of the overridden
+   * member matches the [expected] text (modulo white space).
+   */
+  _assertWriteOverrideOfInheritedMethod(String content, String expected) async {
+    String path = provider.convertPath('/test.dart');
+    addSource(path, content);
+    ClassElement classA = await _getClassElement(path, 'A');
+
+    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    await builder.addFileEdit(path, (FileEditBuilder builder) {
+      builder.addInsertion(content.length - 2, (EditBuilder builder) {
+        (builder as DartEditBuilder)
+            .writeOverrideOfInheritedMember(classA.methods[0]);
+      });
+    });
+    SourceEdit edit = getEdit(builder);
+    expect(edit.replacement, equalsIgnoringWhitespace(expected));
+  }
+
   Future<ClassElement> _getClassElement(String path, String name) async {
     UnitElementResult result = await driver.getUnitElement(path);
     return result.element.getType(name);
@@ -1350,7 +1426,27 @@
     return new TestTypeProvider(context);
   }
 
-  test_convertFunctionFromSyncToAsync() async {
+  test_convertFunctionFromSyncToAsync_closure() async {
+    String path = provider.convertPath('/test.dart');
+    addSource(path, '''var f = () {}''');
+
+    CompilationUnit unit = (await driver.getResult(path))?.unit;
+    TopLevelVariableDeclaration variable = unit.declarations[0];
+    FunctionBody body =
+        (variable.variables.variables[0].initializer as FunctionExpression)
+            .body;
+
+    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    await builder.addFileEdit(path, (FileEditBuilder builder) {
+      (builder as DartFileEditBuilder)
+          .convertFunctionFromSyncToAsync(body, typeProvider);
+    });
+    List<SourceEdit> edits = getEdits(builder);
+    expect(edits, hasLength(1));
+    expect(edits[0].replacement, equalsIgnoringWhitespace('async'));
+  }
+
+  test_convertFunctionFromSyncToAsync_topLevelFunction() async {
     String path = provider.convertPath('/test.dart');
     addSource(path, 'String f() {}');
 
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index 7a6f642..7a0b6de 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -88,6 +88,11 @@
   // https://gist.github.com/eernstg/4353d7b4f669745bed3a5423e04a453c.
   static const String genericMethodSyntax = '--generic-method-syntax';
 
+  // Starts `async` functions synchronously.
+  //
+  // This is the Dart 2.0 behavior. This flag is only used during the migration.
+  static const String syncAsync = '--sync-async';
+
   // Initializing-formal access is enabled by default and cannot be disabled.
   // For backward compatibility the option is still accepted, but it is ignored.
   static const String initializingFormalAccess = '--initializing-formal-access';
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index 7163d40..67f6910 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -508,6 +508,8 @@
 
   FunctionEntity get asyncHelperStart =>
       _findAsyncHelperFunction("_asyncStart");
+  FunctionEntity get asyncHelperStartSync =>
+      _findAsyncHelperFunction("_asyncStartSync");
   FunctionEntity get asyncHelperAwait =>
       _findAsyncHelperFunction("_asyncAwait");
   FunctionEntity get asyncHelperReturn =>
@@ -550,6 +552,12 @@
   ConstructorEntity get syncCompleterConstructor =>
       _env.lookupConstructor(_findAsyncHelperClass("Completer"), "sync");
 
+  ConstructorEntity get asyncAwaitCompleterConstructor =>
+      _env.lookupConstructor(asyncAwaitCompleter, "");
+
+  ClassEntity get asyncAwaitCompleter =>
+      _findAsyncHelperClass("_AsyncAwaitCompleter");
+
   ClassEntity get asyncStarController =>
       _findAsyncHelperClass("_AsyncStarStreamController");
 
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index b080d91..bd2e4ce 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -355,6 +355,7 @@
     new OptionHandler(Flags.allowMockCompilation, passThrough),
     new OptionHandler(Flags.fastStartup, passThrough),
     new OptionHandler(Flags.genericMethodSyntax, ignoreOption),
+    new OptionHandler(Flags.syncAsync, passThrough),
     new OptionHandler(Flags.initializingFormalAccess, ignoreOption),
     new OptionHandler('${Flags.minify}|-m', implyCompilation),
     new OptionHandler(Flags.preserveUris, passThrough),
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index d099669..a81a272 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -15,7 +15,8 @@
         ConstantValue,
         ConstructedConstantValue,
         DeferredConstantValue,
-        DeferredGlobalConstantValue;
+        DeferredGlobalConstantValue,
+        TypeConstantValue;
 import 'elements/types.dart';
 import 'elements/elements.dart'
     show AstElement, ClassElement, Element, MethodElement, LocalFunctionElement;
@@ -370,6 +371,12 @@
         ClassEntity cls = constant.type.element;
         _updateElementRecursive(cls, oldSet, newSet, queue);
       }
+      if (constant is TypeConstantValue) {
+        var type = constant.representedType;
+        if (type is TypedefType) {
+          _updateElementRecursive(type.element, oldSet, newSet, queue);
+        }
+      }
       constant.getDependencies().forEach((ConstantValue dependency) {
         if (dependency is DeferredConstantValue) {
           /// New deferred-imports are only discovered when we are visiting the
diff --git a/pkg/compiler/lib/src/diagnostics/generated/shared_messages.dart b/pkg/compiler/lib/src/diagnostics/generated/shared_messages.dart
index eddc55e..7f640b3 100644
--- a/pkg/compiler/lib/src/diagnostics/generated/shared_messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/generated/shared_messages.dart
@@ -43,7 +43,6 @@
       howToFix: "Try removing '#{modifier}'.",
       examples: const [
         "var String foo; main(){}",
-        "var set foo; main(){}",
         "var final foo; main(){}",
         "var var foo; main(){}",
         "var const foo; main(){}",
diff --git a/pkg/compiler/lib/src/elements/resolution_types.dart b/pkg/compiler/lib/src/elements/resolution_types.dart
index 0ebbe2fb..4ecaf3b 100644
--- a/pkg/compiler/lib/src/elements/resolution_types.dart
+++ b/pkg/compiler/lib/src/elements/resolution_types.dart
@@ -627,6 +627,8 @@
    */
   final List<ResolutionDartType> namedParameterTypes;
 
+  TypedefType get typedefType => null;
+
   factory ResolutionFunctionType(FunctionTypedElement element,
       [ResolutionDartType returnType = const ResolutionDynamicType(),
       List<ResolutionDartType> parameterTypes = const <ResolutionDartType>[],
diff --git a/pkg/compiler/lib/src/elements/types.dart b/pkg/compiler/lib/src/elements/types.dart
index 0bb9763..5ea9202 100644
--- a/pkg/compiler/lib/src/elements/types.dart
+++ b/pkg/compiler/lib/src/elements/types.dart
@@ -499,13 +499,17 @@
 
   final List<FunctionTypeVariable> typeVariables;
 
+  /// The originating [TypedefType], if any.
+  final TypedefType typedefType;
+
   FunctionType(
       this.returnType,
       this.parameterTypes,
       this.optionalParameterTypes,
       this.namedParameters,
       this.namedParameterTypes,
-      this.typeVariables);
+      this.typeVariables,
+      this.typedefType);
 
   bool get containsTypeVariables {
     return returnType.containsTypeVariables ||
@@ -573,7 +577,8 @@
           newOptionalParameterTypes,
           namedParameters,
           newNamedParameterTypes,
-          newTypeVariables);
+          newTypeVariables,
+          typedefType);
     }
     return this;
   }
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
index 77856cb..a34a070 100644
--- a/pkg/compiler/lib/src/enqueue.dart
+++ b/pkg/compiler/lib/src/enqueue.dart
@@ -362,10 +362,13 @@
         }
         break;
       case TypeUseKind.TYPE_LITERAL:
+        TypedefType typedef;
         if (type.isTypedef) {
-          TypedefType typedef = type;
-          worldBuilder.registerTypedef(typedef.element);
+          typedef = type;
+        } else if (type is FunctionType) {
+          typedef = type.typedefType;
         }
+        if (typedef != null) worldBuilder.registerTypedef(typedef.element);
         break;
     }
   }
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 147a35e..3209051 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -700,7 +700,8 @@
     NativeBasicData nativeBasicData = compiler.frontendStrategy.nativeBasicData;
     RuntimeTypesNeedBuilder rtiNeedBuilder =
         compiler.frontendStrategy.createRuntimeTypesNeedBuilder();
-    BackendImpacts impacts = new BackendImpacts(commonElements);
+    BackendImpacts impacts =
+        new BackendImpacts(compiler.options, commonElements);
     TypeVariableResolutionAnalysis typeVariableResolutionAnalysis =
         new TypeVariableResolutionAnalysis(
             compiler.frontendStrategy.elementEnvironment,
@@ -783,7 +784,8 @@
       CompilerTask task, Compiler compiler, ClosedWorld closedWorld) {
     ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
     CommonElements commonElements = closedWorld.commonElements;
-    BackendImpacts impacts = new BackendImpacts(commonElements);
+    BackendImpacts impacts =
+        new BackendImpacts(compiler.options, commonElements);
     _typeVariableCodegenAnalysis = new TypeVariableCodegenAnalysis(
         closedWorld.elementEnvironment, this, commonElements, mirrorsData);
     _mirrorsCodegenAnalysis = mirrorsResolutionAnalysis.close();
@@ -981,7 +983,8 @@
     emitter.createEmitter(namer, closedWorld, codegenWorldBuilder, sorter);
     // TODO(johnniwinther): Share the impact object created in
     // createCodegenEnqueuer.
-    BackendImpacts impacts = new BackendImpacts(closedWorld.commonElements);
+    BackendImpacts impacts =
+        new BackendImpacts(compiler.options, closedWorld.commonElements);
     if (compiler.options.disableRtiOptimization) {
       _rtiSubstitutions = new TrivialRuntimeTypesSubstitutions(
           closedWorld.elementEnvironment, closedWorld.dartTypes);
@@ -1167,13 +1170,20 @@
       jsAst.Expression code,
       SourceInformation bodySourceInformation,
       SourceInformation exitSourceInformation) {
+    bool startAsyncSynchronously = compiler.options.startAsyncSynchronously;
+
     AsyncRewriterBase rewriter = null;
     jsAst.Name name = namer.methodPropertyName(element);
     switch (element.asyncMarker) {
       case AsyncMarker.ASYNC:
+        var startFunction = startAsyncSynchronously
+            ? commonElements.asyncHelperStartSync
+            : commonElements.asyncHelperStart;
+        var completerConstructor = startAsyncSynchronously
+            ? commonElements.asyncAwaitCompleterConstructor
+            : commonElements.syncCompleterConstructor;
         rewriter = new AsyncRewriter(reporter, element,
-            asyncStart:
-                emitter.staticFunctionAccess(commonElements.asyncHelperStart),
+            asyncStart: emitter.staticFunctionAccess(startFunction),
             asyncAwait:
                 emitter.staticFunctionAccess(commonElements.asyncHelperAwait),
             asyncReturn:
@@ -1181,8 +1191,8 @@
             asyncRethrow:
                 emitter.staticFunctionAccess(commonElements.asyncHelperRethrow),
             wrapBody: emitter.staticFunctionAccess(commonElements.wrapBody),
-            completerFactory: emitter
-                .staticFunctionAccess(commonElements.syncCompleterConstructor),
+            completerFactory:
+                emitter.staticFunctionAccess(completerConstructor),
             safeVariableName: namer.safeVariablePrefixForAsyncRewrite,
             bodyName: namer.deriveAsyncBodyName(name));
         break;
diff --git a/pkg/compiler/lib/src/js_backend/backend_impact.dart b/pkg/compiler/lib/src/js_backend/backend_impact.dart
index 28360bc..3d0fd4f 100644
--- a/pkg/compiler/lib/src/js_backend/backend_impact.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_impact.dart
@@ -8,6 +8,7 @@
 import '../common_elements.dart' show CommonElements, ElementEnvironment;
 import '../elements/types.dart' show InterfaceType;
 import '../elements/entities.dart';
+import '../options.dart' show CompilerOptions;
 import '../universe/selector.dart';
 import '../universe/world_impact.dart'
     show WorldImpact, WorldImpactBuilder, WorldImpactBuilderImpl;
@@ -88,9 +89,10 @@
 
 /// The JavaScript backend dependencies for various features.
 class BackendImpacts {
+  final CompilerOptions _options;
   final CommonElements _commonElements;
 
-  BackendImpacts(this._commonElements);
+  BackendImpacts(this._options, this._commonElements);
 
   BackendImpact _getRuntimeTypeArgument;
 
@@ -126,15 +128,24 @@
   BackendImpact _asyncBody;
 
   BackendImpact get asyncBody {
-    return _asyncBody ??= new BackendImpact(staticUses: [
-      _commonElements.asyncHelperStart,
+    var staticUses = [
       _commonElements.asyncHelperAwait,
       _commonElements.asyncHelperReturn,
       _commonElements.asyncHelperRethrow,
-      _commonElements.syncCompleterConstructor,
       _commonElements.streamIteratorConstructor,
       _commonElements.wrapBody
-    ]);
+    ];
+    var instantiantedClasses = <ClassEntity>[];
+    if (_options.startAsyncSynchronously) {
+      staticUses.add(_commonElements.asyncAwaitCompleterConstructor);
+      staticUses.add(_commonElements.asyncHelperStartSync);
+      instantiantedClasses.add(_commonElements.asyncAwaitCompleter);
+    } else {
+      staticUses.add(_commonElements.syncCompleterConstructor);
+      staticUses.add(_commonElements.asyncHelperStart);
+    }
+    return _asyncBody ??= new BackendImpact(
+        staticUses: staticUses, instantiatedClasses: instantiantedClasses);
   }
 
   BackendImpact _syncStarBody;
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
index 4cd7014..44bc1a5 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
@@ -1949,12 +1949,15 @@
   }
 
   jsAst.Comment buildGeneratedBy() {
-    List<String> options = [];
-    if (_closedWorld.backendUsage.isMirrorsUsed) {
-      options.add('mirrors');
-    }
-    if (compiler.options.useContentSecurityPolicy) options.add("CSP");
-    return new jsAst.Comment(generatedBy(compiler, flavor: options.join(", ")));
+    StringBuffer flavor = new StringBuffer();
+    flavor.write(compiler.options.useKernel ? 'kernel FE' : 'ast FE');
+    if (compiler.options.strongMode) flavor.write(', strong');
+    if (compiler.options.trustPrimitives) flavor.write(', trust primitives');
+    if (compiler.options.trustTypeAnnotations) flavor.write(', trust types');
+    flavor.write(', full emitter');
+    if (compiler.options.useContentSecurityPolicy) flavor.write(', CSP');
+    if (_closedWorld.backendUsage.isMirrorsUsed) flavor.write(', mirrors');
+    return new jsAst.Comment(generatedBy(compiler, flavor: '$flavor'));
   }
 
   void outputDeferredMap() {
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 86f5d3d..0509d2e 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
@@ -228,10 +228,14 @@
 
   /// Generates a simple header that provides the compiler's build id.
   js.Comment buildGeneratedBy() {
-    String flavor = compiler.options.useContentSecurityPolicy
-        ? 'fast startup, CSP'
-        : 'fast startup';
-    return new js.Comment(generatedBy(compiler, flavor: flavor));
+    StringBuffer flavor = new StringBuffer();
+    flavor.write(compiler.options.useKernel ? 'kernel FE' : 'ast FE');
+    if (compiler.options.strongMode) flavor.write(', strong');
+    if (compiler.options.trustPrimitives) flavor.write(', trust primitives');
+    if (compiler.options.trustTypeAnnotations) flavor.write(', trust types');
+    flavor.write(', fast startup emitter');
+    if (compiler.options.useContentSecurityPolicy) flavor.write(', CSP');
+    return new js.Comment(generatedBy(compiler, flavor: '$flavor'));
   }
 
   /// Writes all deferred fragment's code into files.
diff --git a/pkg/compiler/lib/src/js_emitter/type_test_registry.dart b/pkg/compiler/lib/src/js_emitter/type_test_registry.dart
index 310092b..0e31b7c 100644
--- a/pkg/compiler/lib/src/js_emitter/type_test_registry.dart
+++ b/pkg/compiler/lib/src/js_emitter/type_test_registry.dart
@@ -25,14 +25,6 @@
   /// used for RTI.
   Set<ClassEntity> _rtiNeededClasses;
 
-  /// The required checks on classes.
-  // TODO(johnniwinther): Currently this is wrongfully computed twice. Once
-  // in [computeRequiredTypeChecks] and once in [computeRtiNeededClasses]. The
-  // former is stored in [RuntimeTypeChecks] and used in the
-  // [TypeRepresentationGenerator] and the latter is used to compute the
-  // classes needed for RTI.
-  TypeChecks _requiredChecks;
-
   final CodegenWorldBuilder _codegenWorldBuilder;
   final ClosedWorld _closedWorld;
 
@@ -57,14 +49,6 @@
     return _rtiNeededClasses;
   }
 
-  TypeChecks get requiredChecks {
-    assert(
-        _requiredChecks != null,
-        failedAt(NO_LOCATION_SPANNABLE,
-            "requiredChecks has not been computed yet."));
-    return _requiredChecks;
-  }
-
   /**
    * Returns the classes with constructors used as a 'holder' in
    * [emitRuntimeTypeSupport].
@@ -110,10 +94,8 @@
 
     // 2.  Add classes that are referenced by substitutions in object checks and
     //     their superclasses.
-    _requiredChecks = rtiSubstitutions.computeChecks(
-        rtiNeededClasses, rtiChecks.checkedClasses);
-    Set<ClassEntity> classesUsedInSubstitutions =
-        rtiSubstitutions.getClassesUsedInSubstitutions(requiredChecks);
+    Set<ClassEntity> classesUsedInSubstitutions = rtiSubstitutions
+        .getClassesUsedInSubstitutions(rtiChecks.requiredChecks);
     addClassesWithSuperclasses(classesUsedInSubstitutions);
 
     // 3.  Add classes that contain checked generic function types. These are
diff --git a/pkg/compiler/lib/src/js_model/elements.dart b/pkg/compiler/lib/src/js_model/elements.dart
index df8f603..d1792a6 100644
--- a/pkg/compiler/lib/src/js_model/elements.dart
+++ b/pkg/compiler/lib/src/js_model/elements.dart
@@ -170,6 +170,10 @@
     return createClass(library, cls.name, isAbstract: cls.isAbstract);
   }
 
+  TypedefEntity convertTypedef(LibraryEntity library, IndexedTypedef typedef) {
+    return createTypedef(library, typedef.name);
+  }
+
   MemberEntity convertMember(
       LibraryEntity library, ClassEntity cls, IndexedMember member) {
     Name memberName = new Name(member.memberName.text, library,
@@ -261,7 +265,8 @@
         visitList(type.optionalParameterTypes, converter),
         type.namedParameters,
         visitList(type.namedParameterTypes, converter),
-        type.typeVariables);
+        type.typeVariables,
+        visitTypedefType(type.typedefType, converter));
   }
 
   @override
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index 17b9935..6efd179 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -88,6 +88,7 @@
     Entity toBackendEntity(Entity entity) {
       if (entity is ClassEntity) return map.toBackendClass(entity);
       if (entity is MemberEntity) return map.toBackendMember(entity);
+      if (entity is TypedefEntity) return map.toBackendTypedef(entity);
       if (entity is TypeVariableEntity) {
         return map.toBackendTypeVariable(entity);
       }
@@ -683,6 +684,11 @@
       var args = type.typeArguments.map(_handleType).toList();
       return new InterfaceType(element, args);
     }
+    if (type is TypedefType) {
+      var element = toBackendEntity(type.element);
+      var args = type.typeArguments.map(_handleType).toList();
+      return new TypedefType(element, args);
+    }
 
     // TODO(redemption): handle other types.
     return type;
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 9e190de..f71d749 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -462,7 +462,7 @@
     }
 
     return new FunctionType(returnType, parameterTypes, optionalParameterTypes,
-        namedParameters, namedParameterTypes, typeVariables);
+        namedParameters, namedParameterTypes, typeVariables, null);
   }
 
   @override
@@ -592,10 +592,15 @@
             ..sort((a, b) => a.compareTo(b));
           List<DartType> namedParameterTypes =
               new List.filled(namedParameters.length, dynamic);
-          data.callType = new FunctionType(dynamic, requiredParameterTypes,
-              optionalParameterTypes, namedParameters, namedParameterTypes,
+          data.callType = new FunctionType(
+              dynamic,
+              requiredParameterTypes,
+              optionalParameterTypes,
+              namedParameters,
+              namedParameterTypes,
               // TODO(johnniwinther): Generate existential types here.
-              const <FunctionTypeVariable>[]);
+              const <FunctionTypeVariable>[],
+              null);
         } else {
           // The function type is not valid.
           data.callType = const DynamicType();
@@ -1650,6 +1655,10 @@
       }
       index++;
     }
+
+    DartType typedefType =
+        node.typedef == null ? null : elementMap.getTypedefType(node.typedef);
+
     FunctionType type = new FunctionType(
         visitType(node.returnType),
         visitTypes(node.positionalParameters
@@ -1660,7 +1669,8 @@
             .toList()),
         node.namedParameters.map((n) => n.name).toList(),
         node.namedParameters.map((n) => visitType(n.type)).toList(),
-        typeVariables ?? const <FunctionTypeVariable>[]);
+        typeVariables ?? const <FunctionTypeVariable>[],
+        typedefType);
     for (ir.TypeParameter typeParameter in node.typeParameters) {
       currentFunctionTypeParameters.remove(typeParameter);
     }
@@ -1880,7 +1890,7 @@
   @override
   bool isNamedMixinApplication(ClassEntity cls) {
     return elementMap._isMixinApplication(cls) &&
-        elementMap._isUnnamedMixinApplication(cls);
+        !elementMap._isUnnamedMixinApplication(cls);
   }
 
   @override
@@ -2073,6 +2083,10 @@
     return _backend._members.getEntity(member.memberIndex);
   }
 
+  TypedefEntity toBackendTypedef(covariant IndexedTypedef typedef) {
+    return _backend._typedefs.getEntity(typedef.typedefIndex);
+  }
+
   TypeVariableEntity toBackendTypeVariable(TypeVariableEntity typeVariable) {
     if (typeVariable is KLocalTypeVariable) {
       failedAt(
@@ -2134,6 +2148,25 @@
       _classMap[env.cls] = _classes.register(newClass, data.copy(), env);
       assert(newClass.classIndex == oldClass.classIndex);
     }
+    for (int typedefIndex = 0;
+        typedefIndex < _elementMap._typedefs.length;
+        typedefIndex++) {
+      IndexedTypedef oldTypedef = _elementMap._typedefs.getEntity(typedefIndex);
+      TypedefData data = _elementMap._typedefs.getData(oldTypedef);
+      IndexedLibrary oldLibrary = oldTypedef.library;
+      LibraryEntity newLibrary = _libraries.getEntity(oldLibrary.libraryIndex);
+      IndexedTypedef newTypedef = convertTypedef(newLibrary, oldTypedef);
+      _typedefMap[data.node] = _typedefs.register(
+          newTypedef,
+          new TypedefData(
+              data.node,
+              newTypedef,
+              new TypedefType(
+                  newTypedef,
+                  new List<DartType>.filled(
+                      data.node.typeParameters.length, const DynamicType()))));
+      assert(newTypedef.typedefIndex == oldTypedef.typedefIndex);
+    }
     for (int memberIndex = 0;
         memberIndex < _elementMap._members.length;
         memberIndex++) {
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index bdcd32a..ed2fb89 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -349,8 +349,8 @@
 
     int mixinMemberCount = 0;
     if (cls.mixedInClass != null) {
-      addFields(cls.mixedInClass, includeStatic: false);
-      addProcedures(cls.mixedInClass, includeStatic: false);
+      addFields(cls.mixedInClass.mixin, includeStatic: false);
+      addProcedures(cls.mixedInClass.mixin, includeStatic: false);
       mergeSort(members, compare: orderByFileOffset);
       mixinMemberCount = members.length;
     }
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 129af4d..db380bc 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -276,6 +276,9 @@
   /// Strip option used by dart2dart.
   final List<String> strips;
 
+  /// Whether to start `async` functions synchronously.
+  final bool startAsyncSynchronously;
+
   /// Create an options object by parsing flags from [options].
   factory CompilerOptions.parse(
       {Uri entryPoint,
@@ -356,6 +359,7 @@
         useMultiSourceInfo: _hasOption(options, Flags.useMultiSourceInfo),
         useNewSourceInfo: _hasOption(options, Flags.useNewSourceInfo),
         useStartupEmitter: _hasOption(options, Flags.fastStartup),
+        startAsyncSynchronously: _hasOption(options, Flags.syncAsync),
         verbose: _hasOption(options, Flags.verbose));
   }
 
@@ -421,6 +425,7 @@
       bool useMultiSourceInfo: false,
       bool useNewSourceInfo: false,
       bool useStartupEmitter: false,
+      bool startAsyncSynchronously: false,
       bool verbose: false}) {
     // TODO(sigmund): should entrypoint be here? should we validate it is not
     // null? In unittests we use the same compiler to analyze or build multiple
@@ -504,6 +509,7 @@
         useMultiSourceInfo: useMultiSourceInfo,
         useNewSourceInfo: useNewSourceInfo,
         useStartupEmitter: useStartupEmitter,
+        startAsyncSynchronously: startAsyncSynchronously,
         verbose: verbose);
   }
 
@@ -559,6 +565,7 @@
       this.useMultiSourceInfo: false,
       this.useNewSourceInfo: false,
       this.useStartupEmitter: false,
+      this.startAsyncSynchronously: false,
       this.verbose: false})
       : _shownPackageWarnings = shownPackageWarnings;
 
diff --git a/pkg/compiler/lib/src/resolution/members.dart b/pkg/compiler/lib/src/resolution/members.dart
index c2d433a..f920e3c 100644
--- a/pkg/compiler/lib/src/resolution/members.dart
+++ b/pkg/compiler/lib/src/resolution/members.dart
@@ -462,10 +462,7 @@
       parameterNodes = parameterNodes.tail;
     });
     addDeferredAction(enclosingElement, () {
-      // Use function.functionSignature instead of functionSignature because
-      // the signature may have changed.
-      // TODO(het): Fix this so we can use just 'functionSignature' here.
-      function.functionSignature.forEachOptionalParameter((_parameter) {
+      functionSignature.forEachOptionalParameter((_parameter) {
         ParameterElementX parameter = _parameter;
         parameter.constant =
             resolver.constantCompiler.compileConstant(parameter);
diff --git a/pkg/compiler/lib/src/resolution/resolution.dart b/pkg/compiler/lib/src/resolution/resolution.dart
index 4762bc11..ed4c280 100644
--- a/pkg/compiler/lib/src/resolution/resolution.dart
+++ b/pkg/compiler/lib/src/resolution/resolution.dart
@@ -589,6 +589,8 @@
   /// until after we finish resolving the current declaration.
   bool isResolvingTypeDeclaration = false;
 
+  bool isPostProcessingTypeDeclaration = false;
+
   /// Classes found in type annotations while resolving a type declaration.
   ///
   /// These are stored here so that they may be resolved after the original
@@ -621,13 +623,18 @@
                   .removeFirst()
                   .ensureResolved(resolution);
             }
-            while (pendingClassesToBePostProcessed.isNotEmpty) {
-              _postProcessClassElement(
-                  pendingClassesToBePostProcessed.removeFirst());
+            if (!isPostProcessingTypeDeclaration) {
+              isPostProcessingTypeDeclaration = true;
+              while (pendingClassesToBePostProcessed.isNotEmpty) {
+                _postProcessClassElement(
+                    pendingClassesToBePostProcessed.removeFirst());
+              }
+              isPostProcessingTypeDeclaration = false;
             }
           } while (pendingClassesToBeResolved.isNotEmpty);
           assert(pendingClassesToBeResolved.isEmpty);
-          assert(pendingClassesToBePostProcessed.isEmpty);
+          assert(pendingClassesToBePostProcessed.isEmpty ||
+              isPostProcessingTypeDeclaration);
         }
         return result;
       });
diff --git a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
index 0259a5f..cd60f2f 100644
--- a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
@@ -1232,10 +1232,6 @@
 
     var genericCall = _callHelper('generic(#)', [genericArgs]);
 
-    if (element.library.isDartAsync &&
-        (element.name == "Future" || element.name == "_Future")) {
-      genericCall = _callHelper('flattenFutures(#)', [genericCall]);
-    }
     var genericName = _emitTopLevelNameNoInterop(element, suffix: '\$');
     return js.statement('{ # = #; # = #(); }',
         [genericName, genericCall, _emitTopLevelName(element), genericName]);
@@ -2146,8 +2142,7 @@
           var type = _emitAnnotatedFunctionType(
               reifiedType, annotationNode?.metadata,
               parameters: annotationNode?.parameters?.parameters,
-              nameType: false,
-              definite: true);
+              nameType: false);
           var property = new JS.Property(_declareMemberName(method), type);
           if (method.isStatic) {
             staticMethods.add(property);
@@ -2209,8 +2204,7 @@
           var type = _emitAnnotatedFunctionType(
               reifiedType, annotationNode?.metadata,
               parameters: annotationNode?.parameters?.parameters,
-              nameType: false,
-              definite: true);
+              nameType: false);
 
           var property = new JS.Property(_declareMemberName(accessor), type);
           if (isStatic) {
@@ -2266,8 +2260,7 @@
           var type = _emitAnnotatedFunctionType(
               ctor.type, annotationNode?.metadata,
               parameters: annotationNode?.parameters?.parameters,
-              nameType: false,
-              definite: true);
+              nameType: false);
           constructors.add(new JS.Property(memberName, type));
         }
       }
@@ -2459,58 +2452,60 @@
   JS.Statement _initializeFields(List<VariableDeclaration> fieldDecls,
       [ConstructorDeclaration ctor]) {
     // Run field initializers if they can have side-effects.
-    var fields = new Map<FieldElement, JS.Expression>();
-    var unsetFields = new Map<FieldElement, VariableDeclaration>();
-    for (var fieldNode in fieldDecls) {
-      var element = fieldNode.element as FieldElement;
-      if (_constants.isFieldInitConstant(fieldNode)) {
-        unsetFields[element] = fieldNode;
-      } else {
-        fields[element] = _visitInitializer(fieldNode);
-      }
+    Set<FieldElement> ctorFields;
+    if (ctor != null) {
+      ctorFields = ctor.initializers
+          .map((c) => c is ConstructorFieldInitializer
+              ? c.fieldName.staticElement as FieldElement
+              : null)
+          .toSet()
+            ..remove(null);
     }
 
-    // Initialize fields from `this.fieldName` parameters.
+    var body = <JS.Statement>[];
+    emitFieldInit(FieldElement f, Expression initializer,
+        [AstNode sourceInfo]) {
+      var access =
+          _classProperties.virtualFields[f] ?? _declareMemberName(f.getter);
+      var jsInit = _visitInitializer(initializer, f);
+      body.add(jsInit
+          .toAssignExpression(js.call('this.#', [access])
+            ..sourceInformation = sourceInfo == null ? f : null)
+          .toStatement()
+            ..sourceInformation = sourceInfo);
+    }
+
+    for (var field in fieldDecls) {
+      var f = field.element;
+      if (f.isStatic) continue;
+      var init = field.initializer;
+      if (init == null ||
+          ctorFields != null &&
+              ctorFields.contains(f) &&
+              _constants.isFieldInitConstant(field)) {
+        continue;
+      }
+      emitFieldInit(f, init);
+    }
+
+    // Run constructor field initializers such as `: foo = bar.baz`
     if (ctor != null) {
       for (var p in ctor.parameters.parameters) {
         var element = p.element;
         if (element is FieldFormalParameterElement) {
-          fields[element.field] = _emitSimpleIdentifier(p.identifier);
+          emitFieldInit(element.field, p.identifier);
         }
       }
 
-      // Run constructor field initializers such as `: foo = bar.baz`
       for (var init in ctor.initializers) {
         if (init is ConstructorFieldInitializer) {
-          var element = init.fieldName.staticElement as FieldElement;
-          fields[element] = _visitAndMarkExpression(init.expression);
+          emitFieldInit(init.fieldName.staticElement, init.expression, init);
         } else if (init is AssertInitializer) {
-          throw new UnimplementedError(
-              'Assert initializers are not implemented. '
-              'See https://github.com/dart-lang/sdk/issues/27809');
+          body.add(_emitAssert(init.condition, init.message));
         }
       }
     }
 
-    for (var f in fields.keys) unsetFields.remove(f);
-
-    // Initialize all remaining fields
-    unsetFields.forEach((element, fieldNode) {
-      var value =
-          _visitExpression(fieldNode.initializer) ?? new JS.LiteralNull();
-      fields[element] = value..sourceInformation = fieldNode.initializer;
-    });
-
-    var body = <JS.Statement>[];
-    fields.forEach((FieldElement e, JS.Expression initialValue) {
-      JS.Expression access =
-          _classProperties.virtualFields[e] ?? _declareMemberName(e.getter);
-      body.add(initialValue
-          .toAssignExpression(
-              js.call('this.#', [access])..sourceInformation = e)
-          .toStatement());
-    });
-
     return JS.Statement.from(body);
   }
 
@@ -2725,8 +2720,8 @@
   bool _executesAtTopLevel(AstNode node) {
     var ancestor = node.getAncestor((n) =>
         n is FunctionBody ||
-        (n is FieldDeclaration && n.staticKeyword == null) ||
-        (n is ConstructorDeclaration && n.constKeyword == null));
+        n is FieldDeclaration && n.staticKeyword == null ||
+        n is ConstructorDeclaration && n.constKeyword == null);
     return ancestor == null;
   }
 
@@ -2747,12 +2742,8 @@
   JS.Expression _emitFunctionTagged(JS.Expression fn, DartType type,
       {topLevel: false}) {
     var lazy = topLevel && !_typeIsLoaded(type);
-    var typeRep = _emitFunctionType(type, definite: true);
-    if (lazy) {
-      return _callHelper('lazyFn(#, () => #)', [fn, typeRep]);
-    } else {
-      return _callHelper('fn(#, #)', [fn, typeRep]);
-    }
+    var typeRep = _emitFunctionType(type);
+    return _callHelper(lazy ? 'lazyFn(#, () => #)' : 'fn(#, #)', [fn, typeRep]);
   }
 
   /// Emits an arrow FunctionExpression node.
@@ -3214,9 +3205,7 @@
   /// Emit the pieces of a function type, as an array of return type,
   /// regular args, and optional/named args.
   JS.Expression _emitFunctionType(FunctionType type,
-      {List<FormalParameter> parameters,
-      bool nameType: true,
-      definite: false}) {
+      {List<FormalParameter> parameters, bool nameType: true}) {
     var parameterTypes = type.normalParameterTypes;
     var optionalTypes = type.optionalParameterTypes;
     var namedTypes = type.namedParameterTypes;
@@ -3255,27 +3244,25 @@
 
       typeParts = [addTypeFormalsAsParameters(typeParts)];
 
-      helperCall = definite ? 'gFnType(#)' : 'gFnTypeFuzzy(#)';
+      helperCall = 'gFnType(#)';
       // If any explicit bounds were passed, emit them.
       if (typeFormals.any((t) => t.bound != null)) {
         var bounds = typeFormals.map((t) => _emitType(t.type.bound)).toList();
         typeParts.add(addTypeFormalsAsParameters(bounds));
       }
     } else {
-      helperCall = definite ? 'fnType(#)' : 'fnTypeFuzzy(#)';
+      helperCall = 'fnType(#)';
     }
     fullType = _callHelper(helperCall, [typeParts]);
     if (!nameType) return fullType;
-    return _typeTable.nameType(type, fullType, definite: definite);
+    return _typeTable.nameType(type, fullType);
   }
 
   JS.Expression _emitAnnotatedFunctionType(
       FunctionType type, List<Annotation> metadata,
-      {List<FormalParameter> parameters,
-      bool nameType: true,
-      bool definite: false}) {
-    var result = _emitFunctionType(type,
-        parameters: parameters, nameType: nameType, definite: definite);
+      {List<FormalParameter> parameters, bool nameType: true}) {
+    var result =
+        _emitFunctionType(type, parameters: parameters, nameType: nameType);
     return _emitAnnotatedResult(result, metadata);
   }
 
@@ -3639,7 +3626,9 @@
       }
       if (targetType.isDartCoreFunction || targetType.isDynamic) {
         // TODO(vsm): Can a call method take generic type parameters?
-        return _emitDynamicInvoke(node, _visitExpression(target),
+        return _emitDynamicInvoke(
+            _visitExpression(target),
+            _emitInvokeTypeArguments(node),
             _emitArgumentList(node.argumentList));
       }
     }
@@ -3722,6 +3711,10 @@
 
     JS.Expression jsTarget = _emitTarget(target, element, isStatic);
     if (isDynamicInvoke(target) || isDynamicInvoke(node.methodName)) {
+      if (jsTarget is JS.Super) {
+        jsTarget = _emitTargetAccess(jsTarget, jsName, element);
+        return _emitDynamicInvoke(jsTarget, typeArgs, args);
+      }
       if (typeArgs != null) {
         return _callHelper('#(#, [#], #, #)', [
           _emitDynamicOperationName('dgsend'),
@@ -3748,9 +3741,8 @@
     return new JS.Call(jsTarget, args);
   }
 
-  JS.Expression _emitDynamicInvoke(
-      InvocationExpression node, JS.Expression fn, List<JS.Expression> args) {
-    var typeArgs = _emitInvokeTypeArguments(node);
+  JS.Expression _emitDynamicInvoke(JS.Expression fn,
+      List<JS.Expression> typeArgs, List<JS.Expression> args) {
     if (typeArgs != null) {
       return _callHelper('dgcall(#, [#], #)', [fn, typeArgs, args]);
     } else {
@@ -3822,10 +3814,10 @@
     }
     var fn = _visitExpression(function);
     var args = _emitArgumentList(node.argumentList);
-    if (isDynamicInvoke(function)) {
-      return _emitDynamicInvoke(node, fn, args);
-    }
     var typeArgs = _emitInvokeTypeArguments(node);
+    if (isDynamicInvoke(function)) {
+      return _emitDynamicInvoke(fn, typeArgs, args);
+    }
     if (typeArgs != null) args.insertAll(0, typeArgs);
     return new JS.Call(fn, args);
   }
@@ -4087,9 +4079,11 @@
       new JS.EmptyStatement();
 
   @override
-  JS.Statement visitAssertStatement(AssertStatement node) {
+  JS.Statement visitAssertStatement(AssertStatement node) =>
+      _emitAssert(node.condition, node.message);
+
+  JS.Statement _emitAssert(Expression condition, Expression message) {
     // TODO(jmesserly): only emit in checked mode.
-    var condition = node.condition;
     var conditionType = condition.staticType;
     var jsCondition = _visitExpression(condition);
 
@@ -4105,7 +4099,7 @@
     return js.statement(' if (!#) #.assertFailed(#);', [
       jsCondition,
       _runtimeModule,
-      node.message != null ? [_visitExpression(node.message)] : []
+      message != null ? [_visitExpression(message)] : []
     ]);
   }
 
@@ -4217,7 +4211,8 @@
     var name =
         new JS.Identifier(node.name.name, type: emitTypeRef(node.element.type))
           ..sourceInformation = node.name;
-    return new JS.VariableInitialization(name, _visitInitializer(node));
+    return new JS.VariableInitialization(
+        name, _visitInitializer(node.initializer, node.element));
   }
 
   /// Emits a list of top-level field.
@@ -4242,8 +4237,10 @@
           init is InstanceCreationExpression &&
               isSdkInternalRuntime(init.staticElement.library)) {
         _moduleItems.add(closureAnnotate(
-            js.statement('# = #;',
-                [_emitTopLevelName(field.element), _visitInitializer(field)]),
+            js.statement('# = #;', [
+              _emitTopLevelName(field.element),
+              _visitInitializer(field.initializer, field.element)
+            ]),
             field.element,
             field));
       } else {
@@ -4253,14 +4250,12 @@
     return lazyFields;
   }
 
-  JS.Expression _visitInitializer(VariableDeclaration node) {
-    var init = node.initializer;
+  JS.Expression _visitInitializer(Expression init, Element variable) {
     // explicitly initialize to null, to avoid getting `undefined`.
     // TODO(jmesserly): do this only for vars that aren't definitely assigned.
     if (init == null) return new JS.LiteralNull();
-    var value = _annotatedNullCheck(node.element)
-        ? notNull(init)
-        : _visitExpression(init);
+    var value =
+        _annotatedNullCheck(variable) ? notNull(init) : _visitExpression(init);
     return value..sourceInformation = init;
   }
 
@@ -4278,8 +4273,8 @@
       accessors.add(closureAnnotate(
           new JS.Method(
               access,
-              js.call('function() { return #; }', _visitInitializer(node))
-                  as JS.Fun,
+              js.call('function() { return #; }',
+                  _visitInitializer(node.initializer, node.element)) as JS.Fun,
               isGetter: true),
           _findAccessor(element, getter: true),
           node));
@@ -5595,7 +5590,7 @@
   @override
   JS.Expression visitListLiteral(ListLiteral node) {
     var elementType = (node.staticType as InterfaceType).typeArguments[0];
-    if (node.constKeyword == null) {
+    if (!node.isConst) {
       return _emitList(elementType, _visitExpressionList(node.elements));
     }
     return _cacheConst(
@@ -5633,7 +5628,7 @@
       return new JS.ArrayInitializer(entries);
     }
 
-    if (node.constKeyword == null) {
+    if (!node.isConst) {
       var mapType = _emitMapImplType(node.staticType);
       if (node.entries.isEmpty) {
         return js.call('new #.new()', [mapType]);
diff --git a/pkg/dev_compiler/lib/src/analyzer/context.dart b/pkg/dev_compiler/lib/src/analyzer/context.dart
index 8c6e135..12fb82d 100644
--- a/pkg/dev_compiler/lib/src/analyzer/context.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/context.dart
@@ -63,7 +63,9 @@
       String dartSdkSummaryPath,
       List<String> summaryPaths}) {
     var contextBuilderOptions = new ContextBuilderOptions()
-      ..defaultOptions = (new AnalysisOptionsImpl()..strongMode = true)
+      ..defaultOptions = (new AnalysisOptionsImpl()
+        ..strongMode = true
+        ..previewDart2 = true)
       ..dartSdkSummaryPath = dartSdkSummaryPath;
 
     return new AnalyzerOptions._(
@@ -76,6 +78,8 @@
       {String dartSdkSummaryPath, List<String> summaryPaths}) {
     var contextBuilderOptions = createContextBuilderOptions(args,
         strongMode: true, trackCacheDependencies: false);
+    (contextBuilderOptions.defaultOptions as AnalysisOptionsImpl).previewDart2 =
+        true;
 
     var dartSdkPath = args['dart-sdk'] ?? getSdkDir().path;
 
@@ -164,12 +168,13 @@
     {ResourceProvider resourceProvider}) {
   resourceProvider ??= PhysicalResourceProvider.INSTANCE;
   UriResolver packageResolver() {
-    ContextBuilderOptions builderOptions = new ContextBuilderOptions();
+    var builderOptions = new ContextBuilderOptions();
     if (options.packageRoot != null) {
       builderOptions.defaultPackagesDirectoryPath = options.packageRoot;
     }
-    ContextBuilder builder = new ContextBuilder(resourceProvider, null, null,
+    var builder = new ContextBuilder(resourceProvider, null, null,
         options: builderOptions);
+
     return new PackageMapUriResolver(resourceProvider,
         builder.convertPackagesToMap(builder.createPackageMap('')));
   }
diff --git a/pkg/dev_compiler/lib/src/compiler/type_utilities.dart b/pkg/dev_compiler/lib/src/compiler/type_utilities.dart
index 7c101ac..f497fc4 100644
--- a/pkg/dev_compiler/lib/src/compiler/type_utilities.dart
+++ b/pkg/dev_compiler/lib/src/compiler/type_utilities.dart
@@ -158,27 +158,20 @@
   /// Generator variable names for hoisted types.
   final _GeneratorTable _generators;
 
-  /// Generator variable names for hoisted definite function types.
-  final _GeneratorTable _definiteGenerators;
-
   /// Mapping from type parameters to the types which must have their
   /// cache/generator variables discharged at the binding site for the
   /// type variable since the type definition depends on the type
   /// parameter.
   final _scopeDependencies = <TypeParameterElement, List<DartType>>{};
 
-  TypeTable(JS.Identifier runtime)
-      : _generators = new _GeneratorTable(runtime),
-        _definiteGenerators = new _GeneratorTable(runtime);
+  TypeTable(JS.Identifier runtime) : _generators = new _GeneratorTable(runtime);
 
   /// Emit a list of statements declaring the cache variables and generator
   /// definitions tracked by the table.  If [formals] is present, only
   /// emit the definitions which depend on the formals.
   List<JS.Statement> discharge([List<TypeParameterElement> formals]) {
     var filter = formals?.expand((p) => _scopeDependencies[p] ?? <DartType>[]);
-    var stmts = [_generators, _definiteGenerators]
-        .expand((c) => c.discharge(filter))
-        .toList();
+    var stmts = [_generators].expand((c) => c.discharge(filter)).toList();
     formals?.forEach(_scopeDependencies.remove);
     return stmts;
   }
@@ -226,9 +219,8 @@
   /// The boolean parameter [definite] distinguishes between definite function
   /// types and other types (since the same DartType may have different
   /// representations as definite and indefinite function types).
-  JS.Expression nameType(DartType type, JS.Expression typeRep,
-      {bool definite: false}) {
-    var table = definite ? _definiteGenerators : _generators;
+  JS.Expression nameType(DartType type, JS.Expression typeRep) {
+    var table = _generators;
     if (!table.isNamed(type)) {
       if (recordScopeDependencies(type)) return typeRep;
     }
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 42d51ee..4f1c302 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -579,10 +579,6 @@
 
     var genericCall = _callHelper('generic(#)', [genericArgs]);
 
-    if (getLibrary(c) == coreTypes.asyncLibrary &&
-        (name == "Future" || name == "_Future")) {
-      genericCall = _callHelper('flattenFutures(#)', [genericCall]);
-    }
     var genericName = _emitTopLevelNameNoInterop(c, suffix: '\$');
     return js.statement('{ # = #; # = #(); }',
         [genericName, genericCall, _emitTopLevelName(c), genericName]);
@@ -1452,7 +1448,6 @@
   ///   4. initialize fields not covered in 1-3
   JS.Statement _initializeFields(List<Field> fields, [Constructor ctor]) {
     // Run field initializers if they can have side-effects.
-
     Set<Field> ctorFields;
     if (ctor != null) {
       ctorFields = ctor.initializers
@@ -1462,8 +1457,7 @@
     }
 
     var body = <JS.Statement>[];
-    emitFieldInit(Field f, Expression initializer,
-        [TreeNode sourceInfo = null]) {
+    emitFieldInit(Field f, Expression initializer, [TreeNode sourceInfo]) {
       var access = _classProperties.virtualFields[f] ?? _declareMemberName(f);
       var jsInit = _visitInitializer(initializer, f.annotations);
       body.add(jsInit
@@ -1482,7 +1476,7 @@
               _constants.isConstant(init)) {
         continue;
       }
-      emitFieldInit(f, f.initializer);
+      emitFieldInit(f, init);
     }
 
     // Run constructor field initializers such as `: foo = bar.baz`
@@ -1670,9 +1664,8 @@
     if (member.isGetter) return [];
 
     var enclosingClass = member.enclosingClass;
-    var superMember = (member.forwardingStubSuperTarget ??
-            member.forwardingStubInterfaceTarget)
-        ?.asMember;
+    var superMember = member.forwardingStubSuperTarget ??
+        member.forwardingStubInterfaceTarget;
 
     if (superMember == null) return [];
 
diff --git a/pkg/dev_compiler/tool/ddc b/pkg/dev_compiler/tool/ddc
index cc8f410..9846cd6 100755
--- a/pkg/dev_compiler/tool/ddc
+++ b/pkg/dev_compiler/tool/ddc
@@ -60,6 +60,12 @@
   shift
 fi
 
+SYNC_ASYNC=false
+if [ "$1" = "--sync-async" ]; then
+  SYNC_ASYNC=true
+  shift
+fi
+
 BASENAME=$( basename "${1%.*}")
 LIBROOT=$(cd $( dirname "${1%.*}") && pwd)
 
@@ -104,6 +110,7 @@
     let sdk = require(\"dart_sdk\");
     let main = require(\"./$BASENAME\").$BASENAME.main;
     sdk.dart.ignoreWhitelistedErrors(false);
+    if ($SYNC_ASYNC) sdk.dart.setStartAsyncSynchronously();
     try {
       sdk._isolate_helper.startRootIsolate(main, []);
     } catch(e) {
diff --git a/pkg/dev_compiler/tool/ddw b/pkg/dev_compiler/tool/ddw
index 9169c84..dfae2a2 100755
--- a/pkg/dev_compiler/tool/ddw
+++ b/pkg/dev_compiler/tool/ddw
@@ -1,7 +1,6 @@
 #!/bin/bash
 #
-# Compiles code with DDC and runs the resulting code in node.js with devtool,
-# an Electron-based debugger and browser environment.
+# Compiles code with DDC and runs the resulting code in node.js.
 #
 # The first script supplied should be the one with `main()`.
 #
@@ -9,7 +8,51 @@
 # inspection, modification or rerunning the code.
 set -e
 
-DDC_PATH=$( cd $( dirname "${BASH_SOURCE[0]}" )/.. && pwd )
+function follow_links() {
+  file="$1"
+  while [ -h "$file" ]; do
+    file="$(readlink "$file")"
+  done
+  echo "$file"
+}
+PROG_NAME="$(follow_links "$BASH_SOURCE")"
+SDK_DIR="$( cd "${PROG_NAME%/*}/../../.."; pwd -P)"
+
+if [[ `uname` == 'Darwin' ]];
+then
+  OUT_DIR="$SDK_DIR"/xcodebuild
+else
+  OUT_DIR="$SDK_DIR"/out
+fi
+
+if [ -z "$DART_CONFIGURATION" ];
+then
+  DIRS=$( ls "$OUT_DIR" )
+  # list of possible configurations in decreasing desirability
+  CONFIGS=("ReleaseX64" "ReleaseIA32" "DebugX64" "DebugIA32"
+    "ReleaseARM"    "ReleaseARM64"    "ReleaseARMV5TE"
+    "DebugARM"      "DebugARM64"      "DebugARMV5TE")
+  DART_CONFIGURATION="None"
+  for CONFIG in ${CONFIGS[*]}
+  do
+    for DIR in $DIRS;
+    do
+      if [ "$CONFIG" = "$DIR" ];
+      then
+        # choose most desirable configuration that is available and break
+        DART_CONFIGURATION="$DIR"
+        break 2
+      fi
+    done
+  done
+  if [ "$DART_CONFIGURATION" = "None" ]
+  then
+    echo "No valid dart configuration found in $OUT_DIR"
+    exit 1
+  fi
+fi
+
+GEN_DIR="$OUT_DIR"/"$DART_CONFIGURATION"/gen/utils/dartdevc
 
 KERNEL=false
 if [ "$1" = "-k" ]; then
@@ -20,21 +63,31 @@
 BASENAME=$( basename "${1%.*}")
 LIBROOT=$(cd $( dirname "${1%.*}") && pwd)
 
-# TODO(vsm): Change this to use the regular built version of the summaries
-# and the SDK.
-export NODE_PATH=$DDC_PATH/gen/sdk/common:$LIBROOT:$NODE_PATH
-
-# Build the SDK in a place where we can find it if it's not already there.
-if [ ! -e $DDC_PATH/gen/sdk/ddc_sdk.sum ]; then
-  $DDC_PATH/tool/build_sdk.sh
-fi
+export NODE_PATH=$GEN_DIR/js/common:$LIBROOT:$NODE_PATH
 
 if [ "$KERNEL" = true ]; then
-  dart -c $DDC_PATH/bin/dartdevk.dart --modules=node \
-      -o $BASENAME.js $*
+
+  if [ ! -e $GEN_DIR/kernel/ddc_sdk.dill ]; then
+    echo "DDC SDK must be built first, please run:"
+    echo "    pushd $SDKDIR"
+    echo "    ./tools/build.py -m release dartdevc_sdk_kernel_summary"
+    exit 1
+  fi
+
+  dart -c $SDK_DIR/pkg/dev_compiler/bin/dartdevk.dart --modules=node \
+      --dart-sdk-summary=$GEN_DIR/kernel/ddc_sdk.dill \
+      -o $LIBROOT/$BASENAME.js $*
 else
-  dart -c $DDC_PATH/bin/dartdevc.dart --modules=node --library-root=$LIBROOT \
-      --dart-sdk-summary=$DDC_PATH/gen/sdk/ddc_sdk.sum \
+
+  if [ ! -e $GEN_DIR/ddc_sdk.sum ]; then
+    echo "DDC SDK must be built first, please run:"
+    echo "    pushd $SDKDIR"
+    echo "    ./tools/build.py -m release dartdevc_sdk"
+    exit 1
+  fi
+
+  dart -c $SDK_DIR/pkg/dev_compiler/bin/dartdevc.dart --modules=node \
+      --library-root=$LIBROOT --dart-sdk-summary=$GEN_DIR/ddc_sdk.sum \
       -o $LIBROOT/$BASENAME.js $*
 fi
 
@@ -45,7 +98,7 @@
     const originalResolveFilename = Module._resolveFilename;
     Module._resolveFilename = function (request, parent, isMain) {
       let paths = parent.paths;
-      const ddcPath = \"$DDC_PATH/gen/sdk/common\";
+      const ddcPath = \"$GEN_DIR/js/common\";
       if (paths[0] != ddcPath) {
         paths.splice(0, 0, ddcPath, \"$LIBROOT\");
       }
@@ -53,6 +106,7 @@
     };
     let sdk = require(\"dart_sdk\");
     let main = require(\"$BASENAME\").$BASENAME.main;
+    sdk.dart.ignoreWhitelistedErrors(false);
     sdk._isolate_helper.startRootIsolate(main, []);" \
     > $LIBROOT/$BASENAME.run.js
 devtool $LIBROOT/$BASENAME.run.js
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/js/dart2js/js_dart2js.dart b/pkg/dev_compiler/tool/input_sdk/lib/js/dart2js/js_dart2js.dart
index 84479a9..1b1e938 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/js/dart2js/js_dart2js.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/js/dart2js/js_dart2js.dart
@@ -89,7 +89,6 @@
 
 import 'dart:collection' show HashMap, ListMixin;
 
-import 'dart:_interceptors' as _interceptors show JSArray;
 import 'dart:_js_helper' show Primitives;
 import 'dart:_foreign_helper' show JS;
 
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart
index d773cda..a4889fd 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart
@@ -17,6 +17,8 @@
 
 import 'dart:_foreign_helper' show JS, JSExportName;
 
+import 'dart:_runtime' as dart;
+
 typedef void _Callback();
 typedef void _TakeCallback(_Callback callback);
 
@@ -67,7 +69,7 @@
     onError = zone.registerUnaryCallback(onError);
   }
   var asyncFuture = new _Future<T>();
-  scheduleMicrotask(() {
+  var body = () {
     try {
       iter = JS('', '#[Symbol.iterator]()', initGenerator());
       var iteratorValue = JS('', '#.next(null)', iter);
@@ -97,9 +99,20 @@
         _Future._chainCoreFuture(onAwait(value), asyncFuture);
       }
     } catch (e, s) {
-      _completeWithErrorCallback(asyncFuture, e, s);
+      if (dart.startAsyncSynchronously) {
+        scheduleMicrotask(() {
+          _completeWithErrorCallback(asyncFuture, e, s);
+        });
+      } else {
+        _completeWithErrorCallback(asyncFuture, e, s);
+      }
     }
-  });
+  };
+  if (dart.startAsyncSynchronously) {
+    body();
+  } else {
+    scheduleMicrotask(body);
+  }
   return asyncFuture;
 }
 
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
index 4531ea6..c15d282 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
@@ -16,7 +16,8 @@
         NoInline,
         notNull,
         nullCheck,
-        Primitives;
+        Primitives,
+        quoteStringForRegExp;
 
 import 'dart:_runtime' as dart;
 
@@ -24,6 +25,8 @@
 
 import 'dart:_native_typed_data' show NativeUint8List;
 
+import 'dart:typed_data' show Endian, Uint8List, Uint16List;
+
 String _symbolToString(Symbol symbol) => _symbol_dev.Symbol.getName(symbol);
 
 @patch
@@ -157,6 +160,23 @@
 }
 
 @patch
+class BigInt implements Comparable<BigInt> {
+  @patch
+  static BigInt get zero => _BigIntImpl.zero;
+  @patch
+  static BigInt get one => _BigIntImpl.one;
+  @patch
+  static BigInt get two => _BigIntImpl.two;
+
+  @patch
+  static BigInt parse(String source, {int radix}) =>
+      _BigIntImpl.parse(source, radix: radix);
+
+  @patch
+  factory BigInt.from(num value) = _BigIntImpl.from;
+}
+
+@patch
 class Error {
   @patch
   static String _objectToString(Object object) {
@@ -480,6 +500,9 @@
           {bool multiLine: false, bool caseSensitive: true}) =>
       new JSSyntaxRegExp(source,
           multiLine: multiLine, caseSensitive: caseSensitive);
+
+  @patch
+  static String escape(String text) => quoteStringForRegExp(text);
 }
 
 // Patch for 'identical' function.
@@ -701,3 +724,2101 @@
 
   toString() => "Error: field '$_name' is already initialized.";
 }
+
+// TODO(jmesserly): The rest of this core_patch.dart source should reside in an
+// included part file instead of being inlined. However, part files are not
+// properly supported here.
+
+// 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;
+
+int _max(int a, int b) => a > b ? a : b;
+int _min(int a, int b) => a < b ? a : b;
+
+// 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 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/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart
index 43fc543..db047d4 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
@@ -15,17 +15,72 @@
 /// Returns a new type that mixes members from base and the mixin.
 ///
 /// The mixin must be non-generic; generic mixins are handled by [genericMixin].
-mixinMembers(to, from) {
+void mixinMembers(to, from) {
   JS('', '#[#] = #', to, _mixin, from);
   var toProto = JS('', '#.prototype', to);
   var fromProto = JS('', '#.prototype', from);
-  copyProperties(toProto, fromProto);
+  _copyMembers(toProto, fromProto);
   copySignature(to, from, _methodSig);
   copySignature(to, from, _fieldSig);
   copySignature(to, from, _getterSig);
   copySignature(to, from, _setterSig);
 }
 
+void _copyMembers(to, from) {
+  var names = getOwnNamesAndSymbols(from);
+  for (var i = 0, n = JS('int', '#.length', names); i < n; ++i) {
+    var name = JS('', '#[#]', names, i);
+    if (name == 'constructor') continue;
+    _copyMember(to, from, name);
+  }
+  return to;
+}
+
+void _copyMember(to, from, name) {
+  var desc = getOwnPropertyDescriptor(from, name);
+  if (JS('bool', '# == Symbol.iterator', name)) {
+    // On native types, Symbol.iterator may already be present.
+    // TODO(jmesserly): investigate if we still need this.
+    // If so, we need to find a better solution.
+    // See https://github.com/dart-lang/sdk/issues/28324
+    var existing = getOwnPropertyDescriptor(to, name);
+    if (existing != null) {
+      if (JS('bool', '#.writable', existing)) {
+        JS('', '#[#] = #.value', to, name, desc);
+      }
+      return;
+    }
+  }
+  var getter = JS('', '#.get', desc);
+  var setter = JS('', '#.set', desc);
+  if (getter != null) {
+    if (setter == null) {
+      var obj = JS(
+          '',
+          '#.set = { __proto__: #.__proto__, '
+          'set [#](x) { return super[#] = x; } }',
+          desc,
+          to,
+          name,
+          name);
+      JS('', '#.set = #.set', desc, getOwnPropertyDescriptor(obj, name));
+    }
+  } else if (setter != null) {
+    if (getter == null) {
+      var obj = JS(
+          '',
+          '#.get = { __proto__: #.__proto__, '
+          'get [#]() { return super[#]; } }',
+          desc,
+          to,
+          name,
+          name);
+      JS('', '#.get = #.get', desc, getOwnPropertyDescriptor(obj, name));
+    }
+  }
+  defineProperty(to, name, desc);
+}
+
 void copySignature(to, from, signatureField) {
   defineLazyField(
       to,
@@ -58,24 +113,6 @@
 
 final mixinNew = JS('', 'Symbol("dart.mixinNew")');
 
-/// Wrap a generic class builder function with future flattening.
-flattenFutures(builder) => JS('', '''(() => {
-  function flatten(T) {
-    if (!T) return $builder($dynamic);
-    let futureClass = $getGenericClass($Future);
-    //TODO(leafp): This only handles the direct flattening case.
-    // It would probably be good to at least search up the class
-    // hierarchy.  If we keep doing flattening long term, we may
-    // want to implement the full future flattening per spec.
-    if ($getGenericClass(T) == futureClass) {
-      let args = $getGenericArgs(T);
-      if (args) return $builder(args[0]);
-    }
-    return $builder(T);
-  }
-  return flatten;
-})()''');
-
 /// Memoize a generic type constructor function.
 generic(typeConstructor, setBaseClass) => JS('', '''(() => {
   let length = $typeConstructor.length;
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 dc2d82e..d8f20d7 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
@@ -11,6 +11,12 @@
 /// stepping stone for proposed ES7 async/await, and uses ES6 Promises.
 part of dart._runtime;
 
+// TODO(vsm): Remove once this flag is the default.
+bool startAsyncSynchronously = false;
+void setStartAsyncSynchronously() {
+  startAsyncSynchronously = true;
+}
+
 final _jsIterator = JS('', 'Symbol("_jsIterator")');
 final _current = JS('', 'Symbol("_current")');
 
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
index edf399b..1d7790c 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
@@ -439,10 +439,7 @@
     if (!!$isSubtype(type, $Iterable) && !!$isSubtype(actual, $Iterable) ||
         !!$isSubtype(type, $Future) && !!$isSubtype(actual, $Future) ||
         !!$isSubtype(type, $Map) && !!$isSubtype(actual, $Map) ||
-        $_isFunctionType(type) && $_isFunctionType(actual) ||
-        !!$isSubtype(type, $Stream) && !!$isSubtype(actual, $Stream) ||
-        !!$isSubtype(type, $StreamSubscription) &&
-        !!$isSubtype(actual, $StreamSubscription)) {
+        !!$isSubtype(type, $Stream) && !!$isSubtype(actual, $Stream)) {
       console.warn('Ignoring cast fail from ' + $typeName(actual) +
                    ' to ' + $typeName(type));
       return true;
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
index 6d982be..50c35e1 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
@@ -25,7 +25,8 @@
         JsLinkedHashMap,
         ImmutableMap,
         PrivateSymbol,
-        ReifyFunctionTypes;
+        ReifyFunctionTypes,
+        NoReifyGeneric;
 import 'dart:_debugger' show trackCall;
 
 export 'dart:_debugger'
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 8274bdd..08464ee 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
@@ -227,7 +227,8 @@
 /// index path (if present) is the canonical function type.
 final List _fnTypeSmallMap = JS('', '[new Map(), new Map(), new Map()]');
 
-_memoizeArray(map, arr, create) => JS('', '''(() => {
+@NoReifyGeneric()
+T _memoizeArray<T>(map, arr, T create()) => JS('', '''(() => {
   let len = $arr.length;
   $map = $_lookupNonTerminal($map, len);
   for (var i = 0; i < len-1; ++i) {
@@ -239,41 +240,20 @@
   return result;
 })()''');
 
-// Map dynamic to bottom. If meta-data is present,
-// we slice off the remaining meta-data and make
-// it the second element of a packet for processing
-// later on in the constructor.
-_normalizeParameter(a) => JS('', '''(() => {
-  if ($a instanceof Array) {
-    let result = [];
-    result.push(($a[0] == $dynamic) ? $bottom : $a[0]);
-    result.push($a.slice(1));
-    return result;
-  }
-  return ($a == $dynamic) ? $bottom : $a;
-})()''');
-
-List _canonicalizeArray(definite, array, map) => JS('', '''(() => {
-  let arr = ($definite)
-     ? $array
-     : $array.map($_normalizeParameter);
-  return $_memoizeArray($map, arr, () => arr);
-})()''');
+List _canonicalizeArray(List array, map) =>
+    _memoizeArray(map, array, () => array);
 
 // TODO(leafp): This only canonicalizes of the names are
 // emitted in a consistent order.
-_canonicalizeNamed(definite, named, map) => JS('', '''(() => {
+_canonicalizeNamed(named, map) => JS('', '''(() => {
   let key = [];
   let names = $getOwnPropertyNames($named);
-  let r = {};
   for (var i = 0; i < names.length; ++i) {
     let name = names[i];
     let type = $named[name];
-    if (!definite) r[name] = type = $_normalizeParameter(type);
     key.push(name);
     key.push(type);
   }
-  if (!$definite) $named = r;
   return $_memoizeArray($map, key, () => $named);
 })()''');
 
@@ -287,16 +267,15 @@
 // TODO(leafp): This handles some low hanging fruit, but
 // really we should make all of this faster, and also
 // handle more cases here.
-_createSmall(count, definite, returnType, required) => JS('', '''(() => {
-  let map = $_fnTypeSmallMap[$count];
-  let args = ($definite) ? $required
-    : $required.map($_normalizeParameter);
-  for (var i = 0; i < $count; ++i) {
-    map = $_lookupNonTerminal(map, args[i]);
+FunctionType _createSmall(returnType, List required) => JS('', '''(() => {
+  let count = $required.length;
+  let map = $_fnTypeSmallMap[count];
+  for (var i = 0; i < count; ++i) {
+    map = $_lookupNonTerminal(map, $required[i]);
  }
  let result = map.get($returnType);
  if (result !== void 0) return result;
- result = new $FunctionType.new($returnType, args, [], {});
+ result = ${new FunctionType(returnType, required, [], JS('', '{}'))};
  map.set($returnType, result);
  return result;
 })()''');
@@ -311,14 +290,7 @@
   String _stringValue;
 
   /**
-   * Construct a function type. There are two arrow constructors,
-   * distinguished by the "definite" flag.
-   *
-   * The fuzzy arrow (definite is false) treats any arguments
-   * of type dynamic as having type bottom, and will always be
-   * called with a dynamic invoke.
-   *
-   * The definite arrow (definite is true) leaves arguments unchanged.
+   * Construct a function type.
    *
    * We eagerly normalize the argument types to avoid having to deal with
    * this logic in multiple places.
@@ -327,28 +299,29 @@
    * that all instances will share.
    *
    */
-  static create(definite, returnType, List args, extra) {
+  static FunctionType create(returnType, List args, extra) {
     // Note that if extra is ever passed as an empty array
     // or an empty map, we can end up with semantically
     // identical function types that don't canonicalize
     // to the same object since we won't fall into this
     // fast path.
     if (extra == null && JS('bool', '#.length < 3', args)) {
-      return _createSmall(JS('', '#.length', args), definite, returnType, args);
+      return _createSmall(returnType, args);
     }
-    args = _canonicalizeArray(definite, args, _fnTypeArrayArgMap);
+    args = _canonicalizeArray(args, _fnTypeArrayArgMap);
     var keys;
-    var create;
+    FunctionType Function() create;
     if (extra == null) {
       keys = [returnType, args];
       create = () => new FunctionType(returnType, args, [], JS('', '{}'));
     } else if (JS('bool', '# instanceof Array', extra)) {
-      var optionals = _canonicalizeArray(definite, extra, _fnTypeArrayArgMap);
+      var optionals =
+          _canonicalizeArray(JS('', '#', extra), _fnTypeArrayArgMap);
       keys = [returnType, args, optionals];
       create =
           () => new FunctionType(returnType, args, optionals, JS('', '{}'));
     } else {
-      var named = _canonicalizeNamed(definite, extra, _fnTypeNamedArgMap);
+      var named = _canonicalizeNamed(extra, _fnTypeNamedArgMap);
       keys = [returnType, args, named];
       create = () => new FunctionType(returnType, args, [], named);
     }
@@ -509,14 +482,12 @@
 }
 
 class GenericFunctionType extends AbstractFunctionType {
-  final bool definite;
   final _instantiateTypeParts;
   final int formalCount;
   final _instantiateTypeBounds;
   List<TypeVariable> _typeFormals;
 
-  GenericFunctionType(
-      this.definite, instantiateTypeParts, this._instantiateTypeBounds)
+  GenericFunctionType(instantiateTypeParts, this._instantiateTypeBounds)
       : _instantiateTypeParts = instantiateTypeParts,
         formalCount = JS('int', '#.length', instantiateTypeParts);
 
@@ -555,10 +526,10 @@
     }
   }
 
-  instantiate(typeArgs) {
+  FunctionType instantiate(typeArgs) {
     var parts = JS('', '#.apply(null, #)', _instantiateTypeParts, typeArgs);
-    return JS('', '#.create(#, #[0], #[1], #[2])', FunctionType, definite,
-        parts, parts, parts);
+    return FunctionType.create(
+        JS('', '#[0]', parts), JS('', '#[1]', parts), JS('', '#[2]', parts));
   }
 
   List instantiateTypeBounds(List typeArgs) {
@@ -690,22 +661,14 @@
   }
 }
 
-typedef(name, AbstractFunctionType Function() closure) =>
+Typedef typedef(name, AbstractFunctionType Function() closure) =>
     new Typedef(name, closure);
 
-/// Create a definite function type.
-///
-/// No substitution of dynamic for bottom occurs.
-fnType(returnType, List args, [extra = undefined]) =>
-    FunctionType.create(true, returnType, args, extra);
+/// Create a function type.
+FunctionType fnType(returnType, List args, [extra = undefined]) =>
+    FunctionType.create(returnType, args, extra);
 
-/// Create a "fuzzy" function type.
-///
-/// If any arguments are dynamic they will be replaced with bottom.
-fnTypeFuzzy(returnType, List args, [extra = undefined]) =>
-    FunctionType.create(false, returnType, args, extra);
-
-/// Creates a definite generic function type.
+/// Creates a generic function type.
 ///
 /// A function type consists of two things: an instantiate function, and an
 /// function that returns a list of upper bound constraints for each
@@ -716,10 +679,7 @@
 /// For example given the type <T extends Iterable<T>>(T) -> T, we can declare
 /// this type with `gFnType(T => [T, [T]], T => [Iterable$(T)])`.\
 gFnType(instantiateFn, typeBounds) =>
-    new GenericFunctionType(true, instantiateFn, typeBounds);
-
-gFnTypeFuzzy(instantiateFn, typeBounds) =>
-    new GenericFunctionType(false, instantiateFn, typeBounds);
+    new GenericFunctionType(instantiateFn, typeBounds);
 
 /// TODO(vsm): Remove when mirrors is deprecated.
 /// This is a temporary workaround to support dart:mirrors, which doesn't
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 4adfd4f..2a7689e 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
@@ -95,12 +95,12 @@
   static int parseInt(
       @nullCheck String source, int _radix, int handleError(String source)) {
     var re = JS('', r'/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i');
-    var/*=JSArray<String>*/ match =
-        JS('JSExtendableArray|Null', '#.exec(#)', re, source);
+    // TODO(jmesserly): this isn't reified List<String>, but it's safe to use as
+    // long as we use it locally and don't expose it to user code.
+    List<String> match = JS('', '#.exec(#)', re, source);
     int digitsIndex = 1;
     int hexIndex = 2;
     int decimalIndex = 3;
-    int nonDecimalHexIndex = 4;
     if (match == null) {
       // TODO(sra): It might be that the match failed due to unrecognized U+0085
       // spaces.  We could replace them with U+0020 spaces and try matching
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 e01387f..aac0185 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
@@ -15,9 +15,11 @@
 import 'compiler_options.dart' show CompilerOptions;
 
 abstract class IncrementalKernelGenerator {
-  factory IncrementalKernelGenerator(CompilerOptions options, Uri entryPoint) {
-    return new IncrementalCompiler(new CompilerContext(
-        new ProcessedOptions(options, false, [entryPoint])));
+  factory IncrementalKernelGenerator(CompilerOptions options, Uri entryPoint,
+      [Uri bootstrapDill]) {
+    return new IncrementalCompiler(
+        new CompilerContext(new ProcessedOptions(options, false, [entryPoint])),
+        bootstrapDill);
   }
 
   /// Returns a component (nee program) whose libraries are the recompiled
diff --git a/pkg/front_end/lib/src/fasta/builder/load_library_builder.dart b/pkg/front_end/lib/src/fasta/builder/load_library_builder.dart
index 85234f3..c2365ca 100644
--- a/pkg/front_end/lib/src/fasta/builder/load_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/load_library_builder.dart
@@ -41,7 +41,7 @@
     String prefix = expression.import.name;
     tearoff = new Procedure(new Name('__loadLibrary_$prefix', parent.target),
         ProcedureKind.Method, new FunctionNode(new ReturnStatement(expression)),
-        fileUri: parent.target.fileUri)
+        fileUri: parent.target.fileUri, isStatic: true)
       ..fileOffset = charOffset;
     return tearoff;
   }
diff --git a/pkg/front_end/lib/src/fasta/builder_graph.dart b/pkg/front_end/lib/src/fasta/builder_graph.dart
new file mode 100644
index 0000000..9f77242
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/builder_graph.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.builder_graph;
+
+import 'builder/builder.dart' show LibraryBuilder;
+
+import 'export.dart' show Export;
+
+import 'graph/graph.dart' show Graph;
+
+import 'import.dart' show Import;
+
+import 'dill/dill_library_builder.dart' show DillLibraryBuilder;
+
+import 'source/source_library_builder.dart' show SourceLibraryBuilder;
+
+class BuilderGraph implements Graph<Uri> {
+  final Map<Uri, LibraryBuilder> builders;
+
+  BuilderGraph(this.builders);
+
+  Iterable<Uri> get vertices => builders.keys;
+
+  Iterable<Uri> neighborsOf(Uri vertex) sync* {
+    LibraryBuilder library = builders[vertex];
+    if (library == null) {
+      throw "Library not found: $vertex";
+    }
+    if (library is SourceLibraryBuilder) {
+      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;
+        }
+      }
+    } else if (library is DillLibraryBuilder) {
+      // Imports and exports
+      for (var dependency in library.library.dependencies) {
+        var uriString;
+        if (dependency.importedLibraryReference.node != null) {
+          uriString = '${dependency.targetLibrary.importUri}';
+        } else {
+          uriString =
+              '${dependency.importedLibraryReference.canonicalName.name}';
+        }
+        Uri uri = Uri.parse(uriString);
+        if (builders.containsKey(uri)) {
+          yield uri;
+        }
+      }
+
+      // Parts
+      for (var part in library.library.parts) {
+        Uri uri = part.fileUri;
+        if (builders.containsKey(uri)) {
+          yield 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 72eb2b1..34ce204 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -226,6 +226,18 @@
     message: r"""'await' can only be used in 'async' or 'async*' methods.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeBreakOutsideOfLoop = messageBreakOutsideOfLoop;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageBreakOutsideOfLoop = const MessageCode(
+    "BreakOutsideOfLoop",
+    analyzerCode: "BREAK_OUTSIDE_OF_LOOP",
+    dart2jsCode: "*ignored*",
+    message:
+        r"""A break statement can't be used outside of a loop or switch statement.""",
+    tip: r"""Try removing the break statement.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Token token)> templateBuiltInIdentifierAsType =
     const Template<Message Function(Token token)>(
         messageTemplate:
@@ -765,6 +777,32 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeContinueOutsideOfLoop = messageContinueOutsideOfLoop;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageContinueOutsideOfLoop = const MessageCode(
+    "ContinueOutsideOfLoop",
+    analyzerCode: "CONTINUE_OUTSIDE_OF_LOOP",
+    dart2jsCode: "*ignored*",
+    message:
+        r"""A continue statement can't be used outside of a loop or switch statement.""",
+    tip: r"""Try removing the continue statement.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeContinueWithoutLabelInCase =
+    messageContinueWithoutLabelInCase;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageContinueWithoutLabelInCase = const MessageCode(
+    "ContinueWithoutLabelInCase",
+    analyzerCode: "CONTINUE_WITHOUT_LABEL_IN_CASE",
+    dart2jsCode: "*ignored*",
+    message:
+        r"""A continue statement in a switch statement must have a label as a target.""",
+    tip:
+        r"""Try adding a label associated with one of the case clauses to the continue statement.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string, String string2)>
     templateCouldNotParseUri =
     const Template<Message Function(String string, String string2)>(
@@ -934,6 +972,42 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
+    Message Function(
+        DartType _type,
+        String
+            name)> templateDeferredTypeAnnotation = const Template<
+        Message Function(DartType _type, String name)>(
+    messageTemplate:
+        r"""The type '#type' is deferred loaded via prefix '#name' and can't be used as a type annotation.""",
+    tipTemplate:
+        r"""Try removing 'deferred' from the import of '#name' or use a supertype of '#type' that isn't deferred.""",
+    withArguments: _withArgumentsDeferredTypeAnnotation);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(DartType _type, String name)>
+    codeDeferredTypeAnnotation =
+    const Code<Message Function(DartType _type, String name)>(
+        "DeferredTypeAnnotation", templateDeferredTypeAnnotation,
+        analyzerCode: "TYPE_ANNOTATION_DEFERRED_CLASS",
+        dart2jsCode: "*fatal*",
+        severity: Severity.errorLegacyWarning);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsDeferredTypeAnnotation(DartType _type, String name) {
+  NameSystem nameSystem = new NameSystem();
+  StringBuffer buffer = new StringBuffer();
+  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
+  String type = '$buffer';
+
+  return new Message(codeDeferredTypeAnnotation,
+      message:
+          """The type '$type' is deferred loaded via prefix '$name' and can't be used as a type annotation.""",
+      tip: """Try removing 'deferred' from the import of '$name' or use a supertype of '$type' that isn't deferred.""",
+      arguments: {'type': _type, 'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
         Message Function(int count, int count2, String string, String string2,
             String string3)> templateDillOutlineSummary =
     const Template<
@@ -1805,7 +1879,7 @@
 const MessageCode messageFactoryTopLevelDeclaration = const MessageCode(
     "FactoryTopLevelDeclaration",
     analyzerCode: "FACTORY_TOP_LEVEL_DECLARATION",
-    dart2jsCode: "*ignored*",
+    dart2jsCode: "*fatal*",
     message: r"""Top-level declarations can't be declared to be 'factory'.""",
     tip: r"""Try removing the keyword 'factory'.""");
 
@@ -2231,9 +2305,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(Token token)> codeIntegerLiteralIsOutOfRange =
     const Code<Message Function(Token token)>(
-  "IntegerLiteralIsOutOfRange",
-  templateIntegerLiteralIsOutOfRange,
-);
+        "IntegerLiteralIsOutOfRange", templateIntegerLiteralIsOutOfRange,
+        analyzerCode: "INTEGER_LITERAL_OUT_OF_RANGE", dart2jsCode: "*fatal*");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsIntegerLiteralIsOutOfRange(Token token) {
@@ -4690,7 +4763,7 @@
 const MessageCode messageTopLevelOperator = const MessageCode(
     "TopLevelOperator",
     analyzerCode: "TOP_LEVEL_OPERATOR",
-    dart2jsCode: "*ignored*",
+    dart2jsCode: "*fatal*",
     message: r"""Operators must be declared within a class.""",
     tip:
         r"""Try removing the operator, moving it to a class, or converting it to be a function.""");
@@ -4963,16 +5036,6 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Null> codeUnimplementedBoundsOnTypeVariables =
-    messageUnimplementedBoundsOnTypeVariables;
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageUnimplementedBoundsOnTypeVariables = const MessageCode(
-    "UnimplementedBoundsOnTypeVariables",
-    severity: Severity.warning,
-    message: r"""Unimplemented bounds on type variables.""");
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string, Token token)>
     templateUnmatchedToken =
     const Template<Message Function(String string, Token token)>(
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 2c8d581..70e3a76 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -7,23 +7,27 @@
 import 'dart:async' show Future;
 
 import 'package:kernel/kernel.dart'
-    show Library, Program, Source, loadProgramFromBytes;
+    show loadProgramFromBytes, Library, Procedure, Program, Source;
 
 import '../api_prototype/incremental_kernel_generator.dart'
     show IncrementalKernelGenerator;
 
+import '../api_prototype/file_system.dart' show FileSystemEntity;
+
 import 'builder/builder.dart' show LibraryBuilder;
 
+import 'builder_graph.dart' show BuilderGraph;
+
+import 'compiler_context.dart' show CompilerContext;
+
+import 'dill/dill_library_builder.dart' show DillLibraryBuilder;
+
 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 'ticker.dart' show Ticker;
 
 import 'uri_translator.dart' show UriTranslator;
@@ -35,31 +39,90 @@
 
   List<Uri> invalidatedUris = <Uri>[];
 
-  DillTarget platform;
+  DillTarget dillLoadedData;
+  List<LibraryBuilder> platformBuilders;
+  Map<Uri, LibraryBuilder> userBuilders;
+  final Uri bootstrapDill;
+  bool bootstrapSuccess = false;
 
   KernelTarget userCode;
 
-  IncrementalCompiler(this.context) : ticker = context.options.ticker;
+  IncrementalCompiler(this.context, [this.bootstrapDill])
+      : ticker = context.options.ticker;
 
   @override
   Future<Program> computeDelta({Uri entryPoint}) async {
     ticker.reset();
     entryPoint ??= context.options.inputs.single;
     return context.runInContext<Future<Program>>((CompilerContext c) async {
-      if (platform == null) {
+      bool includeUserLoadedLibraries = false;
+      Map<Uri, Source> uriToSource = {};
+      Map<Uri, int> importUriToOrder = {};
+      Procedure userLoadedUriMain;
+      bootstrapSuccess = false;
+      if (dillLoadedData == null) {
         UriTranslator uriTranslator = await c.options.getUriTranslator();
         ticker.logMs("Read packages file");
 
-        platform = new DillTarget(ticker, uriTranslator, c.options.target);
-        List<int> bytes = await c.options.loadSdkSummaryBytes();
-        if (bytes != null) {
+        dillLoadedData =
+            new DillTarget(ticker, uriTranslator, c.options.target);
+        List<int> summaryBytes = await c.options.loadSdkSummaryBytes();
+        int bytesLength = 0;
+        Program program;
+        if (summaryBytes != null) {
           ticker.logMs("Read ${c.options.sdkSummary}");
-          Program program = loadProgramFromBytes(bytes);
+          program = loadProgramFromBytes(summaryBytes);
           ticker.logMs("Deserialized ${c.options.sdkSummary}");
-          platform.loader.appendLibraries(program, byteCount: bytes.length);
-          ticker.logMs("Appended libraries");
+          bytesLength += summaryBytes.length;
         }
-        await platform.buildOutlines();
+
+        if (bootstrapDill != null) {
+          FileSystemEntity entity =
+              c.options.fileSystem.entityForUri(bootstrapDill);
+          if (await entity.exists()) {
+            List<int> bootstrapBytes = await entity.readAsBytes();
+            if (bootstrapBytes != null) {
+              Set<Uri> prevLibraryUris = new Set<Uri>.from(
+                  program.libraries.map((Library lib) => lib.importUri));
+              ticker.logMs("Read $bootstrapDill");
+              bool bootstrapFailed = false;
+              try {
+                loadProgramFromBytes(bootstrapBytes, program);
+              } catch (e) {
+                bootstrapFailed = true;
+                program = loadProgramFromBytes(summaryBytes);
+              }
+              if (!bootstrapFailed) {
+                bootstrapSuccess = true;
+                bytesLength += bootstrapBytes.length;
+                for (Library lib in program.libraries) {
+                  if (prevLibraryUris.contains(lib.importUri)) continue;
+                  importUriToOrder[lib.importUri] = importUriToOrder.length;
+                }
+                userLoadedUriMain = program.mainMethod;
+                includeUserLoadedLibraries = true;
+                uriToSource.addAll(program.uriToSource);
+              }
+            }
+          }
+        }
+        summaryBytes = null;
+        if (program != null) {
+          dillLoadedData.loader
+              .appendLibraries(program, byteCount: bytesLength);
+        }
+        ticker.logMs("Appended libraries");
+        await dillLoadedData.buildOutlines();
+        userBuilders = <Uri, LibraryBuilder>{};
+        platformBuilders = <LibraryBuilder>[];
+        dillLoadedData.loader.builders.forEach((uri, builder) {
+          if (builder.fileUri.scheme == "dart") {
+            platformBuilders.add(builder);
+          } else {
+            userBuilders[uri] = builder;
+          }
+        });
+        if (userBuilders.isEmpty) userBuilders = null;
       }
 
       List<Uri> invalidatedUris = this.invalidatedUris.toList();
@@ -67,16 +130,21 @@
 
       List<LibraryBuilder> reusedLibraries =
           computeReusedLibraries(invalidatedUris);
+      Set<Uri> reusedLibraryUris =
+          new Set<Uri>.from(reusedLibraries.map((b) => b.uri));
+      for (Uri uri in new Set<Uri>.from(dillLoadedData.loader.builders.keys)
+        ..removeAll(reusedLibraryUris)) {
+        dillLoadedData.loader.builders.remove(uri);
+      }
+
       if (userCode != null) {
         ticker.logMs("Decided to reuse ${reusedLibraries.length}"
             " of ${userCode.loader.builders.length} libraries");
       }
 
-      platform.loader.builders.forEach((Uri uri, LibraryBuilder builder) {
-        reusedLibraries.add(builder);
-      });
+      reusedLibraries.addAll(platformBuilders);
       userCode = new KernelTarget(
-          c.fileSystem, false, platform, platform.uriTranslator,
+          c.fileSystem, false, dillLoadedData, dillLoadedData.uriTranslator,
           uriToSource: c.uriToSource);
       for (LibraryBuilder library in reusedLibraries) {
         userCode.loader.builders[library.uri] = library;
@@ -94,16 +162,45 @@
       Program programWithDill =
           await userCode.buildProgram(verify: c.options.verify);
 
+      List<Library> libraries =
+          new List<Library>.from(userCode.loader.libraries);
+      uriToSource.addAll(userCode.uriToSource);
+      if (includeUserLoadedLibraries) {
+        for (LibraryBuilder library in reusedLibraries) {
+          if (library.fileUri.scheme == "dart") continue;
+          assert(library is DillLibraryBuilder);
+          libraries.add((library as DillLibraryBuilder).library);
+        }
+
+        // For now ensure original order of libraries to produce bit-perfect
+        // output.
+        List<Library> librariesOriginalOrder =
+            new List<Library>.filled(libraries.length, null, growable: true);
+        int lastOpen = libraries.length;
+        for (Library lib in libraries) {
+          int order = importUriToOrder[lib.importUri];
+          if (order != null) {
+            librariesOriginalOrder[order] = lib;
+          } else {
+            librariesOriginalOrder[--lastOpen] = lib;
+          }
+        }
+        libraries = librariesOriginalOrder;
+      }
+
       // This is the incremental program.
-      return new Program(
-          libraries: new List<Library>.from(userCode.loader.libraries),
-          uriToSource: new Map<Uri, Source>.from(userCode.uriToSource))
-        ..mainMethod = programWithDill?.mainMethod;
+      Procedure mainMethod = programWithDill == null
+          ? userLoadedUriMain
+          : programWithDill.mainMethod;
+      return new Program(libraries: libraries, uriToSource: uriToSource)
+        ..mainMethod = mainMethod;
     });
   }
 
   List<LibraryBuilder> computeReusedLibraries(Iterable<Uri> invalidatedUris) {
-    if (userCode == null) return <LibraryBuilder>[];
+    if (userCode == null && userBuilders == null) {
+      return <LibraryBuilder>[];
+    }
 
     // [invalidatedUris] converted to a set.
     Set<Uri> invalidatedFileUris = invalidatedUris.toSet();
@@ -116,25 +213,29 @@
     List<Uri> invalidatedImportUris = <Uri>[];
 
     // Compute [builders] and [invalidatedImportUris].
-    addBuilderAndInvalidateUris(Uri uri, LibraryBuilder libraryBuilder) {
-      if (libraryBuilder.loader != platform.loader) {
-        assert(libraryBuilder is SourceLibraryBuilder);
-        SourceLibraryBuilder library = libraryBuilder;
-        builders[uri] = library;
-        if (invalidatedFileUris.contains(uri) ||
-            (uri != library.fileUri &&
-                invalidatedFileUris.contains(library.fileUri))) {
-          invalidatedImportUris.add(uri);
-        }
+    addBuilderAndInvalidateUris(Uri uri, LibraryBuilder library) {
+      builders[uri] = library;
+      if (invalidatedFileUris.contains(uri) ||
+          (uri != library.fileUri &&
+              invalidatedFileUris.contains(library.fileUri)) ||
+          (library is DillLibraryBuilder &&
+              uri != library.library.fileUri &&
+              invalidatedFileUris.contains(library.library.fileUri))) {
+        invalidatedImportUris.add(uri);
+      }
+      if (library is SourceLibraryBuilder) {
         for (var part in library.parts) {
           addBuilderAndInvalidateUris(part.uri, part);
         }
       }
     }
 
-    userCode.loader.builders.forEach(addBuilderAndInvalidateUris);
+    userBuilders?.forEach(addBuilderAndInvalidateUris);
+    if (userCode != null) {
+      userCode.loader.builders.forEach(addBuilderAndInvalidateUris);
+    }
 
-    SourceGraph graph = new SourceGraph(builders);
+    BuilderGraph graph = new BuilderGraph(builders);
 
     // Compute direct dependencies for each import URI (the reverse of the
     // edges returned by `graph.neighborsOf`).
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 7a6968a..e70282b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -42,6 +42,8 @@
         closeBraceTokenFor,
         optional;
 
+import '../parser/class_member_parser.dart' show ClassMemberParser;
+
 import '../parser/formal_parameter_kind.dart'
     show isOptionalPositionalFormalParameterKind;
 
@@ -63,6 +65,8 @@
 
 import '../scope.dart' show ProblemBuilder;
 
+import '../source/outline_builder.dart' show OutlineBuilder;
+
 import '../source/scope_listener.dart'
     show JumpTargetKind, NullValue, ScopeListener;
 
@@ -592,7 +596,7 @@
 
   DartType _computeReturnTypeContext(MemberBuilder member) {
     if (member is KernelProcedureBuilder) {
-      return member.target.function.returnType;
+      return member.procedure.function.returnType;
     } else {
       assert(member is KernelConstructorBuilder);
       return null;
@@ -1242,8 +1246,11 @@
         deprecated_addCompileTimeError(
             charOffset, "Not a constant expression.");
       }
-      return new TypeDeclarationAccessor(
+      TypeDeclarationAccessor accessor = new TypeDeclarationAccessor(
           this, prefix, charOffset, builder, name, token);
+      return (prefix?.deferred == true)
+          ? new DeferredAccessor(this, token, prefix, accessor)
+          : accessor;
     } else if (builder.isLocal) {
       if (constantExpressionRequired &&
           !builder.isConst &&
@@ -1849,12 +1856,8 @@
         return;
       }
     }
-    if (name is TypeDeclarationAccessor) {
+    if (name is FastaAccessor) {
       push(name.buildTypeWithBuiltArguments(arguments));
-    } else if (name is FastaAccessor) {
-      addProblem(fasta.templateNotAType.withArguments(beginToken.lexeme),
-          beginToken.charOffset);
-      push(const InvalidType());
     } else if (name is TypeBuilder) {
       push(name.build(library));
     } else if (name is PrefixBuilder) {
@@ -1871,15 +1874,12 @@
   @override
   void beginFunctionType(Token beginToken) {
     debugEvent("beginFunctionType");
-    enterFunctionTypeScope();
   }
 
-  void enterFunctionTypeScope() {
+  void enterFunctionTypeScope(List typeVariables) {
     debugEvent("enterFunctionTypeScope");
-    List typeVariables = pop();
     enterLocalScope(null,
-        scope.createNestedScope("function-type scope", isModifiable: false));
-    push(typeVariables ?? NullValue.TypeVariables);
+        scope.createNestedScope("function-type scope", isModifiable: true));
     if (typeVariables != null) {
       ScopeBuilder scopeBuilder = new ScopeBuilder(scope);
       for (KernelTypeVariableBuilder builder in typeVariables) {
@@ -2056,7 +2056,6 @@
   void beginFunctionTypedFormalParameter(Token token) {
     debugEvent("beginFunctionTypedFormalParameter");
     functionNestingLevel++;
-    enterFunctionTypeScope();
   }
 
   @override
@@ -2482,6 +2481,15 @@
 
     String prefixName;
     var type = pop();
+    PrefixBuilder deferredPrefix;
+    int checkOffset;
+    if (type is DeferredAccessor) {
+      DeferredAccessor accessor = type;
+      type = accessor.accessor;
+      deferredPrefix = accessor.builder;
+      checkOffset = accessor.token.charOffset;
+    }
+
     if (type is TypeDeclarationAccessor) {
       TypeDeclarationAccessor accessor = type;
       if (accessor.prefix != null) {
@@ -2493,7 +2501,7 @@
 
     bool savedConstantExpressionRequired = pop();
     if (type is TypeDeclarationBuilder) {
-      push(buildConstructorInvocation(
+      Expression expression = buildConstructorInvocation(
           type,
           nameToken,
           arguments,
@@ -2501,8 +2509,11 @@
           typeArguments,
           token.charOffset,
           optional("const", token) || optional("@", token),
-          prefixName: prefixName));
-    } else if (type is UnresolvedAccessor) {
+          prefixName: prefixName);
+      push(deferredPrefix != null
+          ? wrapInDeferredCheck(expression, deferredPrefix, checkOffset)
+          : expression);
+    } else if (type is ErrorAccessor) {
       push(type.buildError(arguments));
     } else {
       push(throwNoSuchMethodError(
@@ -2667,7 +2678,6 @@
 
   void enterFunction() {
     debugEvent("enterFunction");
-    enterFunctionTypeScope();
     functionNestingLevel++;
     push(switchScope ?? NullValue.SwitchScope);
     switchScope = null;
@@ -3246,22 +3256,39 @@
   }
 
   @override
+  void beginTypeVariables(Token token) {
+    debugEvent("beginTypeVariables");
+    OutlineBuilder listener = new OutlineBuilder(library);
+    new ClassMemberParser(listener).parseTypeVariablesOpt(token.previous);
+    enterFunctionTypeScope(listener.pop());
+  }
+
+  @override
+  void handleNoTypeVariables(Token token) {
+    debugEvent("NoTypeVariables");
+    enterFunctionTypeScope(null);
+    push(NullValue.TypeVariables);
+  }
+
+  @override
   void endTypeVariable(Token token, Token extendsOrSuper) {
     debugEvent("TypeVariable");
     DartType bound = pop();
-    if (bound != null) {
-      // TODO(ahe): To handle F-bounded types, this needs to be a TypeBuilder.
-      // TODO(askesc): Remove message type when no longer needed.
-      // https://github.com/dart-lang/sdk/issues/31766
-      addProblem(fasta.messageUnimplementedBoundsOnTypeVariables,
-          offsetForToken(extendsOrSuper.next));
-    }
     Identifier name = pop();
     // TODO(ahe): Do not discard metadata.
     pop(); // Metadata.
-    push(new KernelTypeVariableBuilder(
-        name.name, library, offsetForToken(name.token), null)
-      ..finish(library, library.loader.coreLibrary["Object"]));
+    KernelTypeVariableBuilder variable;
+    Object inScope = scopeLookup(scope, name.name, token);
+    if (inScope is TypeDeclarationAccessor) {
+      variable = inScope.declaration;
+    } else {
+      // Something went wrong when pre-parsing the type variables.
+      // Assume an error is reported elsewhere.
+      variable = new KernelTypeVariableBuilder(
+          name.name, library, offsetForToken(name.token), null);
+    }
+    variable.parameter.bound = bound;
+    push(variable..finish(library, library.loader.coreLibrary["Object"]));
   }
 
   @override
@@ -3626,6 +3653,7 @@
     library.addCompileTimeError(message, charOffset, uri);
   }
 
+  @override
   void addProblem(Message message, int charOffset) {
     library.addProblem(message, charOffset, uri);
   }
@@ -3657,11 +3685,12 @@
   }
 
   @override
-  Expression makeDeferredCheck(Expression expression, PrefixBuilder prefix) {
-    return new ShadowDeferredCheck(
-        new VariableDeclaration.forValue(
-            new CheckLibraryIsLoaded(prefix.dependency)),
-        expression);
+  Expression wrapInDeferredCheck(
+      Expression expression, PrefixBuilder prefix, int charOffset) {
+    var check = new VariableDeclaration.forValue(
+        new CheckLibraryIsLoaded(prefix.dependency))
+      ..fileOffset = charOffset;
+    return new ShadowDeferredCheck(check, expression);
   }
 }
 
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 bebb020..a838287 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
@@ -13,7 +13,9 @@
         messageInvalidInitializer,
         messageLoadLibraryTakesNoArguments,
         messageSuperAsExpression,
-        templateIntegerLiteralIsOutOfRange;
+        templateDeferredTypeAnnotation,
+        templateIntegerLiteralIsOutOfRange,
+        templateNotAType;
 
 import '../messages.dart' show Message;
 
@@ -139,7 +141,8 @@
   StaticGet makeStaticGet(Member readTarget, Token token,
       {String prefixName, int targetOffset: -1, Class targetClass});
 
-  Expression makeDeferredCheck(Expression expression, PrefixBuilder prefix);
+  Expression wrapInDeferredCheck(
+      Expression expression, PrefixBuilder prefix, int charOffset);
 
   dynamic deprecated_addCompileTimeError(int charOffset, String message);
 
@@ -165,6 +168,8 @@
   DartType validatedTypeVariableUse(
       TypeParameterType type, int offset, bool nonInstanceAccessIsError);
 
+  void addProblem(Message message, int charOffset);
+
   void addProblemErrorIfConst(Message message, int charOffset, int length);
 
   Message warnUnresolvedGet(Name name, int charOffset, {bool isSuper});
@@ -229,6 +234,13 @@
     }
   }
 
+  DartType buildTypeWithBuiltArguments(List<DartType> arguments,
+      {bool nonInstanceAccessIsError: false}) {
+    helper.addProblem(
+        templateNotAType.withArguments(token.lexeme), token.charOffset);
+    return const InvalidType();
+  }
+
   /* Expression | FastaAccessor */ buildThrowNoSuchMethodError(
       Expression receiver, Arguments arguments,
       {bool isSuper: false,
@@ -839,7 +851,7 @@
 
 class DeferredAccessor extends kernel.DeferredAccessor with FastaAccessor {
   DeferredAccessor(BuilderHelper helper, Token token, PrefixBuilder builder,
-      StaticAccessor expression)
+      FastaAccessor expression)
       : super(helper, token, builder, expression);
 
   String get plainNameForRead {
@@ -847,11 +859,35 @@
         "deferredAccessor.plainNameForRead", offsetForToken(token), uri);
   }
 
-  StaticAccessor get staticAccessor => super.staticAccessor;
+  FastaAccessor get accessor => super.accessor;
+
+  buildPropertyAccess(
+      IncompleteSend send, int operatorOffset, bool isNullAware) {
+    var propertyAccess =
+        accessor.buildPropertyAccess(send, operatorOffset, isNullAware);
+    if (propertyAccess is FastaAccessor) {
+      return new DeferredAccessor(helper, token, builder, propertyAccess);
+    } else {
+      Expression expression = propertyAccess;
+      return helper.wrapInDeferredCheck(expression, builder, token.charOffset);
+    }
+  }
+
+  @override
+  DartType buildTypeWithBuiltArguments(List<DartType> arguments,
+      {bool nonInstanceAccessIsError: false}) {
+    helper.addProblem(
+        templateDeferredTypeAnnotation.withArguments(
+            accessor.buildTypeWithBuiltArguments(arguments,
+                nonInstanceAccessIsError: nonInstanceAccessIsError),
+            builder.name),
+        token.charOffset);
+    return const InvalidType();
+  }
 
   Expression doInvocation(int offset, Arguments arguments) {
-    return helper.makeDeferredCheck(
-        staticAccessor.doInvocation(offset, arguments), builder);
+    return helper.wrapInDeferredCheck(
+        accessor.doInvocation(offset, arguments), builder, token.charOffset);
   }
 }
 
@@ -1155,6 +1191,7 @@
     }
   }
 
+  @override
   DartType buildTypeWithBuiltArguments(List<DartType> arguments,
       {bool nonInstanceAccessIsError: false}) {
     if (arguments != null) {
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 c0afd0a..e698255 100644
--- a/pkg/front_end/lib/src/fasta/kernel/frontend_accessors.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/frontend_accessors.dart
@@ -738,22 +738,28 @@
 
 abstract class DeferredAccessor extends Accessor {
   final PrefixBuilder builder;
-  final StaticAccessor staticAccessor;
+  final Accessor accessor;
 
   DeferredAccessor(
-      BuilderHelper helper, Token token, this.builder, this.staticAccessor)
+      BuilderHelper helper, Token token, this.builder, this.accessor)
       : super(helper, token);
 
+  Expression _makeSimpleRead() {
+    return helper.wrapInDeferredCheck(
+        accessor._makeSimpleRead(), builder, token.charOffset);
+  }
+
   Expression _makeRead(ShadowComplexAssignment complexAssignment) {
-    return helper.makeDeferredCheck(
-        staticAccessor._makeRead(complexAssignment), builder);
+    return helper.wrapInDeferredCheck(
+        accessor._makeRead(complexAssignment), builder, token.charOffset);
   }
 
   Expression _makeWrite(Expression value, bool voidContext,
       ShadowComplexAssignment complexAssignment) {
-    return helper.makeDeferredCheck(
-        staticAccessor._makeWrite(value, voidContext, complexAssignment),
-        builder);
+    return helper.wrapInDeferredCheck(
+        accessor._makeWrite(value, voidContext, complexAssignment),
+        builder,
+        token.charOffset);
   }
 }
 
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 5e3d25a..ec69a92 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
@@ -595,9 +595,12 @@
     endNestedDeclaration("#method").resolveTypes(typeVariables, this);
     String procedureName;
     ProcedureBuilder procedure;
-    String constructorName =
-        isTopLevel ? null : computeAndValidateConstructorName(name, charOffset);
     MetadataCollector metadataCollector = loader.target.metadataCollector;
+    String constructorName = isTopLevel ||
+            kind == ProcedureKind.Getter ||
+            kind == ProcedureKind.Setter
+        ? null
+        : computeAndValidateConstructorName(name, charOffset);
     if (constructorName != null) {
       procedureName = constructorName;
       procedure = new KernelConstructorBuilder(
diff --git a/pkg/front_end/lib/src/fasta/parser/loop_state.dart b/pkg/front_end/lib/src/fasta/parser/loop_state.dart
new file mode 100644
index 0000000..b6443b8
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/parser/loop_state.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.parser.loop_state;
+
+enum LoopState {
+  OutsideLoop,
+  InsideSwitch, // `break` statement allowed
+  InsideLoop, // `break` and `continue` statements allowed
+}
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 7d83002..dc031af 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -72,6 +72,8 @@
 
 import 'listener.dart' show Listener;
 
+import 'loop_state.dart' show LoopState;
+
 import 'member_kind.dart' show MemberKind;
 
 import 'modifier_context.dart'
@@ -254,6 +256,17 @@
   /// external clients, for example, to parse an expression outside a function.
   AsyncModifier asyncState = AsyncModifier.Sync;
 
+  // TODO(danrubel): The [loopState] and associated functionality in the
+  // [Parser] duplicates work that the resolver needs to do when resolving
+  // break/continue targets. Long term, this state and functionality will be
+  // removed from the [Parser] class and the resolver will be responsible
+  // for generating all break/continue error messages.
+
+  /// Represents parser state: whether parsing outside a loop,
+  /// inside a loop, or inside a switch. This is used to determine whether
+  /// break and continue statements are allowed.
+  LoopState loopState = LoopState.OutsideLoop;
+
   /// A rewriter for inserting synthetic tokens.
   /// Access using [rewriter] for lazy initialization.
   TokenStreamRewriter cachedRewriter;
@@ -277,6 +290,12 @@
 
   bool get inPlainSync => asyncState == AsyncModifier.Sync;
 
+  bool get isBreakAllowed => loopState != LoopState.OutsideLoop;
+
+  bool get isContinueAllowed => loopState == LoopState.InsideLoop;
+
+  bool get isContinueWithLabelAllowed => loopState != LoopState.OutsideLoop;
+
   /// Parse a compilation unit.
   ///
   /// This method is only invoked from outside the parser. As a result, this
@@ -1307,6 +1326,154 @@
     return token;
   }
 
+  /// Skip over the `Function` type parameter.
+  /// For example, `Function<E>(int foo)` or `Function(foo)` or just `Function`.
+  Token skipGenericFunctionType(Token token) {
+    Token last = token;
+    Token next = token.next;
+    while (optional('Function', next)) {
+      last = token;
+      token = next;
+      next = token.next;
+      if (optional('<', next)) {
+        next = next.endGroup;
+        if (next == null) {
+          // TODO(danrubel): Consider better recovery
+          // because this is probably a type reference.
+          return token;
+        }
+        token = next;
+        next = token.next;
+      }
+      if (optional('(', next)) {
+        token = next.endGroup;
+        next = token.next;
+      }
+    }
+    if (next.isKeywordOrIdentifier) {
+      return token;
+    } else {
+      return last;
+    }
+  }
+
+  /// If the token after [token] begins a valid type reference
+  /// or looks like a valid type reference, then return the last token
+  /// in that type reference, otherwise return [token].
+  ///
+  /// For example, it is an error when built-in keyword is being used as a type,
+  /// as in `abstract<t> foo`. In situations such as this, return the last
+  /// token in that type reference and assume the caller will report the error
+  /// and recover.
+  Token skipTypeReferenceOpt(Token token) {
+    final Token beforeStart = token;
+    Token next = token.next;
+
+    TokenType type = next.type;
+    bool looksLikeTypeRef = false;
+    if (type != TokenType.IDENTIFIER) {
+      String value = next.stringValue;
+      if (identical(value, 'get') || identical(value, 'set')) {
+        // No type reference.
+        return beforeStart;
+      } else if (identical(value, 'factory') || identical(value, 'operator')) {
+        Token next2 = next.next;
+        if (!optional('<', next2) || next2.endGroup == null) {
+          // No type reference.
+          return beforeStart;
+        }
+        // Even though built-ins cannot be used as a type,
+        // it looks like its being used as such.
+      } else if (identical(value, 'void')) {
+        // Found type reference.
+        looksLikeTypeRef = true;
+      } else if (identical(value, 'Function')) {
+        // Found type reference.
+        return skipGenericFunctionType(token);
+      } else if (identical(value, 'typedef')) {
+        // `typedef` can be used as a prefix.
+        // For example: `typedef.A x = new typedef.A();`
+        if (!optional('.', next.next)) {
+          // No type reference.
+          return beforeStart;
+        }
+      } else if (!next.isIdentifier) {
+        // No type reference.
+        return beforeStart;
+      }
+    }
+    token = next;
+    next = token.next;
+
+    if (optional('.', next)) {
+      token = next;
+      next = token.next;
+      if (next.type != TokenType.IDENTIFIER) {
+        String value = next.stringValue;
+        if (identical(value, 'get') || identical(value, 'set')) {
+          // Found a type reference, but missing an identifier after the period.
+          rewriteAndRecover(
+              token,
+              fasta.templateExpectedIdentifier.withArguments(next),
+              new SyntheticStringToken(
+                  TokenType.IDENTIFIER, '', next.charOffset, 0));
+          // Return the newly inserted synthetic token
+          // as the end of the type reference.
+          return token.next;
+        } else if (identical(value, '<') || identical(value, 'Function')) {
+          // Found a type reference, but missing an identifier after the period.
+          rewriteAndRecover(
+              token,
+              fasta.templateExpectedIdentifier.withArguments(next),
+              new SyntheticStringToken(
+                  TokenType.IDENTIFIER, '', next.charOffset, 0));
+          // Fall through to continue processing as a type reference.
+          next = token.next;
+        } else if (!next.isIdentifier) {
+          if (identical(value, 'void')) {
+            looksLikeTypeRef = true;
+            // Found a type reference, but the period
+            // and preceding identifier are both invalid.
+            reportRecoverableErrorWithToken(
+                token, fasta.templateUnexpectedToken);
+            // Fall through to continue processing as a type reference.
+          } else {
+            // No type reference.
+            return beforeStart;
+          }
+        }
+      }
+      token = next;
+      next = token.next;
+    }
+
+    if (optional('<', next)) {
+      token = next.endGroup;
+      if (token == null) {
+        // TODO(danrubel): Consider better recovery
+        // because this is probably a type reference.
+        return beforeStart;
+      }
+      next = token.next;
+      if (optional('(', next)) {
+        // No type reference - e.g. `f<E>()`.
+        return beforeStart;
+      }
+    }
+
+    if (optional('Function', next)) {
+      looksLikeTypeRef = true;
+      token = skipGenericFunctionType(token);
+      next = token.next;
+    }
+
+    return next.isIdentifier ||
+            (next.isOperator && !optional('=', next)) ||
+            looksLikeTypeRef
+        ? token
+        : beforeStart;
+  }
+
   bool isValidTypeReference(Token token) {
     int kind = token.kind;
     if (IDENTIFIER_TOKEN == kind) return true;
@@ -2795,183 +2962,124 @@
     }
     typeContinuation ??= TypeContinuation.Required;
 
-    Link<Token> identifiers = findMemberName(token);
-    if (identifiers.isEmpty) {
-      // Recovery
-      if ((varFinalOrConst != null) &&
-          isPostIdentifierForRecovery(
-              next.next, IdentifierContext.topLevelVariableDeclaration)) {
-        // Looks like a top level variable declaration
-        // but missing a variable name.
-        return parseFields(
-            beforeStart,
-            externalToken,
-            null,
-            null,
-            varFinalOrConst,
-            null,
-            token,
-            MemberKind.TopLevelField,
-            typeContinuation);
-      } else if (next.isIdentifier &&
-          isPostIdentifierForRecovery(
-              next.next, IdentifierContext.topLevelVariableDeclaration)) {
-        // Looks like a top level variable declaration
-        // but missing a variable name.
-        return parseFields(
-            beforeStart,
-            externalToken,
-            null,
-            null,
-            varFinalOrConst,
-            null,
-            token,
-            MemberKind.TopLevelField,
-            typeContinuation);
-      } else {
-        return reportInvalidTopLevelDeclaration(beforeStart.next);
-      }
+    Token beforeType = token;
+    // TODO(danrubel): Consider changing the listener contract
+    // so that the type reference can be parsed immediately
+    // rather than skipped now and parsed later.
+    token = skipTypeReferenceOpt(token);
+    if (token == beforeType) {
+      // There is no type reference.
+      beforeType = null;
     }
-    Token afterName = identifiers.head.next;
-    identifiers = identifiers.tail;
+    next = token.next;
 
-    if (identifiers.isEmpty) {
-      return reportInvalidTopLevelDeclaration(beforeStart.next);
-    }
-    Token beforeName = identifiers.head;
-    identifiers = identifiers.tail;
-    if (!beforeName.next.isIdentifier) {
-      // Recovery
-      if (identical(beforeName.stringValue, 'operator')) {
-        // If the token before the invalid name is `operator`
-        // then report the error on the `operator` keyword.
-        reportRecoverableError(beforeName, fasta.messageTopLevelOperator);
-        if (identifiers.isNotEmpty &&
-            identical(identifiers.head.next.stringValue, 'operator')) {
-          identifiers = identifiers.tail;
-        }
-      } else {
-        reportRecoverableErrorWithToken(
-            beforeName.next, fasta.templateUnexpectedToken);
-      }
-      // Insert a synthetic modifier
-      // to be interpreted as the top level function's identifier.
-      beforeName = beforeName.next;
-      rewriter.insertTokenAfter(
-          beforeName,
-          new SyntheticStringToken(
-              TokenType.IDENTIFIER,
-              '#synthetic_function_${beforeName.charOffset}',
-              beforeName.charOffset,
-              0));
-    }
     Token getOrSet;
-    if (!identifiers.isEmpty) {
-      String value = identifiers.head.next.stringValue;
-      if ((identical(value, 'get')) || (identical(value, 'set'))) {
-        getOrSet = identifiers.head.next;
-        identifiers = identifiers.tail;
+    String value = next.stringValue;
+    if (identical(value, 'get') || identical(value, 'set')) {
+      if (next.next.isIdentifier) {
+        getOrSet = token = next;
+        next = token.next;
       }
     }
-    Token beforeType;
-    if (!identifiers.isEmpty) {
-      Token maybeType = identifiers.head.next;
-      if (isValidTypeReference(maybeType)) {
-        beforeType = identifiers.head;
-        identifiers = identifiers.tail;
-      } else if (maybeType.type.isBuiltIn && optional('<', maybeType.next)) {
+
+    if (next.type != TokenType.IDENTIFIER) {
+      value = next.stringValue;
+      if (identical(value, 'factory') || identical(value, 'operator')) {
+        // `factory` and `operator` can be used as an identifier.
+        value = next.next.stringValue;
+        if (getOrSet == null &&
+            !identical(value, '(') &&
+            !identical(value, '{') &&
+            !identical(value, '<') &&
+            !identical(value, '=>') &&
+            !identical(value, '=') &&
+            !identical(value, ';') &&
+            !identical(value, ',')) {
+          // Recovery
+          value = next.stringValue;
+          if (identical(value, 'factory')) {
+            reportRecoverableError(
+                next, fasta.messageFactoryTopLevelDeclaration);
+          } else {
+            reportRecoverableError(next, fasta.messageTopLevelOperator);
+            if (next.next.isOperator) {
+              token = next;
+              next = token.next;
+              if (optional('(', next.next)) {
+                rewriter.insertTokenAfter(
+                    next,
+                    new SyntheticStringToken(
+                        TokenType.IDENTIFIER,
+                        '#synthetic_identifier_${next.charOffset}',
+                        next.charOffset,
+                        0));
+              }
+            }
+          }
+          listener.handleInvalidTopLevelDeclaration(next);
+          return next;
+        }
+        // Fall through and continue parsing
+      } else if (!next.isIdentifier) {
         // Recovery
-        // It is an error when built-in keyword is being used
-        // as a type, as in `abstract<t> foo`.
-        // This error is reported by parseFields and parseTopLevelMethod
-        // via ensureIdentifier.
-        beforeType = identifiers.head;
-        identifiers = identifiers.tail;
-      }
-    }
-
-    // Recovery: Anything left in the identifiers list is unexpected.
-    if (identifiers.isNotEmpty) {
-      identifiers = identifiers.reverse();
-      while (identifiers.isNotEmpty) {
-        Token token = identifiers.head;
-        Token next = token.next;
-        identifiers = identifiers.tail;
-        // If we have find the start of a new top level declaration,
-        // then return to parse that new declaration.
-        if (next.isTopLevelKeyword) {
-          listener.handleInvalidTopLevelDeclaration(token);
-          return token;
-        }
-        // Report errors on any unexpected tokens.
-        String value = next.stringValue;
-        if (identical(value, 'operator')) {
-          reportRecoverableError(next, fasta.messageTopLevelOperator);
-        } else if (identical(value, 'factory')) {
-          reportRecoverableError(next, fasta.messageFactoryTopLevelDeclaration);
+        if (next.isKeyword) {
+          reportRecoverableErrorWithToken(
+              next, fasta.templateExpectedIdentifier);
+          rewriter.insertTokenAfter(
+              next,
+              new SyntheticStringToken(
+                  TokenType.IDENTIFIER,
+                  '#synthetic_identifier_${next.charOffset}',
+                  next.charOffset,
+                  0));
+          token = next;
+          next = token.next;
+        } else if (token == beforeStart) {
+          // Ensure we make progress.
+          return reportInvalidTopLevelDeclaration(next);
         } else {
-          reportRecoverableErrorWithToken(next, fasta.templateUnexpectedToken);
+          // Looks like a declaration missing an identifier.
+          // Insert synthetic identifier and fall through.
+          rewriteAndRecover(
+              token,
+              fasta.templateExpectedIdentifier.withArguments(next),
+              new SyntheticStringToken(
+                  TokenType.IDENTIFIER,
+                  '#synthetic_identifier_${next.charOffset}',
+                  next.charOffset,
+                  0));
+          next = token.next;
         }
       }
     }
+    // At this point, `token` is beforeName.
 
-    token = afterName;
-    bool isField;
-    while (true) {
-      // Loop to allow the listener to rewrite the token stream for
-      // error handling.
-      final String value = token.stringValue;
-      if ((identical(value, '(')) ||
-          (identical(value, '{')) ||
-          (identical(value, '=>'))) {
-        isField = false;
-        break;
-      } else if (identical(value, '=') ||
-          identical(value, ',') ||
-          identical(value, '}')) {
-        isField = true;
-        break;
-      } else if (identical(value, ';')) {
-        if (getOrSet != null) {
-          // If we found a "get" keyword, this must be an abstract
-          // getter.
-          isField = (!identical(getOrSet.stringValue, 'get'));
-          // TODO(ahe): This feels like a hack.
-        } else {
-          isField = true;
-        }
-        break;
-      } else {
-        token = reportUnexpectedToken(token);
-        if (identical(token.next.kind, EOF_TOKEN)) return token;
-      }
-    }
-    if (isField) {
-      if (externalToken != null) {
-        reportRecoverableError(externalToken, fasta.messageExternalField);
-      }
-      if (getOrSet != null) {
-        reportRecoverableErrorWithToken(
-            getOrSet, fasta.templateExtraneousModifier);
-      }
-      return parseFields(
-          beforeStart,
-          externalToken,
-          null,
-          null,
-          varFinalOrConst,
-          beforeType,
-          beforeName,
-          MemberKind.TopLevelField,
-          typeContinuation);
-    } else {
+    next = next.next;
+    value = next.stringValue;
+    if (getOrSet != null ||
+        identical(value, '(') ||
+        identical(value, '{') ||
+        identical(value, '<') ||
+        identical(value, '.') ||
+        identical(value, '=>')) {
       if (varFinalOrConst != null) {
-        reportRecoverableErrorWithToken(
-            varFinalOrConst, fasta.templateExtraneousModifier);
+        if (optional('var', varFinalOrConst)) {
+          reportRecoverableError(varFinalOrConst, fasta.messageVarReturnType);
+        } else {
+          reportRecoverableErrorWithToken(
+              varFinalOrConst, fasta.templateExtraneousModifier);
+        }
       }
       return parseTopLevelMethod(
-          beforeStart, externalToken, beforeType, getOrSet, beforeName);
+          beforeStart, externalToken, beforeType, getOrSet, token);
     }
+
+    if (getOrSet != null) {
+      reportRecoverableErrorWithToken(
+          getOrSet, fasta.templateExtraneousModifier);
+    }
+    return parseFields(beforeStart, externalToken, null, null, varFinalOrConst,
+        beforeType, token, MemberKind.TopLevelField, typeContinuation);
   }
 
   Token parseFields(
@@ -4243,6 +4351,8 @@
       }
     }
 
+    LoopState savedLoopState = loopState;
+    loopState = LoopState.OutsideLoop;
     listener.beginBlockFunctionBody(begin);
     token = next;
     while (notEofOrValue('}', token.next)) {
@@ -4260,6 +4370,7 @@
     token = token.next;
     listener.endBlockFunctionBody(statementCount, begin, token);
     expect('}', token);
+    loopState = savedLoopState;
     return token;
   }
 
@@ -5761,7 +5872,10 @@
     }
     expect(')', token);
     listener.beginForStatementBody(token.next);
+    LoopState savedLoopState = loopState;
+    loopState = LoopState.InsideLoop;
     token = parseStatement(token);
+    loopState = savedLoopState;
     listener.endForStatementBody(token.next);
     listener.endForStatement(
         forToken, leftParenthesis, leftSeparator, expressionCount, token.next);
@@ -5789,7 +5903,10 @@
     listener.endForInExpression(token);
     expect(')', token);
     listener.beginForInBody(token.next);
+    LoopState savedLoopState = loopState;
+    loopState = LoopState.InsideLoop;
     token = parseStatement(token);
+    loopState = savedLoopState;
     listener.endForInBody(token.next);
     listener.endForIn(
         awaitToken, forKeyword, leftParenthesis, inKeyword, token.next);
@@ -5807,7 +5924,10 @@
     listener.beginWhileStatement(whileToken);
     token = parseParenthesizedExpression(whileToken);
     listener.beginWhileStatementBody(token.next);
+    LoopState savedLoopState = loopState;
+    loopState = LoopState.InsideLoop;
     token = parseStatement(token);
+    loopState = savedLoopState;
     listener.endWhileStatementBody(token.next);
     listener.endWhileStatement(whileToken, token.next);
     return token;
@@ -5823,7 +5943,10 @@
     assert(optional('do', doToken));
     listener.beginDoWhileStatement(doToken);
     listener.beginDoWhileStatementBody(doToken.next);
+    LoopState savedLoopState = loopState;
+    loopState = LoopState.InsideLoop;
     token = parseStatement(doToken).next;
+    loopState = savedLoopState;
     listener.endDoWhileStatementBody(token);
     Token whileToken = token;
     expect('while', token);
@@ -6016,7 +6139,12 @@
     assert(optional('switch', switchKeyword));
     listener.beginSwitchStatement(switchKeyword);
     token = parseParenthesizedExpression(switchKeyword);
+    LoopState savedLoopState = loopState;
+    if (loopState == LoopState.OutsideLoop) {
+      loopState = LoopState.InsideSwitch;
+    }
     token = parseSwitchBlock(token);
+    loopState = savedLoopState;
     listener.endSwitchStatement(switchKeyword, token);
     return token;
   }
@@ -6155,6 +6283,8 @@
     if (token.next.isIdentifier) {
       token = ensureIdentifier(token, IdentifierContext.labelReference);
       hasTarget = true;
+    } else if (!isBreakAllowed) {
+      reportRecoverableError(breakKeyword, fasta.messageBreakOutsideOfLoop);
     }
     token = ensureSemicolon(token);
     listener.handleBreakStatement(hasTarget, breakKeyword, token);
@@ -6233,6 +6363,16 @@
     if (token.next.isIdentifier) {
       token = ensureIdentifier(token, IdentifierContext.labelReference);
       hasTarget = true;
+      if (!isContinueWithLabelAllowed) {
+        reportRecoverableError(
+            continueKeyword, fasta.messageContinueOutsideOfLoop);
+      }
+    } else if (!isContinueAllowed) {
+      reportRecoverableError(
+          continueKeyword,
+          loopState == LoopState.InsideSwitch
+              ? fasta.messageContinueWithoutLabelInCase
+              : fasta.messageContinueOutsideOfLoop);
     }
     token = ensureSemicolon(token);
     listener.handleContinueStatement(hasTarget, continueKeyword, token);
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index 2582768..fa54d3b 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -482,7 +482,7 @@
       // redirecting factory bodies.
       return;
     }
-    buildFunctionBody(bodyToken, lookupBuilder(beginToken, null, name),
+    buildFunctionBody(bodyToken, lookupConstructor(beginToken, name),
         MemberKind.Factory, metadata);
   }
 
@@ -521,7 +521,13 @@
       // TODO(ahe): Don't skip this. We need to compile metadata.
       return;
     }
-    ProcedureBuilder builder = lookupBuilder(beginToken, getOrSet, name);
+    ProcedureBuilder builder;
+    if (name is QualifiedName ||
+        (getOrSet == null && name == currentClass.name)) {
+      builder = lookupConstructor(beginToken, name);
+    } else {
+      builder = lookupBuilder(beginToken, getOrSet, name);
+    }
     buildFunctionBody(
         bodyToken,
         builder,
@@ -735,18 +741,9 @@
     listener.checkEmpty(token.charOffset);
   }
 
-  Builder lookupBuilder(Token token, Token getOrSet, Object nameOrQualified) {
+  Builder lookupBuilder(Token token, Token getOrSet, String name) {
     // TODO(ahe): Can I move this to Scope or ScopeBuilder?
     Builder builder;
-    String name;
-    String suffix;
-    if (nameOrQualified is QualifiedName) {
-      name = nameOrQualified.prefix;
-      suffix = nameOrQualified.suffix;
-      assert(currentClass != null);
-    } else {
-      name = nameOrQualified;
-    }
     if (currentClass != null) {
       if (uri != currentClass.fileUri) {
         unexpected("$uri", "${currentClass.fileUri}", currentClass.charOffset,
@@ -756,40 +753,46 @@
       if (getOrSet != null && optional("set", getOrSet)) {
         builder = currentClass.scope.setters[name];
       } else {
-        if (name == currentClass.name) {
-          suffix ??= "";
-        }
-        if (suffix != null) {
-          builder = currentClass.constructors.local[suffix];
-        } else {
-          builder = currentClass.constructors.local[name];
-          if (builder == null) {
-            builder = currentClass.scope.local[name];
-          }
-        }
+        builder = currentClass.scope.local[name];
       }
     } else if (getOrSet != null && optional("set", getOrSet)) {
       builder = library.scope.setters[name];
     } else {
       builder = library.scopeBuilder[name];
     }
+    checkBuilder(token, builder, name);
+    return builder;
+  }
+
+  Builder lookupConstructor(Token token, Object nameOrQualified) {
+    assert(currentClass != null);
+    Builder builder;
+    String name;
+    String suffix;
+    if (nameOrQualified is QualifiedName) {
+      name = nameOrQualified.prefix;
+      suffix = nameOrQualified.suffix;
+    } else {
+      name = nameOrQualified;
+      suffix = name == currentClass.name ? "" : name;
+    }
+    builder = currentClass.constructors.local[suffix];
+    checkBuilder(token, builder, nameOrQualified);
+    return builder;
+  }
+
+  void checkBuilder(Token token, Builder builder, Object name) {
     if (builder == null) {
-      return internalProblem(
-          templateInternalProblemNotFound.withArguments(name),
-          token.charOffset,
-          uri);
+      internalProblem(templateInternalProblemNotFound.withArguments("$name"),
+          token.charOffset, uri);
     }
     if (builder.next != null) {
-      String errorName = suffix == null ? name : "$name.$suffix";
-      return deprecated_inputError(
-          uri, token.charOffset, "Duplicated name: $errorName");
+      deprecated_inputError(uri, token.charOffset, "Duplicated name: $name");
     }
-
     if (uri != builder.fileUri) {
       unexpected(
           "$uri", "${builder.fileUri}", builder.charOffset, builder.fileUri);
     }
-    return builder;
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/source/source_graph.dart b/pkg/front_end/lib/src/fasta/source/source_graph.dart
deleted file mode 100644
index 00297c6..0000000
--- a/pkg/front_end/lib/src/fasta/source/source_graph.dart
+++ /dev/null
@@ -1,48 +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.
-
-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_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 7835088..e58f517 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -210,8 +210,8 @@
 
     LibraryBuilder coreLibrary =
         loader.read(resolve(this.uri, "dart:core", -1), -1);
-    LibraryBuilder imported = coreLibrary
-        .loader.builders[new Uri(scheme: 'dart', path: dottedName)];
+    LibraryBuilder imported =
+        coreLibrary.loader.builders[new Uri(scheme: 'dart', path: dottedName)];
     return imported != null ? "true" : "";
   }
 
@@ -399,7 +399,9 @@
     }
     bool isConstructor = builder is ProcedureBuilder &&
         (builder.isConstructor || builder.isFactory);
-    if (!isConstructor && name == currentDeclaration.name) {
+    if (!isConstructor &&
+        !builder.isSetter &&
+        name == currentDeclaration.name) {
       addCompileTimeError(
           messageMemberWithSameNameAsClass, charOffset, fileUri);
     }
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 caa6991..febb348 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
@@ -417,7 +417,7 @@
     }
     function.body = new ReturnStatement(superCall)..parent = function;
     procedure.transformerFlags |= TransformerFlag.superCalls;
-    procedure.forwardingStubSuperTarget = superTarget.reference;
+    procedure.forwardingStubSuperTarget = superTarget;
   }
 
   /// Creates a forwarding stub based on the given [target].
@@ -465,7 +465,7 @@
         returnType: substitution.substituteType(target.function.returnType));
     Member finalTarget;
     if (target is Procedure && target.isForwardingStub) {
-      finalTarget = target.forwardingStubInterfaceTarget.node;
+      finalTarget = target.forwardingStubInterfaceTarget;
     } else if (target is SyntheticAccessor) {
       finalTarget = target._field;
     } else {
@@ -475,7 +475,7 @@
         isAbstract: true,
         isForwardingStub: true,
         fileUri: enclosingClass.fileUri,
-        forwardingStubInterfaceTarget: finalTarget.reference)
+        forwardingStubInterfaceTarget: finalTarget)
       ..fileOffset = enclosingClass.fileOffset
       ..parent = enclosingClass
       ..isGenericContravariant = target.isGenericContravariant;
@@ -804,8 +804,7 @@
         resolution = member;
       }
       if (resolution is Procedure &&
-          resolution.isForwardingStub &&
-          !resolution.isForwardingSemiStub &&
+          resolution.isSyntheticForwarder &&
           identical(resolution.enclosingClass, class_)) {
         if (strongMode) class_.addMember(resolution);
         _instrumentation?.record(
@@ -978,7 +977,7 @@
     for (var procedure in class_.procedures) {
       if (procedure.isStatic) continue;
       // Forwarding stubs are annotated separately
-      if (procedure.isForwardingStub && !procedure.isForwardingSemiStub) {
+      if (procedure.isSyntheticForwarder) {
         continue;
       }
       void recordFormalAnnotations(VariableDeclaration formal) {
diff --git a/pkg/front_end/lib/src/fasta/util/link.dart b/pkg/front_end/lib/src/fasta/util/link.dart
index 80e21ff..86c1c70 100644
--- a/pkg/front_end/lib/src/fasta/util/link.dart
+++ b/pkg/front_end/lib/src/fasta/util/link.dart
@@ -114,7 +114,7 @@
   /// Returns true if f returns true for all elements of this list.
   ///
   /// Returns true for the empty list.
-  bool every(bool f(T)) {
+  bool every(bool f(T e)) {
     for (Link<T> link = this; !link.isEmpty; link = link.tail) {
       if (!f(link.head)) return false;
     }
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 2fd52f9..7882c3b 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -565,6 +565,30 @@
   script:
     - "class C { static operator +(int x) => x + 1; }"
 
+BreakOutsideOfLoop:
+  template: "A break statement can't be used outside of a loop or switch statement."
+  tip: "Try removing the break statement."
+  analyzerCode: BREAK_OUTSIDE_OF_LOOP
+  dart2jsCode: "*ignored*"
+  script:
+    - "main() { break; }"
+
+ContinueOutsideOfLoop:
+  template: "A continue statement can't be used outside of a loop or switch statement."
+  tip: "Try removing the continue statement."
+  analyzerCode: CONTINUE_OUTSIDE_OF_LOOP
+  dart2jsCode: "*ignored*"
+  script:
+    - "main() { continue; }"
+
+ContinueWithoutLabelInCase:
+  template: "A continue statement in a switch statement must have a label as a target."
+  tip: "Try adding a label associated with one of the case clauses to the continue statement."
+  analyzerCode: CONTINUE_WITHOUT_LABEL_IN_CASE
+  dart2jsCode: "*ignored*"
+  script:
+    - "main() { switch (x) {case 1: continue;} }"
+
 InvalidAwaitFor:
   template: "The keyword 'await' isn't allowed for a normal 'for' statement."
   tip: "Try removing the keyword, or use a for-each statement."
@@ -1041,12 +1065,6 @@
   template: "Unimplemented #string."
   severity: INTERNAL_PROBLEM
 
-UnimplementedBoundsOnTypeVariables:
-  # Has its own message to make it just a warning.
-  # TODO(askesc): Remove when no longer needed.
-  template: "Unimplemented bounds on type variables."
-  severity: WARNING
-
 InternalProblemUnexpected:
   template: "Expected '#string', but got '#string2'."
   severity: INTERNAL_PROBLEM
@@ -1151,6 +1169,13 @@
   analyzerCode: DUPLICATE_DEFERRED
   dart2jsCode: "*fatal*"
 
+DeferredTypeAnnotation:
+  template: "The type '#type' is deferred loaded via prefix '#name' and can't be used as a type annotation."
+  tip: "Try removing 'deferred' from the import of '#name' or use a supertype of '#type' that isn't deferred."
+  severity: ERROR_LEGACY_WARNING
+  analyzerCode: TYPE_ANNOTATION_DEFERRED_CLASS
+  dart2jsCode: "*fatal*"
+
 DuplicatePrefix:
   template: "An import directive can only have one prefix ('as' clause)."
   tip: "Try removing all but one prefix."
@@ -1398,7 +1423,7 @@
   template: "Top-level declarations can't be declared to be 'factory'."
   tip: "Try removing the keyword 'factory'."
   analyzerCode: FACTORY_TOP_LEVEL_DECLARATION
-  dart2jsCode: "*ignored*"
+  dart2jsCode: "*fatal*"
   script:
     - "factory class C {}"
 
@@ -1414,7 +1439,7 @@
   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."
   analyzerCode: TOP_LEVEL_OPERATOR
-  dart2jsCode: "*ignored*"
+  dart2jsCode: "*fatal*"
   script:
     - "operator +(bool x, bool y) => x | y;"
     - "bool operator +(bool x, bool y) => x | y;"
@@ -1675,6 +1700,8 @@
 IntegerLiteralIsOutOfRange:
   template: "The integer literal #lexeme can't be represented in 64 bits."
   tip: "Try using the BigInt class if you need an integer larger than 9,223,372,036,854,775,807 or less than -9,223,372,036,854,775,808."
+  analyzerCode: INTEGER_LITERAL_OUT_OF_RANGE
+  dart2jsCode: "*fatal*"
 
 ColonInPlaceOfIn:
   template: "For-in loops use 'in' rather than a colon."
diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml
index 7b6e9cc..370ee5b 100644
--- a/pkg/front_end/pubspec.yaml
+++ b/pkg/front_end/pubspec.yaml
@@ -1,5 +1,5 @@
 name: front_end
-version: 0.1.0-alpha.7
+version: 0.1.0-alpha.8
 author: Dart Team <misc@dartlang.org>
 description: Front end for compilation of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/front_end
@@ -9,7 +9,7 @@
   charcode: '^1.1.1'
   convert: '^2.0.1'
   crypto: '^2.0.2'
-  kernel: 0.3.0-alpha.4
+  kernel: 0.3.0-alpha.5
   meta: '^1.1.1'
   package_config: '^1.0.1'
   path: '^1.3.9'
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index 00f49bf..d40576b 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -241,7 +241,7 @@
     File generated = new File.fromUri(uri);
     StdioProcess process;
     try {
-      var args = ['--kernel-binaries=${context.platformBinaries.toFilePath()}'];
+      var args = [];
       if (context.strongMode) {
         args.add('--strong');
         args.add('--reify-generic-functions');
diff --git a/pkg/front_end/test/fasta/type_inference/interface_resolver_test.dart b/pkg/front_end/test/fasta/type_inference/interface_resolver_test.dart
index 76dd52c..269c4c6 100644
--- a/pkg/front_end/test/fasta/type_inference/interface_resolver_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/interface_resolver_test.dart
@@ -740,7 +740,7 @@
     expect(y.isGenericCovariantImpl, isFalse);
     expect(y.isGenericCovariantInterface, isFalse);
     expect(y.isCovariant, isTrue);
-    expect(stub.forwardingStubInterfaceTarget.node, same(methodA));
+    expect(stub.forwardingStubInterfaceTarget, same(methodA));
     expect(getStubTarget(stub), same(methodA));
   }
 
@@ -788,7 +788,7 @@
     expect(y.isGenericCovariantImpl, isTrue);
     expect(y.isGenericCovariantInterface, isFalse);
     expect(y.isCovariant, isFalse);
-    expect(stub.forwardingStubInterfaceTarget.node, same(methodA));
+    expect(stub.forwardingStubInterfaceTarget, same(methodA));
     expect(getStubTarget(stub), same(methodA));
   }
 
@@ -833,7 +833,7 @@
     ]);
     var nodeE = getForwardingNode(e, false);
     var stub = nodeE.finalize();
-    expect(stub.forwardingStubInterfaceTarget.node, same(methodC));
+    expect(stub.forwardingStubInterfaceTarget, same(methodC));
     expect(getStubTarget(stub), same(methodC));
   }
 
@@ -866,7 +866,7 @@
         implementedTypes: [i2.asThisSupertype]);
     var nodeE = getForwardingNode(e, true);
     var stub = nodeE.finalize();
-    expect(stub.forwardingStubInterfaceTarget.node, same(setterC));
+    expect(stub.forwardingStubInterfaceTarget, same(setterC));
     expect(getStubTarget(stub), same(setterC));
   }
 
@@ -881,7 +881,7 @@
         implementedTypes: [b.asThisSupertype]);
     var node = getForwardingNode(c, false);
     var stub = node.finalize();
-    expect(stub.forwardingStubInterfaceTarget.node, same(fieldB));
+    expect(stub.forwardingStubInterfaceTarget, same(fieldB));
   }
 
   void test_merge_candidates_including_mixin() {
@@ -976,7 +976,7 @@
         name: 'C', implementedTypes: [a.asThisSupertype, b.asThisSupertype]);
     var node = getForwardingNode(c, false);
     var stub = node.finalize();
-    expect(stub.forwardingStubInterfaceTarget.node, same(methodB));
+    expect(stub.forwardingStubInterfaceTarget, same(methodB));
     expect(getStubTarget(stub), isNull);
     expect(stub.function.returnType, intType);
   }
@@ -995,7 +995,7 @@
     ]);
     var node = getForwardingNode(d, true);
     var stub = node.finalize();
-    expect(stub.forwardingStubInterfaceTarget.node, same(setterB));
+    expect(stub.forwardingStubInterfaceTarget, same(setterB));
     expect(getStubTarget(stub), isNull);
     expect(stub.function.positionalParameters[0].type, objectType);
   }
@@ -1057,7 +1057,7 @@
         ]);
     var node = getForwardingNode(d, false);
     var stub = node.finalize();
-    expect(stub.forwardingStubInterfaceTarget.node, same(methodB));
+    expect(stub.forwardingStubInterfaceTarget, same(methodB));
     expect(getStubTarget(stub), isNull);
     expect(stub.function.returnType, intType);
   }
diff --git a/pkg/front_end/test/incremental_load_from_dill_test.dart b/pkg/front_end/test/incremental_load_from_dill_test.dart
new file mode 100644
index 0000000..6a9403f
--- /dev/null
+++ b/pkg/front_end/test/incremental_load_from_dill_test.dart
@@ -0,0 +1,120 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async' show Future;
+import 'dart:io' show Directory, File;
+
+import 'package:expect/expect.dart' show Expect;
+import 'package:front_end/src/api_prototype/compiler_options.dart'
+    show CompilerOptions;
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalKernelGenerator;
+import 'package:front_end/src/compute_platform_binaries_location.dart'
+    show computePlatformBinariesLocation;
+import 'package:front_end/src/fasta/incremental_compiler.dart'
+    show IncrementalCompiler;
+import 'package:front_end/src/fasta/kernel/utils.dart' show writeProgramToFile;
+
+final Uri dart2jsUrl = Uri.base.resolve("pkg/compiler/bin/dart2js.dart");
+final Uri invalidateUri = Uri.parse("package:compiler/src/filenames.dart");
+Directory outDir;
+Uri normalDill;
+Uri bootstrappedDill;
+
+main() async {
+  outDir =
+      Directory.systemTemp.createTempSync("incremental_load_from_dill_test");
+  normalDill = outDir.uri.resolve("dart2js.full.dill");
+  bootstrappedDill = outDir.uri.resolve("dart2js.bootstrap.dill");
+  Uri nonexisting = outDir.uri.resolve("dart2js.nonexisting.dill");
+  Uri nonLoadable = outDir.uri.resolve("dart2js.nonloadable.dill");
+  try {
+    // Compile dart2js without bootstrapping.
+    Stopwatch stopwatch = new Stopwatch()..start();
+    await normalCompile();
+    print("Normal compile took ${stopwatch.elapsedMilliseconds} ms");
+
+    // Create a file that cannot be (fully) loaded as a dill file.
+    List<int> corruptData = new File.fromUri(normalDill).readAsBytesSync();
+    for (int i = 10 * (corruptData.length ~/ 16);
+        i < 15 * (corruptData.length ~/ 16);
+        ++i) {
+      corruptData[i] = 42;
+    }
+    new File.fromUri(nonLoadable).writeAsBytesSync(corruptData);
+
+    // Compile dart2js, bootstrapping from the just-compiled dill.
+    for (List<Object> bootstrapData in [
+      [normalDill, true],
+      [nonexisting, false],
+      //  [nonLoadable, false] // disabled for now
+    ]) {
+      Uri bootstrapWith = bootstrapData[0];
+      bool bootstrapExpect = bootstrapData[1];
+      stopwatch.reset();
+      bool bootstrapResult = await bootstrapCompile(bootstrapWith);
+      Expect.equals(bootstrapExpect, bootstrapResult);
+      print("Bootstrapped compile(s) from ${bootstrapWith.pathSegments.last} "
+          "took ${stopwatch.elapsedMilliseconds} ms");
+
+      // Compare the two files.
+      List<int> normalDillData = new File.fromUri(normalDill).readAsBytesSync();
+      List<int> bootstrappedDillData =
+          new File.fromUri(bootstrappedDill).readAsBytesSync();
+      Expect.equals(normalDillData.length, bootstrappedDillData.length);
+      for (int i = 0; i < normalDillData.length; ++i) {
+        if (normalDillData[i] != bootstrappedDillData[i]) {
+          Expect.fail("Normally compiled and bootstrapped compile differs.");
+        }
+      }
+    }
+  } finally {
+    outDir.deleteSync(recursive: true);
+  }
+}
+
+CompilerOptions getOptions() {
+  final Uri sdkRoot = computePlatformBinariesLocation();
+  var options = new CompilerOptions()
+    ..sdkRoot = sdkRoot
+    ..librariesSpecificationUri = Uri.base.resolve("sdk/lib/libraries.json")
+    ..strongMode = false;
+  return options;
+}
+
+Future<bool> normalCompile() async {
+  CompilerOptions options = getOptions();
+  IncrementalCompiler compiler =
+      new IncrementalKernelGenerator(options, dart2jsUrl);
+  var y = await compiler.computeDelta();
+  await writeProgramToFile(y, normalDill);
+  return compiler.bootstrapSuccess;
+}
+
+Future<bool> bootstrapCompile(Uri bootstrapWith) async {
+  CompilerOptions options = getOptions();
+  IncrementalCompiler compiler =
+      new IncrementalKernelGenerator(options, dart2jsUrl, bootstrapWith);
+  compiler.invalidate(invalidateUri);
+  var bootstrappedProgram = await compiler.computeDelta();
+  bool result = compiler.bootstrapSuccess;
+  await writeProgramToFile(bootstrappedProgram, bootstrappedDill);
+  compiler.invalidate(invalidateUri);
+
+  var partialProgram = await compiler.computeDelta();
+  var emptyProgram = await compiler.computeDelta();
+
+  var fullLibUris =
+      bootstrappedProgram.libraries.map((lib) => lib.importUri).toList();
+  var partialLibUris =
+      partialProgram.libraries.map((lib) => lib.importUri).toList();
+  var emptyLibUris =
+      emptyProgram.libraries.map((lib) => lib.importUri).toList();
+
+  Expect.isTrue(fullLibUris.length > partialLibUris.length);
+  Expect.isTrue(partialLibUris.isNotEmpty);
+  Expect.isTrue(emptyLibUris.isEmpty);
+
+  return result;
+}
diff --git a/pkg/front_end/test/src/incremental/hot_reload_e2e_test.dart b/pkg/front_end/test/src/incremental/hot_reload_e2e_test.dart
index 9b33737..932fa35 100644
--- a/pkg/front_end/test/src/incremental/hot_reload_e2e_test.dart
+++ b/pkg/front_end/test/src/incremental/hot_reload_e2e_test.dart
@@ -102,7 +102,6 @@
     var vmArgs = [
       '--enable-vm-service=0', // Note: use 0 to avoid port collisions.
       '--pause_isolates_on_start',
-      '--kernel-binaries=${sdkRoot.toFilePath()}',
       outputUri.toFilePath()
     ];
     vmArgs.add('$reloadCount');
diff --git a/pkg/front_end/test/subpackage_relationships_test.dart b/pkg/front_end/test/subpackage_relationships_test.dart
index a0bc923..3875706 100644
--- a/pkg/front_end/test/subpackage_relationships_test.dart
+++ b/pkg/front_end/test/subpackage_relationships_test.dart
@@ -70,6 +70,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/scanner',
@@ -118,7 +119,6 @@
     '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',
diff --git a/pkg/front_end/testcases/ast_builder.status b/pkg/front_end/testcases/ast_builder.status
index 4e4c471..b464fce 100644
--- a/pkg/front_end/testcases/ast_builder.status
+++ b/pkg/front_end/testcases/ast_builder.status
@@ -10,11 +10,15 @@
 argument_mismatch: Crash
 bad_setter_abstract: Crash
 cascade: Crash
-check_deferred_read: Crash
-check_deferred_before_write: Crash
-check_deferred_before_call: Crash
-check_deferred_before_args: Crash
+check_deferred_allocation: Crash
 check_deferred_before_args2: Crash
+check_deferred_before_args: Crash
+check_deferred_before_call: Crash
+check_deferred_before_write: Crash
+check_deferred_read: Crash
+check_deferred_read_static_field: Crash
+check_deferred_read_type: Crash
+check_deferred_static_method_call: Crash
 classes: Crash
 duplicated_named_args_3: Crash
 dynamic_and_void: Fail
@@ -118,7 +122,6 @@
 rasta/previsit_deferred: Crash
 rasta/static: Crash
 rasta/super_initializer: Crash
-rasta/supports_reflection: VerificationError
 rasta/type_literals: Crash
 rasta/typedef: Crash
 rasta/unresolved: Crash
@@ -143,6 +146,8 @@
 regress/issue_31187: Crash
 regress/issue_31198: Crash
 regress/issue_31213: Crash
+regress/issue_31299: Crash
+regress/issue_31766: Crash
 reorder_super: Crash
 runtime_checks/implicit_downcast_assert_initializer: Crash
 runtime_checks/implicit_downcast_constructor_initializer: Crash
diff --git a/pkg/front_end/testcases/check_deferred_allocation.dart b/pkg/front_end/testcases/check_deferred_allocation.dart
new file mode 100644
index 0000000..3bf29bf
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_allocation.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+import 'deferred_lib.dart' deferred as lib;
+
+main() {}
+test() {
+  print(new lib.C());
+}
diff --git a/pkg/front_end/testcases/check_deferred_allocation.dart.direct.expect b/pkg/front_end/testcases/check_deferred_allocation.dart.direct.expect
new file mode 100644
index 0000000..25dc9b8
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_allocation.dart.direct.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "./deferred_lib.dart" as def;
+
+static method main() → dynamic {}
+static method test() → dynamic {
+  core::print(let final dynamic #t1 = CheckLibraryIsLoaded(lib) in new def::C::•());
+}
diff --git a/pkg/front_end/testcases/check_deferred_allocation.dart.outline.expect b/pkg/front_end/testcases/check_deferred_allocation.dart.outline.expect
new file mode 100644
index 0000000..7a4d537
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_allocation.dart.outline.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+
+static method main() → dynamic
+  ;
+static method test() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/check_deferred_allocation.dart.strong.expect b/pkg/front_end/testcases/check_deferred_allocation.dart.strong.expect
new file mode 100644
index 0000000..25dc9b8
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_allocation.dart.strong.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "./deferred_lib.dart" as def;
+
+static method main() → dynamic {}
+static method test() → dynamic {
+  core::print(let final dynamic #t1 = CheckLibraryIsLoaded(lib) in new def::C::•());
+}
diff --git a/pkg/front_end/testcases/check_deferred_as_check.dart b/pkg/front_end/testcases/check_deferred_as_check.dart
new file mode 100644
index 0000000..e9d17ff
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_as_check.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+import 'deferred_lib.dart' deferred as lib;
+
+main() {}
+test(x) {
+  x as lib.C;
+}
diff --git a/pkg/front_end/testcases/check_deferred_as_check.dart.direct.expect b/pkg/front_end/testcases/check_deferred_as_check.dart.direct.expect
new file mode 100644
index 0000000..d17f162
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_as_check.dart.direct.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+
+static method main() → dynamic {}
+static method test(dynamic x) → dynamic {
+  x as invalid-type;
+}
diff --git a/pkg/front_end/testcases/check_deferred_as_check.dart.outline.expect b/pkg/front_end/testcases/check_deferred_as_check.dart.outline.expect
new file mode 100644
index 0000000..dc16c61
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_as_check.dart.outline.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+
+static method main() → dynamic
+  ;
+static method test(dynamic x) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/check_deferred_as_check.dart.strong.expect b/pkg/front_end/testcases/check_deferred_as_check.dart.strong.expect
new file mode 100644
index 0000000..bd033e5
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_as_check.dart.strong.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/check_deferred_as_check.dart:9:8: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.\nTry removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.\n  x as lib.C;\n       ^"]/* from null */;
+static method main() → dynamic {}
+static method test(dynamic x) → dynamic {
+  x as invalid-type;
+}
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart b/pkg/front_end/testcases/check_deferred_is_check.dart
new file mode 100644
index 0000000..7069d9a
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_is_check.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+import 'deferred_lib.dart' deferred as lib;
+
+main() {}
+test(x) {
+  print(x is lib.C);
+}
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart.direct.expect b/pkg/front_end/testcases/check_deferred_is_check.dart.direct.expect
new file mode 100644
index 0000000..8fa0c48
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_is_check.dart.direct.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {}
+static method test(dynamic x) → dynamic {
+  core::print(x is invalid-type);
+}
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart.outline.expect b/pkg/front_end/testcases/check_deferred_is_check.dart.outline.expect
new file mode 100644
index 0000000..dc16c61
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_is_check.dart.outline.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+
+static method main() → dynamic
+  ;
+static method test(dynamic x) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart.strong.expect b/pkg/front_end/testcases/check_deferred_is_check.dart.strong.expect
new file mode 100644
index 0000000..c612334
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_is_check.dart.strong.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/check_deferred_is_check.dart:9:14: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.\nTry removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.\n  print(x is lib.C);\n             ^"]/* from null */;
+static method main() → dynamic {}
+static method test(dynamic x) → dynamic {
+  core::print(x is invalid-type);
+}
diff --git a/pkg/front_end/testcases/check_deferred_read_static_field.dart b/pkg/front_end/testcases/check_deferred_read_static_field.dart
new file mode 100644
index 0000000..0a446f7
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_read_static_field.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+import 'deferred_lib.dart' deferred as lib;
+
+main() {}
+test() {
+  print(lib.C.y);
+}
diff --git a/pkg/front_end/testcases/check_deferred_read_static_field.dart.direct.expect b/pkg/front_end/testcases/check_deferred_read_static_field.dart.direct.expect
new file mode 100644
index 0000000..7b3c2df
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_read_static_field.dart.direct.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "./deferred_lib.dart" as def;
+
+static method main() → dynamic {}
+static method test() → dynamic {
+  core::print(let final dynamic #t1 = CheckLibraryIsLoaded(lib) in def::C::y);
+}
diff --git a/pkg/front_end/testcases/check_deferred_read_static_field.dart.outline.expect b/pkg/front_end/testcases/check_deferred_read_static_field.dart.outline.expect
new file mode 100644
index 0000000..7a4d537
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_read_static_field.dart.outline.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+
+static method main() → dynamic
+  ;
+static method test() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/check_deferred_read_static_field.dart.strong.expect b/pkg/front_end/testcases/check_deferred_read_static_field.dart.strong.expect
new file mode 100644
index 0000000..7b3c2df
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_read_static_field.dart.strong.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "./deferred_lib.dart" as def;
+
+static method main() → dynamic {}
+static method test() → dynamic {
+  core::print(let final dynamic #t1 = CheckLibraryIsLoaded(lib) in def::C::y);
+}
diff --git a/pkg/front_end/testcases/check_deferred_read_type.dart b/pkg/front_end/testcases/check_deferred_read_type.dart
new file mode 100644
index 0000000..be64b65
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_read_type.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+import 'deferred_lib.dart' deferred as lib;
+
+main() {}
+test() {
+  print(lib.C);
+}
diff --git a/pkg/front_end/testcases/check_deferred_read_type.dart.direct.expect b/pkg/front_end/testcases/check_deferred_read_type.dart.direct.expect
new file mode 100644
index 0000000..4c3620c
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_read_type.dart.direct.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "./deferred_lib.dart" as def;
+
+static method main() → dynamic {}
+static method test() → dynamic {
+  core::print(let final dynamic #t1 = CheckLibraryIsLoaded(lib) in def::C);
+}
diff --git a/pkg/front_end/testcases/check_deferred_read_type.dart.outline.expect b/pkg/front_end/testcases/check_deferred_read_type.dart.outline.expect
new file mode 100644
index 0000000..7a4d537
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_read_type.dart.outline.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+
+static method main() → dynamic
+  ;
+static method test() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/check_deferred_read_type.dart.strong.expect b/pkg/front_end/testcases/check_deferred_read_type.dart.strong.expect
new file mode 100644
index 0000000..4c3620c
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_read_type.dart.strong.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "./deferred_lib.dart" as def;
+
+static method main() → dynamic {}
+static method test() → dynamic {
+  core::print(let final dynamic #t1 = CheckLibraryIsLoaded(lib) in def::C);
+}
diff --git a/pkg/front_end/testcases/check_deferred_static_method_call.dart b/pkg/front_end/testcases/check_deferred_static_method_call.dart
new file mode 100644
index 0000000..63008c6
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_static_method_call.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+import 'deferred_lib.dart' deferred as lib;
+
+main() {}
+test() {
+  print(lib.C.m());
+}
diff --git a/pkg/front_end/testcases/check_deferred_static_method_call.dart.direct.expect b/pkg/front_end/testcases/check_deferred_static_method_call.dart.direct.expect
new file mode 100644
index 0000000..05236e5
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_static_method_call.dart.direct.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "./deferred_lib.dart" as def;
+
+static method main() → dynamic {}
+static method test() → dynamic {
+  core::print(let final dynamic #t1 = CheckLibraryIsLoaded(lib) in def::C::m());
+}
diff --git a/pkg/front_end/testcases/check_deferred_static_method_call.dart.outline.expect b/pkg/front_end/testcases/check_deferred_static_method_call.dart.outline.expect
new file mode 100644
index 0000000..7a4d537
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_static_method_call.dart.outline.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+
+static method main() → dynamic
+  ;
+static method test() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/check_deferred_static_method_call.dart.strong.expect b/pkg/front_end/testcases/check_deferred_static_method_call.dart.strong.expect
new file mode 100644
index 0000000..05236e5
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_static_method_call.dart.strong.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "./deferred_lib.dart" as def;
+
+static method main() → dynamic {}
+static method test() → dynamic {
+  core::print(let final dynamic #t1 = CheckLibraryIsLoaded(lib) in def::C::m());
+}
diff --git a/pkg/front_end/testcases/check_deferred_type_declaration.dart b/pkg/front_end/testcases/check_deferred_type_declaration.dart
new file mode 100644
index 0000000..f3cc305
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_type_declaration.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+import 'deferred_lib.dart' deferred as lib;
+
+main() => test();
+test() {
+  lib.C x = null;
+}
diff --git a/pkg/front_end/testcases/check_deferred_type_declaration.dart.direct.expect b/pkg/front_end/testcases/check_deferred_type_declaration.dart.direct.expect
new file mode 100644
index 0000000..fe4fe2e
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_type_declaration.dart.direct.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+
+static method main() → dynamic
+  return self::test();
+static method test() → dynamic {
+  invalid-type x = null;
+}
diff --git a/pkg/front_end/testcases/check_deferred_type_declaration.dart.outline.expect b/pkg/front_end/testcases/check_deferred_type_declaration.dart.outline.expect
new file mode 100644
index 0000000..7a4d537
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_type_declaration.dart.outline.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+
+static method main() → dynamic
+  ;
+static method test() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.expect b/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.expect
new file mode 100644
index 0000000..944b59d
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/check_deferred_type_declaration.dart:9:3: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.\nTry removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.\n  lib.C x = null;\n  ^"]/* from null */;
+static method main() → dynamic
+  return self::test();
+static method test() → dynamic {
+  invalid-type x = null;
+}
diff --git a/pkg/front_end/testcases/deferred_lib.dart b/pkg/front_end/testcases/deferred_lib.dart
index b08a2df..94f5f06 100644
--- a/pkg/front_end/testcases/deferred_lib.dart
+++ b/pkg/front_end/testcases/deferred_lib.dart
@@ -5,3 +5,8 @@
 dynamic m(x) => null;
 
 var x = 0;
+
+class C {
+  static int y = 1;
+  static int m() => 2;
+}
diff --git a/pkg/front_end/testcases/rasta/supports_reflection.dart.strong.expect b/pkg/front_end/testcases/rasta/supports_reflection.dart.strong.expect
new file mode 100644
index 0000000..b7bfa56
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/supports_reflection.dart.strong.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print(const core::bool::fromEnvironment("dart.library.mirrors"));
+}
diff --git a/pkg/front_end/testcases/regress/issue_30834.dart b/pkg/front_end/testcases/regress/issue_30834.dart
new file mode 100644
index 0000000..12a2a33
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_30834.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {
+  set A(v) {}
+}
+
+main() {
+  var a = new A();
+  a.A = 5;
+}
diff --git a/pkg/front_end/testcases/regress/issue_30834.dart.direct.expect b/pkg/front_end/testcases/regress/issue_30834.dart.direct.expect
new file mode 100644
index 0000000..de8a7cd
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_30834.dart.direct.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  set A(dynamic v) → dynamic {}
+}
+static method main() → dynamic {
+  dynamic a = new self::A::•();
+  a.A = 5;
+}
diff --git a/pkg/front_end/testcases/regress/issue_30834.dart.outline.expect b/pkg/front_end/testcases/regress/issue_30834.dart.outline.expect
new file mode 100644
index 0000000..c591247
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_30834.dart.outline.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    ;
+  set A(dynamic v) → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/regress/issue_30834.dart.strong.expect b/pkg/front_end/testcases/regress/issue_30834.dart.strong.expect
new file mode 100644
index 0000000..21d109e
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_30834.dart.strong.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  set A(dynamic v) → void {}
+}
+static method main() → dynamic {
+  self::A a = new self::A::•();
+  a.{self::A::A} = 5;
+}
diff --git a/pkg/front_end/testcases/regress/issue_31299.dart b/pkg/front_end/testcases/regress/issue_31299.dart
new file mode 100644
index 0000000..27c47ab
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31299.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {
+  int m;
+  A() : m = 1;
+
+  // Named constructor may not conflict with names of methods and fields.
+  A.foo() : m = 2;
+  int foo(int a, int b) => a + b * m;
+}
+
+test() {
+  new A().foo();
+  new A().foo(1, 2);
+  new A.foo();
+  new A.foo(1, 2);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/regress/issue_31299.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31299.dart.direct.expect
new file mode 100644
index 0000000..88fec62
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.direct.expect
@@ -0,0 +1,23 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int m;
+  constructor •() → void
+    : self::A::m = 1, super core::Object::•()
+    ;
+  constructor foo() → void
+    : self::A::m = 2, super core::Object::•()
+    ;
+  method foo(core::int a, core::int b) → core::int
+    return a.+(b.*(this.{self::A::m}));
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31299.dart:10:3: Error: Conflicts with member 'foo'.\n  A.foo() : m = 2;\n  ^", "pkg/front_end/testcases/regress/issue_31299.dart:11:7: Error: Conflicts with constructor 'A.foo'.\n  int foo(int a, int b) => a + b * m;\n      ^"]/* from null */;
+static method test() → dynamic {
+  new self::A::•().foo();
+  new self::A::•().foo(1, 2);
+  new self::A::foo();
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#foo, 32, const <core::Type>[], <dynamic>[1, 2].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31299.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31299.dart.outline.expect
new file mode 100644
index 0000000..caa88eb
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.outline.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int m;
+  constructor •() → void
+    ;
+  constructor foo() → void
+    ;
+  method foo(core::int a, core::int b) → core::int
+    ;
+}
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
new file mode 100644
index 0000000..d8441ee
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
@@ -0,0 +1,23 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int m;
+  constructor •() → void
+    : self::A::m = 1, super core::Object::•()
+    ;
+  constructor foo() → void
+    : self::A::m = 2, super core::Object::•()
+    ;
+  method foo(core::int a, core::int b) → core::int
+    return a.{core::num::+}(b.{core::num::*}(this.{self::A::m}));
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31299.dart:10:3: Error: Conflicts with member 'foo'.\n  A.foo() : m = 2;\n  ^", "pkg/front_end/testcases/regress/issue_31299.dart:11:7: Error: Conflicts with constructor 'A.foo'.\n  int foo(int a, int b) => a + b * m;\n      ^", "pkg/front_end/testcases/regress/issue_31299.dart:18:7: Error: Method not found: 'foo'.\n  new A.foo(1, 2);\n      ^"]/* from null */;
+static method test() → dynamic {
+  new self::A::•().{self::A::foo}();
+  new self::A::•().{self::A::foo}(1, 2);
+  new self::A::foo();
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#foo, 32, const <core::Type>[], <dynamic>[1, 2].toList(growable: false), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31766.dart b/pkg/front_end/testcases/regress/issue_31766.dart
new file mode 100644
index 0000000..491cb00
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31766.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {
+  foo() => null;
+}
+
+main() {
+  void bar<T extends A>(T t) {
+    print("t.foo()=${t.foo()}");
+  }
+
+  bar(new A());
+
+  (<S extends A>(S s) {
+    print("s.foo()=${s.foo()}");
+  })(new A());
+}
diff --git a/pkg/front_end/testcases/regress/issue_31766.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31766.dart.direct.expect
new file mode 100644
index 0000000..ad01f98
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31766.dart.direct.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    return null;
+}
+static method main() → dynamic {
+  function bar<T extends self::A>(T t) → void {
+    core::print("t.foo()=${t.foo()}");
+  }
+  bar.call(new self::A::•());
+  (<S extends self::A>(S s) → dynamic {
+    core::print("s.foo()=${s.foo()}");
+  }).call(new self::A::•());
+}
diff --git a/pkg/front_end/testcases/regress/issue_31766.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31766.dart.outline.expect
new file mode 100644
index 0000000..54cb769
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31766.dart.outline.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    ;
+  method foo() → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/regress/issue_31766.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31766.dart.strong.expect
new file mode 100644
index 0000000..5228fa9
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31766.dart.strong.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    return null;
+}
+static method main() → dynamic {
+  function bar<T extends self::A>(T t) → void {
+    core::print("t.foo()=${t.{self::A::foo}()}");
+  }
+  bar.call<self::A>(new self::A::•());
+  (<S extends self::A>(S s) → core::Null {
+    core::print("s.foo()=${s.{self::A::foo}()}");
+  }).call<self::A>(new self::A::•());
+}
diff --git a/pkg/front_end/testcases/sdk.status b/pkg/front_end/testcases/sdk.status
index 5adfa9f..38cd79e 100644
--- a/pkg/front_end/testcases/sdk.status
+++ b/pkg/front_end/testcases/sdk.status
@@ -2,7 +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.md file.
 
-language/bad_constructor_test/06_generated: Crash
+language/branches_test: Crash
+language/operator_test: Crash
+language/prefix5_negative_test: Crash
+language_2/branches_test: Crash
+language_2/operator_test: Crash
+language_2/prefix5_negative_test: Crash
 
 language/async_test/constructor4_generated: VerificationError
 language/const_factory_with_body_test/01_generated: VerificationError
@@ -10,7 +15,6 @@
 language/constructor10_test/00_generated: VerificationError
 language/constructor10_test/01_generated: VerificationError
 language/constructor10_test/02_generated: VerificationError
-language/deferred_closurize_load_library_test: VerificationError
 language/enum_syntax_test/20_generated: VerificationError
 language/enum_syntax_test/22_generated: VerificationError
 language/malformed_inheritance_test/03_generated: VerificationError
@@ -46,8 +50,6 @@
 language_2/constructor10_test/00_generated: VerificationError
 language_2/constructor10_test/01_generated: VerificationError
 language_2/constructor10_test/02_generated: VerificationError
-language_2/covariant_subtyping_test: VerificationError
-language_2/deferred_closurize_load_library_test: VerificationError
 language_2/enum_syntax_test/20_generated: VerificationError
 language_2/enum_syntax_test/22_generated: VerificationError
 language_2/malformed_inheritance_test/02_generated: VerificationError
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index 96c1038..32163f0 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -179,7 +179,6 @@
 rasta/super_initializer: Fail
 rasta/super_mixin: TypeCheckError
 rasta/super_operator: Fail
-rasta/supports_reflection: VerificationError
 rasta/switch_execution_case_t02: Fail
 rasta/switch_fall_through: Fail
 rasta/this_invoke: Fail
@@ -199,6 +198,7 @@
 regress/issue_30836: RuntimeError # Issue 30836.
 regress/issue_31155: Crash # Issue 31155.
 regress/issue_31184: TypeCheckError
+regress/issue_31299: TypeCheckError
 
 runtime_checks/forwarding_stub_with_default_values: RuntimeError # Bug 31027
 runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast: RuntimeError
diff --git a/pkg/front_end/testing.json b/pkg/front_end/testing.json
index 0771100..ac2d0fe 100644
--- a/pkg/front_end/testing.json
+++ b/pkg/front_end/testing.json
@@ -167,6 +167,7 @@
         "/sdk/tests/language/round_test\\.dart$",
         "/sdk/tests/language_2/arg_param_trailing_comma_test\\.dart$",
         "/sdk/tests/language_2/async_switch_test\\.dart$",
+        "/sdk/tests/language_2/built_in_identifier_type_annotation_test\\.dart$",
         "/sdk/tests/language_2/case_expression_with_assignment_test\\.dart$",
         "/sdk/tests/language_2/constructor_redirect1_negative_test\\.dart$",
         "/sdk/tests/language_2/deferred_type_dependency_test\\.dart$",
@@ -176,6 +177,7 @@
         "/sdk/tests/language_2/field_initialization_order_test\\.dart$",
         "/sdk/tests/language_2/field_override_test\\.dart$",
         "/sdk/tests/language_2/field3_test\\.dart$",
+        "/sdk/tests/language_2/known_identifier_usage_test\\.dart$",
         "/sdk/tests/language_2/map_literal11_test\\.dart$",
         "/sdk/tests/language_2/round_test\\.dart$",
         "/sdk/tests/language_2/regress_23996_test\\.dart$",
diff --git a/pkg/front_end/tool/_fasta/command_line.dart b/pkg/front_end/tool/_fasta/command_line.dart
index aeb2bb5..a25d6be 100644
--- a/pkg/front_end/tool/_fasta/command_line.dart
+++ b/pkg/front_end/tool/_fasta/command_line.dart
@@ -228,9 +228,13 @@
   final bool strongMode =
       options.containsKey("--strong-mode") || options.containsKey("--strong");
 
+  final bool syncAsync = options.containsKey("--sync-async");
+
   final String targetName = options["-t"] ?? options["--target"] ?? "vm";
 
-  final TargetFlags flags = new TargetFlags(strongMode: strongMode);
+  final TargetFlags flags =
+      new TargetFlags(strongMode: strongMode, syncAsync: syncAsync);
+
   final Target target = getTarget(targetName, flags);
   if (target == null) {
     return throw new CommandLineProblem.deprecated(
diff --git a/pkg/kernel/bin/transform.dart b/pkg/kernel/bin/transform.dart
index 399de1c..aabac5e 100755
--- a/pkg/kernel/bin/transform.dart
+++ b/pkg/kernel/bin/transform.dart
@@ -44,7 +44,10 @@
   ..addOption('transformation',
       abbr: 't',
       help: 'The transformation to apply.',
-      defaultsTo: 'continuation');
+      defaultsTo: 'continuation')
+  ..addFlag('sync-async',
+      help: 'Whether `async` functions start synchronously.',
+      defaultsTo: false);
 
 main(List<String> arguments) async {
   if (arguments.isNotEmpty && arguments[0] == '--batch') {
@@ -69,6 +72,7 @@
   var output = options['out'];
   var format = options['format'];
   var verbose = options['verbose'];
+  var syncAsync = options['sync-async'];
 
   if (output == null) {
     output = '${input.substring(0, input.lastIndexOf('.'))}.transformed.dill';
@@ -85,7 +89,7 @@
   final hierarchy = new ClassHierarchy(program);
   switch (options['transformation']) {
     case 'continuation':
-      program = cont.transformProgram(coreTypes, program);
+      program = cont.transformProgram(coreTypes, program, syncAsync);
       break;
     case 'resolve-mixins':
       mix.transformLibraries(
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index c07f52a..dcbffd3 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -1486,10 +1486,37 @@
   /// The uri of the source file this procedure was loaded from.
   Uri fileUri;
 
-  Reference forwardingStubSuperTarget;
-  Reference forwardingStubInterfaceTarget;
+  Reference forwardingStubSuperTargetReference;
+  Reference forwardingStubInterfaceTargetReference;
 
-  Procedure(Name name, this.kind, this.function,
+  Procedure(Name name, ProcedureKind kind, FunctionNode function,
+      {bool isAbstract: false,
+      bool isStatic: false,
+      bool isExternal: false,
+      bool isConst: false,
+      bool isForwardingStub: false,
+      bool isForwardingSemiStub: false,
+      int transformerFlags: 0,
+      Uri fileUri,
+      Reference reference,
+      Member forwardingStubSuperTarget,
+      Member forwardingStubInterfaceTarget})
+      : this.byReference(name, kind, function,
+            isAbstract: isAbstract,
+            isStatic: isStatic,
+            isExternal: isExternal,
+            isConst: isConst,
+            isForwardingStub: isForwardingStub,
+            isForwardingSemiStub: isForwardingSemiStub,
+            transformerFlags: transformerFlags,
+            fileUri: fileUri,
+            reference: reference,
+            forwardingStubSuperTargetReference:
+                getMemberReference(forwardingStubSuperTarget),
+            forwardingStubInterfaceTargetReference:
+                getMemberReference(forwardingStubInterfaceTarget));
+
+  Procedure.byReference(Name name, this.kind, this.function,
       {bool isAbstract: false,
       bool isStatic: false,
       bool isExternal: false,
@@ -1499,8 +1526,8 @@
       int transformerFlags: 0,
       this.fileUri,
       Reference reference,
-      this.forwardingStubSuperTarget,
-      this.forwardingStubInterfaceTarget})
+      this.forwardingStubSuperTargetReference,
+      this.forwardingStubInterfaceTargetReference})
       : super(name, reference) {
     function?.parent = this;
     this.isAbstract = isAbstract;
@@ -1528,6 +1555,14 @@
   /// constant factories, such as `String.fromEnvironment`.
   bool get isConst => flags & FlagConst != 0;
 
+  /// If set, this flag indicates that this function's implementation exists
+  /// solely for the purpose of type checking arguments and forwarding to
+  /// [forwardingStubSuperTarget].
+  ///
+  /// Note that just because this bit is set doesn't mean that the function was
+  /// not declared in the source; it's possible that this is a forwarding
+  /// semi-stub (see isForwardingSemiStub).  To determine whether this function
+  /// was present in the source, consult [isSyntheticForwarder].
   bool get isForwardingStub => flags & FlagForwardingStub != 0;
 
   /// Indicates whether invocations using this interface target may need to
@@ -1542,6 +1577,11 @@
   /// stub, it was present in the original source as an abstract method.
   bool get isForwardingSemiStub => flags & FlagForwardingSemiStub != 0;
 
+  /// If set, this flag indicates that this function was not present in the
+  /// source, and it exists solely for the purpose of type checking arguments
+  /// and forwarding to [forwardingStubSuperTarget].
+  bool get isSyntheticForwarder => isForwardingStub && !isForwardingSemiStub;
+
   void set isStatic(bool value) {
     flags = value ? (flags | FlagStatic) : (flags & ~FlagStatic);
   }
@@ -1583,6 +1623,20 @@
   bool get hasSetter => kind == ProcedureKind.Setter;
   bool get isFactory => kind == ProcedureKind.Factory;
 
+  Member get forwardingStubSuperTarget =>
+      forwardingStubSuperTargetReference?.asMember;
+
+  void set forwardingStubSuperTarget(Member target) {
+    forwardingStubSuperTargetReference = getMemberReference(target);
+  }
+
+  Member get forwardingStubInterfaceTarget =>
+      forwardingStubInterfaceTargetReference?.asMember;
+
+  void set forwardingStubInterfaceTarget(Member target) {
+    forwardingStubInterfaceTargetReference = getMemberReference(target);
+  }
+
   accept(MemberVisitor v) => v.visitProcedure(this);
 
   acceptReference(MemberReferenceVisitor v) => v.visitProcedureReference(this);
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index a05093e..af75d44 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -940,9 +940,9 @@
     bool readFunctionNodeNow =
         (kind == ProcedureKind.Factory && functionNodeSize <= 50) ||
             _disableLazyReading;
-    var forwardingStubSuperTarget =
+    var forwardingStubSuperTargetReference =
         readAndCheckOptionTag() ? readMemberReference() : null;
-    var forwardingStubInterfaceTarget =
+    var forwardingStubInterfaceTargetReference =
         readAndCheckOptionTag() ? readMemberReference() : null;
     var function = readFunctionNodeOption(!readFunctionNodeNow, endOffset);
     var transformerFlags = getAndResetTransformerFlags();
@@ -958,10 +958,12 @@
       node.function = function;
       function?.parent = node;
       node.setTransformerFlagsWithoutLazyLoading(transformerFlags);
-      node.forwardingStubSuperTarget = forwardingStubSuperTarget;
-      node.forwardingStubInterfaceTarget = forwardingStubInterfaceTarget;
+      node.forwardingStubSuperTargetReference =
+          forwardingStubSuperTargetReference;
+      node.forwardingStubInterfaceTargetReference =
+          forwardingStubInterfaceTargetReference;
 
-      assert((node.forwardingStubSuperTarget != null) ||
+      assert((node.forwardingStubSuperTargetReference != null) ||
           !(node.isForwardingStub && node.function.body != null));
     }
     _byteOffset = endOffset;
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index ef1edea..8ed77d7 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -765,8 +765,8 @@
     writeName(node.name ?? '');
     writeUriReference(node.fileUri);
     writeAnnotationList(node.annotations);
-    writeOptionalReference(node.forwardingStubSuperTarget);
-    writeOptionalReference(node.forwardingStubInterfaceTarget);
+    writeOptionalReference(node.forwardingStubSuperTargetReference);
+    writeOptionalReference(node.forwardingStubInterfaceTargetReference);
     writeOptionalNode(node.function);
     _variableIndexer = null;
 
diff --git a/pkg/kernel/lib/core_types.dart b/pkg/kernel/lib/core_types.dart
index f23ccbf..fe1cd4b 100644
--- a/pkg/kernel/lib/core_types.dart
+++ b/pkg/kernel/lib/core_types.dart
@@ -79,7 +79,9 @@
   Class _stackTraceClass;
   Class _streamClass;
   Class _completerClass;
+  Class _asyncAwaitCompleterClass;
   Class _futureOrClass;
+  Constructor _asyncAwaitCompleterConstructor;
   Procedure _completerSyncConstructor;
   Procedure _completerComplete;
   Procedure _completerCompleteError;
@@ -162,11 +164,21 @@
     return _completerClass ??= _index.getClass('dart:async', 'Completer');
   }
 
+  Class get asyncAwaitCompleterClass {
+    return _asyncAwaitCompleterClass ??=
+        _index.getClass('dart:async', '_AsyncAwaitCompleter');
+  }
+
   Procedure get completerSyncConstructor {
     return _completerSyncConstructor ??=
         _index.getMember('dart:async', 'Completer', 'sync');
   }
 
+  Constructor get asyncAwaitCompleterConstructor {
+    return _asyncAwaitCompleterConstructor ??=
+        _index.getMember('dart:async', '_AsyncAwaitCompleter', '');
+  }
+
   Procedure get completerComplete {
     return _completerComplete ??=
         _index.getMember('dart:async', 'Completer', 'complete');
diff --git a/pkg/kernel/lib/target/targets.dart b/pkg/kernel/lib/target/targets.dart
index 342757e..1d1e8c9 100644
--- a/pkg/kernel/lib/target/targets.dart
+++ b/pkg/kernel/lib/target/targets.dart
@@ -15,16 +15,20 @@
 final List<String> targetNames = targets.keys.toList();
 
 class TargetFlags {
-  bool strongMode;
-  bool treeShake;
-  List<ProgramRoot> programRoots;
-  Uri kernelRuntime;
+  final bool strongMode;
+  final bool treeShake;
+
+  /// Whether `async` functions start synchronously.
+  final bool syncAsync;
+  final List<ProgramRoot> programRoots;
+  final Uri kernelRuntime;
 
   TargetFlags(
       {this.strongMode: false,
       this.treeShake: false,
+      this.syncAsync: false,
       this.programRoots: const <ProgramRoot>[],
-      this.kernelRuntime}) {}
+      this.kernelRuntime});
 }
 
 typedef Target _TargetBuilder(TargetFlags flags);
diff --git a/pkg/kernel/lib/target/vm.dart b/pkg/kernel/lib/target/vm.dart
index a30abbb..5079c65 100644
--- a/pkg/kernel/lib/target/vm.dart
+++ b/pkg/kernel/lib/target/vm.dart
@@ -64,7 +64,7 @@
     logger?.call("Transformed mixin applications");
 
     // TODO(kmillikin): Make this run on a per-method basis.
-    transformAsync.transformLibraries(coreTypes, libraries);
+    transformAsync.transformLibraries(coreTypes, libraries, flags.syncAsync);
     logger?.call("Transformed async methods");
   }
 
diff --git a/pkg/kernel/lib/target/vmcc.dart b/pkg/kernel/lib/target/vmcc.dart
index 28522cf..3496882 100644
--- a/pkg/kernel/lib/target/vmcc.dart
+++ b/pkg/kernel/lib/target/vmcc.dart
@@ -44,7 +44,7 @@
       performTreeShaking(coreTypes, program);
     }
 
-    cont.transformProgram(coreTypes, program);
+    cont.transformProgram(coreTypes, program, flags.syncAsync);
 
     new SanitizeForVM().transform(program);
 
diff --git a/pkg/kernel/lib/transformations/async.dart b/pkg/kernel/lib/transformations/async.dart
index 8539f2d..8f8133e 100644
--- a/pkg/kernel/lib/transformations/async.dart
+++ b/pkg/kernel/lib/transformations/async.dart
@@ -484,8 +484,8 @@
   }
 
   visitFunctionNode(FunctionNode node) {
-    var nestedRewriter =
-        new RecursiveContinuationRewriter(continuationRewriter.helper);
+    var nestedRewriter = new RecursiveContinuationRewriter(
+        continuationRewriter.helper, continuationRewriter.syncAsync);
     return node.accept(nestedRewriter);
   }
 }
diff --git a/pkg/kernel/lib/transformations/continuation.dart b/pkg/kernel/lib/transformations/continuation.dart
index 2b77554..9d8e50e 100644
--- a/pkg/kernel/lib/transformations/continuation.dart
+++ b/pkg/kernel/lib/transformations/continuation.dart
@@ -12,29 +12,34 @@
 
 import 'async.dart';
 
-void transformLibraries(CoreTypes coreTypes, List<Library> libraries) {
+void transformLibraries(
+    CoreTypes coreTypes, List<Library> libraries, bool syncAsync) {
   var helper = new HelperNodes.fromCoreTypes(coreTypes);
-  var rewriter = new RecursiveContinuationRewriter(helper);
+  var rewriter = new RecursiveContinuationRewriter(helper, syncAsync);
   for (var library in libraries) {
     rewriter.rewriteLibrary(library);
   }
 }
 
-Program transformProgram(CoreTypes coreTypes, Program program) {
+Program transformProgram(CoreTypes coreTypes, Program program, bool syncAsync) {
   var helper = new HelperNodes.fromCoreTypes(coreTypes);
-  var rewriter = new RecursiveContinuationRewriter(helper);
+  var rewriter = new RecursiveContinuationRewriter(helper, syncAsync);
   return rewriter.rewriteProgram(program);
 }
 
 class RecursiveContinuationRewriter extends Transformer {
   final HelperNodes helper;
+
+  /// Whether `async` functions should start synchronously.
+  final bool syncAsync;
+
   final VariableDeclaration asyncJumpVariable = new VariableDeclaration(
       ":await_jump_var",
       initializer: new IntLiteral(0));
   final VariableDeclaration asyncContextVariable =
       new VariableDeclaration(":await_ctx_var");
 
-  RecursiveContinuationRewriter(this.helper);
+  RecursiveContinuationRewriter(this.helper, this.syncAsync);
 
   Program rewriteProgram(Program node) {
     return node.accept(this);
@@ -52,14 +57,15 @@
     switch (node.asyncMarker) {
       case AsyncMarker.Sync:
       case AsyncMarker.SyncYielding:
-        node.transformChildren(new RecursiveContinuationRewriter(helper));
+        node.transformChildren(
+            new RecursiveContinuationRewriter(helper, syncAsync));
         return node;
       case AsyncMarker.SyncStar:
-        return new SyncStarFunctionRewriter(helper, node).rewrite();
+        return new SyncStarFunctionRewriter(helper, node, syncAsync).rewrite();
       case AsyncMarker.Async:
-        return new AsyncFunctionRewriter(helper, node).rewrite();
+        return new AsyncFunctionRewriter(helper, node, syncAsync).rewrite();
       case AsyncMarker.AsyncStar:
-        return new AsyncStarFunctionRewriter(helper, node).rewrite();
+        return new AsyncStarFunctionRewriter(helper, node, syncAsync).rewrite();
     }
   }
 }
@@ -72,8 +78,9 @@
   int capturedTryDepth = 0; // Deepest yield point within a try-block.
   int capturedCatchDepth = 0; // Deepest yield point within a catch-block.
 
-  ContinuationRewriterBase(HelperNodes helper, this.enclosingFunction)
-      : super(helper);
+  ContinuationRewriterBase(
+      HelperNodes helper, this.enclosingFunction, bool syncAsync)
+      : super(helper, syncAsync);
 
   /// Given a container [type], which is an instantiation of the given
   /// [containerClass] extract its element type.
@@ -157,13 +164,14 @@
 class SyncStarFunctionRewriter extends ContinuationRewriterBase {
   final VariableDeclaration iteratorVariable;
 
-  SyncStarFunctionRewriter(HelperNodes helper, FunctionNode enclosingFunction)
+  SyncStarFunctionRewriter(
+      HelperNodes helper, FunctionNode enclosingFunction, syncAsync)
       : iteratorVariable = new VariableDeclaration(':iterator')
           ..type = new InterfaceType(helper.syncIteratorClass, [
             ContinuationRewriterBase.elementTypeFrom(
                 helper.iterableClass, enclosingFunction.returnType)
           ]),
-        super(helper, enclosingFunction);
+        super(helper, enclosingFunction, syncAsync);
 
   FunctionNode rewrite() {
     // :sync_op(:iterator) {
@@ -256,8 +264,9 @@
 
   ExpressionLifter expressionRewriter;
 
-  AsyncRewriterBase(helper, enclosingFunction)
-      : super(helper, enclosingFunction) {}
+  AsyncRewriterBase(
+      HelperNodes helper, FunctionNode enclosingFunction, bool syncAsync)
+      : super(helper, enclosingFunction, syncAsync) {}
 
   void setupAsyncContinuations(List<Statement> statements) {
     expressionRewriter = new ExpressionLifter(this);
@@ -754,8 +763,9 @@
 class AsyncStarFunctionRewriter extends AsyncRewriterBase {
   VariableDeclaration controllerVariable;
 
-  AsyncStarFunctionRewriter(helper, enclosingFunction)
-      : super(helper, enclosingFunction);
+  AsyncStarFunctionRewriter(
+      HelperNodes helper, FunctionNode enclosingFunction, bool syncAsync)
+      : super(helper, enclosingFunction, syncAsync);
 
   FunctionNode rewrite() {
     var statements = <Statement>[];
@@ -862,8 +872,9 @@
   VariableDeclaration completerVariable;
   VariableDeclaration returnVariable;
 
-  AsyncFunctionRewriter(helper, enclosingFunction)
-      : super(helper, enclosingFunction);
+  AsyncFunctionRewriter(
+      HelperNodes helper, FunctionNode enclosingFunction, bool syncAsync)
+      : super(helper, enclosingFunction, syncAsync);
 
   FunctionNode rewrite() {
     var statements = <Statement>[];
@@ -877,16 +888,29 @@
     final DartType returnType =
         new InterfaceType(helper.futureOrClass, <DartType>[valueType]);
     var completerTypeArguments = <DartType>[valueType];
-    var completerType =
-        new InterfaceType(helper.completerClass, completerTypeArguments);
 
-    // final Completer<T> :completer = new Completer<T>.sync();
-    completerVariable = new VariableDeclaration(":completer",
-        initializer: new StaticInvocation(helper.completerConstructor,
-            new Arguments([], types: completerTypeArguments))
-          ..fileOffset = enclosingFunction.body?.fileOffset ?? -1,
-        isFinal: true,
-        type: completerType);
+    if (syncAsync) {
+      final completerType = new InterfaceType(
+          helper.asyncAwaitCompleterClass, completerTypeArguments);
+      // final Completer<T> :completer = new _AsyncAwaitCompleter<T>();
+      completerVariable = new VariableDeclaration(":completer",
+          initializer: new ConstructorInvocation(
+              helper.asyncAwaitCompleterConstructor,
+              new Arguments([], types: completerTypeArguments))
+            ..fileOffset = enclosingFunction.body?.fileOffset ?? -1,
+          isFinal: true,
+          type: completerType);
+    } else {
+      final completerType =
+          new InterfaceType(helper.completerClass, completerTypeArguments);
+      // final Completer<T> :completer = new Completer<T>.sync();
+      completerVariable = new VariableDeclaration(":completer",
+          initializer: new StaticInvocation(helper.completerConstructor,
+              new Arguments([], types: completerTypeArguments))
+            ..fileOffset = enclosingFunction.body?.fileOffset ?? -1,
+          isFinal: true,
+          type: completerType);
+    }
     statements.add(completerVariable);
 
     returnVariable = new VariableDeclaration(":return_value", type: returnType);
@@ -894,14 +918,23 @@
 
     setupAsyncContinuations(statements);
 
-    // new Future.microtask(:async_op);
-    var newMicrotaskStatement = new ExpressionStatement(new StaticInvocation(
-        helper.futureMicrotaskConstructor,
-        new Arguments([new VariableGet(nestedClosureVariable)],
-            types: [const DynamicType()]))
-      ..fileOffset = enclosingFunction.fileOffset);
-    statements.add(newMicrotaskStatement);
-
+    if (syncAsync) {
+      // :completer.start(:async_op);
+      var startStatement = new ExpressionStatement(new MethodInvocation(
+          new VariableGet(completerVariable),
+          new Name('start'),
+          new Arguments([new VariableGet(nestedClosureVariable)]))
+        ..fileOffset = enclosingFunction.fileOffset);
+      statements.add(startStatement);
+    } else {
+      // new Future.microtask(:async_op);
+      var newMicrotaskStatement = new ExpressionStatement(new StaticInvocation(
+          helper.futureMicrotaskConstructor,
+          new Arguments([new VariableGet(nestedClosureVariable)],
+              types: [const DynamicType()]))
+        ..fileOffset = enclosingFunction.fileOffset);
+      statements.add(newMicrotaskStatement);
+    }
     // return :completer.future;
     var completerGet = new VariableGet(completerVariable);
     var returnStatement = new ReturnStatement(new PropertyGet(completerGet,
@@ -964,9 +997,11 @@
   final Procedure asyncThenWrapper;
   final Procedure awaitHelper;
   final Class completerClass;
+  final Class asyncAwaitCompleterClass;
   final Member completerComplete;
   final Member completerCompleteError;
   final Member completerConstructor;
+  final Member asyncAwaitCompleterConstructor;
   final Member completerFuture;
   final Library coreLibrary;
   final CoreTypes coreTypes;
@@ -1001,9 +1036,11 @@
       this.asyncThenWrapper,
       this.awaitHelper,
       this.completerClass,
+      this.asyncAwaitCompleterClass,
       this.completerComplete,
       this.completerCompleteError,
       this.completerConstructor,
+      this.asyncAwaitCompleterConstructor,
       this.completerFuture,
       this.coreLibrary,
       this.coreTypes,
@@ -1039,9 +1076,11 @@
         coreTypes.asyncThenWrapperHelperProcedure,
         coreTypes.awaitHelperProcedure,
         coreTypes.completerClass,
+        coreTypes.asyncAwaitCompleterClass,
         coreTypes.completerComplete,
         coreTypes.completerCompleteError,
         coreTypes.completerSyncConstructor,
+        coreTypes.asyncAwaitCompleterConstructor,
         coreTypes.completerFuture,
         coreTypes.coreLibrary,
         coreTypes,
diff --git a/pkg/kernel/lib/transformations/mixin_full_resolution.dart b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
index 0935136..a38f134 100644
--- a/pkg/kernel/lib/transformations/mixin_full_resolution.dart
+++ b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
@@ -107,6 +107,13 @@
     // [Object] class.
     if (!processedClasses.add(class_)) return;
 
+    if (!librariesToBeTransformed.contains(class_.enclosingLibrary) &&
+        class_.enclosingLibrary.importUri?.scheme == "dart") {
+      // If we're not asked to transform the platform libraries then we expect
+      // that they will be already transformed.
+      return;
+    }
+
     // Ensure super classes have been transformed before this class.
     if (class_.superclass != null &&
         class_.superclass.level.index >= ClassLevel.Mixin.index) {
diff --git a/pkg/kernel/lib/transformations/treeshaker.dart b/pkg/kernel/lib/transformations/treeshaker.dart
index 74f236f..c64205c 100644
--- a/pkg/kernel/lib/transformations/treeshaker.dart
+++ b/pkg/kernel/lib/transformations/treeshaker.dart
@@ -1251,7 +1251,6 @@
         }
       }
     }
-    throw 'External procedure has no @ExternalName("...") annotation!';
   }
   return null;
 }
diff --git a/pkg/kernel/pubspec.yaml b/pkg/kernel/pubspec.yaml
index dea57f8..4a5212c 100644
--- a/pkg/kernel/pubspec.yaml
+++ b/pkg/kernel/pubspec.yaml
@@ -1,5 +1,5 @@
 name: kernel
-version: 0.3.0-alpha.4
+version: 0.3.0-alpha.5
 author: Dart Team <misc@dartlang.org>
 description: Dart IR (Intermediate Representation)
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/kernel
@@ -12,7 +12,7 @@
   package_config: ^1.0.0
 dev_dependencies:
   analyzer: '>=0.30.0 <0.32.0'
-  front_end: 0.1.0-alpha.7
+  front_end: 0.1.0-alpha.8
   test: ^0.12.15+6
   stack_trace: ^1.6.6
   ansicolor: ^0.0.9
diff --git a/pkg/pkg.status b/pkg/pkg.status
index f5bf31f..2c26a32 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -45,7 +45,6 @@
 front_end/test/minimal_incremental_kernel_generator_test: Slow, Pass
 front_end/test/whole_program_test: Slow, Pass
 front_end/testcases/*: Skip # These are not tests but input for tests.
-front_end/tool/_fasta/compile_platform_test: Fail
 front_end/tool/incremental_perf_test: Slow, Pass
 kernel/test/closures_test: Slow, Pass
 kernel/testcases/*: Skip # These are not tests but input for tests.
@@ -71,6 +70,7 @@
 compiler/tool/*: SkipByDesign # Only meant to run on vm
 front_end/test/dependency_grapher_test: SkipByDesign # Uses dart:io
 front_end/test/incremental_kernel_generator_test: SkipByDesign # Uses dart:io
+front_end/test/incremental_load_from_dill_test: SkipByDesign # Uses dart:io
 front_end/test/incremental_resolved_ast_generator_test: SkipByDesign # Uses dart:io
 front_end/test/memory_file_system_test: CompileTimeError # Issue 23773
 front_end/test/src/base/file_repository_test: SkipByDesign # Uses dart:io
diff --git a/pkg/status_file/test/parse_and_normalize_test.dart b/pkg/status_file/test/parse_and_normalize_test.dart
index 2a90c33..0692c3a 100644
--- a/pkg/status_file/test/parse_and_normalize_test.dart
+++ b/pkg/status_file/test/parse_and_normalize_test.dart
@@ -20,16 +20,17 @@
       // to be valid and looks more like some kind of template or help document.
       // Ignore it.
       var co19StatusFile = repoRoot.resolve('tests/co19/src/co19.status');
+      var co19_2StatusFile = repoRoot.resolve('tests/co19_2/src/co19.status');
       if (FileSystemEntity.identicalSync(
-          entry.path, new File.fromUri(co19StatusFile).path)) {
+              entry.path, new File.fromUri(co19StatusFile).path) ||
+          FileSystemEntity.identicalSync(
+              entry.path, new File.fromUri(co19_2StatusFile).path)) {
         continue;
       }
 
       try {
         var statusFile = new StatusFile.read(entry.path);
-        print("-------" + entry.path + "---------------");
-        print(statusFile.toString());
-        print("-------" + entry.path + "---------------");
+        statusFile.toString();
       } catch (err, st) {
         print(err);
         print(st);
diff --git a/pkg/status_file/test/repo_status_files_test.dart b/pkg/status_file/test/repo_status_files_test.dart
index ef4ae6d..ce57c42 100644
--- a/pkg/status_file/test/repo_status_files_test.dart
+++ b/pkg/status_file/test/repo_status_files_test.dart
@@ -10,26 +10,31 @@
 import 'package:path/path.dart' as p;
 import 'package:status_file/status_file.dart';
 
-final repoRoot =
-    p.normalize(p.join(p.dirname(p.fromUri(Platform.script)), "../../../"));
+final Uri repoRoot = Platform.script.resolve("../../../");
 
 void main() {
   // Parse every status file in the repository.
-  for (var directory in ["tests", p.join("runtime", "tests")]) {
-    for (var entry in new Directory(p.join(repoRoot, directory))
+  for (var directory in ["tests", "runtime/tests"]) {
+    for (var entry in new Directory.fromUri(repoRoot.resolve(directory))
         .listSync(recursive: true)) {
       if (!entry.path.endsWith(".status")) continue;
 
       // Inside the co19 repository, there is a status file that doesn't appear
       // to be valid and looks more like some kind of template or help document.
       // Ignore it.
-      if (entry.path.endsWith(p.join("co19", "src", "co19.status"))) continue;
+      var co19StatusFile = repoRoot.resolve('tests/co19/src/co19.status');
+      var co19_2StatusFile = repoRoot.resolve('tests/co19_2/src/co19.status');
+      if (FileSystemEntity.identicalSync(
+              entry.path, new File.fromUri(co19StatusFile).path) ||
+          FileSystemEntity.identicalSync(
+              entry.path, new File.fromUri(co19_2StatusFile).path)) {
+        continue;
+      }
 
       try {
         new StatusFile.read(entry.path);
       } catch (err) {
-        var path = p.relative(entry.path, from: repoRoot);
-        Expect.fail("Could not parse '$path'.\n$err");
+        Expect.fail("Could not parse '${entry.path}'.\n$err");
       }
     }
   }
diff --git a/pkg/testing/lib/src/multitest.dart b/pkg/testing/lib/src/multitest.dart
index 3ba8410..c87a654 100644
--- a/pkg/testing/lib/src/multitest.dart
+++ b/pkg/testing/lib/src/multitest.dart
@@ -4,7 +4,7 @@
 
 library testing.multitest;
 
-import 'dart:async' show Stream, StreamTransformer;
+import 'dart:async' show Stream, StreamTransformerBase;
 
 import 'dart:io' show Directory, File;
 
@@ -25,7 +25,7 @@
 }
 
 class MultitestTransformer
-    implements StreamTransformer<TestDescription, TestDescription> {
+    extends StreamTransformerBase<TestDescription, TestDescription> {
   static RegExp multitestMarker = new RegExp(r"//[#/]");
   static int _multitestMarkerLength = 3;
 
diff --git a/pkg/vm/bin/dump_kernel.dart b/pkg/vm/bin/dump_kernel.dart
index 28499bc..46f6680 100644
--- a/pkg/vm/bin/dump_kernel.dart
+++ b/pkg/vm/bin/dump_kernel.dart
@@ -11,6 +11,8 @@
 import 'package:vm/metadata/direct_call.dart' show DirectCallMetadataRepository;
 import 'package:vm/metadata/inferred_type.dart'
     show InferredTypeMetadataRepository;
+import 'package:vm/metadata/procedure_attributes.dart'
+    show ProcedureAttributesMetadataRepository;
 
 final String _usage = '''
 Usage: dump_kernel input.dill output.txt
@@ -31,6 +33,7 @@
   // Register VM-specific metadata.
   program.addMetadataRepository(new DirectCallMetadataRepository());
   program.addMetadataRepository(new InferredTypeMetadataRepository());
+  program.addMetadataRepository(new ProcedureAttributesMetadataRepository());
 
   final List<int> bytes = new File(input).readAsBytesSync();
   new BinaryBuilderWithMetadata(bytes).readProgram(program);
diff --git a/pkg/vm/bin/gen_kernel.dart b/pkg/vm/bin/gen_kernel.dart
index 8a501f5..1a5b13c 100644
--- a/pkg/vm/bin/gen_kernel.dart
+++ b/pkg/vm/bin/gen_kernel.dart
@@ -25,6 +25,7 @@
           'Produce kernel file for AOT compilation (enables global transformations).',
       defaultsTo: false)
   ..addFlag('strong-mode', help: 'Enable strong mode', defaultsTo: true)
+  ..addFlag('sync-async', help: 'Start `async` functions synchronously')
   ..addFlag('embed-sources',
       help: 'Embed source files in the generated kernel program',
       defaultsTo: true);
@@ -62,12 +63,14 @@
   final String packages = options['packages'];
   final bool strongMode = options['strong-mode'];
   final bool aot = options['aot'];
+  final bool syncAsync = options['sync-async'];
 
   ErrorDetector errorDetector = new ErrorDetector();
 
   final CompilerOptions compilerOptions = new CompilerOptions()
     ..strongMode = strongMode
-    ..target = new VmTarget(new TargetFlags(strongMode: strongMode))
+    ..target = new VmTarget(
+        new TargetFlags(strongMode: strongMode, syncAsync: syncAsync))
     ..linkedDependencies = <Uri>[Uri.base.resolve(platformKernel)]
     ..packagesFileUri = packages != null ? Uri.base.resolve(packages) : null
     ..reportMessages = true
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index da72077..60e73f2 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -39,6 +39,7 @@
 import 'package:kernel/target/vm.dart' show VmTarget;
 
 const bool verbose = const bool.fromEnvironment('DFE_VERBOSE');
+const String platformKernelFile = 'virtual_platform_kernel.dill';
 
 abstract class Compiler {
   final FileSystem fileSystem;
@@ -47,8 +48,10 @@
 
   CompilerOptions options;
 
-  Compiler(this.fileSystem, Uri platformKernel,
-      {this.strongMode: false, bool suppressWarnings: false}) {
+  Compiler(this.fileSystem, Uri platformKernelPath,
+      {this.strongMode: false,
+      bool suppressWarnings: false,
+      bool syncAsync: false}) {
     Uri packagesUri = (Platform.packageConfig != null)
         ? Uri.parse(Platform.packageConfig)
         : null;
@@ -57,16 +60,18 @@
       print("DFE: Platform.packageConfig: ${Platform.packageConfig}");
       print("DFE: packagesUri: ${packagesUri}");
       print("DFE: Platform.resolvedExecutable: ${Platform.resolvedExecutable}");
-      print("DFE: platformKernel: ${platformKernel}");
+      print("DFE: platformKernelPath: ${platformKernelPath}");
       print("DFE: strongMode: ${strongMode}");
+      print("DFE: syncAsync: ${syncAsync}");
     }
 
     options = new CompilerOptions()
       ..strongMode = strongMode
       ..fileSystem = fileSystem
-      ..target = new VmTarget(new TargetFlags(strongMode: strongMode))
+      ..target = new VmTarget(
+          new TargetFlags(strongMode: strongMode, syncAsync: syncAsync))
       ..packagesFileUri = packagesUri
-      ..sdkSummary = platformKernel
+      ..sdkSummary = platformKernelPath
       ..verbose = verbose
       ..onProblem =
           (message, Severity severity, String formatted, int line, int column) {
@@ -98,10 +103,12 @@
 class IncrementalCompiler extends Compiler {
   IncrementalKernelGenerator generator;
 
-  IncrementalCompiler(FileSystem fileSystem, Uri platformKernel,
-      {bool strongMode: false, bool suppressWarnings: false})
-      : super(fileSystem, platformKernel,
-            strongMode: strongMode, suppressWarnings: suppressWarnings);
+  IncrementalCompiler(FileSystem fileSystem, Uri platformKernelPath,
+      {bool strongMode: false, bool suppressWarnings: false, syncAsync: false})
+      : super(fileSystem, platformKernelPath,
+            strongMode: strongMode,
+            suppressWarnings: suppressWarnings,
+            syncAsync: syncAsync);
 
   @override
   Future<Program> compileInternal(Uri script) async {
@@ -119,12 +126,15 @@
 class SingleShotCompiler extends Compiler {
   final bool requireMain;
 
-  SingleShotCompiler(FileSystem fileSystem, Uri platformKernel,
+  SingleShotCompiler(FileSystem fileSystem, Uri platformKernelPath,
       {this.requireMain: false,
       bool strongMode: false,
-      bool suppressWarnings: false})
-      : super(fileSystem, platformKernel,
-            strongMode: strongMode, suppressWarnings: suppressWarnings);
+      bool suppressWarnings: false,
+      bool syncAsync: false})
+      : super(fileSystem, platformKernelPath,
+            strongMode: strongMode,
+            suppressWarnings: suppressWarnings,
+            syncAsync: syncAsync);
 
   @override
   Future<Program> compileInternal(Uri script) async {
@@ -136,9 +146,11 @@
 
 final Map<int, Compiler> isolateCompilers = new Map<int, Compiler>();
 
-Future<Compiler> lookupOrBuildNewIncrementalCompiler(
-    int isolateId, List sourceFiles, Uri platformKernel,
-    {bool strongMode: false, bool suppressWarnings: false}) async {
+Future<Compiler> lookupOrBuildNewIncrementalCompiler(int isolateId,
+    List sourceFiles, Uri platformKernelPath, List<int> platformKernel,
+    {bool strongMode: false,
+    bool suppressWarnings: false,
+    bool syncAsync: false}) async {
   IncrementalCompiler compiler;
   if (isolateCompilers.containsKey(isolateId)) {
     compiler = isolateCompilers[isolateId];
@@ -153,42 +165,48 @@
       }
     }
   } else {
-    final FileSystem fileSystem = sourceFiles == null
+    final FileSystem fileSystem = sourceFiles == null && platformKernel == null
         ? StandardFileSystem.instance
-        : _buildFileSystem(sourceFiles);
+        : _buildFileSystem(sourceFiles, platformKernel);
 
     // TODO(aam): IncrementalCompiler instance created below have to be
     // destroyed when corresponding isolate is shut down. To achieve that kernel
     // isolate needs to receive a message indicating that particular
     // isolate was shut down. Message should be handled here in this script.
-    compiler = new IncrementalCompiler(fileSystem, platformKernel,
-        strongMode: strongMode, suppressWarnings: suppressWarnings);
+    compiler = new IncrementalCompiler(fileSystem, platformKernelPath,
+        strongMode: strongMode,
+        suppressWarnings: suppressWarnings,
+        syncAsync: syncAsync);
     isolateCompilers[isolateId] = compiler;
   }
   return compiler;
 }
 
-// Process a request from the runtime. See KernelIsolate::CompileToKernel in
-// kernel_isolate.cc and Loader::SendKernelRequest in loader.cc.
 Future _processLoadRequest(request) async {
   if (verbose) print("DFE: request: $request");
 
   int tag = request[0];
   final SendPort port = request[1];
   final String inputFileUri = request[2];
-  final Uri script = Uri.base.resolve(inputFileUri);
-  final Uri platformKernel = request[3] != null
-      ? Uri.base.resolveUri(new Uri.file(request[3]))
-      : computePlatformBinariesLocation().resolve(
-          // TODO(sigmund): use `vm_outline.dill` when the mixin transformer is
-          // modular.
-          'vm_platform.dill');
-
   final bool incremental = request[4];
   final bool strong = request[5];
   final int isolateId = request[6];
   final List sourceFiles = request[7];
   final bool suppressWarnings = request[8];
+  final bool syncAsync = request[9];
+
+  final Uri script = Uri.base.resolve(inputFileUri);
+  Uri platformKernelPath = null;
+  List<int> platformKernel = null;
+  if (request[3] is String) {
+    platformKernelPath = Uri.base.resolveUri(new Uri.file(request[3]));
+  } else if (request[3] is List<int>) {
+    platformKernelPath = Uri.parse(platformKernelFile);
+    platformKernel = request[3];
+  } else {
+    platformKernelPath = computePlatformBinariesLocation()
+        .resolve(strong ? 'vm_platform_strong.dill' : 'vm_platform.dill');
+  }
 
   Compiler compiler;
   // TODO(aam): There should be no need to have an option to choose
@@ -197,16 +215,17 @@
   // watch the performance though.
   if (incremental) {
     compiler = await lookupOrBuildNewIncrementalCompiler(
-        isolateId, sourceFiles, platformKernel,
-        suppressWarnings: suppressWarnings);
+        isolateId, sourceFiles, platformKernelPath, platformKernel,
+        suppressWarnings: suppressWarnings, syncAsync: syncAsync);
   } else {
-    final FileSystem fileSystem = sourceFiles == null
+    final FileSystem fileSystem = sourceFiles == null && platformKernel == null
         ? StandardFileSystem.instance
-        : _buildFileSystem(sourceFiles);
-    compiler = new SingleShotCompiler(fileSystem, platformKernel,
+        : _buildFileSystem(sourceFiles, platformKernel);
+    compiler = new SingleShotCompiler(fileSystem, platformKernelPath,
         requireMain: sourceFiles == null,
         strongMode: strong,
-        suppressWarnings: suppressWarnings);
+        suppressWarnings: suppressWarnings,
+        syncAsync: syncAsync);
   }
 
   CompilationResult result;
@@ -256,17 +275,24 @@
 ///
 /// The result can be used instead of StandardFileSystem.instance by the
 /// frontend.
-FileSystem _buildFileSystem(List namedSources) {
+FileSystem _buildFileSystem(List namedSources, List<int> platformKernel) {
   MemoryFileSystem fileSystem = new MemoryFileSystem(Uri.parse('file:///'));
-  for (int i = 0; i < namedSources.length ~/ 2; i++) {
+  if (namedSources != null) {
+    for (int i = 0; i < namedSources.length ~/ 2; i++) {
+      fileSystem
+          .entityForUri(Uri.parse(namedSources[i * 2]))
+          .writeAsBytesSync(namedSources[i * 2 + 1]);
+    }
+  }
+  if (platformKernel != null) {
     fileSystem
-        .entityForUri(Uri.parse(namedSources[i * 2]))
-        .writeAsBytesSync(namedSources[i * 2 + 1]);
+        .entityForUri(Uri.parse(platformKernelFile))
+        .writeAsBytesSync(platformKernel);
   }
   return new HybridFileSystem(fileSystem);
 }
 
-train(String scriptUri, String platformKernel) {
+train(String scriptUri, String platformKernelPath) {
   // TODO(28532): Enable on Windows.
   if (Platform.isWindows) return;
 
@@ -287,12 +313,13 @@
     tag,
     responsePort.sendPort,
     scriptUri,
-    platformKernel,
+    platformKernelPath,
     false /* incremental */,
     false /* strong */,
     1 /* isolateId chosen randomly */,
     null /* source files */,
     false /* suppress warnings */,
+    false /* synchronous async */,
   ];
   _processLoadRequest(request);
 }
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index 281f67c..569b786 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -19,6 +19,8 @@
 
 import 'transformations/devirtualization.dart' as devirtualization
     show transformProgram;
+import 'transformations/no_dynamic_invocations_annotator.dart'
+    as no_dynamic_invocations_annotator show transformProgram;
 import 'transformations/type_flow/transformer.dart' as globalTypeFlow
     show transformProgram;
 
@@ -58,6 +60,7 @@
       globalTypeFlow.transformProgram(coreTypes, program);
     } else {
       devirtualization.transformProgram(coreTypes, program);
+      no_dynamic_invocations_annotator.transformProgram(coreTypes, program);
     }
   }
 }
diff --git a/pkg/vm/lib/metadata/procedure_attributes.dart b/pkg/vm/lib/metadata/procedure_attributes.dart
new file mode 100644
index 0000000..1e6acb8
--- /dev/null
+++ b/pkg/vm/lib/metadata/procedure_attributes.dart
@@ -0,0 +1,41 @@
+// 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 vm.metadata.procedure_attributes;
+
+import 'package:kernel/ast.dart';
+
+/// Metadata for annotating procedures with various attributes.
+class ProcedureAttributesMetadata {
+  final bool hasDynamicInvocations;
+
+  const ProcedureAttributesMetadata({this.hasDynamicInvocations});
+
+  const ProcedureAttributesMetadata.noDynamicInvocations()
+      : hasDynamicInvocations = false;
+
+  @override
+  String toString() => "hasDynamicInvocations:${hasDynamicInvocations}";
+}
+
+/// Repository for [ProcedureAttributesMetadata].
+class ProcedureAttributesMetadataRepository
+    extends MetadataRepository<ProcedureAttributesMetadata> {
+  @override
+  final String tag = 'vm.procedure-attributes.metadata';
+
+  @override
+  final Map<TreeNode, ProcedureAttributesMetadata> mapping =
+      <TreeNode, ProcedureAttributesMetadata>{};
+
+  @override
+  void writeToBinary(ProcedureAttributesMetadata metadata, BinarySink sink) {
+    assert(!metadata.hasDynamicInvocations);
+  }
+
+  @override
+  ProcedureAttributesMetadata readFromBinary(BinarySource source) {
+    return const ProcedureAttributesMetadata.noDynamicInvocations();
+  }
+}
diff --git a/pkg/vm/lib/transformations/no_dynamic_invocations_annotator.dart b/pkg/vm/lib/transformations/no_dynamic_invocations_annotator.dart
new file mode 100644
index 0000000..7950fa0
--- /dev/null
+++ b/pkg/vm/lib/transformations/no_dynamic_invocations_annotator.dart
@@ -0,0 +1,117 @@
+// 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 vm.transformations.no_dynamic_invocations_annotator;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/core_types.dart' show CoreTypes;
+
+import '../metadata/procedure_attributes.dart';
+
+/// Assumes strong mode and closed world. If a procedure can not be riched
+/// via dynamic invocation from anywhere then annotates it with appropriate
+/// [ProcedureAttributeMetadata] annotation.
+Program transformProgram(CoreTypes coreTypes, Program program) {
+  new NoDynamicInvocationsAnnotator(program).visitProgram(program);
+  return program;
+}
+
+enum Action { get, set, invoke }
+
+class Selector {
+  final Action action;
+  final Name target;
+
+  Selector(this.action, this.target);
+
+  bool operator ==(other) {
+    return other is Selector &&
+        other.action == this.action &&
+        other.target == this.target;
+  }
+
+  int get hashCode => (action.index * 31) ^ target.hashCode;
+
+  @override
+  String toString() {
+    switch (action) {
+      case Action.get:
+        return 'get:${target}';
+      case Action.set:
+        return 'set:${target}';
+      case Action.invoke:
+        return '${target}';
+    }
+    return '?';
+  }
+}
+
+class NoDynamicInvocationsAnnotator extends RecursiveVisitor<Null> {
+  final Set<Selector> _dynamicSelectors;
+  final ProcedureAttributesMetadataRepository _metadata;
+
+  NoDynamicInvocationsAnnotator(Program program)
+      : _dynamicSelectors = DynamicSelectorsCollector.collect(program),
+        _metadata = new ProcedureAttributesMetadataRepository() {
+    program.addMetadataRepository(_metadata);
+  }
+
+  @override
+  visitProcedure(Procedure node) {
+    if (node.isStatic || node.name.name == 'call') {
+      return;
+    }
+
+    Selector selector;
+    if (node.kind == ProcedureKind.Method) {
+      selector = new Selector(Action.invoke, node.name);
+    } else if (node.kind == ProcedureKind.Setter) {
+      selector = new Selector(Action.set, node.name);
+    } else {
+      return;
+    }
+
+    if (!_dynamicSelectors.contains(selector)) {
+      _metadata.mapping[node] =
+          const ProcedureAttributesMetadata.noDynamicInvocations();
+    }
+  }
+}
+
+class DynamicSelectorsCollector extends RecursiveVisitor<Null> {
+  final Set<Selector> dynamicSelectors = new Set<Selector>();
+
+  static Set<Selector> collect(Program program) {
+    final v = new DynamicSelectorsCollector();
+    v.visitProgram(program);
+    return v.dynamicSelectors;
+  }
+
+  @override
+  visitMethodInvocation(MethodInvocation node) {
+    super.visitMethodInvocation(node);
+
+    if (node.dispatchCategory == DispatchCategory.dynamicDispatch) {
+      dynamicSelectors.add(new Selector(Action.invoke, node.name));
+    }
+  }
+
+  @override
+  visitPropertyGet(PropertyGet node) {
+    super.visitPropertyGet(node);
+
+    if (node.dispatchCategory == DispatchCategory.dynamicDispatch) {
+      dynamicSelectors.add(new Selector(Action.get, node.name));
+    }
+  }
+
+  @override
+  visitPropertySet(PropertySet node) {
+    super.visitPropertySet(node);
+
+    if (node.dispatchCategory == DispatchCategory.dynamicDispatch) {
+      dynamicSelectors.add(new Selector(Action.set, node.name));
+    }
+  }
+}
diff --git a/pkg/vm/lib/transformations/type_flow/analysis.dart b/pkg/vm/lib/transformations/type_flow/analysis.dart
index 390a625..de9316c 100644
--- a/pkg/vm/lib/transformations/type_flow/analysis.dart
+++ b/pkg/vm/lib/transformations/type_flow/analysis.dart
@@ -5,6 +5,7 @@
 /// Global type flow analysis.
 library kernel.transformations.analysis;
 
+import 'dart:collection';
 import 'dart:core' hide Type;
 
 import 'package:kernel/ast.dart' hide Statement, StatementVisitor;
@@ -24,7 +25,6 @@
 // organized in several categories:
 //
 // === Correctness ===
-// * Handle noSuchMethod invocations correctly.
 // * Verify incremental re-calculation by fresh analysis starting with known
 //   allocated classes.
 // * Auto-generate entry_points.json during build.
@@ -68,7 +68,8 @@
 /// This is the basic unit of processing in type flow analysis.
 /// Call sites calling the same method with the same argument types
 /// may reuse results of the analysis through the same _Invocation instance.
-abstract class _Invocation extends _DependencyTracker {
+abstract class _Invocation extends _DependencyTracker
+    with LinkedListEntry<_Invocation> {
   final Selector selector;
   final Args<Type> args;
 
@@ -96,6 +97,34 @@
 
   @override
   String toString() => "_Invocation $selector $args";
+
+  /// Processes noSuchMethod() invocation and returns its result.
+  /// Used if target is not found or number of arguments is incorrect.
+  Type _processNoSuchMethod(Type receiver, TypeFlowAnalysis typeFlowAnalysis) {
+    tracePrint("Processing noSuchMethod for receiver $receiver");
+
+    final nsmSelector = new InterfaceSelector(
+        typeFlowAnalysis.hierarchyCache.objectNoSuchMethod,
+        callKind: CallKind.Method);
+
+    final nsmArgs = new Args<Type>([
+      receiver,
+      new Type.cone(
+          typeFlowAnalysis.environment.coreTypes.invocationClass.rawType)
+    ]);
+
+    final nsmInvocation =
+        typeFlowAnalysis._invocationsCache.getInvocation(nsmSelector, nsmArgs);
+
+    final Type type =
+        typeFlowAnalysis.workList.processInvocation(nsmInvocation);
+
+    // Result of this invocation depends on the result of noSuchMethod
+    // inovcation.
+    nsmInvocation.addDependentInvocation(this);
+
+    return type;
+  }
 }
 
 class _DirectInvocation extends _Invocation {
@@ -160,8 +189,8 @@
             .getSummary(member)
             .apply(args, typeFlowAnalysis.hierarchyCache, typeFlowAnalysis);
       } else {
-        // TODO(alexmarkov): support noSuchMethod invocation here.
-        return new Type.empty();
+        assertx(selector.callKind == CallKind.Method);
+        return _processNoSuchMethod(args.receiver, typeFlowAnalysis);
       }
     } else {
       if (selector.callKind == CallKind.PropertyGet) {
@@ -211,6 +240,10 @@
   Set<Call> _callSites; // Populated only if not polymorphic.
   Member _monomorphicTarget;
 
+  /// Marker for noSuchMethod() invocation in the map of invocation targets.
+  static final Member kNoSuchMethodMarker =
+      new Procedure(new Name('noSuchMethod&&'), ProcedureKind.Method, null);
+
   _DispatchableInvocation(Selector selector, Args<Type> args)
       : super(selector, args) {
     assertx(selector is! DirectSelector);
@@ -222,7 +255,7 @@
 
     // Collect all possible targets for this invocation,
     // along with more accurate receiver types for each target.
-    final targets = <Member, Type>{};
+    final targets = <Member, _ReceiverTypeBuilder>{};
     _collectTargetsForReceiverType(args.receiver, targets, typeFlowAnalysis);
 
     // Calculate result as a union of results of direct invocations
@@ -233,29 +266,42 @@
       tracePrint("No targets...");
     } else {
       if (targets.length == 1) {
-        _setMonomorphicTarget(targets.keys.single);
+        final target = targets.keys.single;
+        if (target != kNoSuchMethodMarker) {
+          _setMonomorphicTarget(target);
+        } else {
+          _setPolymorphic();
+        }
       } else {
         _setPolymorphic();
       }
-      targets.forEach((Member target, Type receiver) {
-        final directSelector =
-            new DirectSelector(target, callKind: selector.callKind);
 
-        Args<Type> directArgs = args;
-        if (args.receiver != receiver) {
-          directArgs = new Args<Type>.withReceiver(args, receiver);
+      targets
+          .forEach((Member target, _ReceiverTypeBuilder receiverTypeBuilder) {
+        Type receiver = receiverTypeBuilder.toType();
+        Type type;
+
+        if (target == kNoSuchMethodMarker) {
+          type = _processNoSuchMethod(receiver, typeFlowAnalysis);
+        } else {
+          final directSelector =
+              new DirectSelector(target, callKind: selector.callKind);
+
+          Args<Type> directArgs = args;
+          if (args.receiver != receiver) {
+            directArgs = new Args<Type>.withReceiver(args, receiver);
+          }
+
+          final directInvocation = typeFlowAnalysis._invocationsCache
+              .getInvocation(directSelector, directArgs);
+
+          type = typeFlowAnalysis.workList.processInvocation(directInvocation);
+
+          // Result of this invocation depends on the results of direct
+          // invocations corresponding to each target.
+          directInvocation.addDependentInvocation(this);
         }
 
-        final directInvocation = typeFlowAnalysis._invocationsCache
-            .getInvocation(directSelector, directArgs);
-
-        final Type type =
-            typeFlowAnalysis.workList.processInvocation(directInvocation);
-
-        // Result of this invocation depends on the results of direct
-        // invocations corresponding to each target.
-        directInvocation.addDependentInvocation(this);
-
         result = result.union(type, typeFlowAnalysis.hierarchyCache);
       });
     }
@@ -269,12 +315,14 @@
     return result;
   }
 
-  void _collectTargetsForReceiverType(Type receiver, Map<Member, Type> targets,
+  void _collectTargetsForReceiverType(
+      Type receiver,
+      Map<Member, _ReceiverTypeBuilder> targets,
       TypeFlowAnalysis typeFlowAnalysis) {
     assertx(receiver != const EmptyType()); // should be filtered earlier
 
-    if (receiver is NullableType) {
-      _collectTargetsForNull(targets, typeFlowAnalysis);
+    final bool isNullableReceiver = receiver is NullableType;
+    if (isNullableReceiver) {
       receiver = (receiver as NullableType).baseType;
       assertx(receiver is! NullableType);
     }
@@ -286,7 +334,9 @@
           staticReceiverType, typeFlowAnalysis.hierarchyCache);
       assertx(receiver is! NullableType);
 
-      tracePrint("Narrowed down receiver type: $receiver");
+      if (kPrintTrace) {
+        tracePrint("Narrowed down receiver type: $receiver");
+      }
     }
 
     if (receiver is ConeType) {
@@ -297,6 +347,8 @@
           .specializeTypeCone((receiver as ConeType).dartType);
     }
 
+    assertx(targets.isEmpty);
+
     if (receiver is ConcreteType) {
       _collectTargetsForConcreteType(receiver, targets, typeFlowAnalysis);
     } else if (receiver is SetType) {
@@ -308,25 +360,32 @@
     } else {
       assertx(receiver is EmptyType);
     }
+
+    if (isNullableReceiver) {
+      _collectTargetsForNull(targets, typeFlowAnalysis);
+    }
   }
 
   // TODO(alexmarkov): Consider caching targets for Null type.
-  void _collectTargetsForNull(
-      Map<Member, Type> targets, TypeFlowAnalysis typeFlowAnalysis) {
+  void _collectTargetsForNull(Map<Member, _ReceiverTypeBuilder> targets,
+      TypeFlowAnalysis typeFlowAnalysis) {
     Class nullClass = typeFlowAnalysis.environment.coreTypes.nullClass;
 
     Member target = typeFlowAnalysis.hierarchyCache.hierarchy
         .getDispatchTarget(nullClass, selector.name, setter: selector.isSetter);
 
     if (target != null) {
-      tracePrint("Found $target for null receiver");
-      _addTarget(targets, target, new Type.nullable(const EmptyType()),
-          typeFlowAnalysis);
+      if (kPrintTrace) {
+        tracePrint("Found $target for null receiver");
+      }
+      _getReceiverTypeBuilder(targets, target).addNull();
     }
   }
 
-  void _collectTargetsForConcreteType(ConcreteType receiver,
-      Map<Member, Type> targets, TypeFlowAnalysis typeFlowAnalysis) {
+  void _collectTargetsForConcreteType(
+      ConcreteType receiver,
+      Map<Member, _ReceiverTypeBuilder> targets,
+      TypeFlowAnalysis typeFlowAnalysis) {
     DartType receiverDartType = receiver.dartType;
 
     assertx(receiverDartType is! FunctionType);
@@ -338,15 +397,27 @@
         .getDispatchTarget(class_, selector.name, setter: selector.isSetter);
 
     if (target != null) {
-      tracePrint("Found $target for concrete receiver $receiver");
-      _addTarget(targets, target, receiver, typeFlowAnalysis);
+      if (kPrintTrace) {
+        tracePrint("Found $target for concrete receiver $receiver");
+      }
+      _getReceiverTypeBuilder(targets, target).addConcreteType(receiver);
     } else {
-      tracePrint("Target is not found for receiver $receiver");
+      if (typeFlowAnalysis.hierarchyCache.hasNonTrivialNoSuchMethod(class_)) {
+        if (kPrintTrace) {
+          tracePrint("Found non-trivial noSuchMethod for receiver $receiver");
+        }
+        _getReceiverTypeBuilder(targets, kNoSuchMethodMarker)
+            .addConcreteType(receiver);
+      } else {
+        if (kPrintTrace) {
+          tracePrint("Target is not found for receiver $receiver");
+        }
+      }
     }
   }
 
-  void _collectTargetsForSelector(
-      Map<Member, Type> targets, TypeFlowAnalysis typeFlowAnalysis) {
+  void _collectTargetsForSelector(Map<Member, _ReceiverTypeBuilder> targets,
+      TypeFlowAnalysis typeFlowAnalysis) {
     Selector selector = this.selector;
     if (selector is InterfaceSelector) {
       // TODO(alexmarkov): support generic types and make sure inferred types
@@ -357,20 +428,26 @@
     }
 
     final receiver = args.receiver;
-    for (Member target in typeFlowAnalysis.hierarchyCache
-        .getDynamicTargets(selector as DynamicSelector)) {
-      _addTarget(targets, target, receiver, typeFlowAnalysis);
+    final _DynamicTargetSet dynamicTargetSet = typeFlowAnalysis.hierarchyCache
+        .getDynamicTargetSet(selector as DynamicSelector);
+
+    dynamicTargetSet.addDependentInvocation(this);
+
+    assertx(targets.isEmpty);
+    for (Member target in dynamicTargetSet.targets) {
+      _getReceiverTypeBuilder(targets, target).addType(receiver);
+    }
+
+    // Conservatively include noSuchMethod if selector is not from Object,
+    // as class might miss the implementation.
+    if (!dynamicTargetSet.isObjectMember) {
+      _getReceiverTypeBuilder(targets, kNoSuchMethodMarker).addType(receiver);
     }
   }
 
-  void _addTarget(Map<Member, Type> targets, Member member, Type receiver,
-      TypeFlowAnalysis typeFlowAnalysis) {
-    Type oldReceiver = targets[member];
-    if (oldReceiver != null) {
-      receiver = receiver.union(oldReceiver, typeFlowAnalysis.hierarchyCache);
-    }
-    targets[member] = receiver;
-  }
+  _ReceiverTypeBuilder _getReceiverTypeBuilder(
+          Map<Member, _ReceiverTypeBuilder> targets, Member member) =>
+      targets[member] ??= new _ReceiverTypeBuilder();
 
   void _setPolymorphic() {
     if (!_isPolymorphic) {
@@ -426,6 +503,72 @@
   }
 }
 
+/// Efficient builder of receiver type.
+///
+/// Supports the following operations:
+/// 1) Add 1..N concrete types OR add 1 arbitrary type.
+/// 2) Make type nullable.
+class _ReceiverTypeBuilder {
+  Type _type;
+  Set<ConcreteType> _set;
+  bool _nullable = false;
+
+  /// Appends a ConcreteType. May be called multiple times.
+  /// Should not be used in conjunction with [addType].
+  void addConcreteType(ConcreteType type) {
+    if (_set == null) {
+      if (_type == null) {
+        _type = type;
+        return;
+      }
+
+      assertx(_type is ConcreteType);
+      assertx(_type != type);
+
+      _set = new Set<ConcreteType>();
+      _set.add(_type);
+
+      _type = null;
+    }
+
+    _set.add(type);
+  }
+
+  /// Appends an arbitrary Type. May be called only once.
+  /// Should not be used in conjunction with [addConcreteType].
+  void addType(Type type) {
+    assertx(_type == null && _set == null);
+    _type = type;
+  }
+
+  /// Makes the resulting type nullable.
+  void addNull() {
+    _nullable = true;
+  }
+
+  /// Returns union of added types.
+  Type toType() {
+    Type t = _type;
+    if (t == null) {
+      if (_set == null) {
+        t = const EmptyType();
+      } else {
+        t = new SetType(_set);
+      }
+    } else {
+      assertx(_set == null);
+    }
+
+    if (_nullable) {
+      if (t is! NullableType) {
+        t = new NullableType(t);
+      }
+    }
+
+    return t;
+  }
+}
+
 class _InvocationsCache {
   final Set<_Invocation> _invocations = new Set<_Invocation>();
 
@@ -514,8 +657,9 @@
 class _DynamicTargetSet extends _DependencyTracker {
   final DynamicSelector selector;
   final Set<Member> targets = new Set<Member>();
+  final bool isObjectMember;
 
-  _DynamicTargetSet(this.selector);
+  _DynamicTargetSet(this.selector, this.isObjectMember);
 }
 
 class _ClassData extends _DependencyTracker {
@@ -523,6 +667,11 @@
   final Set<_ClassData> supertypes; // List of super-types including this.
   final Set<_ClassData> allocatedSubtypes = new Set<_ClassData>();
 
+  /// Flag indicating if this class has a noSuchMethod() method not inherited
+  /// from Object.
+  /// Lazy initialized by _ClassHierarchyCache.hasNonTrivialNoSuchMethod().
+  bool hasNonTrivialNoSuchMethod;
+
   _ClassData(this.class_, this.supertypes) {
     supertypes.add(this);
   }
@@ -539,6 +688,11 @@
   final Set<Class> allocatedClasses = new Set<Class>();
   final Map<Class, _ClassData> classes = <Class, _ClassData>{};
 
+  /// Object.noSuchMethod().
+  final Member objectNoSuchMethod;
+
+  static final Name noSuchMethodName = new Name("noSuchMethod");
+
   /// Class hierarchy is sealed after analysis is finished.
   /// Once it is sealed, no new allocated classes may be added and no new
   /// targets of invocations may appear.
@@ -547,7 +701,12 @@
   final Map<DynamicSelector, _DynamicTargetSet> _dynamicTargets =
       <DynamicSelector, _DynamicTargetSet>{};
 
-  _ClassHierarchyCache(this._typeFlowAnalysis, this.hierarchy);
+  _ClassHierarchyCache(this._typeFlowAnalysis, this.hierarchy)
+      : objectNoSuchMethod = hierarchy.getDispatchTarget(
+            _typeFlowAnalysis.environment.coreTypes.objectClass,
+            noSuchMethodName) {
+    assertx(objectNoSuchMethod != null);
+  }
 
   _ClassData getClassData(Class c) {
     return classes[c] ??= _createClassData(c);
@@ -673,14 +832,26 @@
     }
   }
 
-  Iterable<Member> getDynamicTargets(DynamicSelector selector) {
-    final targetSet =
-        (_dynamicTargets[selector] ??= _createDynamicTargetSet(selector));
-    return targetSet.targets;
+  bool hasNonTrivialNoSuchMethod(Class c) {
+    final classData = getClassData(c);
+    classData.hasNonTrivialNoSuchMethod ??=
+        (hierarchy.getDispatchTarget(c, noSuchMethodName) !=
+            objectNoSuchMethod);
+    return classData.hasNonTrivialNoSuchMethod;
+  }
+
+  _DynamicTargetSet getDynamicTargetSet(DynamicSelector selector) {
+    return (_dynamicTargets[selector] ??= _createDynamicTargetSet(selector));
   }
 
   _DynamicTargetSet _createDynamicTargetSet(DynamicSelector selector) {
-    final targetSet = new _DynamicTargetSet(selector);
+    // TODO(alexmarkov): consider caching the set of Object selectors.
+    final isObjectMethod = (hierarchy.getDispatchTarget(
+            _typeFlowAnalysis.environment.coreTypes.objectClass, selector.name,
+            setter: selector.isSetter) !=
+        null);
+
+    final targetSet = new _DynamicTargetSet(selector, isObjectMethod);
     for (Class c in allocatedClasses) {
       _addDynamicTarget(c, targetSet);
     }
@@ -718,19 +889,22 @@
 
 class _WorkList {
   final TypeFlowAnalysis _typeFlowAnalysis;
-  final Set<_Invocation> pending = new Set<_Invocation>();
+  final LinkedList<_Invocation> pending = new LinkedList<_Invocation>();
   final Set<_Invocation> processing = new Set<_Invocation>();
   final List<_Invocation> callStack = <_Invocation>[];
 
   _WorkList(this._typeFlowAnalysis);
 
+  bool _isPending(_Invocation invocation) => invocation.list != null;
+
   void enqueueInvocation(_Invocation invocation) {
     assertx(invocation.result == null);
-    if (!pending.add(invocation)) {
+    if (_isPending(invocation)) {
       // Re-add the invocation to the tail of the pending queue.
       pending.remove(invocation);
-      pending.add(invocation);
+      assertx(!_isPending(invocation));
     }
+    pending.add(invocation);
   }
 
   void invalidateInvocation(_Invocation invocation) {
@@ -745,14 +919,7 @@
   void process() {
     while (pending.isNotEmpty) {
       assertx(callStack.isEmpty && processing.isEmpty);
-      _Invocation invocation = pending.first;
-
-      // Remove from pending before processing, as the invocation
-      // could be invalidated and re-added to pending while processing.
-      pending.remove(invocation);
-
-      processInvocation(invocation);
-      assertx(invocation.result != null);
+      processInvocation(pending.first);
     }
   }
 
@@ -770,6 +937,7 @@
 
     if (processing.add(invocation)) {
       callStack.add(invocation);
+      pending.remove(invocation);
 
       final Type result = invocation.process(_typeFlowAnalysis);
 
@@ -783,6 +951,13 @@
         invocation.invalidatedResult = null;
       }
 
+      // Invocation is still pending - it was invalidated while being processed.
+      // Move result to invalidatedResult.
+      if (_isPending(invocation)) {
+        invocation.invalidatedResult = result;
+        invocation.result = null;
+      }
+
       final last = callStack.removeLast();
       assertx(identical(last, invocation));
 
diff --git a/pkg/vm/lib/transformations/type_flow/entry_points_extra.json b/pkg/vm/lib/transformations/type_flow/entry_points_extra.json
index dc3849b..d45ef2a 100644
--- a/pkg/vm/lib/transformations/type_flow/entry_points_extra.json
+++ b/pkg/vm/lib/transformations/type_flow/entry_points_extra.json
@@ -62,6 +62,12 @@
       "action": "call"
     },
     {
+      "library": "dart:core",
+      "class": "_AssertionError",
+      "name": "_throwNew",
+      "action": "call"
+    },
+    {
       "library": "dart:_builtin",
       "name": "_resolveScriptUri",
       "action": "call"
diff --git a/pkg/vm/lib/transformations/type_flow/summary.dart b/pkg/vm/lib/transformations/type_flow/summary.dart
index 1272b69..50dfbb2 100644
--- a/pkg/vm/lib/transformations/type_flow/summary.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary.dart
@@ -86,9 +86,6 @@
   Narrow(this.arg, this.type);
 
   @override
-  DartType get staticType => type.staticType;
-
-  @override
   void accept(StatementVisitor visitor) => visitor.visitNarrow(this);
 
   @override
@@ -133,9 +130,8 @@
 class Call extends Statement {
   final Selector selector;
   final Args<TypeExpr> args;
-  final DartType staticType;
 
-  Call(this.selector, this.args, this.staticType);
+  Call(this.selector, this.args);
 
   @override
   void accept(StatementVisitor visitor) => visitor.visitCall(this);
diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
index 8290f25..3899672 100644
--- a/pkg/vm/lib/transformations/type_flow/summary_collector.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
@@ -417,9 +417,7 @@
   }
 
   Call _makeCall(TreeNode node, Selector selector, Args<TypeExpr> args) {
-    DartType staticType =
-        (node is Expression) ? node.getStaticType(_environment) : null;
-    Call call = new Call(selector, args, staticType);
+    Call call = new Call(selector, args);
     _summary.add(call);
     callSites[node] = call;
     return call;
diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart
index 1d19d63..63f91ae 100644
--- a/pkg/vm/lib/transformations/type_flow/transformer.dart
+++ b/pkg/vm/lib/transformations/type_flow/transformer.dart
@@ -24,6 +24,8 @@
 
 const bool kDumpAllSummaries =
     const bool.fromEnvironment('global.type.flow.dump.all.summaries');
+const bool kDumpClassHierarchy =
+    const bool.fromEnvironment('global.type.flow.dump.class.hierarchy');
 
 /// Whole-program type flow analysis and transformation.
 /// Assumes strong mode and closed world.
@@ -33,7 +35,9 @@
       'pkg/vm/lib/transformations/type_flow/entry_points.json',
       'pkg/vm/lib/transformations/type_flow/entry_points_extra.json',
     ]}) {
-  final hierarchy = new ClassHierarchy(program);
+  void ignoreAmbiguousSupertypes(Class cls, Supertype a, Supertype b) {}
+  final hierarchy = new ClassHierarchy(program,
+      onAmbiguousSupertypes: ignoreAmbiguousSupertypes);
   final types = new TypeEnvironment(coreTypes, hierarchy, strongMode: true);
   final libraryIndex = new LibraryIndex.all(program);
 
@@ -56,6 +60,10 @@
 
   analysisStopWatch.stop();
 
+  if (kDumpClassHierarchy) {
+    debugPrint(typeFlowAnalysis.hierarchyCache);
+  }
+
   final transformsStopWatch = new Stopwatch()..start();
 
   new DropMethodBodiesVisitor(typeFlowAnalysis).visitProgram(program);
diff --git a/pkg/vm/lib/transformations/type_flow/types.dart b/pkg/vm/lib/transformations/type_flow/types.dart
index 4865e16..c8249b0 100644
--- a/pkg/vm/lib/transformations/type_flow/types.dart
+++ b/pkg/vm/lib/transformations/type_flow/types.dart
@@ -42,11 +42,6 @@
 abstract class TypeExpr {
   const TypeExpr();
 
-  /// Static [DartType] approximation.
-  /// May not be available for certain inferred types (such as [EmptyType] and
-  /// [SetType]) as they don't have corresponding Dart types.
-  DartType get staticType;
-
   /// Returns computed type of this type expression.
   /// [types] is the list of types computed for the statements in the summary.
   Type getComputedType(List<Type> types);
@@ -97,9 +92,6 @@
     return new Type.nullable(new ConeType(dartType));
   }
 
-  @override
-  DartType get staticType;
-
   Class getConcreteClass(TypeHierarchy typeHierarchy) => null;
 
   @override
@@ -130,9 +122,6 @@
   const EmptyType();
 
   @override
-  DartType get staticType => throw 'Unable to get static type of empty type';
-
-  @override
   int get hashCode => 997;
 
   @override
@@ -162,10 +151,6 @@
   }
 
   @override
-  DartType get staticType =>
-      (baseType is EmptyType) ? const BottomType() : baseType.staticType;
-
-  @override
   int get hashCode => (baseType.hashCode + 31) & kHashMask;
 
   @override
@@ -210,9 +195,6 @@
   const AnyType();
 
   @override
-  DartType get staticType => const DynamicType();
-
-  @override
   int get hashCode => 991;
 
   @override
@@ -252,9 +234,6 @@
   }
 
   @override
-  DartType get staticType => throw 'Unable to get static type of set type';
-
-  @override
   int get hashCode => _hashCode ??= _computeHashCode();
 
   int _computeHashCode() {
@@ -338,9 +317,6 @@
   }
 
   @override
-  DartType get staticType => dartType;
-
-  @override
   Class getConcreteClass(TypeHierarchy typeHierarchy) => typeHierarchy
       .specializeTypeCone(dartType)
       .getConcreteClass(typeHierarchy);
@@ -423,9 +399,6 @@
   }
 
   @override
-  DartType get staticType => dartType;
-
-  @override
   Class getConcreteClass(TypeHierarchy typeHierarchy) =>
       (dartType is InterfaceType)
           ? (dartType as InterfaceType).classNode
diff --git a/pkg/vm/test/transformations/type_flow/types_test.dart b/pkg/vm/test/transformations/type_flow/types_test.dart
index 7d60091..83685b7 100644
--- a/pkg/vm/test/transformations/type_flow/types_test.dart
+++ b/pkg/vm/test/transformations/type_flow/types_test.dart
@@ -67,36 +67,6 @@
         equals(new NullableType(new ConeType(t2Raw))));
   });
 
-  test('static-type', () {
-    InterfaceType classType = new InterfaceType(new Class(name: 'C'));
-    FunctionType funcType = new FunctionType([], const VoidType());
-
-    // [T, T.staticType]
-    final testCases = [
-      [new Type.cone(classType), classType],
-      [new Type.cone(funcType), const DynamicType()],
-      [new Type.concrete(classType), classType],
-      [new AnyType(), const DynamicType()],
-      [new Type.nullable(new Type.empty()), const BottomType()],
-      [new Type.nullable(new Type.cone(classType)), classType],
-      [new Type.nullable(new Type.concrete(classType)), classType],
-      [new Type.nullable(new AnyType()), const DynamicType()],
-      [new Type.fromStatic(const DynamicType()), const DynamicType()],
-      [new Type.fromStatic(const BottomType()), const BottomType()],
-      [new Type.fromStatic(classType), classType],
-      [new Type.fromStatic(funcType), const DynamicType()],
-    ];
-
-    for (List testCase in testCases) {
-      Type type = testCase[0] as Type;
-      DartType staticType = testCase[1] as DartType;
-
-      expect(type.staticType, equals(staticType),
-          reason:
-              "Test case: ${type}.staticType is expected to be $staticType");
-    }
-  });
-
   test('union-intersection', () {
     // T1 <: T3, T2 <: T3
 
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart
new file mode 100644
index 0000000..cd5d128
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class T1 {}
+
+class T2 {}
+
+class T3 {}
+
+class A {
+  foo() => new T1();
+  bar() => new T2();
+  bazz() => new T3();
+}
+
+class B {
+  foo() => new T1();
+  bar() => new T2();
+  bazz() => new T3();
+}
+
+use_foo1(dynamic x) => x.foo();
+use_foo2(dynamic x) => x.foo();
+
+use_bar(dynamic x) => x.bar();
+
+use_bazz(dynamic x) => x.bazz();
+
+Function unknown;
+
+getDynamic() => unknown.call();
+
+allocateA() {
+  new A();
+}
+
+allocateB() {
+  new B();
+}
+
+main(List<String> args) {
+  use_foo1(getDynamic()); // No classes with 'foo' selector.
+
+  allocateA();
+
+  use_foo2(getDynamic()); // Only A with 'foo' selector.
+  use_bar(getDynamic()); // Only A with 'bar' selector.
+
+  allocateB();
+
+  use_bazz(getDynamic()); // A and B have 'bazz' selector.
+}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart.expect
new file mode 100644
index 0000000..68fff2b
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart.expect
@@ -0,0 +1,66 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+
+class T1 extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class T2 extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class T3 extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    return new self::T1::•();
+  method bar() → dynamic
+    return new self::T2::•();
+  method bazz() → dynamic
+    return new self::T3::•();
+}
+class B extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    return new self::T1::•();
+  method bar() → dynamic
+    return new self::T2::•();
+  method bazz() → dynamic
+    return new self::T3::•();
+}
+static field core::Function unknown;
+static method use_foo1(dynamic x) → dynamic
+  return [@vm.inferred-type.metadata=#lib::T1] x.foo();
+static method use_foo2(dynamic x) → dynamic
+  return [@vm.inferred-type.metadata=#lib::T1] x.foo();
+static method use_bar(dynamic x) → dynamic
+  return [@vm.inferred-type.metadata=#lib::T2] x.bar();
+static method use_bazz(dynamic x) → dynamic
+  return [@vm.inferred-type.metadata=#lib::T3] x.bazz();
+static method getDynamic() → dynamic
+  return self::unknown.call();
+static method allocateA() → dynamic {
+  new self::A::•();
+}
+static method allocateB() → dynamic {
+  new self::B::•();
+}
+static method main(core::List<core::String> args) → dynamic {
+  self::use_foo1(self::getDynamic());
+  self::allocateA();
+  self::use_foo2(self::getDynamic());
+  self::use_bar(self::getDynamic());
+  self::allocateB();
+  self::use_bazz(self::getDynamic());
+}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart
new file mode 100644
index 0000000..1451811
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+abstract class I {
+  void foo();
+}
+
+class T1 implements I {
+  void foo() {}
+}
+
+class T2 implements I {
+  void foo() {}
+}
+
+class Point {
+  final I x;
+
+  const Point(I x) : this.x = x;
+
+  Point newPoint1() => new Point(x);
+  Point newPoint2() => new Point(x);
+}
+
+getX(var point) {
+  point.x;
+}
+
+main() {
+  var a = new Point(new T1());
+
+  print(a.x);
+
+  var c = new Point(new T2());
+
+  c.x.foo();
+
+  getX(a.newPoint1());
+  getX(a.newPoint2());
+}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart.expect
new file mode 100644
index 0000000..17533c2
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart.expect
@@ -0,0 +1,43 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    throw "TFA Error: #lib::I::";
+  abstract method foo() → void;
+}
+class T1 extends core::Object implements self::I {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method foo() → void {}
+}
+class T2 extends core::Object implements self::I {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method foo() → void {}
+}
+class Point extends core::Object {
+  final field self::I x;
+  const constructor •(self::I x) → void
+    : self::Point::x = x, super core::Object::•()
+    ;
+  method newPoint1() → self::Point
+    return new self::Point::•([@vm.direct-call.metadata=#lib::Point::x] [@vm.inferred-type.metadata=!] this.{self::Point::x});
+  method newPoint2() → self::Point
+    return new self::Point::•([@vm.direct-call.metadata=#lib::Point::x] [@vm.inferred-type.metadata=!] this.{self::Point::x});
+}
+static method getX(dynamic point) → dynamic {
+  point.x;
+}
+static method main() → dynamic {
+  self::Point a = new self::Point::•(new self::T1::•());
+  core::print([@vm.direct-call.metadata=#lib::Point::x] [@vm.inferred-type.metadata=!] a.{self::Point::x});
+  self::Point c = new self::Point::•(new self::T2::•());
+  [@vm.direct-call.metadata=#lib::Point::x] [@vm.inferred-type.metadata=!] c.{self::Point::x}.{self::I::foo}();
+  self::getX([@vm.direct-call.metadata=#lib::Point::newPoint1] [@vm.inferred-type.metadata=#lib::Point] a.{self::Point::newPoint1}());
+  self::getX([@vm.direct-call.metadata=#lib::Point::newPoint2] [@vm.inferred-type.metadata=#lib::Point] a.{self::Point::newPoint2}());
+}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart
new file mode 100644
index 0000000..ab479a7
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart
@@ -0,0 +1,86 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class T1 {}
+
+class T2 {}
+
+class T3 {}
+
+class T4 {}
+
+class T5 {}
+
+abstract class A {
+  foo();
+  get bar;
+  bazz(a1, a2, a3, [a4, a5]);
+}
+
+class B extends A {
+  noSuchMethod(Invocation invocation) {
+    return new T1();
+  }
+}
+
+class C {
+  noSuchMethod(Invocation invocation) {
+    return new T2();
+  }
+}
+
+class D extends C implements A {}
+
+class E implements A {
+  foo() => new T3();
+
+  noSuchMethod(Invocation invocation) {
+    return new T4();
+  }
+}
+
+class F {
+  twoArg(a1, a2) => new T1();
+
+  noSuchMethod(Invocation invocation) {
+    return new T2();
+  }
+}
+
+class G {
+  noSuchMethod(Invocation invocation) {
+    return new T5();
+  }
+}
+
+A bb = new B();
+A dd = new D();
+
+Function unknown;
+
+getDynamic() => unknown.call();
+
+main(List<String> args) {
+  print(bb.foo());
+  print(bb.bar);
+  print(bb.bazz(1, 2, 3, 4));
+
+  print(dd.foo());
+  print(dd.bar);
+  print(dd.bazz(1, 2, 3, 4));
+
+  new E();
+  A xx = getDynamic();
+
+  print(xx.bar);
+
+  dynamic yy = getDynamic();
+  print(yy.twoArg(1, 2, 3));
+
+  new F();
+
+  dynamic gg = new G();
+
+  print(gg.noSuchMethod(null, null));
+}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
new file mode 100644
index 0000000..2d4e301
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
@@ -0,0 +1,107 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+
+class T1 extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class T2 extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class T3 extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    throw "TFA Error: #lib::T3::";
+}
+class T4 extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class T5 extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+abstract class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  abstract method foo() → dynamic;
+  abstract get bar() → dynamic;
+  abstract method bazz(dynamic a1, dynamic a2, dynamic a3, [dynamic a4 = null, dynamic a5 = null]) → dynamic;
+}
+class B extends self::A {
+  synthetic constructor •() → void
+    : super self::A::•()
+    ;
+  method noSuchMethod(core::Invocation invocation) → dynamic {
+    return new self::T1::•();
+  }
+}
+class C extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation invocation) → dynamic {
+    return new self::T2::•();
+  }
+}
+class D extends self::C implements self::A {
+  synthetic constructor •() → void
+    : super self::C::•()
+    ;
+}
+class E extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    throw "TFA Error: #lib::E::foo";
+  method noSuchMethod(core::Invocation invocation) → dynamic {
+    return new self::T4::•();
+  }
+}
+class F extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method twoArg(dynamic a1, dynamic a2) → dynamic
+    throw "TFA Error: #lib::F::twoArg";
+  method noSuchMethod(core::Invocation invocation) → dynamic {
+    return new self::T2::•();
+  }
+}
+class G extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation invocation) → dynamic {
+    return new self::T5::•();
+  }
+}
+static field self::A bb = new self::B::•();
+static field self::A dd = new self::D::•();
+static field core::Function unknown;
+static method getDynamic() → dynamic
+  return self::unknown.call();
+static method main(core::List<core::String> args) → dynamic {
+  core::print([@vm.inferred-type.metadata=#lib::T1] [@vm.inferred-type.metadata=#lib::B] self::bb.{self::A::foo}());
+  core::print([@vm.inferred-type.metadata=#lib::T1] [@vm.inferred-type.metadata=#lib::B] self::bb.{self::A::bar});
+  core::print([@vm.inferred-type.metadata=#lib::T1] [@vm.inferred-type.metadata=#lib::B] self::bb.{self::A::bazz}(1, 2, 3, 4));
+  core::print([@vm.inferred-type.metadata=#lib::T2] [@vm.inferred-type.metadata=#lib::D] self::dd.{self::A::foo}());
+  core::print([@vm.inferred-type.metadata=#lib::T2] [@vm.inferred-type.metadata=#lib::D] self::dd.{self::A::bar});
+  core::print([@vm.inferred-type.metadata=#lib::T2] [@vm.inferred-type.metadata=#lib::D] self::dd.{self::A::bazz}(1, 2, 3, 4));
+  new self::E::•();
+  self::A xx = self::getDynamic() as{TypeError} self::A;
+  core::print([@vm.inferred-type.metadata=!] xx.{self::A::bar});
+  dynamic yy = self::getDynamic();
+  core::print([@vm.inferred-type.metadata=!] yy.twoArg(1, 2, 3));
+  new self::F::•();
+  dynamic gg = new self::G::•();
+  core::print([@vm.inferred-type.metadata=#lib::T5] gg.{core::Object::noSuchMethod}(null, null));
+}
diff --git a/pkg/vm/tool/dart2 b/pkg/vm/tool/dart2
index 364820c..66ac062 100755
--- a/pkg/vm/tool/dart2
+++ b/pkg/vm/tool/dart2
@@ -45,5 +45,4 @@
      --reify-generic-functions                                                 \
      --limit-ints-to-64-bits                                                   \
      --dfe="$KERNEL_SERVICE_SNAPSHOT"                                          \
-     --kernel-binaries="$KERNEL_BINARIES_DIR"                                  \
      "$@"
diff --git a/pkg/vm/tool/dart2.bat b/pkg/vm/tool/dart2.bat
index 739671a..91004d6 100644
--- a/pkg/vm/tool/dart2.bat
+++ b/pkg/vm/tool/dart2.bat
@@ -13,10 +13,12 @@
 
 set OUT_DIR=%SCRIPTPATH%/../../../out/
 
-REM Remove trailing spaces
-set DART_CONFIGURATION=%DART_CONFIGURATION: =%
-
+REM Remove trailing spaces if line is not empty
+if not "%DART_CONFIGURATION%" == "" (
+  set DART_CONFIGURATION=%DART_CONFIGURATION: =%
+)
 if "%DART_CONFIGURATION%"=="" set DART_CONFIGURATION=ReleaseX64
+
 if "%DART_USE_SDK%"=="" set DART_USE_SDK=0
 set BUILD_DIR=%OUT_DIR%%DART_CONFIGURATION%
 
diff --git a/pkg/vm/tool/precompiler2 b/pkg/vm/tool/precompiler2
index faf92c0..69062fe 100755
--- a/pkg/vm/tool/precompiler2
+++ b/pkg/vm/tool/precompiler2
@@ -16,6 +16,7 @@
 
 OPTIONS=()
 PACKAGES=
+SYNC_ASYNC=
 
 ARGV=()
 for arg in "$@"; do
@@ -23,6 +24,9 @@
     --packages=*)
     PACKAGES="$arg"
     ;;
+    --sync-async)
+    SYNC_ASYNC="--sync-async"
+    ;;
     --*)
     OPTIONS+=("$arg")
     ;;
@@ -72,6 +76,7 @@
      "${SDK_DIR}/pkg/vm/bin/gen_kernel.dart"                                   \
      --platform "${BIN_DIR}/vm_platform_strong.dill"                           \
      --aot                                                                     \
+     $SYNC_ASYNC                                                               \
      $PACKAGES                                                                 \
      -o "$SNAPSHOT_FILE.dill"                                                  \
      "$SOURCE_FILE"
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index 9142737..e1ce40e 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -270,6 +270,10 @@
       ":generate_web_gl_cc_file",
       ":generate_web_sql_cc_file",
     ]
+    if (is_fuchsia) {
+      deps += [ "//zircon/public/lib/launchpad" ]
+      public_deps = [ "//zircon/public/lib/fdio" ]
+    }
     include_dirs = [ ".." ]
     set_sources_assignment_filter([
                                     "*_test.cc",
@@ -321,6 +325,9 @@
              ":generate_cli_cc_file",
              ":generate_cli_patch_cc_file",
            ] + extra_deps
+    if (is_fuchsia) {
+      deps += [ "//zircon/public/lib/launchpad" ]
+    }
 
     sources = [
       # Include generated source files.
@@ -376,10 +383,6 @@
         "winmm.lib",
       ]
     }
-
-    if (is_fuchsia) {
-      libs = [ "launchpad" ]
-    }
   }
 }
 
@@ -419,6 +422,7 @@
 
     if (is_fuchsia) {
       deps += [ "//garnet/public/lib/netstack/c" ]
+      public_deps = [ "//zircon/public/lib/fdio" ]
       configs -= [ "//build/config:symbol_visibility_hidden" ]
     }
 
@@ -515,8 +519,11 @@
     deps += [ "//third_party/boringssl" ]
 
     if (is_fuchsia) {
-      deps += [ "//garnet/public/lib/netstack/c" ]
-      libs = [ "launchpad" ]
+      deps += [
+        "//garnet/public/lib/netstack/c",
+        "//zircon/public/lib/launchpad",
+      ]
+      public_deps = [ "//zircon/public/lib/fdio" ]
     }
 
     sources = io_impl_sources + builtin_impl_sources + cli_impl_sources
@@ -673,24 +680,64 @@
   executable = true
 }
 
-action("kernel_service_dill_cc") {
+template("dill_to_cc") {
+  assert(defined(invoker.dill_file), "Need dill_file in $target_name.")
+  assert(defined(invoker.data_symbol), "Need data_symbol in $target_name.")
+  assert(defined(invoker.size_symbol), "Need size_symbol in $target_name.")
+  assert(defined(invoker.output), "Need output in $target_name.")
+
+  extra_deps = []
+  if (defined(invoker.deps)) {
+    extra_deps += invoker.deps
+  }
+
+  action(target_name) {
+    deps = extra_deps
+    script = "../tools/dill_to_data_cc.py"
+    inputs = [
+      "../tools/dill_to_data_cc.py",
+      invoker.dill_file,
+    ]
+    outputs = [
+      invoker.output,
+    ]
+    args = [
+      "--dill_file=" + rebase_path(invoker.dill_file),
+      "--data_symbol=" + invoker.data_symbol,
+      "--size_symbol=" + invoker.size_symbol,
+      "--output=" + rebase_path(invoker.output),
+    ]
+  }
+}
+
+dill_to_cc("kernel_service_dill_cc") {
   deps = [
     "../../utils/kernel-service:kernel_service_dill",
   ]
-  script = "../tools/dill_to_data_cc.py"
-  inputs = [
-    "../tools/dill_to_data_cc.py",
-    "$root_gen_dir/kernel_service.dill",
+  dill_file = "$root_gen_dir/kernel_service.dill"
+  data_symbol = "kKernelServiceDill"
+  size_symbol = "kKernelServiceDillSize"
+  output = "$root_gen_dir/kernel_service.dill.cc"
+}
+
+dill_to_cc("platform_dill_cc") {
+  deps = [
+    "../vm:vm_legacy_platform",
   ]
-  outputs = [
-    "$root_gen_dir/kernel_service.dill.cc",
+  dill_file = "$root_out_dir/vm_platform.dill"
+  data_symbol = "kPlatformDill"
+  size_symbol = "kPlatformDillSize"
+  output = "$target_gen_dir/vm_platform.dill.cc"
+}
+
+dill_to_cc("platform_strong_dill_cc") {
+  deps = [
+    "../vm:vm_platform",
   ]
-  args = [
-    "--dill_file=" + rebase_path("$root_gen_dir/kernel_service.dill"),
-    "--data_symbol=kKernelServiceDill",
-    "--size_symbol=kKernelServiceDillSize",
-    "--output=" + rebase_path("$root_gen_dir/kernel_service.dill.cc"),
-  ]
+  dill_file = "$root_out_dir/vm_platform_strong.dill"
+  data_symbol = "kPlatformStrongDill"
+  size_symbol = "kPlatformStrongDillSize"
+  output = "$target_gen_dir/vm_platform_strong.dill.cc"
 }
 
 source_set("dart_snapshot_cc") {
@@ -698,6 +745,8 @@
     ":isolate_snapshot_data_assembly",
     ":isolate_snapshot_instructions_assembly",
     ":kernel_service_dill_cc",
+    ":platform_dill_cc",
+    ":platform_strong_dill_cc",
     ":vm_snapshot_data_assembly",
     ":vm_snapshot_instructions_assembly",
   ]
@@ -705,6 +754,8 @@
     "$root_gen_dir/kernel_service.dill.cc",
     "$target_gen_dir/isolate_snapshot_data.S",
     "$target_gen_dir/isolate_snapshot_instructions.S",
+    "$target_gen_dir/vm_platform.dill.cc",
+    "$target_gen_dir/vm_platform_strong.dill.cc",
     "$target_gen_dir/vm_snapshot_data.S",
     "$target_gen_dir/vm_snapshot_instructions.S",
   ]
@@ -755,6 +806,10 @@
              "$dart_zlib_path",
            ] + extra_deps
 
+    if (is_fuchsia) {
+      deps += [ "//zircon/public/lib/launchpad" ]
+    }
+
     defines = extra_defines
 
     if (dart_use_tcmalloc) {
@@ -797,10 +852,6 @@
         "winmm.lib",
       ]
     }
-
-    if (is_fuchsia) {
-      libs = [ "launchpad" ]
-    }
   }
 }
 
@@ -1068,7 +1119,7 @@
   }
 
   if (is_fuchsia) {
-    deps += [ "//zircon/system/ulib/trace" ]
+    deps += [ "//zircon/public/lib/trace" ]
   }
 
   # The VM sources are already included in libdart, so we just want to add in
diff --git a/runtime/bin/dfe.cc b/runtime/bin/dfe.cc
index 7ab6bcb..3e568ac 100644
--- a/runtime/bin/dfe.cc
+++ b/runtime/bin/dfe.cc
@@ -15,6 +15,10 @@
 extern "C" {
 extern const uint8_t kKernelServiceDill[];
 extern intptr_t kKernelServiceDillSize;
+extern const uint8_t kPlatformDill[];
+extern intptr_t kPlatformDillSize;
+extern const uint8_t kPlatformStrongDill[];
+extern intptr_t kPlatformStrongDillSize;
 }
 
 namespace dart {
@@ -23,17 +27,21 @@
 #if defined(DART_NO_SNAPSHOT) || defined(DART_PRECOMPILER)
 const uint8_t* kernel_service_dill = NULL;
 const intptr_t kernel_service_dill_size = 0;
+const uint8_t* platform_dill = NULL;
+const intptr_t platform_dill_size = 0;
+const uint8_t* platform_strong_dill = NULL;
+const intptr_t platform_strong_dill_size = 0;
 #else
 const uint8_t* kernel_service_dill = kKernelServiceDill;
 const intptr_t kernel_service_dill_size = kKernelServiceDillSize;
+const uint8_t* platform_dill = kPlatformDill;
+const intptr_t platform_dill_size = kPlatformDillSize;
+const uint8_t* platform_strong_dill = kPlatformStrongDill;
+const intptr_t platform_strong_dill_size = kPlatformStrongDillSize;
 #endif
 
 const char kKernelServiceSnapshot[] = "kernel-service.dart.snapshot";
 const char kSnapshotsDirectory[] = "snapshots";
-const char kPlatformBinaryName[] = "vm_platform.dill";
-const char kPlatformStrongBinaryName[] = "vm_platform_strong.dill";
-
-void* DFE::kKernelServiceProgram = NULL;
 
 static char* GetDirectoryPrefixFromExeName() {
   const char* name = Platform::GetExecutableName();
@@ -54,12 +62,14 @@
   return StringUtils::StrNDup(name, i + 1);
 }
 
+static void NoopRelease(uint8_t* buffer) {}
+
 DFE::DFE()
     : use_dfe_(false),
       frontend_filename_(NULL),
-      kernel_binaries_path_(NULL),
-      platform_binary_filename_(NULL),
-      kernel_platform_(NULL),
+      kernel_service_program_(NULL),
+      platform_program_(NULL),
+      platform_strong_program_(NULL),
       application_kernel_binary_(NULL) {}
 
 DFE::~DFE() {
@@ -68,23 +78,34 @@
   }
   frontend_filename_ = NULL;
 
-  free(kernel_binaries_path_);
-  kernel_binaries_path_ = NULL;
+  delete reinterpret_cast<kernel::Program*>(kernel_service_program_);
+  kernel_service_program_ = NULL;
 
-  free(platform_binary_filename_);
-  platform_binary_filename_ = NULL;
+  delete reinterpret_cast<kernel::Program*>(platform_program_);
+  platform_program_ = NULL;
 
-  delete reinterpret_cast<kernel::Program*>(kernel_platform_);
-  kernel_platform_ = NULL;
-
-  delete reinterpret_cast<kernel::Program*>(kKernelServiceProgram);
-  kKernelServiceProgram = NULL;
+  delete reinterpret_cast<kernel::Program*>(platform_strong_program_);
+  platform_strong_program_ = NULL;
 
   delete reinterpret_cast<kernel::Program*>(application_kernel_binary_);
   application_kernel_binary_ = NULL;
 }
 
-char* DFE::FrontendFilename() {
+void DFE::Init() {
+  if (platform_dill == NULL) {
+    return;
+  }
+  // platform_dill is not NULL implies that platform_strong_dill is also
+  // not NULL.
+  if (platform_program_ == NULL) {
+    platform_program_ =
+        Dart_ReadKernelBinary(platform_dill, platform_dill_size, NoopRelease);
+  }
+  if (platform_strong_program_ == NULL) {
+    platform_strong_program_ = Dart_ReadKernelBinary(
+        platform_strong_dill, platform_strong_dill_size, NoopRelease);
+  }
+
   if (frontend_filename_ == NULL) {
     // Look for the frontend snapshot next to the executable.
     char* dir_prefix = GetDirectoryPrefixFromExeName();
@@ -108,40 +129,34 @@
       frontend_filename_ = NULL;
     }
   }
-  return frontend_filename_;
 }
 
 bool DFE::KernelServiceDillAvailable() {
   return kernel_service_dill != NULL;
 }
 
-static void NoopRelease(uint8_t* buffer) {}
-
-void* DFE::KernelServiceProgram() {
+void* DFE::LoadKernelServiceProgram() {
   if (kernel_service_dill == NULL) {
     return NULL;
   }
-  if (kKernelServiceProgram == NULL) {
-    kKernelServiceProgram = Dart_ReadKernelBinary(
+  if (kernel_service_program_ == NULL) {
+    kernel_service_program_ = Dart_ReadKernelBinary(
         kernel_service_dill, kernel_service_dill_size, NoopRelease);
   }
-  return kKernelServiceProgram;
+  return kernel_service_program_;
 }
 
-void DFE::SetKernelBinaries(const char* name) {
-  kernel_binaries_path_ = strdup(name);
+void* DFE::platform_program(bool strong) const {
+  if (strong) {
+    return platform_strong_program_;
+  } else {
+    return platform_program_;
+  }
 }
 
-const char* DFE::GetPlatformBinaryFilename() {
-  if (kernel_binaries_path_ == NULL) {
-    return NULL;
-  }
-  if (platform_binary_filename_ == NULL) {
-    platform_binary_filename_ = OS::SCreate(
-        /*zone=*/NULL, "%s%s%s", kernel_binaries_path_, File::PathSeparator(),
-        FLAG_strong ? kPlatformStrongBinaryName : kPlatformBinaryName);
-  }
-  return platform_binary_filename_;
+bool DFE::CanUseDartFrontend() const {
+  return (platform_program() != NULL) &&
+         (KernelServiceDillAvailable() || (frontend_filename() != NULL));
 }
 
 static void ReleaseFetchedBytes(uint8_t* buffer) {
@@ -162,13 +177,8 @@
     // recompile the script.
     // TODO(aam): When Frontend is ready, VM should be passing vm_outline.dill
     // instead of vm_platform.dill to Frontend for compilation.
-    const char* platform_kernel = GetPlatformBinaryFilename();
-    if (platform_kernel == NULL) {
-      return Dart_NewApiError(
-          "Path to platfrom kernel not known; did you miss --kernel-binaries?");
-    }
     Dart_KernelCompilationResult kresult =
-        Dart_CompileToKernel(url_string, platform_kernel);
+        Dart_CompileToKernel(url_string, platform_dill, platform_dill_size);
     if (kresult.status != Dart_KernelCompilationStatus_Ok) {
       return Dart_NewApiError(kresult.error);
     }
@@ -219,7 +229,8 @@
 
 void* DFE::CompileAndReadScript(const char* script_uri,
                                 char** error,
-                                int* exit_code) {
+                                int* exit_code,
+                                bool strong) {
   // TODO(aam): When Frontend is ready, VM should be passing vm_outline.dill
   // instead of vm_platform.dill to Frontend for compilation.
 #if defined(HOST_OS_WINDOWS)
@@ -229,12 +240,12 @@
   const char* sanitized_uri = script_uri;
 #endif
 
-  const char* platform_kernel = GetPlatformBinaryFilename();
-  if (platform_kernel == NULL) {
-    return NULL;
-  }
-  Dart_KernelCompilationResult result =
-      Dart_CompileToKernel(sanitized_uri, platform_kernel);
+  const uint8_t* platform_binary =
+      strong ? platform_strong_dill : platform_dill;
+  intptr_t platform_binary_size =
+      strong ? platform_strong_dill_size : platform_dill_size;
+  Dart_KernelCompilationResult result = Dart_CompileToKernel(
+      sanitized_uri, platform_binary, platform_binary_size);
   switch (result.status) {
     case Dart_KernelCompilationStatus_Ok:
       return Dart_ReadKernelBinary(result.kernel, result.kernel_size,
@@ -255,10 +266,6 @@
   return NULL;
 }
 
-void* DFE::ReadPlatform() {
-  return ReadScript(GetPlatformBinaryFilename());
-}
-
 void* DFE::ReadScript(const char* script_uri) const {
   const uint8_t* buffer = NULL;
   intptr_t buffer_length = -1;
diff --git a/runtime/bin/dfe.h b/runtime/bin/dfe.h
index 2d13b92..0ee4c25 100644
--- a/runtime/bin/dfe.h
+++ b/runtime/bin/dfe.h
@@ -18,7 +18,12 @@
   DFE();
   ~DFE();
 
-  char* FrontendFilename();
+  // Call Init before Dart_Initialize to prevent races between the
+  // different isolates.
+  void Init();
+
+  char* frontend_filename() const { return frontend_filename_; }
+
   void set_frontend_filename(const char* name) {
     if (frontend_filename_ != NULL) {
       free(frontend_filename_);
@@ -26,24 +31,19 @@
     frontend_filename_ = strdup(name);
     set_use_dfe();
   }
-  void set_use_dfe() { use_dfe_ = true; }
+  void set_use_dfe(bool value = true) { use_dfe_ = value; }
   bool UseDartFrontend() const { return use_dfe_; }
 
+  // Returns the platform binary file name if the path to
+  // kernel binaries was set using SetKernelBinaries.
   const char* GetPlatformBinaryFilename();
 
-  void SetKernelBinaries(const char* name);
-
-  bool UsePlatformBinary() const { return kernel_binaries_path_ != NULL; }
-
-  void* kernel_platform() const { return kernel_platform_; }
-  void set_kernel_platform(void* kernel_platform) {
-    kernel_platform_ = kernel_platform;
-  }
-
-  void* application_kernel_binary() const { return application_kernel_binary_; }
+  // Set the kernel program for the main application if it was specified
+  // as a dill file.
   void set_application_kernel_binary(void* application_kernel_binary) {
     application_kernel_binary_ = application_kernel_binary;
   }
+  void* application_kernel_binary() const { return application_kernel_binary_; }
 
   // Method to read a kernel file into a kernel program blob.
   // If the specified script [url] is not a kernel IR, compile it first using
@@ -57,20 +57,26 @@
   // 'error' and 'exit_code' have the error values in case of errors.
   void* CompileAndReadScript(const char* script_uri,
                              char** error,
-                             int* exit_code);
-
-  // Reads the platform kernel file.
-  // Returns an in memory kernel representation of the platform kernel file.
-  void* ReadPlatform();
+                             int* exit_code,
+                             bool strong);
 
   // Reads the script kernel file if specified 'script_uri' is a kernel file.
   // Returns an in memory kernel representation of the specified script is a
   // valid kernel file, false otherwise.
   void* ReadScript(const char* script_uri) const;
 
-  static void* KernelServiceProgram();
   static bool KernelServiceDillAvailable();
 
+  // We distinguish between "intent to use Dart frontend" vs "can actually
+  // use Dart frontend". The method UseDartFrontend tells us about the
+  // intent to use DFE. This method tells us if Dart frontend can actually
+  // be used.
+  bool CanUseDartFrontend() const;
+
+  void* platform_program(bool strong = false) const;
+
+  void* LoadKernelServiceProgram();
+
  private:
   // Tries to read [script_uri] as a Kernel IR file.
   // Returns `true` if successful and sets [kernel_file] and [kernel_length]
@@ -83,16 +89,15 @@
 
   bool use_dfe_;
   char* frontend_filename_;
-  char* kernel_binaries_path_;
-  char* platform_binary_filename_;
-  void* kernel_platform_;
+
+  void* kernel_service_program_;
+  void* platform_program_;
+  void* platform_strong_program_;
 
   // Kernel binary specified on the cmd line.
   // Loaded instead of platform if --kernel-binaries is not specified.
   void* application_kernel_binary_;
 
-  static void* kKernelServiceProgram;
-
   DISALLOW_COPY_AND_ASSIGN(DFE);
 };
 
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 956cfe2..462c1a2 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -72,6 +72,7 @@
   kScript,
   kAppAOTBlobs,
   kAppAOTAssembly,
+  kVMAOTAssembly,
 };
 static SnapshotKind snapshot_kind = kCore;
 
@@ -128,7 +129,13 @@
 }
 
 static const char* kSnapshotKindNames[] = {
-    "core", "core-jit", "script", "app-aot-blobs", "app-aot-assembly", NULL,
+    "core",
+    "core-jit",
+    "script",
+    "app-aot-blobs",
+    "app-aot-assembly",
+    "vm-aot-assembly",
+    NULL,
 };
 
 #define STRING_OPTIONS_LIST(V)                                                 \
@@ -169,7 +176,9 @@
 DEFINE_CB_OPTION(ProcessEnvironmentOption);
 
 static bool IsSnapshottingForPrecompilation() {
-  return (snapshot_kind == kAppAOTBlobs) || (snapshot_kind == kAppAOTAssembly);
+  return (snapshot_kind == kAppAOTBlobs) ||
+         (snapshot_kind == kAppAOTAssembly) ||
+         (snapshot_kind == kVMAOTAssembly);
 }
 
 static bool SnapshotKindAllowedFromKernel() {
@@ -276,13 +285,15 @@
       }
       break;
     }
-  }
-
-  if (IsSnapshottingForPrecompilation() && (entry_points_files->count() == 0)) {
-    Log::PrintErr(
-        "Building an AOT snapshot requires at least one embedder "
-        "entry points manifest.\n\n");
-    return -1;
+    case kVMAOTAssembly: {
+      if ((assembly_filename == NULL) || (*script_name != NULL)) {
+        Log::PrintErr(
+            "Building an AOT snapshot as assembly requires specifying "
+            "an output file for --assembly and a Dart script.\n\n");
+        return -1;
+      }
+      break;
+    }
   }
 
   if (!obfuscate && obfuscation_map_filename != NULL) {
@@ -504,6 +515,8 @@
         // WriteDependenciesWithTarget(isolate_snapshot_data_filename);
         // WriteDependenciesWithTarget(isolate_snapshot_instructions_filename);
         break;
+      default:
+        UNREACHABLE();
     }
 
     if (!success_) {
@@ -795,27 +808,12 @@
 }
 // clang-format on
 
-static const char StubNativeFunctionName[] = "StubNativeFunction";
+static void LoadEntryPoint(size_t lib_index,
+                           const Dart_QualifiedFunctionName* entry) {
+  if (strcmp(entry->library_uri, "::") == 0) {
+    return;  // Root library always loaded; can't `import '::';`.
+  }
 
-void StubNativeFunction(Dart_NativeArguments arguments) {
-  // This is a stub function for the resolver
-  Dart_SetReturnValue(
-      arguments, Dart_NewApiError("<EMBEDDER DID NOT SETUP NATIVE RESOLVER>"));
-}
-
-static Dart_NativeFunction StubNativeLookup(Dart_Handle name,
-                                            int argument_count,
-                                            bool* auto_setup_scope) {
-  return &StubNativeFunction;
-}
-
-static const uint8_t* StubNativeSymbol(Dart_NativeFunction nf) {
-  return reinterpret_cast<const uint8_t*>(StubNativeFunctionName);
-}
-
-static void SetupStubNativeResolver(size_t lib_index,
-                                    const Dart_QualifiedFunctionName* entry) {
-  // TODO(24686): Remove this.
   Dart_Handle library_string = Dart_NewStringFromCString(entry->library_uri);
   DART_CHECK_VALID(library_string);
   Dart_Handle library = Dart_LookupLibrary(library_string);
@@ -842,29 +840,6 @@
   }
 
   DART_CHECK_VALID(library);
-  Dart_Handle result =
-      Dart_SetNativeResolver(library, &StubNativeLookup, &StubNativeSymbol);
-  DART_CHECK_VALID(result);
-}
-
-// Iterate over all libraries and setup the stub native lookup. This must be
-// run after |SetupStubNativeResolversForPrecompilation| because the former
-// loads some libraries.
-static void SetupStubNativeResolvers() {
-  Dart_Handle libraries = Dart_GetLoadedLibraries();
-  intptr_t libraries_length;
-  Dart_ListLength(libraries, &libraries_length);
-  for (intptr_t i = 0; i < libraries_length; i++) {
-    Dart_Handle library = Dart_ListGetAt(libraries, i);
-    DART_CHECK_VALID(library);
-    Dart_NativeEntryResolver old_resolver = NULL;
-    Dart_GetNativeResolver(library, &old_resolver);
-    if (old_resolver == NULL) {
-      Dart_Handle result =
-          Dart_SetNativeResolver(library, &StubNativeLookup, &StubNativeSymbol);
-      DART_CHECK_VALID(result);
-    }
-  }
 }
 
 static void ImportNativeEntryPointLibrariesIntoRoot(
@@ -880,17 +855,18 @@
       // The termination sentinel has null members.
       break;
     }
-    Dart_Handle entry_library =
-        Dart_LookupLibrary(Dart_NewStringFromCString(entry.library_uri));
-    DART_CHECK_VALID(entry_library);
-    Dart_Handle import_result = Dart_LibraryImportLibrary(
-        entry_library, Dart_RootLibrary(), Dart_EmptyString());
-    DART_CHECK_VALID(import_result);
+    if (strcmp(entry.library_uri, "::") != 0) {
+      Dart_Handle entry_library =
+          Dart_LookupLibrary(Dart_NewStringFromCString(entry.library_uri));
+      DART_CHECK_VALID(entry_library);
+      Dart_Handle import_result = Dart_LibraryImportLibrary(
+          entry_library, Dart_RootLibrary(), Dart_EmptyString());
+      DART_CHECK_VALID(import_result);
+    }
   }
 }
 
-static void SetupStubNativeResolversForPrecompilation(
-    const Dart_QualifiedFunctionName* entries) {
+static void LoadEntryPoints(const Dart_QualifiedFunctionName* entries) {
   if (entries == NULL) {
     return;
   }
@@ -903,8 +879,8 @@
       // The termination sentinel has null members.
       break;
     }
-    // Setup stub resolvers on loaded libraries
-    SetupStubNativeResolver(index, &entry);
+    // Ensure library named in entry point is loaded.
+    LoadEntryPoint(index, &entry);
   }
 }
 
@@ -1439,8 +1415,7 @@
 
     Dart_QualifiedFunctionName* entry_points =
         ParseEntryPointsManifestIfPresent();
-    SetupStubNativeResolversForPrecompilation(entry_points);
-    SetupStubNativeResolvers();
+
     CreateAndWritePrecompiledSnapshot(entry_points);
 
     CreateAndWriteDependenciesFile();
@@ -1601,6 +1576,20 @@
   Dart_Handle library;
   Dart_EnterScope();
 
+  if (snapshot_kind == kVMAOTAssembly) {
+    uint8_t* assembly_buffer = NULL;
+    intptr_t assembly_size = 0;
+    result =
+        Dart_CreateVMAOTSnapshotAsAssembly(&assembly_buffer, &assembly_size);
+    CHECK_RESULT(result);
+
+    WriteFile(assembly_filename, assembly_buffer, assembly_size);
+
+    Dart_ExitScope();
+    Dart_ShutdownIsolate();
+    return 0;
+  }
+
   result = Dart_SetEnvironmentCallback(EnvironmentCallback);
   CHECK_RESULT(result);
 
@@ -1667,17 +1656,18 @@
       AddDependency(commandline_packages_file);
     }
 
-    SetupStubNativeResolversForPrecompilation(entry_points);
+    ASSERT(kernel_program == NULL);
 
-    SetupStubNativeResolvers();
+    // Load any libraries named in the entry points. Do this before loading the
+    // user's script to ensure conditional imports see the embedder-specific
+    // dart: libraries.
+    LoadEntryPoints(entry_points);
 
-    if (kernel_program == NULL) {
-      // Load the specified script.
-      library = LoadSnapshotCreationScript(app_script_name);
-      CHECK_RESULT(library);
+    // Load the specified script.
+    library = LoadSnapshotCreationScript(app_script_name);
+    CHECK_RESULT(library);
 
-      ImportNativeEntryPointLibrariesIntoRoot(entry_points);
-    }
+    ImportNativeEntryPointLibrariesIntoRoot(entry_points);
 
     // Ensure that we mark all libraries as loaded.
     result = Dart_FinalizeLoading(false);
diff --git a/runtime/bin/loader.cc b/runtime/bin/loader.cc
index bb6adc6..0f1db6e 100644
--- a/runtime/bin/loader.cc
+++ b/runtime/bin/loader.cc
@@ -209,39 +209,6 @@
   }
 }
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-// Forward a request from the tag handler to the kernel isolate.
-// [ tag, send port, url ]
-void Loader::SendKernelRequest(Dart_LibraryTag tag, Dart_Handle url) {
-  // This port delivers loading messages to the Kernel isolate.
-  Dart_Port kernel_port = Dart_KernelPort();
-  ASSERT(kernel_port != ILLEGAL_PORT);
-
-  // NOTE: This list should be kept in sync with kernel_service.dart
-  // and kernel_isolate.cc.
-  Dart_Handle request = Dart_NewList(9);
-  Dart_ListSetAt(request, 0, Dart_NewInteger(tag));
-  Dart_ListSetAt(request, 1, Dart_NewSendPort(port_));
-  Dart_ListSetAt(request, 2, url);
-  const char* platform_kernel = dfe.GetPlatformBinaryFilename();
-  if (platform_kernel != NULL) {
-    Dart_ListSetAt(request, 3, Dart_NewStringFromCString(platform_kernel));
-  } else {
-    Dart_ListSetAt(request, 3, Dart_Null());
-  }
-  Dart_ListSetAt(request, 4, Dart_False() /* incremental */);
-  Dart_ListSetAt(request, 5, Dart_True() /* strong */);
-  Dart_ListSetAt(request, 6,
-                 Dart_NewInteger(Dart_GetMainPortId()) /* isolateId */);
-  Dart_ListSetAt(request, 7, Dart_Null() /* sourceFiles */);
-  Dart_ListSetAt(request, 8, Dart_True() /* suppressWarnings */);
-  if (Dart_Post(kernel_port, request)) {
-    MonitorLocker ml(monitor_);
-    pending_operations_++;
-  }
-}
-#endif
-
 void Loader::QueueMessage(Dart_CObject* message) {
   MonitorLocker ml(monitor_);
   if (results_length_ == results_capacity_) {
@@ -695,8 +662,8 @@
   if (Dart_IsError(result)) {
     return result;
   }
+  Dart_Isolate current = Dart_CurrentIsolate();
   if (tag == Dart_kKernelTag) {
-    Dart_Isolate current = Dart_CurrentIsolate();
     ASSERT(!Dart_IsServiceIsolate(current) && !Dart_IsKernelIsolate(current));
     return dfe.ReadKernelBinary(current, url_string);
   }
@@ -713,7 +680,7 @@
 
     return Extensions::LoadExtension("/", absolute_path, library);
   }
-  ASSERT(Dart_IsKernelIsolate(Dart_CurrentIsolate()) || !dfe.UseDartFrontend());
+  ASSERT(Dart_IsKernelIsolate(current) || !dfe.UseDartFrontend());
   if (tag != Dart_kScriptTag) {
     // Special case for handling dart: imports and parts.
     // Grab the library's url.
@@ -791,13 +758,9 @@
   if (DartUtils::IsDartExtensionSchemeURL(url_string)) {
     loader->SendImportExtensionRequest(url, Dart_LibraryUrl(library));
   } else {
-    if (Dart_KernelIsolateIsRunning() &&
-        isolate_data->create_isolate_from_kernel()) {
-      // TODO(sivachandra): After linking the platform kernel file with
-      // the embedder, the library tag handler should not be called to compile
-      // a script to kernel and load it. Remove this part when platform kernel
-      // kernel file is linked in to the embedder.
-      loader->SendKernelRequest(tag, url);
+    if (dfe.CanUseDartFrontend() && dfe.UseDartFrontend() &&
+        !Dart_IsKernelIsolate(current)) {
+      FATAL("Loader should not be called to compile scripts to kernel.");
     } else {
       loader->SendRequest(
           tag, url,
diff --git a/runtime/bin/loader.h b/runtime/bin/loader.h
index 808524f..2e94033 100644
--- a/runtime/bin/loader.h
+++ b/runtime/bin/loader.h
@@ -101,9 +101,6 @@
                                        uint8_t** payload,
                                        intptr_t* payload_length);
 
-  // Send a request from the tag handler to the kernel isolate.
-  void SendKernelRequest(Dart_LibraryTag tag, Dart_Handle url);
-
   /// Queue |message| and notify the loader that a message is available.
   void QueueMessage(Dart_CObject* message);
 
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 0f33626..2741f90 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -302,7 +302,7 @@
                                                 Dart_IsolateFlags* flags,
                                                 char** error,
                                                 int* exit_code) {
-  const char* kernel_snapshot_uri = dfe.FrontendFilename();
+  const char* kernel_snapshot_uri = dfe.frontend_filename();
   const char* uri =
       kernel_snapshot_uri != NULL ? kernel_snapshot_uri : script_uri;
 
@@ -333,11 +333,11 @@
         DART_KERNEL_ISOLATE_NAME, main, isolate_snapshot_data,
         isolate_snapshot_instructions, flags, isolate_data, error);
   } else {
-    void* kernel_service_program = DFE::KernelServiceProgram();
+    void* kernel_service_program = dfe.LoadKernelServiceProgram();
+    ASSERT(kernel_service_program != NULL);
     IsolateData* isolate_data =
         new IsolateData(uri, package_root, packages_config, NULL);
     isolate_data->kernel_program = kernel_service_program;
-    isolate_data->set_create_isolate_from_kernel(true);
     isolate = Dart_CreateIsolateFromKernel(uri, main, kernel_service_program,
                                            flags, isolate_data, error);
   }
@@ -391,16 +391,25 @@
   // non-kernel flow.
   ASSERT(flags != NULL);
   flags->load_vmservice_library = true;
-  if (dfe.UsePlatformBinary()) {
-    isolate_data->set_create_isolate_from_kernel(true);
-    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_data->set_create_isolate_from_kernel(true);
-    isolate = Dart_CreateIsolateFromKernel(script_uri, NULL,
-                                           dfe.application_kernel_binary(),
-                                           flags, isolate_data, error);
+
+  if (dfe.UseDartFrontend()) {
+    // If there is intention to use DFE, then we create the isolate
+    // from kernel only if we can.
+    void* platform_program = dfe.platform_program(flags->strong) != NULL
+                                 ? dfe.platform_program(flags->strong)
+                                 : dfe.application_kernel_binary();
+    // TODO(sivachandra): When the platform program is unavailable, check if
+    // application kernel binary is self contained or an incremental binary.
+    // Isolate should be created only if it is a self contained kernel binary.
+    if (platform_program != NULL) {
+      isolate = Dart_CreateIsolateFromKernel(script_uri, NULL, platform_program,
+                                             flags, isolate_data, error);
+    } else {
+      *error = OS::SCreate(
+          NULL, "Platform kernel not available to create service isolate.");
+      delete isolate_data;
+      return NULL;
+    }
     skip_library_load = true;
   } else {
     isolate = Dart_CreateIsolate(script_uri, main, isolate_snapshot_data,
@@ -447,16 +456,9 @@
                                                 char** error,
                                                 int* exit_code) {
   ASSERT(script_uri != NULL);
-  void* kernel_platform = NULL;
   void* kernel_program = NULL;
   AppSnapshot* app_snapshot = NULL;
 
-  IsolateData* isolate_data =
-      new IsolateData(script_uri, package_root, packages_config, app_snapshot);
-  if (is_main_isolate && (Options::snapshot_deps_filename() != NULL)) {
-    isolate_data->set_dependencies(new MallocGrowableArray<char*>());
-  }
-
 #if defined(DART_PRECOMPILED_RUNTIME)
   // AOT: All isolates start from the app snapshot.
   bool isolate_run_app_snapshot = true;
@@ -488,27 +490,45 @@
     }
   }
   if (!isolate_run_app_snapshot) {
-    kernel_platform = dfe.kernel_platform();
     kernel_program = dfe.ReadScript(script_uri);
     if (dfe.UseDartFrontend() && (kernel_program == NULL)) {
-      kernel_program = dfe.CompileAndReadScript(script_uri, error, exit_code);
+      if (!dfe.CanUseDartFrontend()) {
+        *error = OS::SCreate(NULL, "Dart frontend unavailable to compile %s.",
+                             script_uri);
+        return NULL;
+      }
+      kernel_program =
+          dfe.CompileAndReadScript(script_uri, error, exit_code, flags->strong);
       if (kernel_program == NULL) {
+        // Error message would have been set by DFE::CompileAndReadScript.
         return NULL;
       }
     }
-    isolate_data->kernel_program = kernel_program;
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
+  IsolateData* isolate_data =
+      new IsolateData(script_uri, package_root, packages_config, app_snapshot);
+  if (is_main_isolate && (Options::snapshot_deps_filename() != NULL)) {
+    isolate_data->set_dependencies(new MallocGrowableArray<char*>());
+  }
+
   Dart_Isolate isolate = NULL;
-  if (kernel_platform != NULL) {
-    isolate_data->set_create_isolate_from_kernel(true);
-    isolate = Dart_CreateIsolateFromKernel(script_uri, main, kernel_platform,
+  if (kernel_program != NULL) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+    UNREACHABLE();
+    return NULL;
+#else
+    isolate_data->kernel_program = kernel_program;
+    void* platform_program = dfe.platform_program(flags->strong) != NULL
+                                 ? dfe.platform_program(flags->strong)
+                                 : kernel_program;
+    // TODO(sivachandra): When the platform program is unavailable, check if
+    // application kernel binary is self contained or an incremental binary.
+    // Isolate should be created only if it is a self contained kernel binary.
+    isolate = Dart_CreateIsolateFromKernel(script_uri, main, platform_program,
                                            flags, isolate_data, error);
-  } else if (kernel_program != NULL) {
-    isolate_data->set_create_isolate_from_kernel(true);
-    isolate = Dart_CreateIsolateFromKernel(script_uri, main, kernel_program,
-                                           flags, isolate_data, error);
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
   } else {
     isolate = Dart_CreateIsolate(script_uri, main, isolate_snapshot_data,
                                  isolate_snapshot_instructions, flags,
@@ -1050,22 +1070,14 @@
 // Note: must read platform only *after* VM flags are parsed because
 // they might affect how the platform is loaded.
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  // If a kernel platform binary file is specified, read it. This
-  // step will become redundant once we have the snapshot version
-  // of the kernel core/platform libraries.
-  void* application_kernel_binary = NULL;
-  if (dfe.UsePlatformBinary()) {
-    void* kernel_platform = dfe.ReadPlatform();
-    if (kernel_platform == NULL) {
-      Log::PrintErr("The platform binary is not a valid Dart Kernel file.");
-      Platform::Exit(kErrorExitCode);
-    }
-    dfe.set_kernel_platform(kernel_platform);
-  } else {
-    application_kernel_binary = dfe.ReadScript(script_name);
-    if (application_kernel_binary != NULL) {
-      dfe.set_application_kernel_binary(application_kernel_binary);
-    }
+  dfe.Init();
+  void* application_kernel_binary = dfe.ReadScript(script_name);
+  if (application_kernel_binary != NULL) {
+    // Since we loaded the script anyway, save it.
+    dfe.set_application_kernel_binary(application_kernel_binary);
+    // Since we saw a dill file, it means we have to use DFE for
+    // any further source file parsing.
+    dfe.set_use_dfe();
   }
 #endif
 
@@ -1089,16 +1101,8 @@
   init_params.entropy_source = DartUtils::EntropySource;
   init_params.get_service_assets = GetVMServiceAssetsArchiveCallback;
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  // Start the kernel isolate only if
-  // 1. --dart_preview_2 and/or --dfe is used
-  //
-  // or
-  //
-  // 2. If we have kernel service dill file linked in and a dill file
-  // was specified as the main dart program.
   init_params.start_kernel_isolate =
-      dfe.UseDartFrontend() || ((application_kernel_binary != NULL) &&
-                                DFE::KernelServiceDillAvailable());
+      dfe.UseDartFrontend() && dfe.CanUseDartFrontend();
 #else
   init_params.start_kernel_isolate = false;
 #endif
diff --git a/runtime/bin/main_options.cc b/runtime/bin/main_options.cc
index 5b89ff9..30f656b 100644
--- a/runtime/bin/main_options.cc
+++ b/runtime/bin/main_options.cc
@@ -72,8 +72,6 @@
 // specifying --preview_dart_2.
 DEFINE_STRING_OPTION_CB(dfe, { Options::dfe()->set_frontend_filename(value); });
 
-DEFINE_STRING_OPTION_CB(kernel_binaries,
-                        { Options::dfe()->SetKernelBinaries(value); });
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
 DEFINE_BOOL_OPTION_CB(hot_reload_test_mode, {
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 4128b5f..6f58f55 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -3135,7 +3135,9 @@
 DART_EXPORT bool Dart_KernelIsolateIsRunning();
 DART_EXPORT Dart_Port Dart_KernelPort();
 DART_EXPORT Dart_KernelCompilationResult
-Dart_CompileToKernel(const char* script_uri, const char* platform_kernel);
+Dart_CompileToKernel(const char* script_uri,
+                     const uint8_t* platform_kernel,
+                     const intptr_t platform_kernel_size);
 
 typedef struct {
   const char* uri;
@@ -3143,7 +3145,8 @@
 } Dart_SourceFile;
 DART_EXPORT Dart_KernelCompilationResult
 Dart_CompileSourcesToKernel(const char* script_uri,
-                            const char* platform_kernel,
+                            const uint8_t* platform_kernel,
+                            intptr_t platform_kernel_size,
                             int source_files_count,
                             Dart_SourceFile source_files[],
                             bool incremental_compile);
diff --git a/runtime/lib/async_patch.dart b/runtime/lib/async_patch.dart
index de47bf2..19d5b6a 100644
--- a/runtime/lib/async_patch.dart
+++ b/runtime/lib/async_patch.dart
@@ -17,6 +17,43 @@
 // Equivalent of calling FATAL from C++ code.
 _fatal(msg) native "DartAsync_fatal";
 
+class _AsyncAwaitCompleter<T> implements Completer<T> {
+  final _completer = new Completer<T>.sync();
+  bool isSync;
+
+  _AsyncAwaitCompleter() : isSync = false;
+
+  void complete([FutureOr<T> value]) {
+    if (isSync) {
+      _completer.complete(value);
+    } else if (value is Future<T>) {
+      value.then(_completer.complete, onError: _completer.completeError);
+    } else {
+      scheduleMicrotask(() {
+        _completer.complete(value);
+      });
+    }
+  }
+
+  void completeError(e, [st]) {
+    if (isSync) {
+      _completer.completeError(e, st);
+    } else {
+      scheduleMicrotask(() {
+        _completer.completeError(e, st);
+      });
+    }
+  }
+
+  void start(f) {
+    f();
+    isSync = true;
+  }
+
+  Future<T> get future => _completer.future;
+  bool get isCompleted => _completer.isCompleted;
+}
+
 // We need to pass the value as first argument and leave the second and third
 // arguments empty (used for error handling).
 // See vm/ast_transformer.cc for usage.
diff --git a/runtime/lib/bigint_patch.dart b/runtime/lib/bigint_patch.dart
new file mode 100644
index 0000000..5ad216f
--- /dev/null
+++ b/runtime/lib/bigint_patch.dart
@@ -0,0 +1,2110 @@
+// 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.
+ */
+
+@patch
+class BigInt implements Comparable<BigInt> {
+  @patch
+  static BigInt get zero => _BigIntImpl.zero;
+  @patch
+  static BigInt get one => _BigIntImpl.one;
+  @patch
+  static BigInt get two => _BigIntImpl.two;
+
+  @patch
+  static BigInt parse(String source, {int radix}) =>
+      _BigIntImpl.parse(source, radix: radix);
+
+  @patch
+  factory BigInt.from(num value) = _BigIntImpl.from;
+}
+
+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/runtime/lib/core_patch.dart b/runtime/lib/core_patch.dart
index f1ad81e..c7af7be 100644
--- a/runtime/lib/core_patch.dart
+++ b/runtime/lib/core_patch.dart
@@ -45,12 +45,14 @@
 
 import "dart:math" show Random;
 
-import "dart:typed_data" show Uint8List, Int64List, Uint16List, Uint32List;
+import "dart:typed_data"
+    show Endian, Uint8List, Int64List, Uint16List, Uint32List;
 
 /// These are the additional parts of this patch library:
 // part "array.dart";
 // part "array_patch.dart";
 // part "bigint.dart";
+// part "bigint_patch.dart";
 // part "bool_patch.dart";
 // part "date_patch.dart";
 // part "double.dart";
diff --git a/runtime/lib/core_sources.gni b/runtime/lib/core_sources.gni
index 221dc03..dc4f7c8 100644
--- a/runtime/lib/core_sources.gni
+++ b/runtime/lib/core_sources.gni
@@ -11,6 +11,7 @@
   "array.dart",
   "array_patch.dart",
   "bigint.dart",
+  "bigint_patch.dart",
   "bool.cc",
   "bool_patch.dart",
   "date.cc",
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index 5f3e449..3030af2 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -483,7 +483,6 @@
   const TypeArguments& type_arguments =
       TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0));
   const intptr_t len = type_arguments.Length();
-  ASSERT(len > 0);
   const Array& type_list = Array::Handle(zone, Array::New(len));
   TypeArguments& type_list_type_args =
       TypeArguments::Handle(zone, TypeArguments::New(1));
diff --git a/runtime/lib/regexp_patch.dart b/runtime/lib/regexp_patch.dart
index 53af5be..b7e0f46 100644
--- a/runtime/lib/regexp_patch.dart
+++ b/runtime/lib/regexp_patch.dart
@@ -37,6 +37,58 @@
     return value.regexp;
   }
 
+  /**
+   * Finds the index of the first RegExp-significant char in [text].
+   *
+   * Starts looking from [start]. Returns `text.length` if no character
+   * is found that has special meaning in RegExp syntax.
+   */
+  static int _findEscapeChar(String text, int start) {
+    // Table where each character in the range U+0000 to U+007f is represented
+    // by whether it needs to be escaped in a regexp.
+    // The \x00 characters means escacped, and \x01 means non-escaped.
+    const escapes =
+        "\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"
+        "\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"
+        //                 $               (   )   *   +           .
+        "\x01\x01\x01\x01\x00\x01\x01\x01\x00\x00\x00\x00\x01\x01\x00\x01"
+        //                                                             ?
+        "\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00"
+        "\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"
+        //                                             [   \   ]   ^
+        "\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x01"
+        "\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"
+        //                                             {   |   }
+        "\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x01\x01";
+    for (int i = start; i < text.length; i++) {
+      int char = text.codeUnitAt(i);
+      if (char <= 0x7f && escapes.codeUnitAt(char) == 0) return i;
+    }
+    return text.length;
+  }
+
+  @patch
+  static String escape(String text) {
+    int escapeCharIndex = _findEscapeChar(text, 0);
+    // If the text contains no characters needing escape, return it directly.
+    if (escapeCharIndex == text.length) return text;
+
+    var buffer = new StringBuffer();
+    int previousSliceEndIndex = 0;
+    do {
+      // Copy characters from previous escape to current escape into result.
+      // This includes the previously escaped character.
+      buffer.write(text.substring(previousSliceEndIndex, escapeCharIndex));
+      // Prepare the current character to be escaped by prefixing it with a '\'.
+      buffer.write(r"\");
+      previousSliceEndIndex = escapeCharIndex;
+      escapeCharIndex = _findEscapeChar(text, escapeCharIndex + 1);
+    } while (escapeCharIndex < text.length);
+    // Copy tail of string into result.
+    buffer.write(text.substring(previousSliceEndIndex, escapeCharIndex));
+    return buffer.toString();
+  }
+
   // Regular expression objects are stored in a cache of up to _MAX_CACHE_SIZE
   // elements using an LRU eviction strategy.
   // TODO(zerny): Do not impose a fixed limit on the number of cached objects.
diff --git a/runtime/observatory/tests/service/service.status b/runtime/observatory/tests/service/service.status
index e00fe7a..9abd844 100644
--- a/runtime/observatory/tests/service/service.status
+++ b/runtime/observatory/tests/service/service.status
@@ -79,7 +79,6 @@
 bad_reload_test: RuntimeError # Please triage.
 coverage_leaf_function_test: RuntimeError # Please triage.
 coverage_optimized_function_test: RuntimeError # Please triage.
-dev_fs_spawn_test: RuntimeError # Please triage.
 get_object_rpc_test: RuntimeError # Please triage.
 get_source_report_test: RuntimeError # Please triage.
 library_dependency_test: RuntimeError # Please triage.
diff --git a/runtime/tests/vm/dart/callee_side_type_checks_test.dart b/runtime/tests/vm/dart/callee_side_type_checks_test.dart
new file mode 100644
index 0000000..5a8dfaf
--- /dev/null
+++ b/runtime/tests/vm/dart/callee_side_type_checks_test.dart
@@ -0,0 +1,87 @@
+// 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.
+
+// VMOptions=--reify-generic-functions
+
+import "package:expect/expect.dart";
+
+// This test tests that AOT compiler does not optimize away necessary
+// type checks.
+
+class A {
+  int _addOneToArgument(int x) => x + 1;
+}
+
+abstract class G<T> {
+  int _addOneToArgument(T x);
+}
+
+class B extends A implements G<int> {}
+
+class C {
+  int _addTwoToArgument(int x) => x + 2;
+}
+
+class D {
+  int _addThreeToArgument(num x) {
+    return 0;
+  }
+}
+
+class E extends D {
+  int _addThreeToArgument(covariant int x) {
+    return x + 3;
+  }
+}
+
+typedef dynamic F0<T>(T val);
+typedef U F1<T, U>(T val);
+
+class F<T> {
+  T fMethod1(F0<T> f, T val) => f(val) as T;
+  U fMethod2<U>(F1<T, U> f, T val) => f(val);
+}
+
+final arr = <Object>[
+  new B(),
+  new C(),
+  new E(),
+  new D(), // Just to confuse CHA
+  new F<int>(),
+];
+
+int _add42Int(int v) => v + 42;
+double _add42Double(double v) => v + 42;
+double _add42_0Int(int v) => v + 42.0;
+
+main() {
+  final b = arr[0] as G<num>;
+
+  Expect.equals(1, b._addOneToArgument(0));
+  Expect.equals(0, b._addOneToArgument(-1));
+  Expect.throwsTypeError(() => b._addOneToArgument(1.1));
+
+  final c = (arr[1] as C);
+  final tornMethod = c._addTwoToArgument;
+  Expect.equals(2, c._addTwoToArgument(0));
+  Expect.equals(0, c._addTwoToArgument(-2));
+  Expect.throwsTypeError(() => (tornMethod as dynamic)(1.1));
+
+  final e = (arr[2] as D);
+  Expect.equals(3, e._addThreeToArgument(0));
+  Expect.equals(0, e._addThreeToArgument(-3));
+  Expect.throwsTypeError(() => e._addThreeToArgument(1.1));
+
+  final f = (arr[4] as F<num>);
+  final torn1 = f.fMethod1 as dynamic;
+  Expect.equals(43, torn1(_add42Int, 1));
+  Expect.throwsTypeError(() => torn1(_add42Double, 1));
+  Expect.throwsTypeError(() => torn1(_add42Int, 1.1));
+
+  final torn2 = f.fMethod2 as dynamic;
+  Expect.equals(43, torn2<int>(_add42Int, 1));
+  Expect.equals(43.0, torn2<double>(_add42_0Int, 1));
+  Expect.throwsTypeError(() => torn2<double>(_add42Int, 1));
+  Expect.throwsTypeError(() => torn2<int>(_add42_0Int, 1));
+}
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index afd3dd3..dcb48d1 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -46,8 +46,11 @@
 dart/snapshot_version_test: Fail, OK # Expects to find script snapshot relative to Dart source.
 
 [ $compiler == dart2analyzer ]
+dart/byte_array_optimized_test: CompileTimeError # int64
+dart/byte_array_test: CompileTimeError # int64
 dart/optimized_stacktrace_line_and_column_test: StaticWarning
 dart/optimized_stacktrace_line_test: StaticWarning
+dart/truncating_ints_test: CompileTimeError # int64
 
 [ $compiler == dart2js ]
 dart/byte_array_optimized_test: Skip # compilers not aware of byte arrays
@@ -102,6 +105,9 @@
 cc/CorelibCompilerStats: Skip
 cc/Service_Profile: Skip
 
+[ !$strong ]
+dart/callee_side_type_checks_test: SkipByDesign
+
 # Following tests are failing in a weird way on macos/ia32/debug builds
 # need to investigate.
 [ $arch == ia32 && $mode == debug && $runtime == vm && $system == macos ]
diff --git a/runtime/tools/concatenate_patches.py b/runtime/tools/concatenate_patches.py
deleted file mode 100755
index 8b2df2a5..0000000
--- a/runtime/tools/concatenate_patches.py
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-from optparse import OptionParser
-
-def writePatch(output_file_name, input_file_names):
-  dart_file_names = filter(lambda name: name.endswith('.dart'),
-                           input_file_names)
-  with open(output_file_name, 'w') as output_file:
-    is_first = True
-    for dart_file_name in dart_file_names:
-      with open(dart_file_name, 'r') as dart_file:
-        if is_first:
-          output_file.write(dart_file.read())
-          is_first = False
-        else:
-          for line in dart_file.readlines():
-            if not line.startswith("import "):
-              output_file.write(line)
-
-
-def main():
-  parser = OptionParser()
-  parser.add_option('--output', action='store', type='string',
-                    help='output file path')
-  (options, args) = parser.parse_args()
-  if not options.output:
-    parser.error('missing --output option\n')
-  if len(args) == 0:
-    parser.error('no input files given\n')
-  writePatch(options.output, args)
-
-
-if __name__ == '__main__':
-  main()
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index bc194bc..dc0a5b0 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -17,7 +17,6 @@
 import("../../sdk/lib/typed_data/typed_data_sources.gni")
 import("../../sdk/lib/vmservice/vmservice_sources.gni")
 import("../../utils/compile_platform.gni")
-import("../../utils/generate_patch_sdk.gni")
 import("../bin/io_sources.gni")
 import("../bin/cli_sources.gni")
 import("../lib/async_sources.gni")
@@ -38,10 +37,7 @@
 
 config("libdart_vm_config") {
   if (is_fuchsia) {
-    libs = [
-      "zircon",
-      "trace-engine",
-    ]
+    libs = [ "zircon" ]
   } else if (is_win) {
     libs = [
       "advapi32.lib",
@@ -80,7 +76,8 @@
 
         # TODO(zra): When the platform-specific timeline code is moved out to
         # the embedder, this can go away.
-        "//zircon/system/ulib/fbl",
+        "//zircon/public/lib/fbl",
+        "//zircon/public/lib/trace-engine",
       ]
     }
     public_configs = [ ":libdart_vm_config" ]
@@ -455,133 +452,6 @@
                typed_data_runtime_sources + vmservice_runtime_sources
 }
 
-template("concatenate_patch") {
-  assert(defined(invoker.libsources), "Need a sources in $target_name")
-  assert(defined(invoker.output), "Need an output in $target_name")
-
-  process_library_source(target_name) {
-    libsources = invoker.libsources
-    inputs = []
-    output = invoker.output
-    script = "../tools/concatenate_patches.py"
-    args = [
-      "--output",
-      rebase_path(output, root_build_dir),
-    ]
-  }
-}
-
-template("generate_vm_patched_sdk") {
-  assert(defined(invoker.libraries), "Need libraries in $target_name")
-
-  concatenation_target_names = []
-
-  # Concatenate vm library patches.
-  foreach(library, invoker.libraries) {
-    name = library[0]
-
-    target_output = "$target_gen_dir/patches/${name}_patch.dart"
-    concatenate_patch("concatenate_${name}_patch") {
-      libsources = rebase_path(library[1], ".", library[2])
-      output = target_output
-    }
-    concatenation_target_names += [ ":concatenate_${name}_patch" ]
-  }
-
-  patched_sdk_dir = "patched_sdk"
-
-  other_outputs = [
-    # Instead of listing all outputs we list those consumed by
-    # other BUILD rules.
-    "$root_out_dir/$patched_sdk_dir/lib/libraries.json",
-  ]
-
-  # Build the patched sdk out of the concatenated patches and the special
-  # libraries.
-  generate_patched_sdk(target_name) {
-    mode = "vm"
-    deps = concatenation_target_names
-    input_patches_dir = "$target_gen_dir/patches"
-    patched_sdk_dir = patched_sdk_dir
-    outputs = other_outputs
-  }
-}
-
-generate_vm_patched_sdk("patched_sdk") {
-  libraries = [
-    [
-      "async",
-      async_runtime_sources,
-      "../lib",
-    ],
-    [
-      "collection",
-      collection_runtime_sources,
-      "../lib",
-    ],
-    [
-      "convert",
-      convert_runtime_sources,
-      "../lib",
-    ],
-    [
-      "core",
-      core_runtime_sources,
-      "../lib",
-    ],
-    [
-      "developer",
-      developer_runtime_sources,
-      "../lib",
-    ],
-    [
-      "internal",
-      internal_runtime_sources,
-      "../lib",
-    ],
-    [
-      "isolate",
-      isolate_runtime_sources,
-      "../lib",
-    ],
-    [
-      "math",
-      math_runtime_sources,
-      "../lib",
-    ],
-    [
-      "mirrors",
-      mirrors_runtime_sources,
-      "../lib",
-    ],
-    [
-      "profiler",
-      profiler_runtime_sources,
-      "../lib",
-    ],
-    [
-      "typed_data",
-      typed_data_runtime_sources,
-      "../lib",
-    ],
-    [
-      "vmservice",
-      vmservice_runtime_sources,
-      "../lib",
-    ],
-    [
-      "io",
-      io_runtime_sources,
-      "../bin",
-    ],
-    [
-      "cli",
-      cli_runtime_sources,
-      "../bin",
-    ],
-  ]
-}
-
 compile_platform("vm_legacy_platform") {
   sources = [
     "../../sdk/lib/libraries.json",
@@ -601,7 +471,7 @@
 
 compile_platform("vm_platform") {
   sources = [
-    "$root_out_dir/patched_sdk/lib/libraries.json",
+    "../../sdk/lib/libraries.json",
   ]
 
   outputs = [
@@ -609,10 +479,6 @@
     "$root_out_dir/vm_outline_strong.dill",
   ]
 
-  deps = [
-    ":patched_sdk",
-  ]
-
   args = [
     "--strong-mode",
     "dart:core",
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index ef3c299..4708321 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -5555,14 +5555,19 @@
         codes_(new (zone) ZoneGrowableArray<Code*>(4 * KB)),
         script_(Script::Handle(zone)),
         code_(Code::Handle(zone)),
-        stack_maps_(Array::Handle(zone)) {}
+        stack_maps_(Array::Handle(zone)),
+        library_(Library::Handle(zone)),
+        kernel_program_info_(KernelProgramInfo::Handle(zone)) {}
 
   void Visit(const Class& cls) {
     script_ = cls.script();
     if (!script_.IsNull()) {
-      objects_->Add(&Object::Handle(zone_, script_.tokens()));
+      Visit(script_);
     }
 
+    library_ = cls.library();
+    objects_->Add(&Object::Handle(zone_, library_.kernel_data()));
+
     if (!include_code_) return;
 
     code_ = cls.allocation_stub();
@@ -5572,7 +5577,7 @@
   void Visit(const Function& function) {
     script_ = function.script();
     if (!script_.IsNull()) {
-      objects_->Add(&Object::Handle(zone_, script_.tokens()));
+      Visit(script_);
     }
 
     if (!include_code_) return;
@@ -5583,6 +5588,23 @@
     Visit(code_);
   }
 
+  void Visit(const Script& script) {
+    objects_->Add(&Object::Handle(zone_, script_.tokens()));
+    kernel_program_info_ = script_.kernel_program_info();
+    if (!kernel_program_info_.IsNull()) {
+      objects_->Add(
+          &Object::Handle(zone_, kernel_program_info_.string_offsets()));
+      objects_->Add(&Object::Handle(zone_, kernel_program_info_.string_data()));
+      objects_->Add(
+          &Object::Handle(zone_, kernel_program_info_.canonical_names()));
+      objects_->Add(
+          &Object::Handle(zone_, kernel_program_info_.metadata_payloads()));
+      objects_->Add(
+          &Object::Handle(zone_, kernel_program_info_.metadata_mappings()));
+      objects_->Add(&Object::Handle(zone_, kernel_program_info_.constants()));
+    }
+  }
+
   ZoneGrowableArray<Object*>* objects() { return objects_; }
   ZoneGrowableArray<Code*>* codes() { return codes_; }
 
@@ -5610,6 +5632,8 @@
   Script& script_;
   Code& code_;
   Array& stack_maps_;
+  Library& library_;
+  KernelProgramInfo& kernel_program_info_;
 };
 
 FullSnapshotWriter::FullSnapshotWriter(Snapshot::Kind kind,
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index a211946..04b3fd6 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -788,9 +788,9 @@
       lib = Library::LookupLibrary(T, library_uri);
     }
     if (lib.IsNull()) {
-      String& msg =
-          String::Handle(Z, String::NewFormatted("Cannot find entry point %s\n",
-                                                 entry_points[i].library_uri));
+      String& msg = String::Handle(
+          Z, String::NewFormatted("Cannot find entry point '%s'\n",
+                                  entry_points[i].library_uri));
       Jump(Error::Handle(Z, ApiError::New(msg)));
       UNREACHABLE();
     }
@@ -808,7 +808,7 @@
       cls = lib.LookupLocalClass(class_name);
       if (cls.IsNull()) {
         String& msg = String::Handle(
-            Z, String::NewFormatted("Cannot find entry point %s %s\n",
+            Z, String::NewFormatted("Cannot find entry point '%s' '%s'\n",
                                     entry_points[i].library_uri,
                                     entry_points[i].class_name));
         Jump(Error::Handle(Z, ApiError::New(msg)));
@@ -822,7 +822,7 @@
 
     if (func.IsNull() && field.IsNull()) {
       String& msg = String::Handle(
-          Z, String::NewFormatted("Cannot find entry point %s %s %s\n",
+          Z, String::NewFormatted("Cannot find entry point '%s' '%s' '%s'\n",
                                   entry_points[i].library_uri,
                                   entry_points[i].class_name,
                                   entry_points[i].function_name));
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index 2e1d07b..2c204ee 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -1777,11 +1777,13 @@
                               Register rt,
                               int64_t imm,
                               OperandSize sz) {
+    // EncodeImm19BranchOffset will longjump out if the offset does not fit in
+    // 19 bits.
+    const int32_t encoded_offset = EncodeImm19BranchOffset(imm, 0);
     ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
     ASSERT(Utils::IsInt(21, imm) && ((imm & 0x3) == 0));
     ASSERT((rt != CSP) && (rt != R31));
     const int32_t size = (sz == kDoubleWord) ? B31 : 0;
-    const int32_t encoded_offset = EncodeImm19BranchOffset(imm, 0);
     const int32_t encoding = op | size | Arm64Encode::Rt(rt) | encoded_offset;
     Emit(encoding);
   }
@@ -1790,11 +1792,13 @@
                            Register rt,
                            intptr_t bit_number,
                            int64_t imm) {
+    // EncodeImm14BranchOffset will longjump out if the offset does not fit in
+    // 14 bits.
+    const int32_t encoded_offset = EncodeImm14BranchOffset(imm, 0);
     ASSERT((bit_number >= 0) && (bit_number <= 63));
     ASSERT(Utils::IsInt(16, imm) && ((imm & 0x3) == 0));
     ASSERT((rt != CSP) && (rt != R31));
     const Register crt = ConcreteRegister(rt);
-    const int32_t encoded_offset = EncodeImm14BranchOffset(imm, 0);
     const int32_t encoding = op | (static_cast<int32_t>(bit_number) << 19) |
                              (static_cast<int32_t>(crt) << kRtShift) |
                              encoded_offset;
@@ -1833,6 +1837,9 @@
         } else {
           EmitConditionalBranchOp(op, InvertCondition(cond),
                                   2 * Instr::kInstrSize);
+          // Make a new dest that takes the new position into account after the
+          // inverted test.
+          const int64_t dest = label->Position() - buffer_.Size();
           b(dest);
         }
       } else {
@@ -1863,6 +1870,9 @@
       if (use_far_branches() && !CanEncodeImm19BranchOffset(dest)) {
         EmitCompareAndBranchOp(op == CBZ ? CBNZ : CBZ, rt,
                                2 * Instr::kInstrSize, sz);
+        // Make a new dest that takes the new position into account after the
+        // inverted test.
+        const int64_t dest = label->Position() - buffer_.Size();
         b(dest);
       } else {
         EmitCompareAndBranchOp(op, rt, dest, sz);
@@ -1889,12 +1899,15 @@
       if (use_far_branches() && !CanEncodeImm14BranchOffset(dest)) {
         EmitTestAndBranchOp(op == TBZ ? TBNZ : TBZ, rt, bit_number,
                             2 * Instr::kInstrSize);
+        // Make a new dest that takes the new position into account after the
+        // inverted test.
+        const int64_t dest = label->Position() - buffer_.Size();
         b(dest);
       } else {
         EmitTestAndBranchOp(op, rt, bit_number, dest);
       }
     } else {
-      const int64_t position = buffer_.Size();
+      int64_t position = buffer_.Size();
       if (use_far_branches()) {
         EmitTestAndBranchOp(op == TBZ ? TBNZ : TBZ, rt, bit_number,
                             2 * Instr::kInstrSize);
diff --git a/runtime/vm/compiler/assembler/assembler_arm64_test.cc b/runtime/vm/compiler/assembler/assembler_arm64_test.cc
index e1129ea..8bf00c9 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64_test.cc
@@ -1076,6 +1076,52 @@
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
 }
 
+ASSEMBLER_TEST_GENERATE(TstBranchIfZeroFar, assembler) {
+  Label l;
+
+  __ movz(R0, Immediate(42), 0);
+  __ movz(R1, Immediate((0 << 5) | 1), 0);
+
+  __ tbz(&l, R1, 5);
+
+  const intptr_t kRange = 1 << 14;  // tbz has 14 bits of range.
+  for (intptr_t i = 0; i < kRange; i++) {
+    __ brk(0);
+  }
+
+  __ movz(R0, Immediate(0), 0);
+  __ Bind(&l);
+  __ ret();
+}
+
+ASSEMBLER_TEST_RUN(TstBranchIfZeroFar, test) {
+  typedef int64_t (*Int64Return)() DART_UNUSED;
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+}
+
+ASSEMBLER_TEST_GENERATE(TstBranchIfNotZeroFar, assembler) {
+  Label l;
+
+  __ movz(R0, Immediate(42), 0);
+  __ movz(R1, Immediate((1 << 5) | 1), 0);
+
+  __ tbnz(&l, R1, 5);
+
+  const intptr_t kRange = 1 << 14;  // tbnz has 14 bits of range.
+  for (intptr_t i = 0; i < kRange; i++) {
+    __ brk(0);
+  }
+
+  __ movz(R0, Immediate(0), 0);
+  __ Bind(&l);
+  __ ret();
+}
+
+ASSEMBLER_TEST_RUN(TstBranchIfNotZeroFar, test) {
+  typedef int64_t (*Int64Return)() DART_UNUSED;
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+}
+
 ASSEMBLER_TEST_GENERATE(FcmpEqBranch, assembler) {
   Label l;
 
@@ -1095,6 +1141,80 @@
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
 }
 
+ASSEMBLER_TEST_GENERATE(TstBranchIfZeroFar1, assembler) {
+  Label l;
+
+  __ LoadImmediate(R0, 41);
+  __ tbnz(&l, R0, 5);
+  __ Stop("Hammertime");
+
+  for (int i = 0; i < 0x10000; i++) {
+    __ add(R0, R0, Operand(1));
+    __ sub(R0, R0, Operand(1));
+  }
+
+  __ AddImmediate(R0, R0, -1);  // Not run.
+
+  __ Bind(&l);
+  __ AddImmediate(R0, R0, 1);
+  __ ret();
+}
+
+ASSEMBLER_TEST_RUN(TstBranchIfZeroFar1, test) {
+  typedef int64_t (*Int64Return)() DART_UNUSED;
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+}
+
+ASSEMBLER_TEST_GENERATE(TstBranchIfZeroFar2, assembler) {
+  Label l;
+
+  for (int i = 0; i < 0x10000; i++) {
+    __ add(R0, R0, Operand(1));
+    __ sub(R0, R0, Operand(1));
+  }
+
+  __ LoadImmediate(R0, 41);
+  __ tbnz(&l, R0, 5);
+  __ Stop("Hammertime");
+
+  __ AddImmediate(R0, R0, -1);  // Not run.
+
+  __ Bind(&l);
+  __ AddImmediate(R0, R0, 1);
+  __ ret();
+}
+
+ASSEMBLER_TEST_RUN(TstBranchIfZeroFar2, test) {
+  typedef int64_t (*Int64Return)() DART_UNUSED;
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+}
+
+ASSEMBLER_TEST_GENERATE(TstBranchIfZeroFar3, assembler) {
+  Label l, l2;
+  __ LoadImmediate(R0, 41);
+  __ b(&l, AL);
+
+  __ AddImmediate(R0, R0, -1);  // Not run.
+
+  __ Bind(&l2);
+  __ AddImmediate(R0, R0, 1);
+  __ ret();
+
+  for (int i = 0; i < 0x10000; i++) {
+    __ add(R0, R0, Operand(1));
+    __ sub(R0, R0, Operand(1));
+  }
+
+  __ Bind(&l);
+  __ tbnz(&l2, R0, 5);
+  __ Stop("Hammertime");
+}
+
+ASSEMBLER_TEST_RUN(TstBranchIfZeroFar3, test) {
+  typedef int64_t (*Int64Return)() DART_UNUSED;
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+}
+
 ASSEMBLER_TEST_GENERATE(FcmpEqBranchNotTaken, assembler) {
   Label l;
 
diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc
index 2520f4b..d69740c 100644
--- a/runtime/vm/compiler/backend/type_propagator.cc
+++ b/runtime/vm/compiler/backend/type_propagator.cc
@@ -942,8 +942,18 @@
     return CompileType(CompileType::kNonNullable, cid, &type);
   }
 
-  // TODO(dartbug.com/30480): Figure out how to use parameter types
-  // without interfering with argument type checks.
+  if (Isolate::Current()->strong() && FLAG_use_strong_mode_types) {
+    LocalScope* scope = graph_entry->parsed_function().node_sequence()->scope();
+    // Note: in catch-blocks we have ParameterInstr for each local variable
+    // not only for normal parameters.
+    if (index() < scope->num_variables()) {
+      LocalVariable* param = scope->VariableAt(index());
+      if (param->was_type_checked_by_caller()) {
+        return CompileType::FromAbstractType(param->type(),
+                                             CompileType::kNullable);
+      }
+    }
+  }
 
   return CompileType::Dynamic();
 }
diff --git a/runtime/vm/compiler/call_specializer.cc b/runtime/vm/compiler/call_specializer.cc
index da16741..30e0407 100644
--- a/runtime/vm/compiler/call_specializer.cc
+++ b/runtime/vm/compiler/call_specializer.cc
@@ -887,7 +887,7 @@
   LoadFieldInstr* load = new (Z) LoadFieldInstr(
       new (Z) Value(call->ArgumentAt(0)), &field,
       AbstractType::ZoneHandle(Z, field.type()), call->token_pos(),
-      FLAG_use_field_guards ? &flow_graph()->parsed_function() : NULL);
+      isolate()->use_field_guards() ? &flow_graph()->parsed_function() : NULL);
   load->set_is_immutable(field.is_final());
 
   // Discard the environment from the original instruction because the load
@@ -945,7 +945,7 @@
     AddReceiverCheck(instr);
   }
 
-  if (FLAG_use_field_guards) {
+  if (I->use_field_guards()) {
     if (field.guarded_cid() != kDynamicCid) {
       ASSERT(I->use_field_guards());
       InsertBefore(instr,
@@ -972,8 +972,8 @@
                               new (Z) Value(instr->ArgumentAt(1)),
                               kEmitStoreBarrier, instr->token_pos());
 
-  ASSERT(FLAG_use_field_guards || !store->IsUnboxedStore());
-  if (FLAG_use_field_guards && store->IsUnboxedStore()) {
+  ASSERT(I->use_field_guards() || !store->IsUnboxedStore());
+  if (I->use_field_guards() && store->IsUnboxedStore()) {
     flow_graph()->parsed_function().AddToGuardedFields(&field);
   }
 
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 52d5650..d76581c 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -566,9 +566,8 @@
   }
 #endif  // DEBUG
 
-  last_node_offset_ = builder_->data_program_offset_ +
-                      builder_->parsed_function()->function().kernel_offset();
-  last_mapping_index_ = FindMetadataMapping(last_node_offset_);
+  last_node_offset_ = kIntptrMax;
+  last_mapping_index_ = 0;
 }
 
 intptr_t MetadataHelper::FindMetadataMapping(intptr_t node_offset) {
@@ -732,6 +731,25 @@
   return DirectCallMetadata(target, check_receiver_for_null);
 }
 
+bool ProcedureAttributesMetadataHelper::ReadMetadata(intptr_t node_offset,
+                                                     bool* has_dynamic_calls) {
+  intptr_t md_offset = GetNextMetadataPayloadOffset(node_offset);
+  if (md_offset < 0) {
+    *has_dynamic_calls = true;
+    return false;
+  }
+  *has_dynamic_calls = false;
+  return true;
+}
+
+ProcedureAttributesMetadata
+ProcedureAttributesMetadataHelper::GetProcedureAttributes(
+    intptr_t node_offset) {
+  bool has_dynamic_calls = true;
+  ReadMetadata(node_offset, &has_dynamic_calls);
+  return ProcedureAttributesMetadata(has_dynamic_calls);
+}
+
 InferredTypeMetadata InferredTypeMetadataHelper::GetInferredType(
     intptr_t node_offset) {
   const intptr_t md_offset = GetNextMetadataPayloadOffset(node_offset);
@@ -803,7 +821,21 @@
   ActiveTypeParametersScope active_type_params(&active_class_, function, Z);
 
   LocalScope* enclosing_scope = NULL;
-  if (function.IsLocalFunction()) {
+  if (function.IsImplicitClosureFunction() && !function.is_static()) {
+    // Create artificial enclosing scope for the tear-off that contains
+    // captured receiver value. This ensure that AssertAssignable will correctly
+    // load instantiator type arguments if they are needed.
+    Class& klass = Class::Handle(Z, function.Owner());
+    Type& klass_type = H.GetCanonicalType(klass);
+    result_->this_variable =
+        MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                     Symbols::This(), klass_type);
+    result_->this_variable->set_index(0);
+    result_->this_variable->set_is_captured();
+    enclosing_scope = new (Z) LocalScope(NULL, 0, 0);
+    enclosing_scope->set_context_level(0);
+    enclosing_scope->AddVariable(result_->this_variable);
+  } else if (function.IsLocalFunction()) {
     enclosing_scope = LocalScope::RestoreOuterScope(
         ContextScope::Handle(Z, function.context_scope()));
   }
@@ -835,6 +867,9 @@
   builder_->SetOffset(function.kernel_offset());
 
   FunctionNodeHelper function_node_helper(builder_);
+  const ProcedureAttributesMetadata attrs =
+      builder_->procedure_attributes_metadata_helper_.GetProcedureAttributes(
+          function.kernel_offset());
 
   switch (function.kind()) {
     case RawFunction::kClosureFunction:
@@ -904,9 +939,34 @@
         result_->type_arguments_variable = variable;
       }
 
+      ParameterTypeCheckMode type_check_mode = kTypeCheckAllParameters;
+      if (!function.IsImplicitClosureFunction()) {
+        if (function.is_static()) {
+          // In static functions we don't check anything.
+          type_check_mode = kTypeCheckForStaticFunction;
+        } else if (!attrs.has_dynamic_invocations) {
+          // If the current function is never a target of a dynamic invocation
+          // and this parameter is not marked with generic-covariant-impl
+          // (which means that among all super-interfaces no type parameters
+          // ever occur at the position of this parameter) then we don't need
+          // to check this parameter on the callee side, because strong mode
+          // guarantees that it was checked at the caller side.
+          type_check_mode = kTypeCheckForNonDynamicallyInvokedMethod;
+        }
+      } else {
+        if (!attrs.has_dynamic_invocations) {
+          // This is a tear-off of an instance method that can not be reached
+          // from any dynamic invocation. The method would not check any
+          // parameters except covariant ones and those annotated with
+          // generic-covariant-impl. Which means that we have to check
+          // the rest in the tear-off itself..
+          type_check_mode = kTypeCheckForTearOffOfNonDynamicallyInvokedMethod;
+        }
+      }
+
       // Continue reading FunctionNode:
       // read positional_parameters and named_parameters.
-      AddPositionalAndNamedParameters(pos);
+      AddPositionalAndNamedParameters(pos, type_check_mode);
 
       // We generate a synthetic body for implicit closure functions - which
       // will forward the call to the real function.
@@ -1945,7 +2005,7 @@
   // read positional_parameters and named_parameters.
   function_node_helper.ReadUntilExcluding(
       FunctionNodeHelper::kPositionalParameters);
-  AddPositionalAndNamedParameters();
+  AddPositionalAndNamedParameters(0, kTypeCheckAllParameters);
 
   // "Peek" is now done.
   builder_->SetOffset(offset);
@@ -1971,21 +2031,25 @@
   scope_ = scope_->parent();
 }
 
-void StreamingScopeBuilder::AddPositionalAndNamedParameters(intptr_t pos) {
+void StreamingScopeBuilder::AddPositionalAndNamedParameters(
+    intptr_t pos,
+    ParameterTypeCheckMode type_check_mode /* = kTypeCheckAllParameters*/) {
   // List of positional.
   intptr_t list_length = builder_->ReadListLength();  // read list length.
   for (intptr_t i = 0; i < list_length; ++i) {
-    AddVariableDeclarationParameter(pos++);  // read ith positional parameter.
+    AddVariableDeclarationParameter(pos++, type_check_mode);
   }
 
   // List of named.
   list_length = builder_->ReadListLength();  // read list length.
   for (intptr_t i = 0; i < list_length; ++i) {
-    AddVariableDeclarationParameter(pos++);  // read ith named parameter.
+    AddVariableDeclarationParameter(pos++, type_check_mode);
   }
 }
 
-void StreamingScopeBuilder::AddVariableDeclarationParameter(intptr_t pos) {
+void StreamingScopeBuilder::AddVariableDeclarationParameter(
+    intptr_t pos,
+    ParameterTypeCheckMode type_check_mode) {
   intptr_t kernel_offset = builder_->ReaderOffset();  // no tag.
   VariableDeclarationHelper helper(builder_);
   helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
@@ -2002,6 +2066,35 @@
   if (variable->name().raw() == Symbols::IteratorParameter().raw()) {
     variable->set_is_forced_stack();
   }
+
+  const bool is_covariant =
+      helper.IsGenericCovariantImpl() || helper.IsCovariant();
+  switch (type_check_mode) {
+    case kTypeCheckAllParameters:
+      variable->set_type_check_mode(LocalVariable::kDoTypeCheck);
+      break;
+    case kTypeCheckForTearOffOfNonDynamicallyInvokedMethod:
+      if (is_covariant) {
+        // Don't type check covariant parameters - they will be checked by
+        // a function we forward to. Their types however are not known.
+        variable->set_type_check_mode(LocalVariable::kSkipTypeCheck);
+      } else {
+        variable->set_type_check_mode(LocalVariable::kDoTypeCheck);
+      }
+      break;
+    case kTypeCheckForNonDynamicallyInvokedMethod:
+      if (is_covariant) {
+        variable->set_type_check_mode(LocalVariable::kDoTypeCheck);
+      } else {
+        // Types of non-covariant parameters are guaranteed to match by
+        // front-end enforcing strong mode types at call site.
+        variable->set_type_check_mode(LocalVariable::kTypeCheckedByCaller);
+      }
+      break;
+    case kTypeCheckForStaticFunction:
+      variable->set_type_check_mode(LocalVariable::kTypeCheckedByCaller);
+      break;
+  }
   scope_->InsertParameterAt(pos, variable);
   result_->locals.Insert(builder_->data_program_offset_ + kernel_offset,
                          variable);
@@ -3980,11 +4073,25 @@
   FunctionNodeHelper function_node_helper(this);
   function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kTypeParameters);
 
-  // Tearoffs of static methods needs to perform arguments checks since static
-  // methods they forward to don't do it themselves.
-  if (I->argument_type_checks() && !target.NeedsArgumentTypeChecks(I)) {
-    AlternativeReadingScope _(reader_);
-    body += BuildArgumentTypeChecks();
+  if (I->argument_type_checks()) {
+    if (!target.NeedsArgumentTypeChecks(I)) {
+      // Tearoffs of static methods needs to perform arguments checks since
+      // static methods they forward to don't do it themselves.
+      AlternativeReadingScope _(reader_);
+      body += BuildArgumentTypeChecks();
+    } else {
+      // Check if target function was annotated with no-dynamic-invocations.
+      const ProcedureAttributesMetadata attrs =
+          procedure_attributes_metadata_helper_.GetProcedureAttributes(
+              target.kernel_offset());
+      if (!attrs.has_dynamic_invocations) {
+        // If it was then we might need to build some checks in the
+        // tear-off.
+        AlternativeReadingScope _(reader_);
+        body +=
+            BuildArgumentTypeChecks(kTypeChecksForNoDynamicInvocationsTearOff);
+      }
+    }
   }
 
   function_node_helper.ReadUntilExcluding(
@@ -4041,7 +4148,8 @@
                 flow_graph_builder_->last_used_block_id_, prologue_info);
 }
 
-Fragment StreamingFlowGraphBuilder::BuildArgumentTypeChecks() {
+Fragment StreamingFlowGraphBuilder::BuildArgumentTypeChecks(
+    TypeChecksToBuild mode /*= kDefaultTypeChecks*/) {
   FunctionNodeHelper function_node_helper(this);
   function_node_helper.SetNext(FunctionNodeHelper::kTypeParameters);
   const Function& dart_function = parsed_function()->function();
@@ -4060,53 +4168,60 @@
   }
 
   // Type parameters
-  intptr_t list_length = ReadListLength();
-  TypeArguments& forwarding_params = TypeArguments::Handle(Z);
-  if (forwarding_target != NULL) {
-    forwarding_params = forwarding_target->type_parameters();
-    ASSERT(forwarding_params.Length() == list_length);
-  }
-  TypeParameter& forwarding_param = TypeParameter::Handle(Z);
-  for (intptr_t i = 0; i < list_length; ++i) {
-    ReadFlags();                                         // skip flags
-    SkipListOfExpressions();                             // skip annotations
-    String& name = H.DartSymbol(ReadStringReference());  // read name
-    AbstractType& bound = T.BuildType();                 // read bound
-
+  if (mode == kDefaultTypeChecks) {
+    intptr_t num_type_params = ReadListLength();
+    TypeArguments& forwarding_params = TypeArguments::Handle(Z);
     if (forwarding_target != NULL) {
-      forwarding_param ^= forwarding_params.TypeAt(i);
-      bound = forwarding_param.bound();
+      forwarding_params = forwarding_target->type_parameters();
+      ASSERT(forwarding_params.Length() == num_type_params);
     }
+    TypeParameter& forwarding_param = TypeParameter::Handle(Z);
+    for (intptr_t i = 0; i < num_type_params; ++i) {
+      ReadFlags();                                         // skip flags
+      SkipListOfExpressions();                             // skip annotations
+      String& name = H.DartSymbol(ReadStringReference());  // read name
+      AbstractType& bound = T.BuildType();                 // read bound
 
-    if (I->strong() && !bound.IsObjectType() &&
-        (I->reify_generic_functions() || dart_function.IsFactory())) {
-      ASSERT(!bound.IsDynamicType());
-      TypeParameter& param = TypeParameter::Handle(Z);
-      if (dart_function.IsFactory()) {
-        param ^= TypeArguments::Handle(
-                     Class::Handle(dart_function.Owner()).type_parameters())
-                     .TypeAt(i);
-      } else {
-        param ^=
-            TypeArguments::Handle(dart_function.type_parameters()).TypeAt(i);
+      if (forwarding_target != NULL) {
+        forwarding_param ^= forwarding_params.TypeAt(i);
+        bound = forwarding_param.bound();
       }
-      ASSERT(param.IsFinalized());
-      body += CheckTypeArgumentBound(param, bound, name);
+
+      if (I->strong() && !bound.IsObjectType() &&
+          (I->reify_generic_functions() || dart_function.IsFactory())) {
+        ASSERT(!bound.IsDynamicType());
+        TypeParameter& param = TypeParameter::Handle(Z);
+        if (dart_function.IsFactory()) {
+          param ^= TypeArguments::Handle(
+                       Class::Handle(dart_function.Owner()).type_parameters())
+                       .TypeAt(i);
+        } else {
+          param ^=
+              TypeArguments::Handle(dart_function.type_parameters()).TypeAt(i);
+        }
+        ASSERT(param.IsFinalized());
+        body += CheckTypeArgumentBound(param, bound, name);
+      }
     }
+    function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
   }
 
-  function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
   function_node_helper.ReadUntilExcluding(
       FunctionNodeHelper::kPositionalParameters);
 
   // Positional.
-  list_length = ReadListLength();
-  const intptr_t positional_length = list_length;
+  const intptr_t num_positional_params = ReadListLength();
   const intptr_t kFirstParameterOffset = 1;
-  for (intptr_t i = 0; i < list_length; ++i) {
+  for (intptr_t i = 0; i < num_positional_params; ++i) {
     // ith variable offset.
     const intptr_t offset = ReaderOffset();
+    SkipVariableDeclaration();
+
     LocalVariable* param = LookupVariable(offset + data_program_offset_);
+    if (!param->needs_type_check()) {
+      continue;
+    }
+
     const AbstractType* target_type = &param->type();
     if (forwarding_target != NULL) {
       // We add 1 to the parameter index to account for the receiver.
@@ -4116,25 +4231,29 @@
     body += LoadLocal(param);
     body += CheckArgumentType(param, *target_type);
     body += Drop();
-    SkipVariableDeclaration();  // read ith variable.
   }
 
   // Named.
-  list_length = ReadListLength();
-  for (intptr_t i = 0; i < list_length; ++i) {
+  const intptr_t num_named_params = ReadListLength();
+  for (intptr_t i = 0; i < num_named_params; ++i) {
     // ith variable offset.
-    LocalVariable* param =
-        LookupVariable(ReaderOffset() + data_program_offset_);
-    body += LoadLocal(param);
+    const intptr_t offset = ReaderOffset();
+    SkipVariableDeclaration();
+
+    LocalVariable* param = LookupVariable(offset + data_program_offset_);
+    if (!param->needs_type_check()) {
+      continue;
+    }
+
     const AbstractType* target_type = &param->type();
     if (forwarding_target != NULL) {
       // We add 1 to the parameter index to account for the receiver.
       target_type = &AbstractType::ZoneHandle(
-          Z, forwarding_target->ParameterTypeAt(positional_length + i + 1));
+          Z, forwarding_target->ParameterTypeAt(num_positional_params + i + 1));
     }
+    body += LoadLocal(param);
     body += CheckArgumentType(param, *target_type);
     body += Drop();
-    SkipVariableDeclaration();  // read ith variable.
   }
 
   return body;
@@ -5554,7 +5673,7 @@
 
   // List of positional.
   intptr_t list_length = ReadListLength();  // read list length.
-  for (intptr_t i = 0; i < list_length; ++i) {
+  if (list_length > 0) {
     return ReadTag();  // read first tag.
   }
 
@@ -9584,6 +9703,9 @@
 
   const intptr_t kUInt32Size = 4;
   Reader reader(H.metadata_mappings());
+  if (reader.size() == 0) {
+    return;
+  }
 
   // Scan through metadata mappings in reverse direction.
 
@@ -9631,6 +9753,18 @@
         inferred_type_metadata_helper_.SetMetadataMappings(offset + kUInt32Size,
                                                            mappings_num);
       }
+    } else if (H.StringEquals(tag, ProcedureAttributesMetadataHelper::tag())) {
+      ASSERT(node_references_num == 0);
+
+      if (mappings_num > 0) {
+        if (!FLAG_precompiled_mode) {
+          FATAL(
+              "ProcedureAttributesMetadata is allowed in precompiled mode "
+              "only");
+        }
+        procedure_attributes_metadata_helper_.SetMetadataMappings(
+            offset + kUInt32Size, mappings_num);
+      }
     }
   }
 }
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 7a2ea01..b99111b 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -590,6 +590,26 @@
   InferredTypeMetadata GetInferredType(intptr_t node_offset);
 };
 
+struct ProcedureAttributesMetadata {
+  explicit ProcedureAttributesMetadata(bool has_dynamic_invocations)
+      : has_dynamic_invocations(has_dynamic_invocations) {}
+  const bool has_dynamic_invocations;
+};
+
+// Helper class which provides access to direct call metadata.
+class ProcedureAttributesMetadataHelper : public MetadataHelper {
+ public:
+  static const char* tag() { return "vm.procedure-attributes.metadata"; }
+
+  explicit ProcedureAttributesMetadataHelper(StreamingFlowGraphBuilder* builder)
+      : MetadataHelper(builder) {}
+
+  ProcedureAttributesMetadata GetProcedureAttributes(intptr_t node_offset);
+
+ private:
+  bool ReadMetadata(intptr_t node_offset, bool* has_dynamic_invocations);
+};
+
 class StreamingDartTypeTranslator {
  public:
   StreamingDartTypeTranslator(StreamingFlowGraphBuilder* builder,
@@ -692,16 +712,34 @@
   void EnterScope(intptr_t kernel_offset);
   void ExitScope(TokenPosition start_position, TokenPosition end_position);
 
-  /**
-   * This assumes that the reader is at a FunctionNode,
-   * about to read the positional parameters.
-   */
-  void AddPositionalAndNamedParameters(intptr_t pos = 0);
-  /**
-   * This assumes that the reader is at a FunctionNode,
-   * about to read a parameter (i.e. VariableDeclaration).
-   */
-  void AddVariableDeclarationParameter(intptr_t pos);
+  // This enum controls which parameters would be marked as requring type
+  // check on the callee side.
+  enum ParameterTypeCheckMode {
+    // All parameters will be checked.
+    kTypeCheckAllParameters,
+
+    // Only parameters marked as covariant or generic-covariant-impl will be
+    // checked.
+    kTypeCheckForNonDynamicallyInvokedMethod,
+
+    // Only parameters *not* marked as covariant or generic-covariant-impl will
+    // be checked. The rest would be checked in the method itself.
+    // Inverse of kTypeCheckOnlyGenericCovariantImplParameters.
+    kTypeCheckForTearOffOfNonDynamicallyInvokedMethod,
+
+    // No parameters will be checked.
+    kTypeCheckForStaticFunction,
+  };
+
+  // This assumes that the reader is at a FunctionNode,
+  // about to read the positional parameters.
+  void AddPositionalAndNamedParameters(intptr_t pos,
+                                       ParameterTypeCheckMode type_check_mode);
+
+  // This assumes that the reader is at a FunctionNode,
+  // about to read a parameter (i.e. VariableDeclaration).
+  void AddVariableDeclarationParameter(intptr_t pos,
+                                       ParameterTypeCheckMode type_check_mode);
 
   LocalVariable* MakeVariable(TokenPosition declaration_pos,
                               TokenPosition token_pos,
@@ -894,6 +932,7 @@
         record_yield_positions_into_(NULL),
         direct_call_metadata_helper_(this),
         inferred_type_metadata_helper_(this),
+        procedure_attributes_metadata_helper_(this),
         metadata_scanned_(false) {}
 
   StreamingFlowGraphBuilder(TranslationHelper* translation_helper,
@@ -915,6 +954,7 @@
         record_yield_positions_into_(NULL),
         direct_call_metadata_helper_(this),
         inferred_type_metadata_helper_(this),
+        procedure_attributes_metadata_helper_(this),
         metadata_scanned_(false) {}
 
   StreamingFlowGraphBuilder(TranslationHelper* translation_helper,
@@ -936,6 +976,7 @@
         record_yield_positions_into_(NULL),
         direct_call_metadata_helper_(this),
         inferred_type_metadata_helper_(this),
+        procedure_attributes_metadata_helper_(this),
         metadata_scanned_(false) {}
 
   ~StreamingFlowGraphBuilder() { delete reader_; }
@@ -1126,7 +1167,14 @@
                         const InferredTypeMetadata* result_type = NULL,
                         intptr_t argument_check_bits = 0,
                         intptr_t type_argument_check_bits = 0);
-  Fragment BuildArgumentTypeChecks();
+
+  enum TypeChecksToBuild {
+    kDefaultTypeChecks,
+    kTypeChecksForNoDynamicInvocationsTearOff
+  };
+
+  Fragment BuildArgumentTypeChecks(TypeChecksToBuild mode = kDefaultTypeChecks);
+
   Fragment ThrowException(TokenPosition position);
   Fragment BooleanNegate();
   Fragment TranslateInstantiatedTypeArguments(
@@ -1323,12 +1371,14 @@
   GrowableArray<intptr_t>* record_yield_positions_into_;
   DirectCallMetadataHelper direct_call_metadata_helper_;
   InferredTypeMetadataHelper inferred_type_metadata_helper_;
+  ProcedureAttributesMetadataHelper procedure_attributes_metadata_helper_;
   bool metadata_scanned_;
 
   friend class ClassHelper;
   friend class ConstantHelper;
   friend class ConstructorHelper;
   friend class DirectCallMetadataHelper;
+  friend class ProcedureAttributesMetadataHelper;
   friend class FieldHelper;
   friend class FunctionNodeHelper;
   friend class InferredTypeMetadataHelper;
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 6219611..4c0c8eb 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -5905,20 +5905,24 @@
 }
 
 DART_EXPORT Dart_KernelCompilationResult
-Dart_CompileToKernel(const char* script_uri, const char* platform_kernel) {
+Dart_CompileToKernel(const char* script_uri,
+                     const uint8_t* platform_kernel,
+                     intptr_t platform_kernel_size) {
 #if defined(DART_PRECOMPILED_RUNTIME)
   Dart_KernelCompilationResult result;
   result.status = Dart_KernelCompilationStatus_Unknown;
   result.error = strdup("Dart_CompileToKernel is unsupported.");
   return result;
 #else
-  return KernelIsolate::CompileToKernel(script_uri, platform_kernel);
+  return KernelIsolate::CompileToKernel(script_uri, platform_kernel,
+                                        platform_kernel_size);
 #endif
 }
 
 DART_EXPORT Dart_KernelCompilationResult
 Dart_CompileSourcesToKernel(const char* script_uri,
-                            const char* platform_kernel,
+                            const uint8_t* platform_kernel,
+                            intptr_t platform_kernel_size,
                             int source_files_count,
                             Dart_SourceFile sources[],
                             bool incremental_compile) {
@@ -5928,9 +5932,9 @@
   result.error = strdup("Dart_CompileSourcesToKernel is unsupported.");
   return result;
 #else
-  return KernelIsolate::CompileToKernel(script_uri, platform_kernel,
-                                        source_files_count, sources,
-                                        incremental_compile);
+  return KernelIsolate::CompileToKernel(
+      script_uri, platform_kernel, platform_kernel_size, source_files_count,
+      sources, incremental_compile);
 #endif
 }
 
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index 67d23d6..b8242e4 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -157,6 +157,7 @@
   C(stress_async_stacks, false, false, bool, false,                            \
     "Stress test async stack traces")                                          \
   P(strong, bool, false, "Enable strong mode.")                                \
+  P(sync_async, bool, false, "Start `async` functions synchronously.")         \
   R(support_ast_printer, false, bool, true, "Support the AST printer.")        \
   R(support_compiler_stats, false, bool, true, "Support compiler stats.")      \
   R(support_disassembler, false, bool, true, "Support the disassembler.")      \
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index 9b804c7..8767588 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -84,8 +84,10 @@
     isolate = reinterpret_cast<Isolate*>(create_callback(
         KernelIsolate::kName, NULL, NULL, NULL, &api_flags, NULL, &error));
     if (isolate == NULL) {
-      OS::PrintErr(DART_KERNEL_ISOLATE_NAME ": Isolate creation error: %s\n",
-                   error);
+      if (FLAG_trace_kernel) {
+        OS::PrintErr(DART_KERNEL_ISOLATE_NAME ": Isolate creation error: %s\n",
+                     error);
+      }
       KernelIsolate::SetKernelIsolate(NULL);
       KernelIsolate::FinishedInitializing();
       return;
@@ -281,6 +283,10 @@
   return files;
 }
 
+static void PassThroughFinalizer(void* isolate_callback_data,
+                                 Dart_WeakPersistentHandle handle,
+                                 void* peer) {}
+
 class KernelCompilationRequest : public ValueObject {
  public:
   KernelCompilationRequest()
@@ -307,7 +313,8 @@
   Dart_KernelCompilationResult SendAndWaitForResponse(
       Dart_Port kernel_port,
       const char* script_uri,
-      const char* platform_kernel,
+      const uint8_t* platform_kernel,
+      intptr_t platform_kernel_size,
       int source_files_count,
       Dart_SourceFile source_files[],
       bool incremental_compile) {
@@ -329,9 +336,20 @@
 
     Dart_CObject dart_platform_kernel;
     if (platform_kernel != NULL) {
-      dart_platform_kernel.type = Dart_CObject_kString;
-      dart_platform_kernel.value.as_string = const_cast<char*>(platform_kernel);
+      dart_platform_kernel.type = Dart_CObject_kExternalTypedData;
+      dart_platform_kernel.value.as_external_typed_data.type =
+          Dart_TypedData_kUint8;
+      dart_platform_kernel.value.as_external_typed_data.length =
+          platform_kernel_size;
+      dart_platform_kernel.value.as_external_typed_data.data =
+          const_cast<uint8_t*>(platform_kernel);
+      dart_platform_kernel.value.as_external_typed_data.peer =
+          const_cast<uint8_t*>(platform_kernel);
+      dart_platform_kernel.value.as_external_typed_data.callback =
+          PassThroughFinalizer;
     } else {
+      // If NULL, the kernel service looks up the platform dill file
+      // next to the executable.
       dart_platform_kernel.type = Dart_CObject_kNull;
     }
 
@@ -370,6 +388,10 @@
     suppress_warnings.type = Dart_CObject_kBool;
     suppress_warnings.value.as_bool = FLAG_suppress_fe_warnings;
 
+    Dart_CObject dart_sync_async;
+    dart_sync_async.type = Dart_CObject_kBool;
+    dart_sync_async.value.as_bool = FLAG_sync_async;
+
     Dart_CObject* message_arr[] = {&tag,
                                    &send_port,
                                    &uri,
@@ -378,7 +400,8 @@
                                    &dart_strong,
                                    &isolate_id,
                                    &files,
-                                   &suppress_warnings};
+                                   &suppress_warnings,
+                                   &dart_sync_async};
     message.value.as_array.values = message_arr;
     message.value.as_array.length = ARRAY_SIZE(message_arr);
     // Send the message.
@@ -492,7 +515,8 @@
 
 Dart_KernelCompilationResult KernelIsolate::CompileToKernel(
     const char* script_uri,
-    const char* platform_kernel,
+    const uint8_t* platform_kernel,
+    intptr_t platform_kernel_size,
     int source_file_count,
     Dart_SourceFile source_files[],
     bool incremental_compile) {
@@ -507,9 +531,9 @@
   }
 
   KernelCompilationRequest request;
-  return request.SendAndWaitForResponse(kernel_port, script_uri,
-                                        platform_kernel, source_file_count,
-                                        source_files, incremental_compile);
+  return request.SendAndWaitForResponse(
+      kernel_port, script_uri, platform_kernel, platform_kernel_size,
+      source_file_count, source_files, incremental_compile);
 }
 
 #endif  // DART_PRECOMPILED_RUNTIME
diff --git a/runtime/vm/kernel_isolate.h b/runtime/vm/kernel_isolate.h
index 89507d1..b0f0819 100644
--- a/runtime/vm/kernel_isolate.h
+++ b/runtime/vm/kernel_isolate.h
@@ -29,7 +29,8 @@
 
   static Dart_KernelCompilationResult CompileToKernel(
       const char* script_uri,
-      const char* platform_kernel = NULL,
+      const uint8_t* platform_kernel,
+      intptr_t platform_kernel_size,
       int source_files_count = 0,
       Dart_SourceFile source_files[] = NULL,
       bool incremental_compile = false);
diff --git a/runtime/vm/os_fuchsia.cc b/runtime/vm/os_fuchsia.cc
index a9abbd7..624c883 100644
--- a/runtime/vm/os_fuchsia.cc
+++ b/runtime/vm/os_fuchsia.cc
@@ -44,7 +44,7 @@
 static zx_status_t GetTimeServicePtr(
     time_service::TimeServiceSyncPtr* time_svc) {
   zx::channel service_root = app::subtle::CreateStaticServiceRootHandle();
-  zx::channel time_svc_channel = GetSynchronousProxy(time_svc).PassChannel();
+  zx::channel time_svc_channel = GetSynchronousProxy(time_svc).TakeChannel();
   return fdio_service_connect_at(service_root.get(), kTimeServiceName,
                                  time_svc_channel.release());
 }
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 5ea02e7..a144a86 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -2012,7 +2012,7 @@
   // It is too early to resolve the type here, since it can be a result type
   // referring to a not yet declared function type parameter.
   parameter.type = &AbstractType::ZoneHandle(
-      Z, ParseTypeOrFunctionType(false, ClassFinalizer::kDoNotResolve));
+      Z, ParseTypeOrFunctionType(true, ClassFinalizer::kDoNotResolve));
 
   // At this point, we must see an identifier for the parameter name, unless
   // we are using the function type syntax (in which case the name is optional,
@@ -2060,10 +2060,6 @@
       ASSERT(params->num_optional_parameters == 0);
     }
   }
-  if (parameter.type->IsVoidType()) {
-    ReportError("parameter '%s' may not be 'void'",
-                parameter.name->ToCString());
-  }
   if (params->implicitly_final) {
     parameter.is_final = true;
   }
@@ -2287,10 +2283,6 @@
       ASSERT(params->num_optional_parameters == 0);
     }
   }
-  if (parameter.type->IsVoidType()) {
-    ReportError("parameter '%s' may not be 'void'",
-                parameter.name->ToCString());
-  }
   if (params->implicitly_final) {
     parameter.is_final = true;
   }
@@ -4756,8 +4748,6 @@
             "missing 'var', 'final', 'const' or type"
             " in field declaration");
       }
-    } else if (member.type->IsVoidType()) {
-      ReportError(member.name_pos, "field may not be 'void'");
     }
     if (!member.type->IsResolved()) {
       AbstractType& type = AbstractType::ZoneHandle(Z, member.type->raw());
@@ -7584,30 +7574,42 @@
       Symbols::AsyncStackTraceVar(), false);
   ASSERT((existing_var != NULL) && existing_var->is_captured());
 
-  // Create and return a new future that executes a closure with the current
-  // body.
+  // Create a completer that executes a closure with the current body and
+  // return the corresponding future.
 
   // No need to capture parameters or other variables, since they have already
   // been captured in the corresponding scope as the body has been parsed within
   // a nested block (contained in the async function's block).
-  const Class& future = Class::ZoneHandle(Z, I->object_store()->future_class());
-  ASSERT(!future.IsNull());
-  const Function& constructor = Function::ZoneHandle(
-      Z, future.LookupFunction(Symbols::FutureMicrotask()));
-  ASSERT(!constructor.IsNull());
-  const Class& completer =
-      Class::ZoneHandle(Z, I->object_store()->completer_class());
-  ASSERT(!completer.IsNull());
-  const Function& completer_constructor = Function::ZoneHandle(
-      Z, completer.LookupFunction(Symbols::CompleterSyncConstructor()));
-  ASSERT(!completer_constructor.IsNull());
+
+  const Library& async_lib = Library::Handle(Z, Library::AsyncLibrary());
 
   LocalVariable* async_completer =
       current_block_->scope->LookupVariable(Symbols::AsyncCompleter(), false);
 
   const TokenPosition token_pos = ST(closure_body->token_pos());
-  // Add to AST:
-  //   :async_completer = new Completer.sync();
+
+  Function& completer_constructor = Function::ZoneHandle(Z);
+  if (FLAG_sync_async) {
+    const Class& completer_class = Class::Handle(
+        Z, async_lib.LookupClassAllowPrivate(Symbols::_AsyncAwaitCompleter()));
+    ASSERT(!completer_class.IsNull());
+    completer_constructor = completer_class.LookupConstructorAllowPrivate(
+        Symbols::_AsyncAwaitCompleterConstructor());
+    ASSERT(!completer_constructor.IsNull());
+
+    // Add to AST:
+    //   :async_completer = new _AsyncAwaitCompleter();
+  } else {
+    const Class& completer =
+        Class::Handle(Z, I->object_store()->completer_class());
+    ASSERT(!completer.IsNull());
+    completer_constructor =
+        completer.LookupFunction(Symbols::CompleterSyncConstructor());
+    ASSERT(!completer_constructor.IsNull());
+
+    // Add to AST:
+    //   :async_completer = new Completer.sync();
+  }
   ArgumentListNode* empty_args = new (Z) ArgumentListNode(token_pos);
   ConstructorCallNode* completer_constructor_node =
       new (Z) ConstructorCallNode(token_pos, TypeArguments::ZoneHandle(Z),
@@ -7634,8 +7636,6 @@
       new (Z) StoreLocalNode(token_pos, async_op_var, cn);
   current_block_->statements->Add(store_async_op);
 
-  const Library& async_lib = Library::Handle(Library::AsyncLibrary());
-
   if (FLAG_causal_async_stacks) {
     // Add to AST:
     //   :async_stack_trace = _asyncStackTraceHelper();
@@ -7699,13 +7699,29 @@
 
   current_block_->statements->Add(store_async_catch_error_callback);
 
-  // Add to AST:
-  //   new Future.microtask(:async_op);
-  ArgumentListNode* arguments = new (Z) ArgumentListNode(token_pos);
-  arguments->Add(new (Z) LoadLocalNode(token_pos, async_op_var));
-  ConstructorCallNode* future_node = new (Z) ConstructorCallNode(
-      token_pos, TypeArguments::ZoneHandle(Z), constructor, arguments);
-  current_block_->statements->Add(future_node);
+  if (FLAG_sync_async) {
+    // Add to AST:
+    //   :async_completer.start(:async_op);
+    ArgumentListNode* arguments = new (Z) ArgumentListNode(token_pos);
+    arguments->Add(new (Z) LoadLocalNode(token_pos, async_op_var));
+    InstanceCallNode* start_call = new (Z) InstanceCallNode(
+        token_pos, new (Z) LoadLocalNode(token_pos, async_completer),
+        Symbols::_AsyncAwaitStart(), arguments);
+    current_block_->statements->Add(start_call);
+  } else {
+    // Add to AST:
+    //   new Future.microtask(:async_op);
+    const Class& future = Class::Handle(Z, I->object_store()->future_class());
+    ASSERT(!future.IsNull());
+    const Function& constructor = Function::ZoneHandle(
+        Z, future.LookupFunction(Symbols::FutureMicrotask()));
+    ASSERT(!constructor.IsNull());
+    ArgumentListNode* arguments = new (Z) ArgumentListNode(token_pos);
+    arguments->Add(new (Z) LoadLocalNode(token_pos, async_op_var));
+    ConstructorCallNode* future_node = new (Z) ConstructorCallNode(
+        token_pos, TypeArguments::ZoneHandle(Z), constructor, arguments);
+    current_block_->statements->Add(future_node);
+  }
 
   // Add to AST:
   //   return :async_completer.future;
@@ -8003,7 +8019,7 @@
     type_is_optional = true;
   }
   if ((CurrentToken() == Token::kVOID) || IsFunctionTypeSymbol()) {
-    return ParseFunctionType(AbstractType::Handle(Z), finalization);
+    return ParseTypeOrFunctionType(true, finalization);
   }
   if (CurrentToken() != Token::kIDENT) {
     if (type_is_optional) {
@@ -8023,7 +8039,7 @@
       return Type::DynamicType();
     }
   }
-  return ParseTypeOrFunctionType(false, finalization);
+  return ParseTypeOrFunctionType(false, finalization);  // void handled above.
 }
 
 // Returns ast nodes of the variable initialization. Variables without an
@@ -8480,6 +8496,8 @@
 // Allow 'void' as type if 'allow_void' is true.
 // Note that 'void Function()' is always allowed, since it is a function type
 // and not the void type.
+// TODO(regis): Consider removing allow_void argument, since this call is only
+// used where void is allowed. Wait for Dart 2 spec to stabilize.
 bool Parser::TryParseType(bool allow_void) {
   bool found = false;
   if (CurrentToken() == Token::kVOID) {
@@ -8536,8 +8554,7 @@
   }
   if ((CurrentToken() != Token::kIDENT) && (CurrentToken() != Token::kVOID) &&
       (CurrentToken() != Token::kCONST)) {
-    // Not a legal type identifier or void (result type of function type)
-    // or const keyword or metadata.
+    // Not a legal type identifier or void or const keyword or metadata.
     return false;
   }
   const TokenPosition saved_pos = TokenPos();
@@ -8548,7 +8565,7 @@
     have_type = true;  // Type is dynamic if 'const' is not followed by a type.
   }
   if ((CurrentToken() == Token::kVOID) || IsFunctionTypeSymbol()) {
-    if (TryParseType(false)) {
+    if (TryParseType(true)) {
       have_type = true;
     }
   } else if (IsIdentifier()) {  // Type or variable name.
@@ -8558,7 +8575,7 @@
         Token::IsIdentifier(follower)) {  // Variable name following a type.
       // We see the beginning of something that could be a type.
       const TokenPosition type_pos = TokenPos();
-      if (TryParseType(false)) {
+      if (TryParseType(false)) {  // void handled above.
         have_type = true;
       } else {
         SetPosition(type_pos);
@@ -8685,10 +8702,12 @@
       CurrentToken() == Token::kCONST) {
     ConsumeToken();
   }
-  if (IsIdentifier()) {
-    if (LookaheadToken(1) == Token::kIN) {
+  // void as the loop variable type does not make much sense, but it is not
+  // disallowed by the spec.
+  if (IsIdentifier() || (CurrentToken() == Token::kVOID)) {
+    if ((CurrentToken() != Token::kVOID) && (LookaheadToken(1) == Token::kIN)) {
       return true;
-    } else if (TryParseType(false)) {
+    } else if (TryParseType(true)) {
       if (IsIdentifier()) {
         ConsumeToken();
       }
diff --git a/runtime/vm/scopes.h b/runtime/vm/scopes.h
index 7ed478e..7a1a51e 100644
--- a/runtime/vm/scopes.h
+++ b/runtime/vm/scopes.h
@@ -35,6 +35,7 @@
         is_invisible_(false),
         is_captured_parameter_(false),
         is_forced_stack_(false),
+        type_check_mode_(kDoTypeCheck),
         index_(LocalVariable::kUninitializedIndex) {
     ASSERT(type.IsZoneHandle() || type.IsReadOnlyHandle());
     ASSERT(type.IsFinalized());
@@ -65,6 +66,24 @@
   bool is_forced_stack() const { return is_forced_stack_; }
   void set_is_forced_stack() { is_forced_stack_ = true; }
 
+  enum TypeCheckMode {
+    kDoTypeCheck,
+    kSkipTypeCheck,
+    kTypeCheckedByCaller,
+  };
+
+  // Returns true if this local variable represents a parameter that needs type
+  // check when we enter the function.
+  bool needs_type_check() const { return type_check_mode_ == kDoTypeCheck; }
+
+  // Returns true if this local variable represents a parameter which type is
+  // guaranteed by the caller.
+  bool was_type_checked_by_caller() const {
+    return type_check_mode_ == kTypeCheckedByCaller;
+  }
+
+  void set_type_check_mode(TypeCheckMode mode) { type_check_mode_ = mode; }
+
   bool HasIndex() const { return index_ != kUninitializedIndex; }
   int index() const {
     ASSERT(HasIndex());
@@ -124,6 +143,7 @@
   bool is_invisible_;
   bool is_captured_parameter_;
   bool is_forced_stack_;
+  TypeCheckMode type_check_mode_;
   int index_;  // Allocation index in words relative to frame pointer (if not
                // captured), or relative to the context pointer (if captured).
 
diff --git a/runtime/vm/service_isolate.cc b/runtime/vm/service_isolate.cc
index 05dce87..2c42ec5 100644
--- a/runtime/vm/service_isolate.cc
+++ b/runtime/vm/service_isolate.cc
@@ -352,13 +352,16 @@
       got_unwind = RunMain(isolate);
     }
 
+    // FinishedInitializing should be called irrespective of whether
+    // running main caused an error or not. Otherwise, other isolates
+    // waiting for service isolate to come up will deadlock.
+    ServiceIsolate::FinishedInitializing();
+
     if (got_unwind) {
       ShutdownIsolate(reinterpret_cast<uword>(isolate));
       return;
     }
 
-    ServiceIsolate::FinishedInitializing();
-
     isolate->message_handler()->Run(Dart::thread_pool(), NULL, ShutdownIsolate,
                                     reinterpret_cast<uword>(isolate));
   }
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 0d2dfcd..276657a 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -145,6 +145,9 @@
   V(CompleterComplete, "complete")                                             \
   V(CompleterCompleteError, "completeError")                                   \
   V(CompleterSyncConstructor, "Completer.sync")                                \
+  V(_AsyncAwaitCompleter, "_AsyncAwaitCompleter")                              \
+  V(_AsyncAwaitCompleterConstructor, "_AsyncAwaitCompleter.")                  \
+  V(_AsyncAwaitStart, "start")                                                 \
   V(CompleterFuture, "future")                                                 \
   V(StreamIterator, "StreamIterator")                                          \
   V(StreamIteratorConstructor, "StreamIterator.")                              \
diff --git a/runtime/vm/thread_interrupter_fuchsia.cc b/runtime/vm/thread_interrupter_fuchsia.cc
index 66f7fbce..26409ca 100644
--- a/runtime/vm/thread_interrupter_fuchsia.cc
+++ b/runtime/vm/thread_interrupter_fuchsia.cc
@@ -76,10 +76,9 @@
  public:
 #if defined(TARGET_ARCH_X64)
   static bool GrabRegisters(zx_handle_t thread, InterruptedThreadState* state) {
-    zx_x86_64_general_regs_t regs;
-    uint32_t regset_size;
+    zx_thread_state_general_regs regs;
     zx_status_t status = zx_thread_read_state(
-        thread, ZX_THREAD_STATE_REGSET0, &regs, sizeof(regs), &regset_size);
+        thread, ZX_THREAD_STATE_GENERAL_REGS, &regs, sizeof(regs));
     if (status != ZX_OK) {
       if (FLAG_trace_thread_interrupter) {
         OS::PrintErr("ThreadInterrupter failed to get registers: %s\n",
@@ -95,10 +94,9 @@
   }
 #elif defined(TARGET_ARCH_ARM64)
   static bool GrabRegisters(zx_handle_t thread, InterruptedThreadState* state) {
-    zx_arm64_general_regs_t regs;
-    uint32_t regset_size;
+    zx_thread_state_general_regs regs;
     zx_status_t status = zx_thread_read_state(
-        thread, ZX_THREAD_STATE_REGSET0, &regs, sizeof(regs), &regset_size);
+        thread, ZX_THREAD_STATE_GENERAL_REGS, &regs, sizeof(regs));
     if (status != ZX_OK) {
       if (FLAG_trace_thread_interrupter) {
         OS::PrintErr("ThreadInterrupter failed to get registers: %s\n",
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index caba5b0..81fe031 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -195,7 +195,7 @@
                                          bool incrementally) {
   Zone* zone = Thread::Current()->zone();
   Dart_KernelCompilationResult compilation_result = Dart_CompileSourcesToKernel(
-      url, NULL /* platform binary can be found at the default location */,
+      url, NULL /* platform binary can be found at the default location */, 0,
       sourcefiles_count, sourcefiles, incrementally);
 
   if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index 56bdc05..53910eb 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -86,11 +86,30 @@
 #define ASSEMBLER_TEST_RUN(name, test)                                         \
   static void AssemblerTestRun##name(AssemblerTest* test);                     \
   ISOLATE_UNIT_TEST_CASE(name) {                                               \
-    Assembler __assembler__;                                                   \
-    AssemblerTest test("" #name, &__assembler__);                              \
-    AssemblerTestGenerate##name(test.assembler());                             \
-    test.Assemble();                                                           \
-    AssemblerTestRun##name(&test);                                             \
+    {                                                                          \
+      bool use_far_branches = false;                                           \
+      LongJumpScope jump;                                                      \
+      if (setjmp(*jump.Set()) == 0) {                                          \
+        Assembler assembler(use_far_branches);                                 \
+        AssemblerTest test("" #name, &assembler);                              \
+        AssemblerTestGenerate##name(test.assembler());                         \
+        test.Assemble();                                                       \
+        AssemblerTestRun##name(&test);                                         \
+        return;                                                                \
+      }                                                                        \
+    }                                                                          \
+                                                                               \
+    const Error& error = Error::Handle(Thread::Current()->sticky_error());     \
+    if (error.raw() == Object::branch_offset_error().raw()) {                  \
+      bool use_far_branches = true;                                            \
+      Assembler assembler(use_far_branches);                                   \
+      AssemblerTest test("" #name, &assembler);                                \
+      AssemblerTestGenerate##name(test.assembler());                           \
+      test.Assemble();                                                         \
+      AssemblerTestRun##name(&test);                                           \
+    } else {                                                                   \
+      FATAL1("Unexpected error: %s\n", error.ToErrorCString());                \
+    }                                                                          \
   }                                                                            \
   static void AssemblerTestRun##name(AssemblerTest* test)
 
diff --git a/sdk/lib/_internal/js_runtime/lib/async_patch.dart b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
index be475bd7..bec28e9 100644
--- a/sdk/lib/_internal/js_runtime/lib/async_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
@@ -132,6 +132,53 @@
   }
 }
 
+class _AsyncAwaitCompleter<T> implements Completer<T> {
+  final _completer = new Completer<T>.sync();
+  bool isSync;
+
+  _AsyncAwaitCompleter() : isSync = false;
+
+  void complete([FutureOr<T> value]) {
+    if (isSync) {
+      _completer.complete(value);
+    } else if (value is Future<T>) {
+      value.then(_completer.complete, onError: _completer.completeError);
+    } else {
+      scheduleMicrotask(() {
+        _completer.complete(value);
+      });
+    }
+  }
+
+  void completeError(e, [st]) {
+    if (isSync) {
+      _completer.completeError(e, st);
+    } else {
+      scheduleMicrotask(() {
+        _completer.completeError(e, st);
+      });
+    }
+  }
+
+  Future<T> get future => _completer.future;
+  bool get isCompleted => _completer.isCompleted;
+}
+
+/// Initiates the computation of an `async` function and starts the body
+/// synchronously.
+///
+/// Used as part of the runtime support for the async/await transformation.
+///
+/// This function sets up the first call into the transformed [bodyFunction].
+/// Independently, it takes the [completer] and returns the future of the
+/// completer for convenience of the transformed code.
+dynamic _asyncStartSync(
+    _WrappedAsyncBody bodyFunction, _AsyncAwaitCompleter completer) {
+  bodyFunction(async_error_codes.SUCCESS, null);
+  completer.isSync = true;
+  return completer.future;
+}
+
 /// Initiates the computation of an `async` function.
 ///
 /// Used as part of the runtime support for the async/await transformation.
diff --git a/sdk/lib/_internal/js_runtime/lib/core_patch.dart b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
index 1c8beff..2815296 100644
--- a/sdk/lib/_internal/js_runtime/lib/core_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
@@ -19,6 +19,7 @@
         objectHashCode,
         patch,
         Primitives,
+        quoteStringForRegExp,
         stringJoinUnchecked,
         getTraceFromException,
         RuntimeError;
@@ -29,6 +30,8 @@
 
 import "dart:convert" show Encoding, utf8;
 
+import 'dart:typed_data' show Endian, Uint8List, Uint16List;
+
 String _symbolToString(Symbol symbol) => _symbol_dev.Symbol.getName(symbol);
 
 Map<String, dynamic> _symbolMapToStringMap(Map<Symbol, dynamic> map) {
@@ -180,6 +183,23 @@
 }
 
 @patch
+class BigInt implements Comparable<BigInt> {
+  @patch
+  static BigInt get zero => _BigIntImpl.zero;
+  @patch
+  static BigInt get one => _BigIntImpl.one;
+  @patch
+  static BigInt get two => _BigIntImpl.two;
+
+  @patch
+  static BigInt parse(String source, {int radix}) =>
+      _BigIntImpl.parse(source, radix: radix);
+
+  @patch
+  factory BigInt.from(num value) = _BigIntImpl.from;
+}
+
+@patch
 class Error {
   @patch
   static String _objectToString(Object object) {
@@ -469,6 +489,9 @@
           {bool multiLine: false, bool caseSensitive: true}) =>
       new JSSyntaxRegExp(source,
           multiLine: multiLine, caseSensitive: caseSensitive);
+
+  @patch
+  static String escape(String text) => quoteStringForRegExp(text);
 }
 
 // Patch for 'identical' function.
@@ -780,3 +803,2101 @@
   @patch
   _throw(error) => throw error;
 }
+
+// TODO(sra): The rest of this core_patch.dart source should reside in an
+// included part file instead of being inlined. However, part files are not
+// properly supported here.
+
+// 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;
+
+int _max(int a, int b) => a > b ? a : b;
+int _min(int a, int b) => a < b ? a : b;
+
+// 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 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/convert/codec.dart b/sdk/lib/convert/codec.dart
index 033e082..95aadd1 100644
--- a/sdk/lib/convert/codec.dart
+++ b/sdk/lib/convert/codec.dart
@@ -40,7 +40,7 @@
   /**
    * Returns the decoder of `this`, converting from [T] to [S].
    *
-   * It may be stateful an should not be reused.
+   * It may be stateful and should not be reused.
    */
   Converter<T, S> get decoder;
 
diff --git a/sdk/lib/core/bigint.dart b/sdk/lib/core/bigint.dart
index 92fe61b..5f92625 100644
--- a/sdk/lib/core/bigint.dart
+++ b/sdk/lib/core/bigint.dart
@@ -4,49 +4,13 @@
 
 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;
+  external static BigInt get zero;
+  external static BigInt get one;
+  external static BigInt get two;
 
   /**
    * Parses [source] as a, possibly signed, integer literal and returns its
@@ -71,11 +35,10 @@
    * 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);
+  external static BigInt parse(String source, {int radix});
 
   /// Allocates a big integer from the provided [value] number.
-  factory BigInt.from(num value) = _BigIntImpl.from;
+  external factory BigInt.from(num value);
 
   /**
    * Returns the absolute value of this integer.
@@ -436,2055 +399,3 @@
    */
   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/regexp.dart b/sdk/lib/core/regexp.dart
index 7388256..95e12b5 100644
--- a/sdk/lib/core/regexp.dart
+++ b/sdk/lib/core/regexp.dart
@@ -24,11 +24,12 @@
  *
  * The following example finds all matches of a regular expression in
  * a string.
+ * ```dart
+ * RegExp exp = new RegExp(r"(\w+)");
+ * String str = "Parse my string";
+ * Iterable<Match> matches = exp.allMatches(str);
+ * ```
  *
- *     RegExp exp = new RegExp(r"(\w+)");
- *     String str = "Parse my string";
- *     Iterable<Match> matches = exp.allMatches(str);
- * 
  * Note the use of a _raw string_ (a string prefixed with `r`)
  * in the example above. Use a raw string to treat each character in a string
  * as a literal character.
@@ -44,6 +45,19 @@
       {bool multiLine: false, bool caseSensitive: true});
 
   /**
+   * Returns a regular expression that matches [text].
+   *
+   * If [text] contains characters that are meaningful in regular expressions,
+   * the resulting regular expression will match those characters literally.
+   * If [text] contains no characters that have special meaning in a regular
+   * expression, it is returned unmodified.
+   *
+   * The characters that have special meaning in regular expressions are:
+   * `(`, `)`, `[`, `]`, `{`, `}`, `*`, `+`, `?`, `.`, `^`, `$`, `|` and `\`.
+   */
+  external static String escape(String text);
+
+  /**
    * Searches for the first match of the regular expression
    * in the string [input]. Returns `null` if there is no match.
    */
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index a5c6212..9a4ae55 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -9651,9 +9651,9 @@
   @DomName('DirectoryEntry.getDirectory')
   @DocsEditable()
   void __getDirectory(String path,
-      {Map options,
+      [Map options,
       _EntryCallback successCallback,
-      _ErrorCallback errorCallback}) {
+      _ErrorCallback errorCallback]) {
     if (errorCallback != null) {
       var options_1 = convertDartToNative_Dictionary(options);
       __getDirectory_1(path, options_1, successCallback, errorCallback);
@@ -9696,9 +9696,9 @@
   @DocsEditable()
   Future<Entry> _getDirectory(String path, {Map options}) {
     var completer = new Completer<Entry>();
-    __getDirectory(path, options: options, successCallback: (value) {
+    __getDirectory(path, options, (value) {
       completer.complete(value);
-    }, errorCallback: (error) {
+    }, (error) {
       completer.completeError(error);
     });
     return completer.future;
@@ -9707,9 +9707,9 @@
   @DomName('DirectoryEntry.getFile')
   @DocsEditable()
   void __getFile(String path,
-      {Map options,
+      [Map options,
       _EntryCallback successCallback,
-      _ErrorCallback errorCallback}) {
+      _ErrorCallback errorCallback]) {
     if (errorCallback != null) {
       var options_1 = convertDartToNative_Dictionary(options);
       __getFile_1(path, options_1, successCallback, errorCallback);
@@ -9752,10 +9752,10 @@
   @DocsEditable()
   Future<Entry> _getFile(String path, {Map options}) {
     var completer = new Completer<Entry>();
-    __getFile(path, options: options, successCallback: (value) {
+    __getFile(path, options, (value) {
       applyExtension('FileEntry', value);
       completer.complete(value);
-    }, errorCallback: (error) {
+    }, (error) {
       completer.completeError(error);
     });
     return completer.future;
@@ -16310,18 +16310,18 @@
   @DomName('Entry.copyTo')
   @DocsEditable()
   void _copyTo(DirectoryEntry parent,
-      {String name,
+      [String name,
       _EntryCallback successCallback,
-      _ErrorCallback errorCallback}) native;
+      _ErrorCallback errorCallback]) native;
 
   @JSName('copyTo')
   @DomName('Entry.copyTo')
   @DocsEditable()
   Future<Entry> copyTo(DirectoryEntry parent, {String name}) {
     var completer = new Completer<Entry>();
-    _copyTo(parent, name: name, successCallback: (value) {
+    _copyTo(parent, name, (value) {
       completer.complete(value);
-    }, errorCallback: (error) {
+    }, (error) {
       completer.completeError(error);
     });
     return completer.future;
@@ -16339,6 +16339,7 @@
   Future<Metadata> getMetadata() {
     var completer = new Completer<Metadata>();
     _getMetadata((value) {
+      applyExtension('Metadata', value);
       completer.complete(value);
     }, (error) {
       completer.completeError(error);
@@ -16369,18 +16370,18 @@
   @DomName('Entry.moveTo')
   @DocsEditable()
   void _moveTo(DirectoryEntry parent,
-      {String name,
+      [String name,
       _EntryCallback successCallback,
-      _ErrorCallback errorCallback}) native;
+      _ErrorCallback errorCallback]) native;
 
   @JSName('moveTo')
   @DomName('Entry.moveTo')
   @DocsEditable()
   Future<Entry> moveTo(DirectoryEntry parent, {String name}) {
     var completer = new Completer<Entry>();
-    _moveTo(parent, name: name, successCallback: (value) {
+    _moveTo(parent, name, (value) {
       completer.complete(value);
-    }, errorCallback: (error) {
+    }, (error) {
       completer.completeError(error);
     });
     return completer.future;
@@ -17219,6 +17220,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.
 
+// WARNING: Do not edit - generated code.
+
+@DomName('FileCallback')
+// http://www.w3.org/TR/file-system-api/#the-filecallback-interface
+@Experimental()
+typedef void _FileCallback(File file);
+// 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.
+
 @DocsEditable()
 @DomName('FileEntry')
 // http://www.w3.org/TR/file-system-api/#the-fileentry-interface
@@ -17253,16 +17264,16 @@
   @JSName('file')
   @DomName('FileEntry.file')
   @DocsEditable()
-  void _file(BlobCallback successCallback, [_ErrorCallback errorCallback])
+  void _file(_FileCallback successCallback, [_ErrorCallback errorCallback])
       native;
 
   @JSName('file')
   @DomName('FileEntry.file')
   @DocsEditable()
-  Future<Blob> file() {
-    var completer = new Completer<Blob>();
+  Future<File> file() {
+    var completer = new Completer<File>();
     _file((value) {
-      applyExtension('Blob', value);
+      applyExtension('File', value);
       completer.complete(value);
     }, (error) {
       completer.completeError(error);
diff --git a/sdk/lib/libraries.json b/sdk/lib/libraries.json
index be981c7..e1a1a6e 100644
--- a/sdk/lib/libraries.json
+++ b/sdk/lib/libraries.json
@@ -18,6 +18,7 @@
           "../../runtime/lib/array.dart",
           "../../runtime/lib/array_patch.dart",
           "../../runtime/lib/bigint.dart",
+          "../../runtime/lib/bigint_patch.dart",
           "../../runtime/lib/bool_patch.dart",
           "../../runtime/lib/date_patch.dart",
           "../../runtime/lib/double.dart",
diff --git a/sdk/lib/libraries.yaml b/sdk/lib/libraries.yaml
index deff85f..c959674 100644
--- a/sdk/lib/libraries.yaml
+++ b/sdk/lib/libraries.yaml
@@ -50,6 +50,7 @@
         - "../../runtime/lib/array.dart"
         - "../../runtime/lib/array_patch.dart"
         - "../../runtime/lib/bigint.dart"
+        - "../../runtime/lib/bigint_patch.dart"
         - "../../runtime/lib/bool_patch.dart"
         - "../../runtime/lib/date_patch.dart"
         - "../../runtime/lib/double.dart"
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer.status
similarity index 88%
rename from tests/co19/co19-analyzer2.status
rename to tests/co19/co19-analyzer.status
index 85a56bd..a4810dd 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer.status
@@ -3,12 +3,25 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dart2analyzer ]
+Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t01: MissingStaticWarning # test is out of date
+Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t02: MissingStaticWarning # test is out of date
+Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t04: MissingStaticWarning # test is out of date
+Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t05: MissingStaticWarning # test is out of date
+Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t06: MissingStaticWarning # test is out of date
 Language/Classes/Classes/method_definition_t06: MissingStaticWarning # Please triage this failure.
 Language/Classes/Getters/static_getter_t02: CompileTimeError # Issue 24534
 Language/Classes/Getters/static_t01: StaticWarning # Please triage this failure.
 Language/Classes/Getters/void_return_type_t01: MissingStaticWarning # Issue co19/30264
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t01: MissingStaticWarning # test is out of date
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t02: MissingStaticWarning # test is out of date
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t04: MissingStaticWarning # test is out of date
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t05: MissingStaticWarning # test is out of date
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t06: MissingStaticWarning # test is out of date
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t07: MissingStaticWarning # test is out of date
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t09: MissingStaticWarning # test is out of date
 Language/Classes/Instance_Variables/definition_t03: StaticWarning # Please triage this failure.
 Language/Classes/Static_Methods/same_name_method_and_setter_t01: MissingStaticWarning # Issue 23749
+Language/Classes/Superclasses/Inheritance_and_Overriding/inheritance_t02: MissingStaticWarning # test is out of date
 Language/Classes/Superclasses/Inheritance_and_Overriding/inheritance_t05: MissingStaticWarning # TBF: Static members should not be accessible via subclasses.
 Language/Classes/definition_t23: CompileTimeError # This seems correct, need to adjust test.
 Language/Classes/method_definition_t06: MissingStaticWarning # Please triage this failure.
@@ -16,7 +29,10 @@
 Language/Enums/syntax_t09: MissingCompileTimeError # Please triage this failure.
 Language/Expressions/Assignment/super_assignment_static_warning_t03: StaticWarning # Issue 15467
 Language/Expressions/Constants/exception_t01: Fail, OK # co19 issue #438, Static variables are initialized lazily, need not be constants
-Language/Expressions/Constants/exception_t02: Fail, OK # co19 issue #438, Static variables are initialized lazily, need not be constants
+Language/Expressions/Constants/literal_number_t01: CompileTimeError # int64
+Language/Expressions/Constants/logical_expression_t03: MissingCompileTimeError
+Language/Expressions/Constants/math_operators_t01: CompileTimeError # int64
+Language/Expressions/Constants/math_operators_t06: CompileTimeError # int64
 Language/Expressions/Function_Invocation/Unqualified_Invocation/instance_context_invocation_t03: MissingCompileTimeError # Please triage this failure.
 Language/Expressions/Function_Invocation/Unqualified_Invocation/instance_context_invocation_t04: MissingCompileTimeError # Please triage this failure.
 Language/Expressions/Function_Invocation/Unqualified_Invocation/invocation_t17: MissingCompileTimeError # Please triage this failure
@@ -46,6 +62,10 @@
 Language/Expressions/Method_Invocation/Super_Invocation/accessible_instance_member_t03: StaticWarning # Please triage this failure.
 Language/Expressions/Method_Invocation/Super_Invocation/accessible_instance_member_t04: StaticWarning # Please triage this failure.
 Language/Expressions/Method_Invocation/Super_Invocation/accessible_instance_member_t05: StaticWarning # Please triage this failure.
+Language/Expressions/Numbers/static_type_of_int_t01: CompileTimeError # int64
+Language/Expressions/Numbers/syntax_t06: CompileTimeError # int64
+Language/Expressions/Numbers/syntax_t09: CompileTimeError # int64
+Language/Expressions/Numbers/syntax_t10: CompileTimeError # int64
 Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t01: MissingCompileTimeError # Issue 24332
 Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t02: MissingCompileTimeError # Issue 24332
 Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t03: MissingCompileTimeError # Issue 24332
@@ -86,8 +106,10 @@
 Language/Mixins/Mixin_Application/warning_t03: StaticWarning # This seems correct, need to adjust test.
 Language/Mixins/declaring_constructor_t05: MissingCompileTimeError # Issue 24767
 Language/Mixins/declaring_constructor_t06: MissingCompileTimeError # Issue 24767
+Language/Statements/Assert/execution_t08: StaticWarning
 Language/Statements/Assert/syntax_t04: MissingCompileTimeError # Assert messages are enabled by default
-Language/Statements/Assert/type_t04: MissingStaticWarning # Please triage this failure
+Language/Statements/Assert/type_t02: StaticWarning
+Language/Statements/Assert/type_t08: StaticWarning
 Language/Statements/Switch/last_statement_t03: MissingStaticWarning # Please triage this failure
 Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t01: MissingCompileTimeError # Issue 25495
 Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t03: MissingCompileTimeError # Issue 25495
@@ -175,8 +197,7 @@
 LayoutTests/fast/html/article-element_t01: StaticWarning # Please triage this failure.
 LayoutTests/fast/html/aside-element_t01: StaticWarning # Please triage this failure.
 LayoutTests/fast/html/imports/import-element-removed-flag_t01: StaticWarning # Please triage this failure.
-LayoutTests/fast/html/imports/import-events_t01: StaticWarning # Please triage this failure.
-LayoutTests/fast/html/imports/import-events_t01: CompileTimeError # Please triage this failure.
+LayoutTests/fast/html/imports/import-events_t01: CompileTimeError, StaticWarning # Please triage this failure.
 LayoutTests/fast/html/select-dropdown-consistent-background-color_t01: StaticWarning # Please triage this failure.
 LayoutTests/fast/html/text-field-input-types_t01: StaticWarning # Please triage this failure.
 LayoutTests/fast/inline/boundingBox-with-continuation_t01: StaticWarning # Please triage this failure.
@@ -219,7 +240,52 @@
 LibTest/collection/SplayTreeMap/inherited_tests_A01_t01: StaticWarning # Please triage this failure.
 LibTest/collection/SplayTreeSet/SplayTreeSet_class_A01_t01: StaticWarning # Please triage this failure.
 LibTest/convert/JsonEncoder/JsonEncoder_A01_t01: StaticWarning # Please triage this failure
+LibTest/core/Duration/Duration_A02_t01: CompileTimeError # int64
 LibTest/core/Set/IterableBase_A01_t01: StaticWarning # Imports libraries with static warnings
+LibTest/core/double/isInfinite_A01_t03: CompileTimeError # int64
+LibTest/core/double/toStringAsExponential_A02_t01: CompileTimeError # int64
+LibTest/core/int/abs_A01_t01: CompileTimeError # int64
+LibTest/core/int/ceilToDouble_A01_t01: CompileTimeError # int64
+LibTest/core/int/ceil_A01_t01: CompileTimeError # int64
+LibTest/core/int/compareTo_A01_t01: CompileTimeError # int64
+LibTest/core/int/floorToDouble_A01_t01: CompileTimeError # int64
+LibTest/core/int/floor_A01_t01: CompileTimeError # int64
+LibTest/core/int/isEven_A01_t01: CompileTimeError # int64
+LibTest/core/int/isInfinite_A01_t01: CompileTimeError # int64
+LibTest/core/int/isNaN_A01_t01: CompileTimeError # int64
+LibTest/core/int/isNegative_A01_t01: CompileTimeError # int64
+LibTest/core/int/isOdd_A01_t01: CompileTimeError # int64
+LibTest/core/int/operator_AND_A01_t01: CompileTimeError # int64
+LibTest/core/int/operator_GE_A01_t01: CompileTimeError # int64
+LibTest/core/int/operator_GT_A01_t01: CompileTimeError # int64
+LibTest/core/int/operator_LE_A01_t01: CompileTimeError # int64
+LibTest/core/int/operator_LT_A01_t01: CompileTimeError # int64
+LibTest/core/int/operator_NOT_A01_t01: CompileTimeError # int64
+LibTest/core/int/operator_OR_A01_t01: CompileTimeError # int64
+LibTest/core/int/operator_XOR_A01_t01: CompileTimeError # int64
+LibTest/core/int/operator_addition_A01_t01: CompileTimeError # int64
+LibTest/core/int/operator_division_A01_t01: CompileTimeError # int64
+LibTest/core/int/operator_left_shift_A01_t01: CompileTimeError # int64
+LibTest/core/int/operator_multiplication_A01_t01: CompileTimeError # int64
+LibTest/core/int/operator_remainder_A01_t01: CompileTimeError # int64
+LibTest/core/int/operator_remainder_A01_t02: CompileTimeError # int64
+LibTest/core/int/operator_right_shift_A01_t01: CompileTimeError # int64
+LibTest/core/int/operator_subtraction_A01_t01: CompileTimeError # int64
+LibTest/core/int/operator_truncating_division_A01_t01: CompileTimeError # int64
+LibTest/core/int/operator_truncating_division_A01_t02: CompileTimeError # int64
+LibTest/core/int/operator_unary_minus_A01_t01: CompileTimeError # int64
+LibTest/core/int/parse_A01_t01: CompileTimeError # int64
+LibTest/core/int/remainder_A01_t01: CompileTimeError # int64
+LibTest/core/int/remainder_A01_t02: CompileTimeError # int64
+LibTest/core/int/roundToDouble_A01_t01: CompileTimeError # int64
+LibTest/core/int/round_A01_t01: CompileTimeError # int64
+LibTest/core/int/toDouble_A01_t01: CompileTimeError # int64
+LibTest/core/int/toInt_A01_t01: CompileTimeError # int64
+LibTest/core/int/toStringAsExponential_A02_t01: CompileTimeError # int64
+LibTest/core/int/toStringAsFixed_A02_t01: CompileTimeError # int64
+LibTest/core/int/toStringAsPrecision_A01_t02: CompileTimeError # int64
+LibTest/core/int/truncateToDouble_A01_t01: CompileTimeError # int64
+LibTest/core/int/truncate_A01_t01: CompileTimeError # int64
 LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: StaticWarning # Please triage this failure.
 LibTest/html/Document/adoptNode_A01_t01: StaticWarning # Please triage this failure.
 LibTest/html/Document/childNodes_A01_t01: StaticWarning # Please triage this failure.
@@ -280,12 +346,19 @@
 LibTest/math/Point/operator_addition_A02_t01: StaticWarning # Please triage this failure.
 LibTest/math/Point/operator_mult_A03_t01: StaticWarning # Please triage this failure.
 LibTest/math/Point/operator_subtraction_A02_t01: StaticWarning # Please triage this failure.
+LibTest/math/pow_A10_t01: CompileTimeError # int64
+LibTest/typed_data/ByteData/getUint64_A01_t01: CompileTimeError # int64
+LibTest/typed_data/ByteData/setUint64_A01_t01: CompileTimeError # int64
 LibTest/typed_data/Float32x4/equal_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/greaterThanOrEqual_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/greaterThan_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/lessThan_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/notEqual_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Uint64List/Uint64List.fromList_A01_t01: CompileTimeError # int64
+LibTest/typed_data/Uint64List/Uint64List.fromList_A01_t02: CompileTimeError # int64
+LibTest/typed_data/Uint64List/Uint64List.view_A01_t01: CompileTimeError # int64
+LibTest/typed_data/Uint64List/Uint64List.view_A01_t02: CompileTimeError # int64
 WebPlatformTest/DOMEvents/approved/Event.bubbles.false_t01: StaticWarning # Please triage this failure.
 WebPlatformTest/DOMEvents/approved/Propagation.path.target.removed_t01: StaticWarning # Please triage this failure.
 WebPlatformTest/custom-elements/*: Pass, StaticWarning # Issue 18095.
@@ -430,4 +503,3 @@
 
 [ $builder_tag == strong && $compiler == dart2analyzer ]
 *: Skip # Issue 28649
-
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index f6c1323..ce7e564 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -484,7 +484,9 @@
 LayoutTests/fast/css/aspect-ratio-inheritance_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/aspect-ratio-parsing-tests_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/auto-min-size_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/background-clip-text_t01: RuntimeError
 LayoutTests/fast/css/background-serialize_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/border-radius-property-value_t01: RuntimeError
 LayoutTests/fast/css/checked-pseudo-selector_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/child-selector-implicit-tbody_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/content/content-none_t01: RuntimeError # Please triage this failure
@@ -514,6 +516,7 @@
 LayoutTests/fast/css/getComputedStyle/computed-style-font_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getComputedStyle/font-family-fallback-reset_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getPropertyValue-border_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/getPropertyValue-clip_t01: RuntimeError
 LayoutTests/fast/css/html-attr-case-sensitivity_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/id-or-class-before-stylesheet_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/implicit-attach-marking_t01: Skip # Times out. Please triage this failure
@@ -524,6 +527,7 @@
 LayoutTests/fast/css/invalidation/targeted-class-shadow-combinator_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/max-device-aspect-ratio_t01: RuntimeError, Pass # Issue 28998
 LayoutTests/fast/css/media-query-recovery_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/modify-ua-rules-from-javascript_t01: RuntimeError
 LayoutTests/fast/css/parsing-at-rule-recovery_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-css-allowed-string-characters_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/parsing-page-rule_t01: RuntimeError # Please triage this failure
@@ -547,6 +551,7 @@
 LayoutTests/fast/css/transform-origin-parsing_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/url-with-multi-byte-unicode-escape_t01: RuntimeError # co19 issue 14
 LayoutTests/fast/css/webkit-keyframes-errors_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/css/word-break-user-modify-allowed-values_t01: RuntimeError
 LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-color_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent-inherited_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent_t01: RuntimeError # Please triage this failure
@@ -635,9 +640,15 @@
 LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/StyleSheet/removed-media-rule-deleted-parent-crash_t01: RuntimeError
+LayoutTests/fast/dom/StyleSheet/removed-stylesheet-rule-deleted-parent-crash_t01: RuntimeError
 LayoutTests/fast/dom/TreeWalker/TreeWalker-basic_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Window/getMatchedCSSRules-nested-rules_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/getMatchedCSSRules-null-crash_t01: RuntimeError
+LayoutTests/fast/dom/Window/getMatchedCSSRules-parent-stylesheets_t01: RuntimeError
+LayoutTests/fast/dom/Window/getMatchedCSSRules-with-invalid-pseudo-elements_t01: RuntimeError
 LayoutTests/fast/dom/Window/getMatchedCSSRules-with-pseudo-elements-complex_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/Window/getMatchedCSSRules-with-pseudo-elements_t01: RuntimeError
 LayoutTests/fast/dom/Window/window-resize-contents_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Window/window-resize_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Window/window-scroll-arguments_t01: RuntimeError # Please triage this failure
@@ -662,8 +673,8 @@
 LayoutTests/fast/dom/horizontal-scrollbar-in-rtl-doesnt-fire-onscroll_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/icon-size-property_t01: RuntimeError # https://github.com/dart-lang/sdk/issues/26422
 LayoutTests/fast/dom/icon-size-property_t01: Skip # Roll 50 failure
+LayoutTests/fast/dom/icon-size-property_t01: RuntimeError # https://github.com/dart-lang/sdk/issues/26422
 LayoutTests/fast/dom/location-hash_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: Skip # API not supported.
 LayoutTests/fast/dom/navigatorcontentutils/register-protocol-handler_t01: Skip # API not supported.
@@ -672,25 +683,34 @@
 LayoutTests/fast/dom/option-properties_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/distribution-crash_t01: RuntimeError
 LayoutTests/fast/dom/shadow/distribution-update-recalcs-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/event-path_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/insertion-point-list-menu-crash_t01: RuntimeError
+LayoutTests/fast/dom/shadow/insertion-point-shadow-crash_t01: RuntimeError
+LayoutTests/fast/dom/shadow/insertion-point-video-crash_t01: RuntimeError
 LayoutTests/fast/dom/shadow/link-in-shadow-tree_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/nested-reprojection-inconsistent_t01: RuntimeError
 LayoutTests/fast/dom/shadow/olderShadowRoot_t01: RuntimeError # Issue 26729
 LayoutTests/fast/dom/shadow/pseudoclass-update-checked-option_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-optgroup_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-option_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-optgroup_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-option_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-aware-shadow-root_t01: RuntimeError
 LayoutTests/fast/dom/shadow/shadow-content-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/shadow-disable_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/shadow-element-inactive_t01: RuntimeError # Issue 25155
 LayoutTests/fast/dom/shadow/shadow-removechild-and-blur-event_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/shadow-root-js-api_t01: RuntimeError
 LayoutTests/fast/dom/shadow/shadowdom-for-input-spellcheck_t01: RuntimeError # Issue 26729
 LayoutTests/fast/dom/shadow/shadowdom-for-input-type-change_t01: RuntimeError # Issue 26729
 LayoutTests/fast/dom/shadow/shadowhost-keyframes_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/shadowroot-clonenode_t01: RuntimeError # Issue 26729
 LayoutTests/fast/dom/shadow/shadowroot-host_t01: RuntimeError # Issue 26729
 LayoutTests/fast/dom/shadow/shadowroot-keyframes_t01: Pass, RuntimeError # Please triage this failure
+LayoutTests/fast/dom/shadow/stale-distribution-after-shadow-removal_t01: RuntimeError
+LayoutTests/fast/dom/shadow/style-sharing-styles-in-older-shadow-roots_t01: RuntimeError
 LayoutTests/fast/dom/vertical-scrollbar-in-rtl-doesnt-fire-onscroll_t01: Pass, RuntimeError
 LayoutTests/fast/dynamic/checkbox-selection-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dynamic/crash-generated-counter_t01: RuntimeError # Please triage this failure
@@ -1196,15 +1216,19 @@
 WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t02: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-005_t01: RuntimeError
 WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/elements-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-003_t01: RuntimeError
 WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-002_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-005_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t02: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-006_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-001_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-002_t01: RuntimeError
 WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t02: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-004_t01: RuntimeError
 WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-005_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/events/event-dispatch/test-001_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/events/event-dispatch/test-002_t01: RuntimeError # Please triage this failure.
@@ -1234,10 +1258,16 @@
 WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-002_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-003_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-004_t01: RuntimeError # Issue 26729
+WebPlatformTest/shadow-dom/shadow-trees/composition/test-001_t01: RuntimeError
 WebPlatformTest/shadow-dom/shadow-trees/custom-pseudo-elements/test-001_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-001_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-001_t01: RuntimeError
+WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-002_t01: RuntimeError
+WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-003_t01: RuntimeError
 WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-004_t01: RuntimeError # Please triage this failure
+WebPlatformTest/shadow-dom/shadow-trees/rendering-shadow-trees/test-001_t01: RuntimeError
+WebPlatformTest/shadow-dom/shadow-trees/reprojection/test-001_t01: RuntimeError
 WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError # Please triage this failure
 WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-001_t01: RuntimeError # Please triage this failure.
 WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-002_t01: RuntimeError # Please triage this failure.
@@ -1256,26 +1286,6 @@
 LayoutTests/fast/canvas/webgl/index-validation-verifies-too-many-indices_t01: RuntimeError, Pass # Please triage this flake
 LayoutTests/fast/canvas/webgl/premultiplyalpha-test_t01: RuntimeError, Pass # Please triage this flake
 LayoutTests/fast/canvas/webgl/triangle_t01: RuntimeError, Pass # Please triage this flake
-LayoutTests/fast/css/background-clip-text_t01: RuntimeError
-LayoutTests/fast/css/border-radius-property-value_t01: RuntimeError
-LayoutTests/fast/css/getPropertyValue-clip_t01: RuntimeError
-LayoutTests/fast/css/modify-ua-rules-from-javascript_t01: RuntimeError
-LayoutTests/fast/css/word-break-user-modify-allowed-values_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/removed-media-rule-deleted-parent-crash_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/removed-stylesheet-rule-deleted-parent-crash_t01: RuntimeError
-LayoutTests/fast/dom/Window/getMatchedCSSRules-null-crash_t01: RuntimeError
-LayoutTests/fast/dom/Window/getMatchedCSSRules-parent-stylesheets_t01: RuntimeError
-LayoutTests/fast/dom/Window/getMatchedCSSRules-with-invalid-pseudo-elements_t01: RuntimeError
-LayoutTests/fast/dom/Window/getMatchedCSSRules-with-pseudo-elements_t01: RuntimeError
-LayoutTests/fast/dom/shadow/distribution-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/insertion-point-list-menu-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/insertion-point-shadow-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/insertion-point-video-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/nested-reprojection-inconsistent_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-aware-shadow-root_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-root-js-api_t01: RuntimeError
-LayoutTests/fast/dom/shadow/stale-distribution-after-shadow-removal_t01: RuntimeError
-LayoutTests/fast/dom/shadow/style-sharing-styles-in-older-shadow-roots_t01: RuntimeError
 LayoutTests/fast/multicol/newmulticol/balance_t04: RuntimeError # Please triage this failure
 LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-left_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t02: RuntimeError # Please triage this failure
@@ -1284,16 +1294,6 @@
 LayoutTests/fast/text/regional-indicator-symobls_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/text/text-combine-shrink-to-fit_t01: RuntimeError # Please triage this failure
 LibTest/math/log_A01_t01: RuntimeError # Please triage this failure
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-004_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/composition/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/rendering-shadow-trees/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/reprojection/test-001_t01: RuntimeError
 
 [ $compiler == dart2js && $runtime == chrome && $system == macos ]
 Language/Expressions/Function_Invocation/async_invokation_t04: RuntimeError # Please triage this failure
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index d599d4ec..2946921 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -60,8 +60,6 @@
 # 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/Spawning_an_Isolate/*: Skip
 Language/Mixins/Mixin_Application/syntax_t16: RuntimeError # Please triaage.
@@ -140,8 +138,8 @@
 Language/Expressions/Constants/math_operators_t05: Crash
 Language/Expressions/Function_Invocation/Unqualified_Invocation/instance_context_invocation_t03: MissingCompileTimeError
 Language/Expressions/Function_Invocation/Unqualified_Invocation/instance_context_invocation_t04: MissingCompileTimeError
-Language/Expressions/Instance_Creation/New/evaluation_t19: RuntimeError # Kernel Issue 28335 (deferred libraries)
-Language/Expressions/Instance_Creation/New/evaluation_t20: RuntimeError # Kernel Issue 28335 (deferred libraries)
+Language/Expressions/Instance_Creation/New/evaluation_t19: CompileTimeError # Issue 31938
+Language/Expressions/Instance_Creation/New/evaluation_t20: CompileTimeError # Issue 31938
 Language/Expressions/Maps/key_value_equals_operator_t01: MissingCompileTimeError
 Language/Expressions/Method_Invocation/Ordinary_Invocation/object_method_invocation_t01: MissingCompileTimeError # Issue 25496
 Language/Expressions/Method_Invocation/Ordinary_Invocation/object_method_invocation_t02: MissingCompileTimeError # Issue 25496
@@ -157,7 +155,6 @@
 Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/class_object_member_t08: MissingCompileTimeError # Issue 24332
 Language/Expressions/This/placement_t04: MissingCompileTimeError
 Language/Expressions/Throw/syntax_t02: MissingCompileTimeError
-Language/Expressions/Type_Test/evaluation_t10: RuntimeError # Kernel Issue 28335 (deferred libraries)
 Language/Functions/External_Functions/not_connected_to_a_body_t01: RuntimeError # Dartk Issue 28565
 Language/Functions/Formal_Parameters/Optional_Formals/default_value_t01: MissingCompileTimeError
 Language/Functions/Formal_Parameters/Optional_Formals/default_value_t02: MissingCompileTimeError
@@ -185,12 +182,7 @@
 Language/Mixins/Mixin_Application/syntax_t16: CompileTimeError # Issue 25765
 Language/Mixins/declaring_constructor_t05: MissingCompileTimeError # Issue 24767
 Language/Mixins/declaring_constructor_t06: MissingCompileTimeError # Issue 24767
-Language/Statements/Continue/label_t06: MissingCompileTimeError
 Language/Statements/Continue/label_t07: MissingCompileTimeError
-Language/Statements/Continue/label_t08: MissingCompileTimeError
-Language/Statements/Continue/label_t09: MissingCompileTimeError
-Language/Statements/Continue/label_t10: MissingCompileTimeError
-Language/Statements/Continue/label_t11: MissingCompileTimeError
 Language/Statements/For/syntax_t12: MissingCompileTimeError
 Language/Statements/For/syntax_t13: MissingCompileTimeError
 Language/Statements/For/syntax_t19: MissingCompileTimeError
@@ -205,7 +197,7 @@
 Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t01: MissingCompileTimeError # Issue 25495
 Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t03: MissingCompileTimeError # Issue 25495
 Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t05: MissingCompileTimeError # Issue 25495
-Language/Types/Static_Types/deferred_type_t01: RuntimeError # Kernel Issue 28335 (deferred libraries)
+Language/Types/Dynamic_Type_System/deferred_type_error_t01: CompileTimeError # Issue 31938
 Language/Types/Type_Void/syntax_t01: Pass # Issue 30470
 Language/Variables/final_or_static_initialization_t02: MissingCompileTimeError
 Language/Variables/final_or_static_initialization_t03: MissingCompileTimeError
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index e423b3e..7190664 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -300,6 +300,9 @@
 Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t10: RuntimeError # Issue 25748
 Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_sync_t05: RuntimeError # Issue 25662,25634
 Language/Types/Type_Void/syntax_t01: MissingCompileTimeError # Issue co19/30264
+Language/Types/Type_Void/syntax_t02: MissingCompileTimeError # Issue co19/30264
+Language/Types/Type_Void/syntax_t04: MissingCompileTimeError # Issue co19/30264
+Language/Types/Type_Void/syntax_t09: MissingCompileTimeError # Issue co19/30264
 LayoutTests/fast/*: SkipByDesign # DOM not supported on VM.
 LibTest/collection/ListBase/ListBase_class_A01_t01: RuntimeError # Large integers
 LibTest/collection/ListMixin/ListMixin_class_A01_t01: RuntimeError # Large integers
diff --git a/tests/co19_2/.gitignore b/tests/co19_2/.gitignore
new file mode 100644
index 0000000..a57582c
--- /dev/null
+++ b/tests/co19_2/.gitignore
@@ -0,0 +1 @@
+/src
diff --git a/tests/co19_2/co19_2-analyzer.status b/tests/co19_2/co19_2-analyzer.status
new file mode 100644
index 0000000..5eea4d2
--- /dev/null
+++ b/tests/co19_2/co19_2-analyzer.status
@@ -0,0 +1,286 @@
+# Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+[ $compiler == dart2analyzer && $strong ]
+Language/Classes/Abstract_Instance_Members/override_default_value_t01: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/override_default_value_t02: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/override_default_value_t03: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/override_default_value_t04: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/override_default_value_t05: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t01: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t02: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t04: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t05: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t06: MissingCompileTimeError
+Language/Classes/Getters/type_object_t01: CompileTimeError
+Language/Classes/Getters/type_object_t02: CompileTimeError
+Language/Classes/Instance_Methods/override_different_default_values_t01: MissingCompileTimeError
+Language/Classes/Instance_Methods/override_different_default_values_t02: MissingCompileTimeError
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t01: MissingCompileTimeError
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t02: MissingCompileTimeError
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t04: MissingCompileTimeError
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t05: MissingCompileTimeError
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t06: MissingCompileTimeError
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t07: MissingCompileTimeError
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t09: MissingCompileTimeError
+Language/Classes/method_definition_t06: MissingCompileTimeError
+Language/Expressions/Assignment/expression_assignment_failed_t02: CompileTimeError
+Language/Expressions/Assignment/indexed_expression_super_t03: CompileTimeError
+Language/Expressions/Assignment/indexed_expression_super_t04: CompileTimeError
+Language/Expressions/Assignment/static_type_t02: CompileTimeError
+Language/Expressions/Assignment/static_type_t03: CompileTimeError
+Language/Expressions/Assignment/super_assignment_failed_t01: CompileTimeError
+Language/Expressions/Assignment/super_assignment_failed_t02: CompileTimeError
+Language/Expressions/Assignment/super_assignment_failed_t03: CompileTimeError
+Language/Expressions/Assignment/super_assignment_failed_t04: CompileTimeError
+Language/Expressions/Assignment/super_assignment_static_warning_t02: CompileTimeError
+Language/Expressions/Assignment/super_assignment_static_warning_t03: CompileTimeError
+Language/Expressions/Assignment/super_assignment_t06: CompileTimeError
+Language/Expressions/Assignment/super_assignment_value_t02: CompileTimeError
+Language/Expressions/Assignment/this_assignment_t02: CompileTimeError
+Language/Expressions/Constants/identifier_denotes_a_constant_t03: MissingCompileTimeError
+Language/Expressions/Identifier_Reference/built_in_identifier_t02: CompileTimeError
+Language/Expressions/Identifier_Reference/evaluation_library_or_getter_t01: StaticWarning
+Language/Expressions/Identifier_Reference/evaluation_property_extraction_t04: CompileTimeError
+Language/Expressions/Identifier_Reference/evaluation_type_parameter_t02: MissingCompileTimeError
+Language/Expressions/Lookup/Getter_and_Setter_Lookup/definition_t09: CompileTimeError
+Language/Expressions/Lookup/Getter_and_Setter_Lookup/definition_t10: CompileTimeError
+Language/Expressions/Method_Invocation/Ordinary_Invocation/accessible_instance_member_t03: CompileTimeError
+Language/Expressions/Method_Invocation/Ordinary_Invocation/accessible_instance_member_t04: CompileTimeError
+Language/Expressions/Method_Invocation/Super_Invocation/accessible_instance_member_t03: CompileTimeError
+Language/Expressions/Method_Invocation/Super_Invocation/accessible_instance_member_t04: CompileTimeError
+Language/Expressions/Method_Invocation/Super_Invocation/accessible_instance_member_t05: CompileTimeError
+Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t01: CompileTimeError
+Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t02: CompileTimeError
+Language/Expressions/Property_Extraction/Super_Getter_Access_and_Method_Closurization/no_such_method_t01: CompileTimeError
+Language/Expressions/Property_Extraction/Super_Getter_Access_and_Method_Closurization/no_such_method_t02: CompileTimeError
+Language/Expressions/Property_Extraction/Super_Getter_Access_and_Method_Closurization/static_type_t03: CompileTimeError
+Language/Functions/generator_return_type_t02: MissingCompileTimeError
+Language/Functions/generator_return_type_t06: MissingCompileTimeError
+Language/Generics/syntax_t02: Crash
+Language/Generics/syntax_t03: Crash
+Language/Libraries_and_Scripts/Imports/namespace_changes_t01: StaticWarning
+Language/Libraries_and_Scripts/Imports/namespace_changes_t02: StaticWarning
+Language/Libraries_and_Scripts/Imports/namespace_changes_t16: StaticWarning
+Language/Libraries_and_Scripts/Imports/namespace_changes_t17: StaticWarning
+Language/Libraries_and_Scripts/Parts/compilation_t03: StaticWarning
+Language/Libraries_and_Scripts/Parts/compilation_t05: StaticWarning
+Language/Mixins/Mixin_Application/static_warning_t02: CompileTimeError
+Language/Mixins/Mixin_Application/superinterfaces_t07: CompileTimeError
+Language/Mixins/Mixin_Application/syntax_t11: CompileTimeError
+Language/Mixins/Mixin_Application/syntax_t12: CompileTimeError
+Language/Mixins/Mixin_Application/syntax_t13: CompileTimeError
+Language/Mixins/Mixin_Application/syntax_t14: CompileTimeError
+Language/Mixins/Mixin_Application/syntax_t21: CompileTimeError
+Language/Mixins/Mixin_Application/syntax_t22: CompileTimeError
+Language/Mixins/Mixin_Application/syntax_t23: CompileTimeError
+Language/Mixins/Mixin_Application/syntax_t24: CompileTimeError
+Language/Mixins/Mixin_Application/syntax_t25: CompileTimeError
+Language/Mixins/Mixin_Application/warning_t01: CompileTimeError
+Language/Mixins/Mixin_Application/warning_t02: CompileTimeError
+Language/Mixins/Mixin_Application/warning_t03: CompileTimeError
+Language/Mixins/declaring_constructor_t05: MissingCompileTimeError
+Language/Mixins/declaring_constructor_t06: MissingCompileTimeError
+Language/Statements/Assert/execution_t10: MissingCompileTimeError
+Language/Statements/Assert/type_t02: MissingCompileTimeError
+Language/Statements/Assert/type_t04: MissingCompileTimeError
+Language/Statements/Do/condition_type_t02: MissingCompileTimeError
+Language/Types/Interface_Types/subtype_t12: StaticWarning
+Language/Types/Type_Declarations/Typedef/syntax_t01: StaticWarning
+Language/Types/Type_Void/syntax_t09: MissingCompileTimeError
+Language/Types/Type_Void/using_t02: MissingCompileTimeError
+Language/Variables/final_or_static_initialization_t01: MissingCompileTimeError
+Language/Variables/final_or_static_initialization_t02: MissingCompileTimeError
+Language/Variables/final_or_static_initialization_t03: MissingCompileTimeError
+LayoutTests/fast/canvas/canvas-blending-clipping_t01: StaticWarning
+LayoutTests/fast/canvas/canvas-blending-color-over-color_t01: StaticWarning
+LayoutTests/fast/canvas/canvas-blending-color-over-gradient_t01: StaticWarning
+LayoutTests/fast/canvas/canvas-blending-color-over-image_t01: StaticWarning
+LayoutTests/fast/canvas/canvas-blending-color-over-pattern_t01: StaticWarning
+LayoutTests/fast/canvas/canvas-blending-fill-style_t01: StaticWarning
+LayoutTests/fast/canvas/canvas-blending-global-alpha_t01: StaticWarning
+LayoutTests/fast/canvas/canvas-blending-gradient-over-color_t01: StaticWarning
+LayoutTests/fast/canvas/canvas-blending-gradient-over-gradient_t01: StaticWarning
+LayoutTests/fast/canvas/canvas-blending-gradient-over-image_t01: StaticWarning
+LayoutTests/fast/canvas/canvas-blending-gradient-over-pattern_t01: StaticWarning
+LayoutTests/fast/canvas/canvas-blending-image-over-color_t01: StaticWarning
+LayoutTests/fast/canvas/canvas-blending-image-over-gradient_t01: StaticWarning
+LayoutTests/fast/canvas/canvas-blending-image-over-image_t01: StaticWarning
+LayoutTests/fast/canvas/canvas-blending-image-over-pattern_t01: StaticWarning
+LayoutTests/fast/canvas/canvas-blending-pattern-over-color_t01: StaticWarning
+LayoutTests/fast/canvas/canvas-blending-pattern-over-gradient_t01: StaticWarning
+LayoutTests/fast/canvas/canvas-blending-pattern-over-image_t01: StaticWarning
+LayoutTests/fast/canvas/canvas-blending-pattern-over-pattern_t01: StaticWarning
+LayoutTests/fast/canvas/canvas-blending-shadow_t01: StaticWarning
+LayoutTests/fast/canvas/canvas-blending-text_t01: StaticWarning
+LayoutTests/fast/canvas/canvas-blending-transforms_t01: StaticWarning
+LibTest/async/Stream/Stream.fromFutures_A01_t01: StaticWarning
+LibTest/async/Stream/Stream.fromFutures_A01_t02: StaticWarning
+LibTest/async/Stream/Stream.fromFutures_A02_t01: StaticWarning
+LibTest/async/Stream/Stream.fromFutures_A02_t02: StaticWarning
+LibTest/async/Stream/Stream.fromFutures_A04_t01: StaticWarning
+LibTest/async/Stream/Stream.fromIterable_A03_t01: StaticWarning
+LibTest/async/Stream/Stream.periodic_A01_t01: StaticWarning
+LibTest/async/Stream/Stream.periodic_A04_t01: StaticWarning
+LibTest/async/StreamController/StreamController.broadcast_A09_t01: StaticWarning
+LibTest/async/StreamController/StreamController.broadcast_A10_t01: StaticWarning
+LibTest/async/StreamController/stream_A02_t01: StaticWarning
+LibTest/async/StreamController/stream_A03_t01: StaticWarning
+LibTest/async/Zone/runBinaryGuarded_A01_t02: CompileTimeError
+LibTest/async/Zone/runUnary_A01_t01: CompileTimeError
+LibTest/collection/DoubleLinkedQueue/firstWhere_A02_t01: StaticWarning
+LibTest/collection/DoubleLinkedQueue/firstWhere_A03_t01: StaticWarning
+LibTest/collection/DoubleLinkedQueue/lastWhere_A02_t01: StaticWarning
+LibTest/collection/DoubleLinkedQueue/lastWhere_A03_t01: StaticWarning
+LibTest/collection/DoubleLinkedQueue/skipWhile_A02_t01: StaticWarning
+LibTest/collection/DoubleLinkedQueue/takeWhile_A02_t01: StaticWarning
+LibTest/collection/DoubleLinkedQueue/where_A02_t01: StaticWarning
+LibTest/collection/HashMap/HashMap_class_A01_t01: StaticWarning
+LibTest/collection/HashSet/HashSet_A01_t02: StaticWarning
+LibTest/collection/HashSet/HashSet_class_A01_t01: StaticWarning
+LibTest/collection/IterableBase/IterableBase_class_A01_t02: StaticWarning
+LibTest/collection/IterableMixin/IterableMixin_class_A02_t01: StaticWarning
+LibTest/collection/IterableMixin/contains_A02_t01: StaticWarning
+LibTest/collection/IterableMixin/every_A01_t01: StaticWarning
+LibTest/collection/IterableMixin/every_A01_t02: StaticWarning
+LibTest/collection/IterableMixin/every_A02_t01: StaticWarning
+LibTest/collection/IterableMixin/expand_A02_t01: StaticWarning
+LibTest/collection/IterableMixin/firstWhere_A02_t01: StaticWarning
+LibTest/collection/IterableMixin/firstWhere_A02_t02: StaticWarning
+LibTest/collection/IterableMixin/map_A03_t01: StaticWarning
+LibTest/collection/IterableMixin/skipWhile_A02_t01: StaticWarning
+LibTest/collection/IterableMixin/takeWhile_A02_t01: StaticWarning
+LibTest/collection/IterableMixin/where_A02_t01: StaticWarning
+LibTest/collection/LinkedHashMap/LinkedHashMap_A03_t01: StaticWarning
+LibTest/collection/LinkedHashMap/LinkedHashMap_A04_t01: StaticWarning
+LibTest/collection/LinkedHashMap/LinkedHashMap_A04_t02: StaticWarning
+LibTest/collection/LinkedHashMap/LinkedHashMap_class_A01_t01: StaticWarning
+LibTest/collection/LinkedHashSet/LinkedHashSet_A03_t01: StaticWarning
+LibTest/collection/LinkedHashSet/LinkedHashSet_A05_t01: StaticWarning
+LibTest/collection/LinkedHashSet/LinkedHashSet_A05_t02: StaticWarning
+LibTest/collection/LinkedHashSet/LinkedHashSet_class_A01_t01: StaticWarning
+LibTest/collection/LinkedList/remove_A01_t01: StaticWarning
+LibTest/collection/ListBase/ListBase_class_A01_t01: StaticWarning
+LibTest/collection/ListMixin/ListMixin_class_A01_t01: StaticWarning
+LibTest/collection/ListQueue/ListQueue_class_A01_t01: StaticWarning
+LibTest/collection/MapBase/MapBase_class_A01_t01: StaticWarning
+LibTest/collection/MapMixin/MapMixin_class_A01_t01: StaticWarning
+LibTest/collection/MapView/MapView_class_A01_t01: StaticWarning
+LibTest/collection/Maps/forEach_A01_t01: StaticWarning
+LibTest/collection/Maps/forEach_A01_t03: StaticWarning
+LibTest/collection/Maps/forEach_A01_t04: StaticWarning
+LibTest/collection/Maps/forEach_A01_t05: StaticWarning
+LibTest/collection/Maps/forEach_A01_t06: StaticWarning
+LibTest/collection/Maps/forEach_A02_t01: StaticWarning
+LibTest/collection/Queue/Queue_class_A01_t01: StaticWarning
+LibTest/collection/SetBase/SetBase_class_A01_t01: StaticWarning
+LibTest/collection/SetMixin/SetMixin_class_A01_t01: StaticWarning
+LibTest/collection/SplayTreeMap/SplayTreeMap.fromIterable_A03_t01: StaticWarning
+LibTest/collection/SplayTreeMap/SplayTreeMap.fromIterable_A05_t01: StaticWarning
+LibTest/collection/SplayTreeMap/SplayTreeMap.fromIterable_A06_t01: StaticWarning
+LibTest/collection/SplayTreeMap/SplayTreeMap.fromIterable_A06_t02: StaticWarning
+LibTest/collection/SplayTreeMap/SplayTreeMap.fromIterables_A04_t01: StaticWarning
+LibTest/collection/SplayTreeMap/SplayTreeMap.fromIterables_A05_t01: StaticWarning
+LibTest/collection/SplayTreeMap/SplayTreeMap.fromIterables_A05_t02: StaticWarning
+LibTest/collection/SplayTreeMap/SplayTreeMap.from_A02_t01: StaticWarning
+LibTest/collection/SplayTreeMap/SplayTreeMap.from_A03_t01: StaticWarning
+LibTest/collection/SplayTreeMap/SplayTreeMap.from_A03_t02: StaticWarning
+LibTest/collection/SplayTreeMap/SplayTreeMap_class_A02_t01: StaticWarning
+LibTest/collection/SplayTreeMap/SplayTreeMap_class_A02_t02: StaticWarning
+LibTest/collection/SplayTreeMap/SplayTreeMap_class_A03_t01: StaticWarning
+LibTest/collection/SplayTreeMap/SplayTreeMap_class_A03_t02: StaticWarning
+LibTest/collection/SplayTreeMap/SplayTreeMap_class_A04_t02: StaticWarning
+LibTest/collection/SplayTreeMap/SplayTreeMap_class_A05_t01: StaticWarning
+LibTest/collection/SplayTreeMap/SplayTreeMap_class_A05_t02: StaticWarning
+LibTest/collection/SplayTreeMap/inherited_tests_A01_t01: StaticWarning
+LibTest/collection/SplayTreeSet/SplayTreeSet.from_A02_t07: StaticWarning
+LibTest/collection/SplayTreeSet/SplayTreeSet.from_A02_t08: StaticWarning
+LibTest/collection/SplayTreeSet/SplayTreeSet_A04_t01: StaticWarning
+LibTest/collection/SplayTreeSet/SplayTreeSet_A05_t01: StaticWarning
+LibTest/collection/SplayTreeSet/SplayTreeSet_A06_t01: StaticWarning
+LibTest/collection/SplayTreeSet/SplayTreeSet_class_A01_t01: StaticWarning
+LibTest/collection/UnmodifiableListView/UnmodifiableListView_class_A01_t01: StaticWarning
+LibTest/core/List/Iterable_A01_t01: StaticWarning
+LibTest/core/List/List_class_A01_t01: StaticWarning
+LibTest/core/List/List_class_A01_t02: StaticWarning
+LibTest/core/Map/allTests_A01_t01: StaticWarning
+LibTest/core/RegExp/allMatches_A01_t01: StaticWarning
+LibTest/core/Set/every_A01_t01: StaticWarning
+LibTest/core/Set/every_A01_t02: StaticWarning
+LibTest/core/Set/every_A01_t03: StaticWarning
+LibTest/core/Set/forEach_A01_t01: StaticWarning
+LibTest/core/Set/forEach_A01_t02: StaticWarning
+LibTest/core/Set/forEach_A01_t03: StaticWarning
+LibTest/core/Set/forEach_A01_t04: StaticWarning
+LibTest/core/Set/forEach_A01_t05: StaticWarning
+LibTest/core/double/operator_GE_A01_t03: StaticWarning
+LibTest/core/double/operator_GE_A02_t01: StaticWarning
+LibTest/core/double/operator_GT_A01_t03: StaticWarning
+LibTest/core/double/operator_GT_A02_t01: StaticWarning
+LibTest/core/double/operator_LE_A01_t03: StaticWarning
+LibTest/core/double/operator_LE_A02_t01: StaticWarning
+LibTest/core/double/operator_LT_A01_t03: StaticWarning
+LibTest/core/double/operator_LT_A02_t01: StaticWarning
+LibTest/core/double/operator_addition_A01_t07: StaticWarning
+LibTest/core/double/operator_addition_A02_t01: StaticWarning
+LibTest/core/double/operator_division_A01_t07: StaticWarning
+LibTest/core/double/operator_division_A01_t08: StaticWarning
+LibTest/core/double/operator_division_A01_t11: StaticWarning
+LibTest/core/double/operator_division_A02_t01: StaticWarning
+LibTest/core/double/operator_multiplication_A01_t06: StaticWarning
+LibTest/core/double/operator_multiplication_A01_t08: StaticWarning
+LibTest/core/double/operator_multiplication_A02_t01: StaticWarning
+LibTest/core/double/operator_remainder_A01_t02: StaticWarning
+LibTest/core/double/operator_remainder_A01_t03: StaticWarning
+LibTest/core/double/operator_remainder_A01_t04: StaticWarning
+LibTest/core/double/operator_remainder_A01_t05: StaticWarning
+LibTest/core/double/operator_remainder_A01_t06: StaticWarning
+LibTest/core/double/operator_remainder_A02_t01: StaticWarning
+LibTest/core/double/operator_subtraction_A01_t07: StaticWarning
+LibTest/core/double/operator_subtraction_A01_t08: StaticWarning
+LibTest/core/double/operator_subtraction_A02_t01: StaticWarning
+LibTest/core/double/operator_truncating_division_A01_t08: StaticWarning
+LibTest/core/double/operator_truncating_division_A02_t01: StaticWarning
+LibTest/core/double/remainder_A01_t02: StaticWarning
+LibTest/core/double/remainder_A01_t03: StaticWarning
+LibTest/core/double/remainder_A01_t04: StaticWarning
+LibTest/core/double/remainder_A01_t05: StaticWarning
+LibTest/core/double/remainder_A01_t06: StaticWarning
+LibTest/core/double/remainder_A02_t01: StaticWarning
+LibTest/core/double/toStringAsFixed_A02_t01: StaticWarning
+LibTest/io/Directory/Directory.fromUri_A01_t01: CompileTimeError
+LibTest/io/File/parent_A01_t02: CompileTimeError
+LibTest/io/HttpClientRequest/addError_A02_t01: StaticWarning
+LibTest/io/HttpClientRequest/addStream_A01_t01: StaticWarning
+LibTest/io/HttpClientRequest/addStream_A02_t01: StaticWarning
+LibTest/io/HttpClientRequest/addStream_A02_t02: StaticWarning
+LibTest/io/HttpClientRequest/add_A03_t01: StaticWarning
+LibTest/io/HttpClientRequest/add_A03_t02: StaticWarning
+LibTest/io/HttpClientRequest/flush_A02_t01: StaticWarning
+LibTest/io/HttpClientRequest/flush_A02_t02: StaticWarning
+LibTest/io/Link/Link_A03_t02: CompileTimeError
+LibTest/io/WebSocket/connect_A01_t01: CompileTimeError
+LibTest/io/WebSocket/connect_A01_t02: CompileTimeError
+LibTest/isolate/Isolate/spawn_A01_t03: StaticWarning
+LibTest/isolate/RawReceivePort/sendPort_A01_t01: CompileTimeError
+LibTest/isolate/ReceivePort/any_A01_t01: StaticWarning
+LibTest/isolate/ReceivePort/any_A01_t02: StaticWarning
+LibTest/isolate/ReceivePort/every_A01_t01: StaticWarning
+LibTest/isolate/ReceivePort/firstWhere_A01_t01: StaticWarning
+LibTest/isolate/ReceivePort/firstWhere_A02_t01: StaticWarning
+LibTest/isolate/ReceivePort/firstWhere_A03_t02: StaticWarning
+LibTest/isolate/ReceivePort/fold_A01_t01: StaticWarning
+LibTest/isolate/ReceivePort/forEach_A01_t01: StaticWarning
+LibTest/isolate/ReceivePort/lastWhere_A01_t01: StaticWarning
+LibTest/isolate/ReceivePort/lastWhere_A02_t01: StaticWarning
+LibTest/isolate/ReceivePort/lastWhere_A04_t01: StaticWarning
+LibTest/isolate/ReceivePort/reduce_A01_t01: StaticWarning
+LibTest/isolate/ReceivePort/singleWhere_A01_t01: StaticWarning
+LibTest/isolate/ReceivePort/singleWhere_A02_t01: StaticWarning
+LibTest/isolate/ReceivePort/toSet_A01_t01: StaticWarning
+LibTest/isolate/ReceivePort/transform_A01_t01: StaticWarning
+LibTest/isolate/ReceivePort/where_A01_t01: StaticWarning
+LibTest/isolate/ReceivePort/where_A01_t02: StaticWarning
+WebPlatformTest/html/semantics/tabular-data/the-table-element/table-rows_t01: StaticWarning
+
diff --git a/tests/co19_2/co19_2-kernel.status b/tests/co19_2/co19_2-kernel.status
new file mode 100644
index 0000000..4632eb0
--- /dev/null
+++ b/tests/co19_2/co19_2-kernel.status
@@ -0,0 +1,1093 @@
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+[ $fasta ]
+Language/Classes/Abstract_Instance_Members/inherited_t01: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/inherited_t02: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/inherited_t03: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/inherited_t04: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/inherited_t05: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/inherited_t06: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/invocation_t01: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/invocation_t02: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/no_implementation_t01: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/override_default_value_t01: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/override_default_value_t02: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/override_default_value_t03: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/override_default_value_t04: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/override_default_value_t05: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/override_default_value_t06: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t01: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t02: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t04: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t05: MissingCompileTimeError
+Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t06: MissingCompileTimeError
+Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t03: MissingCompileTimeError
+Language/Classes/Constructors/Factories/arguments_type_t01: MissingCompileTimeError
+Language/Classes/Constructors/Factories/const_modifier_t01: MissingCompileTimeError
+Language/Classes/Constructors/Factories/const_modifier_t02: MissingCompileTimeError
+Language/Classes/Constructors/Factories/default_value_t01: MissingCompileTimeError
+Language/Classes/Constructors/Factories/default_value_t02: MissingCompileTimeError
+Language/Classes/Constructors/Factories/function_type_t01: MissingCompileTimeError
+Language/Classes/Constructors/Factories/function_type_t02: MissingCompileTimeError
+Language/Classes/Constructors/Factories/name_t03: MissingCompileTimeError
+Language/Classes/Constructors/Factories/name_t05: MissingCompileTimeError
+Language/Classes/Constructors/Generative_Constructors/execution_t04: MissingCompileTimeError
+Language/Classes/Constructors/Generative_Constructors/execution_t05: MissingCompileTimeError
+Language/Classes/Constructors/Generative_Constructors/execution_t06: MissingCompileTimeError
+Language/Classes/Constructors/Generative_Constructors/execution_t07: MissingCompileTimeError
+Language/Classes/Constructors/Generative_Constructors/execution_t12: MissingCompileTimeError
+Language/Classes/Constructors/Generative_Constructors/explicit_type_t01: MissingCompileTimeError
+Language/Classes/Constructors/Generative_Constructors/initializers_t15: CompileTimeError
+Language/Classes/Constructors/Generative_Constructors/redirection_t02: MissingCompileTimeError
+Language/Classes/Constructors/Generative_Constructors/redirection_t03: MissingCompileTimeError
+Language/Classes/Constructors/Generative_Constructors/redirection_t07: MissingCompileTimeError
+Language/Classes/Constructors/Generative_Constructors/redirection_t08: MissingCompileTimeError
+Language/Classes/Constructors/Generative_Constructors/static_type_t01: MissingCompileTimeError
+Language/Classes/Constructors/Generative_Constructors/syntax_t04: MissingCompileTimeError
+Language/Classes/Constructors/Generative_Constructors/syntax_t05: MissingCompileTimeError
+Language/Classes/Getters/instance_getter_t01: MissingCompileTimeError
+Language/Classes/Getters/instance_getter_t02: MissingCompileTimeError
+Language/Classes/Getters/instance_getter_t03: MissingCompileTimeError
+Language/Classes/Getters/instance_getter_t04: MissingCompileTimeError
+Language/Classes/Getters/instance_getter_t05: MissingCompileTimeError
+Language/Classes/Getters/instance_getter_t06: MissingCompileTimeError
+Language/Classes/Getters/override_t02: MissingCompileTimeError
+Language/Classes/Getters/override_t03: MissingCompileTimeError
+Language/Classes/Getters/static_getter_t01: MissingCompileTimeError
+Language/Classes/Getters/type_object_t01: CompileTimeError
+Language/Classes/Getters/type_object_t02: CompileTimeError
+Language/Classes/Instance_Methods/override_different_default_values_t01: MissingCompileTimeError
+Language/Classes/Instance_Methods/override_different_default_values_t02: MissingCompileTimeError
+Language/Classes/Instance_Methods/same_name_setter_t01: MissingCompileTimeError
+Language/Classes/Instance_Methods/same_name_setter_t02: MissingCompileTimeError
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t01: MissingCompileTimeError
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t02: MissingCompileTimeError
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t04: MissingCompileTimeError
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t05: MissingCompileTimeError
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t06: MissingCompileTimeError
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t07: MissingCompileTimeError
+Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t09: MissingCompileTimeError
+Language/Classes/Instance_Variables/constant_t01: MissingCompileTimeError
+Language/Classes/Setters/instance_setter_t01: MissingCompileTimeError
+Language/Classes/Setters/instance_setter_t02: MissingCompileTimeError
+Language/Classes/Setters/instance_setter_t03: MissingCompileTimeError
+Language/Classes/Setters/instance_setter_t04: MissingCompileTimeError
+Language/Classes/Setters/instance_setter_t05: MissingCompileTimeError
+Language/Classes/Setters/instance_setter_t06: MissingCompileTimeError
+Language/Classes/Setters/name_t01: MissingCompileTimeError
+Language/Classes/Setters/name_t02: MissingCompileTimeError
+Language/Classes/Setters/name_t03: MissingCompileTimeError
+Language/Classes/Setters/name_t04: MissingCompileTimeError
+Language/Classes/Setters/name_t05: MissingCompileTimeError
+Language/Classes/Setters/override_t02: MissingCompileTimeError
+Language/Classes/Setters/static_setter_t05: MissingCompileTimeError
+Language/Classes/Setters/static_setter_t06: MissingCompileTimeError
+Language/Classes/Superclasses/Inheritance_and_Overriding/abstract_method_t01: MissingCompileTimeError
+Language/Classes/Superclasses/wrong_superclass_t08: MissingCompileTimeError
+Language/Classes/Superinterfaces/no_member_t01: MissingCompileTimeError
+Language/Classes/Superinterfaces/no_member_t05: MissingCompileTimeError
+Language/Classes/Superinterfaces/wrong_type_t05: MissingCompileTimeError
+Language/Classes/declarations_t06: MissingCompileTimeError
+Language/Classes/declarations_t08: MissingCompileTimeError
+Language/Classes/declarations_t33: MissingCompileTimeError
+Language/Classes/definition_t23: CompileTimeError
+Language/Classes/method_definition_t03: MissingCompileTimeError
+Language/Classes/method_definition_t04: MissingCompileTimeError
+Language/Classes/method_definition_t05: MissingCompileTimeError
+Language/Classes/method_definition_t06: MissingCompileTimeError
+Language/Classes/same_name_type_variable_t04: MissingCompileTimeError
+Language/Classes/same_name_type_variable_t07: MissingCompileTimeError
+Language/Enums/syntax_t08: CompileTimeError
+Language/Enums/syntax_t09: CompileTimeError
+Language/Expressions/Assignable_Expressions/syntax_t01: CompileTimeError
+Language/Expressions/Assignment/expression_assignment_failed_t02: CompileTimeError
+Language/Expressions/Assignment/indexed_expression_super_t03: CompileTimeError
+Language/Expressions/Assignment/indexed_expression_super_t04: CompileTimeError
+Language/Expressions/Assignment/static_type_t02: CompileTimeError
+Language/Expressions/Assignment/static_type_t03: CompileTimeError
+Language/Expressions/Assignment/super_assignment_failed_t01: CompileTimeError
+Language/Expressions/Assignment/super_assignment_failed_t02: CompileTimeError
+Language/Expressions/Assignment/super_assignment_failed_t03: CompileTimeError
+Language/Expressions/Assignment/super_assignment_failed_t04: CompileTimeError
+Language/Expressions/Assignment/super_assignment_static_warning_t02: CompileTimeError
+Language/Expressions/Assignment/super_assignment_static_warning_t03: CompileTimeError
+Language/Expressions/Assignment/super_assignment_t06: CompileTimeError
+Language/Expressions/Assignment/super_assignment_value_t02: CompileTimeError
+Language/Expressions/Assignment/this_assignment_t02: CompileTimeError
+Language/Expressions/Bitwise_Expressions/syntax_t01: CompileTimeError
+Language/Expressions/Constants/constant_list_t02: MissingCompileTimeError
+Language/Expressions/Constants/constant_map_t02: MissingCompileTimeError
+Language/Expressions/Constants/equals_expression_t03: MissingCompileTimeError
+Language/Expressions/Constants/exception_t04: MissingCompileTimeError
+Language/Expressions/Constants/literal_number_t01: CompileTimeError
+Language/Expressions/Constants/literal_string_t02: MissingCompileTimeError
+Language/Expressions/Constants/math_operators_t01: CompileTimeError
+Language/Expressions/Constants/math_operators_t06: CompileTimeError
+Language/Expressions/Equality/syntax_t01: CompileTimeError
+Language/Expressions/Function_Expressions/syntax_t05: CompileTimeError
+Language/Expressions/Function_Invocation/Binding_Actuals_to_Formals/names_matching_t02: MissingCompileTimeError
+Language/Expressions/Function_Invocation/Binding_Actuals_to_Formals/names_matching_t03: MissingCompileTimeError
+Language/Expressions/Function_Invocation/Binding_Actuals_to_Formals/number_of_arguments_t02: MissingCompileTimeError
+Language/Expressions/Function_Invocation/Binding_Actuals_to_Formals/number_of_arguments_t03: MissingCompileTimeError
+Language/Expressions/Function_Invocation/Binding_Actuals_to_Formals/number_of_arguments_t06: MissingCompileTimeError
+Language/Expressions/Function_Invocation/Binding_Actuals_to_Formals/number_of_arguments_t07: MissingCompileTimeError
+Language/Expressions/Function_Invocation/Binding_Actuals_to_Formals/optional_parameter_type_t02: MissingCompileTimeError
+Language/Expressions/Function_Invocation/Function_Expression_Invocation/static_type_t02: CompileTimeError
+Language/Expressions/Function_Invocation/async_cleanup_t01: CompileTimeError
+Language/Expressions/Function_Invocation/async_cleanup_t02: CompileTimeError
+Language/Expressions/Function_Invocation/async_cleanup_t03: CompileTimeError
+Language/Expressions/Function_Invocation/async_cleanup_t04: CompileTimeError
+Language/Expressions/Function_Invocation/async_cleanup_t05: CompileTimeError
+Language/Expressions/Function_Invocation/async_cleanup_t06: CompileTimeError
+Language/Expressions/Function_Invocation/async_cleanup_t07: CompileTimeError
+Language/Expressions/Function_Invocation/async_cleanup_t08: CompileTimeError
+Language/Expressions/Identifier_Reference/built_in_identifier_t02: CompileTimeError
+Language/Expressions/Identifier_Reference/evaluation_property_extraction_t04: CompileTimeError
+Language/Expressions/Instance_Creation/Const/abstract_class_t02: MissingCompileTimeError
+Language/Expressions/Instance_Creation/Const/abstract_class_t04: MissingCompileTimeError
+Language/Expressions/Instance_Creation/Const/arguments_t03: MissingCompileTimeError
+Language/Expressions/Instance_Creation/Const/parameterized_type_t01: CompileTimeError
+Language/Expressions/Instance_Creation/Const/parameterized_type_t02: CompileTimeError
+Language/Expressions/Instance_Creation/New/evaluation_t16: MissingCompileTimeError
+Language/Expressions/Instance_Creation/New/evaluation_t17: MissingCompileTimeError
+Language/Expressions/Instance_Creation/New/evaluation_t18: MissingCompileTimeError
+Language/Expressions/Instance_Creation/New/generic_type_t01: MissingCompileTimeError
+Language/Expressions/Instance_Creation/New/generic_type_t02: MissingCompileTimeError
+Language/Expressions/Instance_Creation/New/generic_type_t03: MissingCompileTimeError
+Language/Expressions/Instance_Creation/New/redirecting_factory_constructor_t02: MissingCompileTimeError
+Language/Expressions/Instance_Creation/New/syntax_t04: MissingCompileTimeError
+Language/Expressions/Instance_Creation/New/type_argument_t01: MissingCompileTimeError
+Language/Expressions/Instance_Creation/malformed_or_malbounded_t07: MissingCompileTimeError
+Language/Expressions/Lists/constant_list_t01: CompileTimeError
+Language/Expressions/Lookup/Getter_and_Setter_Lookup/definition_t09: CompileTimeError
+Language/Expressions/Lookup/Getter_and_Setter_Lookup/definition_t10: CompileTimeError
+Language/Expressions/Maps/constant_map_t02: MissingCompileTimeError
+Language/Expressions/Maps/constant_map_type_t01: CompileTimeError
+Language/Expressions/Maps/equal_keys_t01: MissingCompileTimeError
+Language/Expressions/Maps/key_value_equals_operator_t01: MissingCompileTimeError
+Language/Expressions/Method_Invocation/Ordinary_Invocation/accessible_instance_member_t03: CompileTimeError
+Language/Expressions/Method_Invocation/Ordinary_Invocation/accessible_instance_member_t04: CompileTimeError
+Language/Expressions/Method_Invocation/Ordinary_Invocation/function_type_t01: MissingCompileTimeError
+Language/Expressions/Method_Invocation/Ordinary_Invocation/method_lookup_failed_t21: MissingCompileTimeError
+Language/Expressions/Method_Invocation/Ordinary_Invocation/static_type_t04: CompileTimeError
+Language/Expressions/Method_Invocation/Super_Invocation/accessible_instance_member_t03: CompileTimeError
+Language/Expressions/Method_Invocation/Super_Invocation/accessible_instance_member_t04: CompileTimeError
+Language/Expressions/Method_Invocation/Super_Invocation/accessible_instance_member_t05: CompileTimeError
+Language/Expressions/Method_Invocation/Super_Invocation/evaluation_t05: MissingCompileTimeError
+Language/Expressions/Method_Invocation/Super_Invocation/evaluation_t06: MissingCompileTimeError
+Language/Expressions/Method_Invocation/Super_Invocation/evaluation_t07: MissingCompileTimeError
+Language/Expressions/Method_Invocation/Super_Invocation/evaluation_t08: MissingCompileTimeError
+Language/Expressions/Method_Invocation/Super_Invocation/evaluation_t09: MissingCompileTimeError
+Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t01: CompileTimeError
+Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t02: CompileTimeError
+Language/Expressions/Method_Invocation/Super_Invocation/invocation_t02: MissingCompileTimeError
+Language/Expressions/Method_Invocation/Super_Invocation/static_type_dynamic_t02: CompileTimeError
+Language/Expressions/Multiplicative_Expressions/syntax_t01: CompileTimeError
+Language/Expressions/Numbers/static_type_of_int_t01: CompileTimeError
+Language/Expressions/Numbers/syntax_t06: CompileTimeError
+Language/Expressions/Numbers/syntax_t09: CompileTimeError
+Language/Expressions/Numbers/syntax_t10: CompileTimeError
+Language/Expressions/Postfix_Expressions/syntax_t01: CompileTimeError
+Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/instance_of_type_getter_t01: CompileTimeError
+Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/instance_of_type_getter_t03: CompileTimeError
+Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/instance_of_type_t01: CompileTimeError
+Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/instance_of_type_t03: CompileTimeError
+Language/Expressions/Property_Extraction/Super_Getter_Access_and_Method_Closurization/no_such_method_t01: CompileTimeError
+Language/Expressions/Property_Extraction/Super_Getter_Access_and_Method_Closurization/no_such_method_t02: CompileTimeError
+Language/Expressions/Property_Extraction/Super_Getter_Access_and_Method_Closurization/static_type_t03: CompileTimeError
+Language/Expressions/Relational_Expressions/syntax_t01: CompileTimeError
+Language/Expressions/Shift/syntax_t01: CompileTimeError
+Language/Expressions/Strings/String_Interpolation/double_quote_t02: CompileTimeError
+Language/Expressions/Strings/String_Interpolation/single_quote_t02: CompileTimeError
+Language/Expressions/This/placement_t04: MissingCompileTimeError
+Language/Expressions/Throw/syntax_t02: MissingCompileTimeError
+Language/Expressions/Type_Cast/evaluation_t10: MissingCompileTimeError
+Language/Expressions/Type_Test/evaluation_t10: MissingCompileTimeError
+Language/Expressions/Unary_Expressions/syntax_t10: CompileTimeError
+Language/Expressions/Unary_Expressions/syntax_t27: CompileTimeError
+Language/Functions/Formal_Parameters/Optional_Formals/default_value_t01: MissingCompileTimeError
+Language/Functions/Formal_Parameters/Optional_Formals/default_value_t02: MissingCompileTimeError
+Language/Functions/async_return_type_t01: MissingCompileTimeError
+Language/Functions/async_return_type_t02: MissingCompileTimeError
+Language/Functions/generator_return_type_t01: MissingCompileTimeError
+Language/Functions/generator_return_type_t02: MissingCompileTimeError
+Language/Functions/generator_return_type_t05: MissingCompileTimeError
+Language/Functions/generator_return_type_t06: MissingCompileTimeError
+Language/Generics/scope_t06: MissingCompileTimeError
+Language/Generics/upper_bound_t01: MissingCompileTimeError
+Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_members_t01: MissingCompileTimeError
+Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_method_and_getter_t01: MissingCompileTimeError
+Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_method_and_getter_t02: MissingCompileTimeError
+Language/Libraries_and_Scripts/Exports/reexport_t01: MissingCompileTimeError
+Language/Libraries_and_Scripts/Exports/same_name_t01: MissingCompileTimeError
+Language/Libraries_and_Scripts/Imports/deferred_import_t01: CompileTimeError
+Language/Libraries_and_Scripts/Imports/deferred_import_t02: CompileTimeError
+Language/Libraries_and_Scripts/Imports/invalid_uri_deferred_t03: CompileTimeError
+Language/Libraries_and_Scripts/Imports/invalid_uri_t01: MissingCompileTimeError
+Language/Libraries_and_Scripts/Imports/library_name_t01: MissingCompileTimeError
+Language/Libraries_and_Scripts/Imports/namespace_changes_t01: CompileTimeError
+Language/Libraries_and_Scripts/Imports/namespace_changes_t02: CompileTimeError
+Language/Libraries_and_Scripts/Imports/namespace_changes_t16: CompileTimeError
+Language/Libraries_and_Scripts/Imports/namespace_changes_t17: CompileTimeError
+Language/Libraries_and_Scripts/Imports/static_type_t01: CompileTimeError
+Language/Mixins/Mixin_Application/abstract_t05: MissingCompileTimeError
+Language/Mixins/Mixin_Application/abstract_t06: MissingCompileTimeError
+Language/Mixins/Mixin_Application/deferred_t01: MissingCompileTimeError
+Language/Mixins/Mixin_Application/interfaces_t05: MissingCompileTimeError
+Language/Mixins/Mixin_Application/static_warning_t01: MissingCompileTimeError
+Language/Mixins/Mixin_Application/superinterfaces_t01: MissingCompileTimeError
+Language/Mixins/Mixin_Application/superinterfaces_t02: MissingCompileTimeError
+Language/Mixins/Mixin_Application/superinterfaces_t06: MissingCompileTimeError
+Language/Mixins/Mixin_Application/superinterfaces_t08: MissingCompileTimeError
+Language/Mixins/Mixin_Application/syntax_t16: CompileTimeError
+Language/Mixins/declaring_constructor_t05: MissingCompileTimeError
+Language/Mixins/declaring_constructor_t06: MissingCompileTimeError
+Language/Overview/Privacy/private_and_public_t11: CompileTimeError
+Language/Statements/Assert/execution_t08: CompileTimeError
+Language/Statements/Assert/production_mode_t01: CompileTimeError
+Language/Statements/Assert/type_t08: CompileTimeError
+Language/Statements/Continue/async_loops_t01: CompileTimeError
+Language/Statements/Continue/async_loops_t02: CompileTimeError
+Language/Statements/Continue/async_loops_t03: CompileTimeError
+Language/Statements/Continue/async_loops_t04: CompileTimeError
+Language/Statements/Continue/async_loops_t05: CompileTimeError
+Language/Statements/Continue/async_loops_t06: CompileTimeError
+Language/Statements/Continue/async_loops_t07: CompileTimeError
+Language/Statements/Continue/async_loops_t08: CompileTimeError
+Language/Statements/Continue/async_loops_t09: CompileTimeError
+Language/Statements/Continue/async_loops_t10: CompileTimeError
+Language/Statements/Continue/control_transfer_t08: CompileTimeError
+Language/Statements/Continue/control_transfer_t09: CompileTimeError
+Language/Statements/Continue/label_t06: MissingCompileTimeError
+Language/Statements/Continue/label_t07: MissingCompileTimeError
+Language/Statements/Continue/label_t08: MissingCompileTimeError
+Language/Statements/Continue/label_t09: MissingCompileTimeError
+Language/Statements/Continue/label_t10: MissingCompileTimeError
+Language/Statements/Continue/label_t11: MissingCompileTimeError
+Language/Statements/Do/condition_type_t02: MissingCompileTimeError
+Language/Statements/For/syntax_t12: MissingCompileTimeError
+Language/Statements/For/syntax_t19: MissingCompileTimeError
+Language/Statements/Labels/scope_t05: MissingCompileTimeError
+Language/Statements/Switch/equal_operator_t01: MissingCompileTimeError
+Language/Statements/Switch/equal_operator_t02: MissingCompileTimeError
+Language/Statements/Switch/execution_t01: MissingCompileTimeError
+Language/Statements/Switch/expressions_t01: MissingCompileTimeError
+Language/Statements/Switch/expressions_t02: MissingCompileTimeError
+Language/Statements/Switch/expressions_t04: MissingCompileTimeError
+Language/Statements/Switch/type_t01: MissingCompileTimeError
+Language/Statements/Switch/type_t02: MissingCompileTimeError
+Language/Statements/Try/catch_scope_t01: CompileTimeError
+Language/Types/Dynamic_Type_System/deferred_type_error_t01: MissingCompileTimeError
+Language/Types/Dynamic_Type_System/malbounded_type_error_t01: MissingCompileTimeError
+Language/Types/Function_Types/call_t02: MissingCompileTimeError
+Language/Types/Interface_Types/subtype_t12: CompileTimeError
+Language/Types/Interface_Types/subtype_t30: CompileTimeError
+Language/Types/Parameterized_Types/arity_mismatch_t01: MissingCompileTimeError
+Language/Types/Parameterized_Types/arity_mismatch_t05: MissingCompileTimeError
+Language/Types/Parameterized_Types/arity_mismatch_t07: MissingCompileTimeError
+Language/Types/Parameterized_Types/malbounded_t01: MissingCompileTimeError
+Language/Types/Parameterized_Types/malbounded_t02: MissingCompileTimeError
+Language/Types/Parameterized_Types/malbounded_t03: MissingCompileTimeError
+Language/Types/Parameterized_Types/malbounded_t04: MissingCompileTimeError
+Language/Types/Parameterized_Types/malbounded_t05: MissingCompileTimeError
+Language/Types/Parameterized_Types/malbounded_t06: MissingCompileTimeError
+Language/Types/Static_Types/deferred_type_t01: MissingCompileTimeError
+Language/Types/Static_Types/deferred_type_t02: MissingCompileTimeError
+Language/Types/Static_Types/deferred_type_t03: MissingCompileTimeError
+Language/Types/Static_Types/deferred_type_t04: MissingCompileTimeError
+Language/Types/Static_Types/malformed_type_t01/04: MissingCompileTimeError
+Language/Types/Static_Types/malformed_type_t01/05: MissingCompileTimeError
+Language/Types/Static_Types/malformed_type_t01/06: MissingCompileTimeError
+Language/Types/Type_Declarations/Typedef/syntax_t01: CompileTimeError
+Language/Types/Type_Void/returning_t03: MissingCompileTimeError
+Language/Types/Type_Void/returning_t04: MissingCompileTimeError
+Language/Types/Type_Void/returning_t05: MissingCompileTimeError
+Language/Types/Type_Void/syntax_t05: MissingCompileTimeError
+Language/Types/Type_Void/syntax_t08: MissingCompileTimeError
+Language/Types/Type_Void/syntax_t09: MissingCompileTimeError
+Language/Types/Type_Void/using_t01: MissingCompileTimeError
+Language/Types/Type_Void/using_t02: MissingCompileTimeError
+Language/Variables/final_or_static_initialization_t02: MissingCompileTimeError
+Language/Variables/final_or_static_initialization_t03: MissingCompileTimeError
+LibTest/async/DeferredLibrary/DeferredLibrary_A01_t01: CompileTimeError
+LibTest/async/Stream/Stream.fromFutures_A01_t01: CompileTimeError
+LibTest/async/Stream/Stream.fromFutures_A01_t02: CompileTimeError
+LibTest/async/Stream/Stream.fromFutures_A02_t01: CompileTimeError
+LibTest/async/Stream/Stream.fromFutures_A02_t02: CompileTimeError
+LibTest/async/Stream/Stream.fromFutures_A04_t01: CompileTimeError
+LibTest/async/Stream/Stream.fromIterable_A03_t01: CompileTimeError
+LibTest/async/Stream/Stream.periodic_A01_t01: CompileTimeError
+LibTest/async/Stream/Stream.periodic_A04_t01: CompileTimeError
+LibTest/async/StreamController/StreamController.broadcast_A09_t01: CompileTimeError
+LibTest/async/StreamController/StreamController.broadcast_A10_t01: CompileTimeError
+LibTest/async/StreamController/stream_A02_t01: CompileTimeError
+LibTest/async/StreamController/stream_A03_t01: CompileTimeError
+LibTest/async/Zone/runBinaryGuarded_A01_t02: CompileTimeError
+LibTest/async/Zone/runUnary_A01_t01: CompileTimeError
+LibTest/collection/DoubleLinkedQueue/firstWhere_A02_t01: CompileTimeError
+LibTest/collection/DoubleLinkedQueue/firstWhere_A03_t01: CompileTimeError
+LibTest/collection/DoubleLinkedQueue/lastWhere_A02_t01: CompileTimeError
+LibTest/collection/DoubleLinkedQueue/lastWhere_A03_t01: CompileTimeError
+LibTest/collection/DoubleLinkedQueue/skipWhile_A02_t01: CompileTimeError
+LibTest/collection/DoubleLinkedQueue/takeWhile_A02_t01: CompileTimeError
+LibTest/collection/DoubleLinkedQueue/where_A02_t01: CompileTimeError
+LibTest/collection/HashMap/HashMap_class_A01_t01: CompileTimeError
+LibTest/collection/HashSet/HashSet_A01_t02: CompileTimeError
+LibTest/collection/HashSet/HashSet_class_A01_t01: CompileTimeError
+LibTest/collection/IterableBase/IterableBase_class_A01_t02: CompileTimeError
+LibTest/collection/IterableMixin/IterableMixin_class_A02_t01: CompileTimeError
+LibTest/collection/IterableMixin/contains_A02_t01: CompileTimeError
+LibTest/collection/IterableMixin/every_A01_t01: CompileTimeError
+LibTest/collection/IterableMixin/every_A01_t02: CompileTimeError
+LibTest/collection/IterableMixin/every_A02_t01: CompileTimeError
+LibTest/collection/IterableMixin/expand_A02_t01: CompileTimeError
+LibTest/collection/IterableMixin/firstWhere_A02_t01: CompileTimeError
+LibTest/collection/IterableMixin/firstWhere_A02_t02: CompileTimeError
+LibTest/collection/IterableMixin/map_A03_t01: CompileTimeError
+LibTest/collection/IterableMixin/skipWhile_A02_t01: CompileTimeError
+LibTest/collection/IterableMixin/takeWhile_A02_t01: CompileTimeError
+LibTest/collection/IterableMixin/where_A02_t01: CompileTimeError
+LibTest/collection/LinkedHashMap/LinkedHashMap_A03_t01: CompileTimeError
+LibTest/collection/LinkedHashMap/LinkedHashMap_A04_t01: CompileTimeError
+LibTest/collection/LinkedHashMap/LinkedHashMap_A04_t02: CompileTimeError
+LibTest/collection/LinkedHashMap/LinkedHashMap_class_A01_t01: CompileTimeError
+LibTest/collection/LinkedHashSet/LinkedHashSet_A03_t01: CompileTimeError
+LibTest/collection/LinkedHashSet/LinkedHashSet_A05_t01: CompileTimeError
+LibTest/collection/LinkedHashSet/LinkedHashSet_A05_t02: CompileTimeError
+LibTest/collection/LinkedHashSet/LinkedHashSet_class_A01_t01: CompileTimeError
+LibTest/collection/LinkedList/remove_A01_t01: CompileTimeError
+LibTest/collection/ListBase/ListBase_class_A01_t01: CompileTimeError
+LibTest/collection/ListMixin/ListMixin_class_A01_t01: CompileTimeError
+LibTest/collection/ListQueue/ListQueue_class_A01_t01: CompileTimeError
+LibTest/collection/MapBase/MapBase_class_A01_t01: CompileTimeError
+LibTest/collection/MapMixin/MapMixin_class_A01_t01: CompileTimeError
+LibTest/collection/MapView/MapView_class_A01_t01: CompileTimeError
+LibTest/collection/Maps/forEach_A01_t01: CompileTimeError
+LibTest/collection/Maps/forEach_A01_t03: CompileTimeError
+LibTest/collection/Maps/forEach_A01_t04: CompileTimeError
+LibTest/collection/Maps/forEach_A01_t05: CompileTimeError
+LibTest/collection/Maps/forEach_A01_t06: CompileTimeError
+LibTest/collection/Maps/forEach_A02_t01: CompileTimeError
+LibTest/collection/Queue/Queue_class_A01_t01: CompileTimeError
+LibTest/collection/SetBase/SetBase_class_A01_t01: CompileTimeError
+LibTest/collection/SetMixin/SetMixin_class_A01_t01: CompileTimeError
+LibTest/collection/SplayTreeMap/SplayTreeMap.fromIterable_A03_t01: CompileTimeError
+LibTest/collection/SplayTreeMap/SplayTreeMap.fromIterable_A05_t01: CompileTimeError
+LibTest/collection/SplayTreeMap/SplayTreeMap.fromIterable_A06_t01: CompileTimeError
+LibTest/collection/SplayTreeMap/SplayTreeMap.fromIterable_A06_t02: CompileTimeError
+LibTest/collection/SplayTreeMap/SplayTreeMap.fromIterables_A04_t01: CompileTimeError
+LibTest/collection/SplayTreeMap/SplayTreeMap.fromIterables_A05_t01: CompileTimeError
+LibTest/collection/SplayTreeMap/SplayTreeMap.fromIterables_A05_t02: CompileTimeError
+LibTest/collection/SplayTreeMap/SplayTreeMap.from_A02_t01: CompileTimeError
+LibTest/collection/SplayTreeMap/SplayTreeMap.from_A03_t01: CompileTimeError
+LibTest/collection/SplayTreeMap/SplayTreeMap.from_A03_t02: CompileTimeError
+LibTest/collection/SplayTreeMap/SplayTreeMap_class_A02_t01: CompileTimeError
+LibTest/collection/SplayTreeMap/SplayTreeMap_class_A02_t02: CompileTimeError
+LibTest/collection/SplayTreeMap/SplayTreeMap_class_A03_t01: CompileTimeError
+LibTest/collection/SplayTreeMap/SplayTreeMap_class_A03_t02: CompileTimeError
+LibTest/collection/SplayTreeMap/SplayTreeMap_class_A04_t02: CompileTimeError
+LibTest/collection/SplayTreeMap/SplayTreeMap_class_A05_t01: CompileTimeError
+LibTest/collection/SplayTreeMap/SplayTreeMap_class_A05_t02: CompileTimeError
+LibTest/collection/SplayTreeMap/inherited_tests_A01_t01: CompileTimeError
+LibTest/collection/SplayTreeSet/SplayTreeSet.from_A02_t07: CompileTimeError
+LibTest/collection/SplayTreeSet/SplayTreeSet.from_A02_t08: CompileTimeError
+LibTest/collection/SplayTreeSet/SplayTreeSet_A04_t01: CompileTimeError
+LibTest/collection/SplayTreeSet/SplayTreeSet_A05_t01: CompileTimeError
+LibTest/collection/SplayTreeSet/SplayTreeSet_A06_t01: CompileTimeError
+LibTest/collection/SplayTreeSet/SplayTreeSet_class_A01_t01: CompileTimeError
+LibTest/collection/UnmodifiableListView/UnmodifiableListView_class_A01_t01: CompileTimeError
+LibTest/core/Function/apply_A01_t01: CompileTimeError
+LibTest/core/List/Iterable_A01_t01: CompileTimeError
+LibTest/core/List/List_class_A01_t01: CompileTimeError
+LibTest/core/List/List_class_A01_t02: CompileTimeError
+LibTest/core/Map/allTests_A01_t01: CompileTimeError
+LibTest/core/RegExp/allMatches_A01_t01: CompileTimeError
+LibTest/core/Set/every_A01_t01: CompileTimeError
+LibTest/core/Set/every_A01_t02: CompileTimeError
+LibTest/core/Set/every_A01_t03: CompileTimeError
+LibTest/core/Set/forEach_A01_t01: CompileTimeError
+LibTest/core/Set/forEach_A01_t02: CompileTimeError
+LibTest/core/Set/forEach_A01_t03: CompileTimeError
+LibTest/core/Set/forEach_A01_t04: CompileTimeError
+LibTest/core/Set/forEach_A01_t05: CompileTimeError
+LibTest/core/double/isInfinite_A01_t03: CompileTimeError
+LibTest/core/double/operator_GE_A01_t03: CompileTimeError
+LibTest/core/double/operator_GE_A02_t01: CompileTimeError
+LibTest/core/double/operator_GT_A01_t03: CompileTimeError
+LibTest/core/double/operator_GT_A02_t01: CompileTimeError
+LibTest/core/double/operator_LE_A01_t03: CompileTimeError
+LibTest/core/double/operator_LE_A02_t01: CompileTimeError
+LibTest/core/double/operator_LT_A01_t03: CompileTimeError
+LibTest/core/double/operator_LT_A02_t01: CompileTimeError
+LibTest/core/double/operator_addition_A01_t07: CompileTimeError
+LibTest/core/double/operator_addition_A02_t01: CompileTimeError
+LibTest/core/double/operator_division_A01_t07: CompileTimeError
+LibTest/core/double/operator_division_A01_t08: CompileTimeError
+LibTest/core/double/operator_division_A01_t11: CompileTimeError
+LibTest/core/double/operator_division_A02_t01: CompileTimeError
+LibTest/core/double/operator_multiplication_A01_t06: CompileTimeError
+LibTest/core/double/operator_multiplication_A01_t08: CompileTimeError
+LibTest/core/double/operator_multiplication_A02_t01: CompileTimeError
+LibTest/core/double/operator_remainder_A01_t02: CompileTimeError
+LibTest/core/double/operator_remainder_A01_t03: CompileTimeError
+LibTest/core/double/operator_remainder_A01_t04: CompileTimeError
+LibTest/core/double/operator_remainder_A01_t05: CompileTimeError
+LibTest/core/double/operator_remainder_A01_t06: CompileTimeError
+LibTest/core/double/operator_remainder_A02_t01: CompileTimeError
+LibTest/core/double/operator_subtraction_A01_t07: CompileTimeError
+LibTest/core/double/operator_subtraction_A01_t08: CompileTimeError
+LibTest/core/double/operator_subtraction_A02_t01: CompileTimeError
+LibTest/core/double/operator_truncating_division_A01_t08: CompileTimeError
+LibTest/core/double/operator_truncating_division_A02_t01: CompileTimeError
+LibTest/core/double/remainder_A01_t02: CompileTimeError
+LibTest/core/double/remainder_A01_t03: CompileTimeError
+LibTest/core/double/remainder_A01_t04: CompileTimeError
+LibTest/core/double/remainder_A01_t05: CompileTimeError
+LibTest/core/double/remainder_A01_t06: CompileTimeError
+LibTest/core/double/remainder_A02_t01: CompileTimeError
+LibTest/core/double/toStringAsFixed_A02_t01: CompileTimeError
+LibTest/core/int/abs_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/ceilToDouble_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/ceil_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/compareTo_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/floorToDouble_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/floor_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/isEven_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/isFinite_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/isInfinite_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/isNaN_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/isNegative_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/isOdd_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_AND_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_GE_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_GT_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_LE_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_LT_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_NOT_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_OR_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_XOR_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_addition_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_division_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_equality_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_equality_A02_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_equality_A03_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_left_shift_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_multiplication_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_remainder_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_remainder_A01_t02: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_right_shift_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_subtraction_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_truncating_division_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_truncating_division_A01_t02: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/operator_unary_minus_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/parse_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/remainder_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/remainder_A01_t02: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/roundToDouble_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/round_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/sign_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/toDouble_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/toInt_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/truncateToDouble_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/core/int/truncate_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
+LibTest/io/Directory/Directory.fromUri_A01_t01: CompileTimeError
+LibTest/io/File/parent_A01_t02: CompileTimeError
+LibTest/io/HttpClientRequest/addError_A02_t01: CompileTimeError
+LibTest/io/HttpClientRequest/addStream_A01_t01: CompileTimeError
+LibTest/io/HttpClientRequest/addStream_A02_t01: CompileTimeError
+LibTest/io/HttpClientRequest/addStream_A02_t02: CompileTimeError
+LibTest/io/HttpClientRequest/add_A03_t01: CompileTimeError
+LibTest/io/HttpClientRequest/add_A03_t02: CompileTimeError
+LibTest/io/HttpClientRequest/flush_A02_t01: CompileTimeError
+LibTest/io/HttpClientRequest/flush_A02_t02: CompileTimeError
+LibTest/io/Link/Link_A03_t02: CompileTimeError
+LibTest/io/RawDatagramSocket/asyncExpand_A01_t01: CompileTimeError
+LibTest/io/RawDatagramSocket/asyncExpand_A01_t02: CompileTimeError
+LibTest/io/WebSocket/connect_A01_t01: CompileTimeError
+LibTest/io/WebSocket/connect_A01_t02: CompileTimeError
+LibTest/isolate/Isolate/spawn_A01_t03: CompileTimeError
+LibTest/isolate/RawReceivePort/sendPort_A01_t01: CompileTimeError
+LibTest/isolate/ReceivePort/any_A01_t02: CompileTimeError
+LibTest/isolate/ReceivePort/firstWhere_A01_t01: CompileTimeError
+LibTest/isolate/ReceivePort/firstWhere_A02_t01: CompileTimeError
+LibTest/isolate/ReceivePort/fold_A01_t01: CompileTimeError
+LibTest/isolate/ReceivePort/forEach_A01_t01: CompileTimeError
+LibTest/isolate/ReceivePort/lastWhere_A01_t01: CompileTimeError
+LibTest/isolate/ReceivePort/lastWhere_A02_t01: CompileTimeError
+LibTest/isolate/ReceivePort/reduce_A01_t01: CompileTimeError
+LibTest/isolate/ReceivePort/singleWhere_A01_t01: CompileTimeError
+LibTest/isolate/ReceivePort/toSet_A01_t01: CompileTimeError
+LibTest/isolate/ReceivePort/transform_A01_t01: CompileTimeError
+LibTest/isolate/ReceivePort/where_A01_t01: CompileTimeError
+LibTest/isolate/ReceivePort/where_A01_t02: CompileTimeError
+LibTest/math/pow_A10_t01: CompileTimeError
+LibTest/typed_data/ByteData/getUint64_A01_t01: CompileTimeError
+LibTest/typed_data/ByteData/setUint64_A01_t01: CompileTimeError
+LibTest/typed_data/Int32x4List/skipWhile_A01_t01: CompileTimeError
+LibTest/typed_data/Int32x4List/takeWhile_A01_t01: CompileTimeError
+LibTest/typed_data/Int32x4List/where_A01_t01: CompileTimeError
+LibTest/typed_data/Uint64List/Uint64List.fromList_A01_t01: CompileTimeError
+LibTest/typed_data/Uint64List/Uint64List.fromList_A01_t02: CompileTimeError
+LibTest/typed_data/Uint64List/Uint64List.fromList_A02_t01: CompileTimeError
+LibTest/typed_data/Uint64List/Uint64List.view_A01_t01: CompileTimeError
+LibTest/typed_data/Uint64List/Uint64List.view_A01_t02: CompileTimeError
+
+[ $compiler == dartk && $strong ]
+Language/Classes/Constructors/Constant_Constructors/potentially_constant_expression_t01: Crash
+Language/Expressions/Additive_Expressions/syntax_t01: RuntimeError
+Language/Expressions/Assignment/null_aware_assignment_static_type_t01: RuntimeError
+Language/Expressions/Booleans/Boolean_Conversion/definition_t01: RuntimeError
+Language/Expressions/Constants/depending_on_itself_t03: Crash
+Language/Expressions/Function_Invocation/async_generator_invokation_t08: Fail
+Language/Expressions/Function_Invocation/async_generator_invokation_t10: Fail
+Language/Expressions/Instance_Creation/Const/canonicalized_t05: RuntimeError
+Language/Expressions/Instance_Creation/New/evaluation_t19: RuntimeError
+Language/Expressions/Instance_Creation/New/evaluation_t20: RuntimeError
+Language/Expressions/Lists/identical_t02: RuntimeError
+Language/Expressions/Maps/identical_t02: RuntimeError
+Language/Expressions/Object_Identity/string_t01: RuntimeError
+Language/Expressions/Strings/adjacent_strings_t02: RuntimeError
+Language/Expressions/Type_Cast/syntax_t01: RuntimeError
+Language/Expressions/Unary_Expressions/variable_negative_t03: RuntimeError
+Language/Functions/External_Functions/not_connected_to_a_body_t01: RuntimeError
+Language/Generics/syntax_t02: DartkCrash
+Language/Generics/syntax_t03: DartkCrash
+Language/Libraries_and_Scripts/Parts/compilation_t03: RuntimeError
+Language/Libraries_and_Scripts/Parts/compilation_t05: RuntimeError
+Language/Metadata/before_export_t01: RuntimeError
+Language/Metadata/before_import_t01: RuntimeError
+Language/Metadata/before_library_t01: RuntimeError
+Language/Metadata/before_param_t01: RuntimeError
+Language/Metadata/before_param_t02: RuntimeError
+Language/Metadata/before_param_t03: RuntimeError
+Language/Metadata/before_param_t04: RuntimeError
+Language/Metadata/before_param_t05: RuntimeError
+Language/Metadata/before_param_t06: RuntimeError
+Language/Metadata/before_param_t07: RuntimeError
+Language/Metadata/before_param_t08: RuntimeError
+Language/Metadata/before_param_t09: RuntimeError
+Language/Metadata/before_type_param_t01: RuntimeError
+Language/Metadata/before_typedef_t01: RuntimeError
+Language/Overview/Privacy/private_and_public_t18: RuntimeError
+Language/Statements/Assert/execution_t03: RuntimeError
+Language/Statements/Assert/execution_t09: RuntimeError
+Language/Statements/Assert/execution_t11: RuntimeError
+Language/Statements/Do/execution_t06: RuntimeError
+Language/Statements/For/For_Loop/execution_t11: RuntimeError
+Language/Statements/For/For_in/execution_t02: RuntimeError
+Language/Statements/If/condition_evaluation_t02: RuntimeError
+Language/Statements/If/condition_evaluation_t03: RuntimeError
+Language/Statements/While/execution_t02: RuntimeError
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t08: RuntimeError
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t09: RuntimeError
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t10: RuntimeError
+Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_sync_t05: RuntimeError
+Language/Types/Function_Types/subtype_named_args_t01: RuntimeError
+Language/Types/Function_Types/subtype_named_args_t02: RuntimeError
+Language/Types/Function_Types/subtype_named_args_t03: RuntimeError
+Language/Types/Function_Types/subtype_named_args_t04: RuntimeError
+Language/Types/Function_Types/subtype_named_args_t11: RuntimeError
+Language/Types/Function_Types/subtype_named_args_t12: RuntimeError
+Language/Types/Function_Types/subtype_no_args_t04: RuntimeError
+Language/Types/Function_Types/subtype_optional_args_t01: RuntimeError
+Language/Types/Function_Types/subtype_optional_args_t02: RuntimeError
+Language/Types/Function_Types/subtype_optional_args_t03: RuntimeError
+Language/Types/Function_Types/subtype_optional_args_t04: RuntimeError
+Language/Types/Function_Types/subtype_required_args_t01: RuntimeError
+Language/Types/Function_Types/subtype_required_args_t02: RuntimeError
+Language/Types/Interface_Types/subtype_t02: RuntimeError
+Language/Types/Interface_Types/subtype_t03: RuntimeError
+Language/Types/Interface_Types/subtype_t06: RuntimeError
+Language/Types/Interface_Types/subtype_t17: RuntimeError
+Language/Types/Interface_Types/subtype_t21: RuntimeError
+Language/Types/Interface_Types/subtype_t22: RuntimeError
+Language/Types/Interface_Types/subtype_t23: RuntimeError
+Language/Types/Interface_Types/subtype_t26: RuntimeError
+Language/Types/Type_Declarations/Typedef/dynamic_param_type_t02: RuntimeError
+Language/Types/Type_Declarations/Typedef/self_reference_t08: DartkCrash
+Language/Types/Type_Declarations/Typedef/self_reference_t09: DartkCrash
+Language/Variables/constant_initialization_t03: RuntimeError
+Language/Variables/constant_variable_t09: RuntimeError
+LibTest/async/Future/asStream_A01_t02: RuntimeError
+LibTest/async/Stream/Stream.fromFutures_A04_t02: RuntimeError
+LibTest/async/Stream/Stream.fromFutures_A04_t03: RuntimeError
+LibTest/async/Stream/Stream.fromIterable_A03_t02: RuntimeError
+LibTest/async/Stream/Stream.periodic_A02_t01: RuntimeError
+LibTest/async/Stream/Stream.periodic_A03_t01: RuntimeError
+LibTest/async/Stream/Stream.periodic_A04_t02: RuntimeError
+LibTest/async/Stream/Stream.periodic_A04_t03: RuntimeError
+LibTest/async/StreamController/StreamController.broadcast_A03_t02: RuntimeError
+LibTest/async/StreamController/StreamController.broadcast_A09_t02: RuntimeError
+LibTest/async/StreamController/StreamController.broadcast_A09_t03: RuntimeError
+LibTest/async/StreamController/StreamController.broadcast_A10_t02: RuntimeError
+LibTest/async/StreamController/StreamController.broadcast_A10_t03: RuntimeError
+LibTest/async/StreamController/StreamController_A03_t03: RuntimeError
+LibTest/async/StreamController/stream_A02_t02: RuntimeError
+LibTest/async/StreamController/stream_A02_t03: RuntimeError
+LibTest/async/StreamController/stream_A03_t02: RuntimeError
+LibTest/async/StreamController/stream_A03_t03: RuntimeError
+LibTest/async/StreamTransformer/StreamTransformer.fromHandlers_A01_t03: RuntimeError
+LibTest/async/StreamTransformer/StreamTransformer.fromHandlers_A01_t04: RuntimeError
+LibTest/async/StreamTransformer/StreamTransformer_A01_t02: RuntimeError
+LibTest/async/StreamTransformer/StreamTransformer_A01_t03: RuntimeError
+LibTest/async/StreamTransformer/StreamTransformer_A02_t01: RuntimeError
+LibTest/async/StreamTransformer/StreamTransformer_A02_t02: RuntimeError
+LibTest/async/Zone/registerBinaryCallback_A01_t01: RuntimeError
+LibTest/collection/DoubleLinkedQueue/DoubleLinkedQueue.from_A01_t01: RuntimeError
+LibTest/collection/DoubleLinkedQueue/fold_A01_t01: RuntimeError
+LibTest/collection/DoubleLinkedQueue/reduce_A01_t01: RuntimeError
+LibTest/collection/DoubleLinkedQueue/removeWhere_A02_t02: RuntimeError
+LibTest/collection/DoubleLinkedQueue/removeWhere_A02_t03: RuntimeError
+LibTest/collection/DoubleLinkedQueue/retainWhere_A02_t02: RuntimeError
+LibTest/collection/DoubleLinkedQueue/retainWhere_A02_t03: RuntimeError
+LibTest/collection/HashMap/HashMap_A06_t01: RuntimeError
+LibTest/collection/HashSet/HashSet_A04_t01: RuntimeError
+LibTest/collection/IterableMixin/any_A01_t02: RuntimeError
+LibTest/collection/IterableMixin/expand_A01_t01: RuntimeError
+LibTest/collection/IterableMixin/first_A01_t02: RuntimeError
+LibTest/collection/IterableMixin/fold_A01_t01: RuntimeError
+LibTest/collection/IterableMixin/reduce_A01_t01: RuntimeError
+LibTest/collection/IterableMixin/single_A01_t02: RuntimeError
+LibTest/collection/IterableMixin/skipWhile_A03_t01: RuntimeError
+LibTest/collection/IterableMixin/skipWhile_A04_t01: RuntimeError
+LibTest/collection/LinkedList/addAll_A01_t02: RuntimeError
+LibTest/collection/LinkedList/add_A01_t01: RuntimeError
+LibTest/collection/LinkedList/forEach_A01_t01: RuntimeError
+LibTest/collection/LinkedList/join_A01_t01: RuntimeError
+LibTest/collection/LinkedList/map_A01_t01: RuntimeError
+LibTest/collection/LinkedList/map_A02_t01: RuntimeError
+LibTest/collection/LinkedList/map_A03_t01: RuntimeError
+LibTest/collection/LinkedList/reduce_A01_t01: RuntimeError
+LibTest/collection/LinkedList/reduce_A02_t01: RuntimeError
+LibTest/collection/LinkedList/reduce_A03_t01: RuntimeError
+LibTest/collection/LinkedList/reduce_A04_t01: RuntimeError
+LibTest/collection/LinkedList/remove_A01_t03: RuntimeError
+LibTest/collection/LinkedList/singleWhere_A01_t01: RuntimeError
+LibTest/collection/LinkedList/singleWhere_A02_t01: RuntimeError
+LibTest/collection/LinkedList/singleWhere_A02_t02: RuntimeError
+LibTest/collection/LinkedList/skipWhile_A01_t01: RuntimeError
+LibTest/collection/LinkedList/skipWhile_A03_t01: RuntimeError
+LibTest/collection/LinkedList/skipWhile_A04_t01: RuntimeError
+LibTest/collection/LinkedList/skipWhile_A05_t01: RuntimeError
+LibTest/collection/LinkedList/takeWhile_A01_t01: RuntimeError
+LibTest/collection/LinkedList/takeWhile_A01_t02: RuntimeError
+LibTest/collection/LinkedList/takeWhile_A02_t01: RuntimeError
+LibTest/collection/LinkedList/takeWhile_A03_t01: RuntimeError
+LibTest/collection/LinkedList/take_A01_t01: RuntimeError
+LibTest/collection/LinkedList/take_A02_t01: RuntimeError
+LibTest/collection/LinkedList/take_A03_t01: RuntimeError
+LibTest/collection/LinkedList/toString_A03_t01: RuntimeError
+LibTest/collection/LinkedList/where_A01_t01: RuntimeError
+LibTest/collection/LinkedList/where_A02_t01: RuntimeError
+LibTest/collection/ListQueue/ListQueue.from_A01_t01: RuntimeError
+LibTest/collection/Queue/Queue.from_A01_t01: RuntimeError
+LibTest/convert/ByteConversionSink/ByteConversionSink.from_A01_t01: RuntimeError
+LibTest/convert/ByteConversionSink/ByteConversionSink_class_A01_t01: RuntimeError
+LibTest/convert/LineSplitter/fuse_A01_t01: RuntimeError
+LibTest/convert/StringConversionSink/StringConversionSink.from_A01_t01: RuntimeError
+LibTest/convert/StringConversionSink/asStringSink_A02_t01: RuntimeError
+LibTest/convert/StringConversionSink/asUtf8Sink_A02_t01: RuntimeError
+LibTest/convert/Utf8Codec/Utf8Codec_A01_t02: RuntimeError
+LibTest/convert/Utf8Codec/Utf8Codec_A01_t03: RuntimeError
+LibTest/convert/Utf8Codec/decode_A03_t01: RuntimeError
+LibTest/convert/Utf8Codec/decode_A03_t02: RuntimeError
+LibTest/convert/Utf8Decoder/Utf8Decoder_A02_t01: RuntimeError
+LibTest/convert/Utf8Decoder/Utf8Decoder_A02_t02: RuntimeError
+LibTest/core/AssertionError/AssertionError_A01_t01: RuntimeError
+LibTest/core/AssertionError/message_A01_t01: RuntimeError
+LibTest/core/AssertionError/toString_A01_t01: RuntimeError
+LibTest/core/Expando/operator_square_brackets_A01_t01: RuntimeError
+LibTest/core/Expando/operator_square_brackets_A01_t03: RuntimeError
+LibTest/core/Expando/operator_square_brackets_A01_t04: RuntimeError
+LibTest/core/Expando/operator_square_brackets_A01_t05: RuntimeError
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: RuntimeError
+LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: RuntimeError
+LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: RuntimeError
+LibTest/core/Runes/any_A01_t01: RuntimeError
+LibTest/core/Runes/every_A01_t01: RuntimeError
+LibTest/core/StackOverflowError/stackTrace_A01_t01: RuntimeError
+LibTest/core/StackOverflowError/stackTrace_A01_t02: RuntimeError
+LibTest/core/String/padRight_A01_t01: RuntimeError
+LibTest/core/String/replaceAllMapped_A03_t01: RuntimeError
+LibTest/core/String/replaceFirstMapped_A03_t01: RuntimeError
+LibTest/core/Symbol/Symbol_A01_t03: RuntimeError
+LibTest/core/Symbol/Symbol_A01_t04: RuntimeError
+LibTest/core/Symbol/Symbol_A01_t05: RuntimeError
+LibTest/core/Uri/Uri.dataFromBytes_A01_t01: RuntimeError
+LibTest/core/Uri/Uri.dataFromBytes_A01_t02: RuntimeError
+LibTest/core/Uri/Uri.dataFromBytes_A01_t03: RuntimeError
+LibTest/core/Uri/Uri.dataFromBytes_A01_t04: RuntimeError
+LibTest/core/Uri/Uri.dataFromBytes_A01_t05: RuntimeError
+LibTest/core/Uri/Uri.dataFromString_A01_t01: RuntimeError
+LibTest/core/Uri/Uri.dataFromString_A01_t02: RuntimeError
+LibTest/core/Uri/Uri.dataFromString_A01_t03: RuntimeError
+LibTest/core/Uri/Uri.dataFromString_A01_t04: RuntimeError
+LibTest/core/Uri/Uri.dataFromString_A01_t05: RuntimeError
+LibTest/core/Uri/Uri.dataFromString_A02_t01: RuntimeError
+LibTest/core/Uri/Uri.dataFromString_A02_t03: RuntimeError
+LibTest/core/Uri/Uri.directory_A05_t01: RuntimeError
+LibTest/core/Uri/Uri.file_A02_t03: RuntimeError
+LibTest/core/Uri/parse_A07_t01: RuntimeError
+LibTest/core/Uri/queryParametersAll_A01_t01: RuntimeError
+LibTest/core/Uri/queryParametersAll_A01_t02: RuntimeError
+LibTest/core/Uri/queryParametersAll_A01_t04: RuntimeError
+LibTest/core/Uri/queryParametersAll_A03_t01: RuntimeError
+LibTest/core/Uri/queryParametersAll_A04_t01: RuntimeError
+LibTest/core/UriData/UriData.fromBytes_A01_t03: RuntimeError
+LibTest/core/UriData/UriData.fromString_A02_t03: RuntimeError
+LibTest/core/UriData/UriData.fromUri_A01_t03: RuntimeError
+LibTest/core/UriData/charset_A01_t01: RuntimeError
+LibTest/core/UriData/contentText_A01_t01: RuntimeError
+LibTest/core/UriData/isBase64_A01_t01: RuntimeError
+LibTest/core/UriData/parse_A01_t01: RuntimeError
+LibTest/core/UriData/toString_A01_t01: RuntimeError
+LibTest/core/double/ceil_A01_t04: RuntimeError
+LibTest/core/double/floor_A01_t04: RuntimeError
+LibTest/core/double/round_A01_t03: RuntimeError
+LibTest/core/double/toInt_A01_t05: RuntimeError
+LibTest/core/double/truncate_A01_t05: RuntimeError
+LibTest/core/int/toStringAsFixed_A03_t01: RuntimeError
+LibTest/io/CompressionOptions/DEFAULT_A01_t01: RuntimeError
+LibTest/io/Cookie/Cookie_A01_t01: RuntimeError
+LibTest/io/Cookie/Cookie_A01_t02: RuntimeError
+LibTest/io/Cookie/domain_A01_t02: RuntimeError
+LibTest/io/Cookie/name_A01_t02: RuntimeError
+LibTest/io/Cookie/path_A01_t02: RuntimeError
+LibTest/io/Directory/deleteSync_A02_t06: RuntimeError
+LibTest/io/Directory/delete_A02_t05: RuntimeError
+LibTest/io/Directory/existsSync_A02_t02: RuntimeError
+LibTest/io/Directory/exists_A02_t02: RuntimeError
+LibTest/io/Directory/listSync_A01_t02: RuntimeError
+LibTest/io/Directory/listSync_A01_t03: RuntimeError
+LibTest/io/Directory/listSync_A01_t04: RuntimeError
+LibTest/io/Directory/list_A01_t02: RuntimeError
+LibTest/io/Directory/list_A01_t03: RuntimeError
+LibTest/io/Directory/list_A01_t04: RuntimeError
+LibTest/io/Directory/renameSync_A02_t01: RuntimeError
+LibTest/io/Directory/rename_A02_t01: RuntimeError
+LibTest/io/Directory/statSync_A01_t05: RuntimeError
+LibTest/io/Directory/stat_A01_t05: RuntimeError
+LibTest/io/Directory/watch_A01_t01: RuntimeError
+LibTest/io/Directory/watch_A01_t02: RuntimeError
+LibTest/io/Directory/watch_A02_t01: RuntimeError
+LibTest/io/File/absolute_A01_t01: RuntimeError
+LibTest/io/File/openRead_A01_t04: RuntimeError
+LibTest/io/File/openRead_A02_t01: RuntimeError
+LibTest/io/File/openSync_A01_t03: RuntimeError
+LibTest/io/File/openWrite_A03_t01: RuntimeError
+LibTest/io/File/open_A01_t03: RuntimeError
+LibTest/io/File/statSync_A01_t05: RuntimeError
+LibTest/io/File/stat_A01_t05: RuntimeError
+LibTest/io/FileStat/changed_A01_t01: RuntimeError
+LibTest/io/FileStat/modeString_A01_t01: RuntimeError
+LibTest/io/FileStat/mode_A01_t01: RuntimeError
+LibTest/io/FileStat/modified_A01_t01: RuntimeError
+LibTest/io/FileSystemCreateEvent/isDirectory_A01_t01: RuntimeError
+LibTest/io/FileSystemCreateEvent/isDirectory_A01_t02: RuntimeError
+LibTest/io/FileSystemCreateEvent/isDirectory_A01_t03: RuntimeError
+LibTest/io/FileSystemCreateEvent/isDirectory_A01_t04: RuntimeError
+LibTest/io/FileSystemCreateEvent/isDirectory_A01_t05: RuntimeError
+LibTest/io/FileSystemCreateEvent/isDirectory_A01_t06: RuntimeError
+LibTest/io/FileSystemCreateEvent/path_A01_t01: RuntimeError
+LibTest/io/FileSystemCreateEvent/path_A01_t02: RuntimeError
+LibTest/io/FileSystemCreateEvent/path_A01_t03: RuntimeError
+LibTest/io/FileSystemCreateEvent/type_A01_t01: RuntimeError
+LibTest/io/FileSystemCreateEvent/type_A01_t02: RuntimeError
+LibTest/io/FileSystemCreateEvent/type_A01_t03: RuntimeError
+LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t01: RuntimeError
+LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t02: RuntimeError
+LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t03: RuntimeError
+LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t04: RuntimeError
+LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t05: RuntimeError
+LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t06: RuntimeError
+LibTest/io/FileSystemDeleteEvent/path_A01_t01: RuntimeError
+LibTest/io/FileSystemDeleteEvent/path_A01_t02: RuntimeError
+LibTest/io/FileSystemDeleteEvent/path_A01_t03: RuntimeError
+LibTest/io/FileSystemDeleteEvent/type_A01_t01: RuntimeError
+LibTest/io/FileSystemDeleteEvent/type_A01_t02: RuntimeError
+LibTest/io/FileSystemDeleteEvent/type_A01_t03: RuntimeError
+LibTest/io/FileSystemEntity/isDirectorySync_A01_t03: RuntimeError
+LibTest/io/FileSystemEntity/isDirectory_A01_t03: RuntimeError
+LibTest/io/FileSystemEntity/isFileSync_A01_t03: RuntimeError
+LibTest/io/FileSystemEntity/isFile_A01_t01: RuntimeError
+LibTest/io/FileSystemEntity/isFile_A01_t03: RuntimeError
+LibTest/io/FileSystemModifyEvent/contentChanged_A01_t01: RuntimeError
+LibTest/io/FileSystemModifyEvent/isDirectory_A01_t01: RuntimeError
+LibTest/io/FileSystemModifyEvent/isDirectory_A01_t02: RuntimeError
+LibTest/io/FileSystemModifyEvent/path_A01_t01: RuntimeError
+LibTest/io/FileSystemModifyEvent/path_A01_t02: RuntimeError
+LibTest/io/FileSystemModifyEvent/type_A01_t01: RuntimeError
+LibTest/io/FileSystemModifyEvent/type_A01_t02: RuntimeError
+LibTest/io/FileSystemMoveEvent/destination_A01_t01: RuntimeError
+LibTest/io/FileSystemMoveEvent/destination_A01_t02: RuntimeError
+LibTest/io/FileSystemMoveEvent/destination_A01_t03: RuntimeError
+LibTest/io/FileSystemMoveEvent/isDirectory_A01_t01: RuntimeError
+LibTest/io/FileSystemMoveEvent/isDirectory_A01_t02: RuntimeError
+LibTest/io/FileSystemMoveEvent/isDirectory_A01_t03: RuntimeError
+LibTest/io/FileSystemMoveEvent/path_A01_t01: RuntimeError
+LibTest/io/FileSystemMoveEvent/path_A01_t02: RuntimeError
+LibTest/io/FileSystemMoveEvent/path_A01_t03: RuntimeError
+LibTest/io/FileSystemMoveEvent/type_A01_t01: RuntimeError
+LibTest/io/FileSystemMoveEvent/type_A01_t02: RuntimeError
+LibTest/io/FileSystemMoveEvent/type_A01_t03: RuntimeError
+LibTest/io/HttpClient/addCredentials_A03_t01: RuntimeError
+LibTest/io/HttpClient/addProxyCredentials_A03_t01: RuntimeError
+LibTest/io/HttpClient/authenticateProxy_A01_t01: RuntimeError
+LibTest/io/HttpClient/authenticateProxy_A01_t02: RuntimeError
+LibTest/io/HttpClient/authenticateProxy_A02_t01: RuntimeError
+LibTest/io/HttpClient/authenticate_A01_t01: RuntimeError
+LibTest/io/HttpClient/authenticate_A01_t02: RuntimeError
+LibTest/io/HttpClient/authenticate_A02_t01: RuntimeError
+LibTest/io/HttpClient/autoUncompress_A02_t01: RuntimeError
+LibTest/io/HttpClient/autoUncompress_A04_t01: RuntimeError
+LibTest/io/HttpClient/autoUncompress_A04_t03: RuntimeError
+LibTest/io/HttpClient/close_A01_t01: RuntimeError
+LibTest/io/HttpClient/findProxy_A01_t01: RuntimeError
+LibTest/io/HttpClient/findProxy_A01_t02: RuntimeError
+LibTest/io/HttpClient/findProxy_A02_t01: RuntimeError
+LibTest/io/HttpClient/findProxy_A02_t02: RuntimeError
+LibTest/io/HttpClient/findProxy_A03_t01: RuntimeError
+LibTest/io/HttpClient/findProxy_A03_t02: RuntimeError
+LibTest/io/HttpClientBasicCredentials/HttpClientBasicCredentials_A01_t01: RuntimeError
+LibTest/io/HttpClientDigestCredentials/HttpClientDigestCredentials_A01_t01: RuntimeError
+LibTest/io/HttpClientRequest/close_A02_t01: RuntimeError
+LibTest/io/HttpClientRequest/done_A02_t01: RuntimeError
+LibTest/io/HttpClientResponse/certificate_A01_t01: RuntimeError
+LibTest/io/HttpClientResponse/isRedirect_A01_t02: RuntimeError
+LibTest/io/HttpServer/autoCompress_A02_t01: RuntimeError
+LibTest/io/HttpServer/bind_A02_t03: RuntimeError
+LibTest/io/HttpServer/bind_A03_t01: RuntimeError
+LibTest/io/HttpServer/bind_A03_t02: RuntimeError
+LibTest/io/HttpServer/bind_A05_t02: Fail
+LibTest/io/HttpServer/isBroadcast_A01_t01: RuntimeError
+LibTest/io/IOSink/IOSink_class_A01_t01: RuntimeError
+LibTest/io/IOSink/IOSink_class_A02_t01: RuntimeError
+LibTest/io/IOSink/addError_A01_t01: RuntimeError
+LibTest/io/IOSink/addError_A01_t02: RuntimeError
+LibTest/io/IOSink/addError_A01_t03: RuntimeError
+LibTest/io/IOSink/addError_A01_t04: RuntimeError
+LibTest/io/IOSink/addError_A02_t01: RuntimeError
+LibTest/io/IOSink/addError_A02_t02: RuntimeError
+LibTest/io/IOSink/addError_A03_t01: RuntimeError
+LibTest/io/IOSink/addStream_A01_t01: RuntimeError
+LibTest/io/IOSink/addStream_A02_t01: RuntimeError
+LibTest/io/IOSink/addStream_A02_t02: RuntimeError
+LibTest/io/IOSink/add_A01_t01: RuntimeError
+LibTest/io/IOSink/add_A01_t02: RuntimeError
+LibTest/io/IOSink/add_A02_t01: RuntimeError
+LibTest/io/IOSink/add_A03_t01: RuntimeError
+LibTest/io/IOSink/add_A03_t02: RuntimeError
+LibTest/io/IOSink/add_A04_t01: RuntimeError
+LibTest/io/IOSink/close_A01_t01: RuntimeError
+LibTest/io/IOSink/close_A01_t02: RuntimeError
+LibTest/io/IOSink/close_A02_t01: RuntimeError
+LibTest/io/IOSink/flush_A01_t01: RuntimeError
+LibTest/io/IOSink/flush_A02_t01: RuntimeError
+LibTest/io/IOSink/writeAll_A01_t01: RuntimeError
+LibTest/io/IOSink/writeAll_A01_t02: RuntimeError
+LibTest/io/IOSink/writeAll_A01_t03: RuntimeError
+LibTest/io/IOSink/writeAll_A01_t04: RuntimeError
+LibTest/io/IOSink/writeAll_A02_t01: RuntimeError
+LibTest/io/IOSink/writeAll_A02_t02: RuntimeError
+LibTest/io/IOSink/writeAll_A02_t03: RuntimeError
+LibTest/io/IOSink/writeAll_A02_t04: RuntimeError
+LibTest/io/IOSink/writeAll_A02_t05: RuntimeError
+LibTest/io/IOSink/writeCharCode_A01_t01: RuntimeError
+LibTest/io/IOSink/writeCharCode_A01_t02: RuntimeError
+LibTest/io/IOSink/writeCharCode_A01_t03: RuntimeError
+LibTest/io/IOSink/write_A01_t01: RuntimeError
+LibTest/io/IOSink/write_A01_t02: RuntimeError
+LibTest/io/IOSink/write_A01_t03: RuntimeError
+LibTest/io/IOSink/write_A01_t04: RuntimeError
+LibTest/io/IOSink/write_A01_t05: RuntimeError
+LibTest/io/IOSink/write_A01_t06: RuntimeError
+LibTest/io/IOSink/write_A01_t07: RuntimeError
+LibTest/io/IOSink/writeln_A01_t01: RuntimeError
+LibTest/io/IOSink/writeln_A01_t02: RuntimeError
+LibTest/io/InternetAddress/reverse_A01_t01: RuntimeError
+LibTest/io/Link/renameSync_A02_t03: RuntimeError
+LibTest/io/Link/rename_A02_t03: RuntimeError
+LibTest/io/Link/statSync_A01_t01: RuntimeError
+LibTest/io/Link/stat_A01_t01: RuntimeError
+LibTest/io/Link/watch_A01_t01: RuntimeError
+LibTest/io/Process/run_A01_t02: RuntimeError
+LibTest/io/Process/stderr_A01_t01: RuntimeError
+LibTest/io/Process/stdin_A01_t01: RuntimeError
+LibTest/io/Process/stdout_A01_t01: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A01_t01: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A01_t02: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A02_t01: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A02_t02: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A02_t03: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A02_t04: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A03_t01: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A03_t02: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A03_t03: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A04_t01: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A04_t02: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A04_t03: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A04_t04: RuntimeError
+LibTest/io/RandomAccessFile/lockSync_A05_t01: RuntimeError
+LibTest/io/RandomAccessFile/lock_A01_t02: RuntimeError
+LibTest/io/RandomAccessFile/lock_A01_t03: RuntimeError
+LibTest/io/RandomAccessFile/lock_A01_t04: RuntimeError
+LibTest/io/RandomAccessFile/lock_A02_t01: RuntimeError
+LibTest/io/RandomAccessFile/lock_A02_t02: RuntimeError
+LibTest/io/RandomAccessFile/lock_A02_t03: RuntimeError
+LibTest/io/RandomAccessFile/lock_A03_t01: RuntimeError
+LibTest/io/RandomAccessFile/lock_A03_t02: RuntimeError
+LibTest/io/RandomAccessFile/lock_A03_t03: RuntimeError
+LibTest/io/RandomAccessFile/lock_A04_t01: RuntimeError
+LibTest/io/RandomAccessFile/lock_A04_t02: RuntimeError
+LibTest/io/RandomAccessFile/lock_A04_t03: RuntimeError
+LibTest/io/RandomAccessFile/lock_A04_t04: RuntimeError
+LibTest/io/RandomAccessFile/lock_A05_t01: RuntimeError
+LibTest/io/RandomAccessFile/lock_A05_t02: RuntimeError
+LibTest/io/RandomAccessFile/unlockSync_A01_t01: RuntimeError
+LibTest/io/RandomAccessFile/unlockSync_A01_t02: RuntimeError
+LibTest/io/RandomAccessFile/unlockSync_A01_t03: RuntimeError
+LibTest/io/RandomAccessFile/unlockSync_A02_t01: RuntimeError
+LibTest/io/RandomAccessFile/unlock_A01_t02: RuntimeError
+LibTest/io/RandomAccessFile/unlock_A01_t03: RuntimeError
+LibTest/io/RandomAccessFile/unlock_A01_t04: RuntimeError
+LibTest/io/RandomAccessFile/unlock_A02_t01: RuntimeError
+LibTest/io/RawDatagramSocket/any_A01_t01: RuntimeError
+LibTest/io/RawDatagramSocket/any_A01_t04: Timeout
+LibTest/io/RawDatagramSocket/any_A01_t05: Timeout
+LibTest/io/RawDatagramSocket/any_A01_t06: Timeout
+LibTest/io/RawDatagramSocket/any_A01_t07: Timeout
+LibTest/io/RawDatagramSocket/any_A01_t08: Timeout
+LibTest/io/RawDatagramSocket/multicastInterface_A01_t01: RuntimeError
+LibTest/io/RawDatagramSocket/receive_A02_t02: RuntimeError
+LibTest/io/Stdin/echoMode_A01_t01: RuntimeError
+LibTest/io/Stdin/echoMode_A01_t02: RuntimeError
+LibTest/io/Stdin/lineMode_A01_t01: RuntimeError
+LibTest/io/Stdin/lineMode_A01_t02: RuntimeError
+LibTest/io/Stdin/readByteSync_A01_t02: RuntimeError
+LibTest/io/Stdin/readByteSync_A02_t01: RuntimeError
+LibTest/io/Stdin/supportsAnsiEscapes_A02_t01: RuntimeError
+LibTest/io/Stdout/Stdout_class_A02_t01: RuntimeError
+LibTest/io/Stdout/Stdout_class_A03_t01: RuntimeError
+LibTest/io/Stdout/addError_A02_t01: RuntimeError
+LibTest/io/Stdout/addStream_A02_t01: RuntimeError
+LibTest/io/Stdout/addStream_A03_t01: RuntimeError
+LibTest/io/Stdout/addStream_A03_t02: RuntimeError
+LibTest/io/Stdout/add_A03_t01: RuntimeError
+LibTest/io/Stdout/add_A03_t02: RuntimeError
+LibTest/io/Stdout/close_A02_t01: RuntimeError
+LibTest/io/Stdout/close_A02_t02: RuntimeError
+LibTest/io/Stdout/flush_A01_t01: RuntimeError
+LibTest/io/Stdout/flush_A02_t01: RuntimeError
+LibTest/io/Stdout/supportsAnsiEscapes_A02_t01: RuntimeError
+LibTest/io/Stdout/writeAll_A02_t05: RuntimeError
+LibTest/io/Stdout/writeCharCode_A01_t03: RuntimeError
+LibTest/io/SystemEncoding/name_A01_t01: RuntimeError
+LibTest/io/WebSocket/isEmpty_A01_t01: RuntimeError
+LibTest/io/WebSocketTransformer/bind_A01_t01: RuntimeError
+LibTest/io/ZLibDecoder/fuse_A01_t01: RuntimeError
+LibTest/io/ZLibEncoder/fuse_A01_t01: RuntimeError
+LibTest/isolate/Isolate/addOnExitListener_A04_t01: RuntimeError
+LibTest/isolate/Isolate/ping_A03_t02: RuntimeError
+LibTest/isolate/Isolate/ping_A04_t01: RuntimeError
+LibTest/isolate/Isolate/spawnUri_A05_t04: RuntimeError
+LibTest/isolate/Isolate/spawn_A04_t04: RuntimeError
+LibTest/isolate/ReceivePort/any_A01_t01: RuntimeError
+LibTest/isolate/ReceivePort/every_A01_t01: RuntimeError
+LibTest/isolate/ReceivePort/firstWhere_A03_t02: RuntimeError
+LibTest/isolate/ReceivePort/lastWhere_A04_t01: RuntimeError
+LibTest/isolate/ReceivePort/singleWhere_A02_t01: RuntimeError
+LibTest/isolate/ReceivePort/transform_A01_t02: RuntimeError
+LibTest/isolate/SendPort/send_A01_t02: Crash
+LibTest/isolate/SendPort/send_A01_t03: Crash
+LibTest/math/MutableRectangle/MutableRectangle_A03_t04: RuntimeError
+LibTest/math/MutableRectangle/height_A03_t02: RuntimeError
+LibTest/math/MutableRectangle/width_A03_t02: RuntimeError
+LibTest/math/Rectangle/Rectangle_A03_t04: RuntimeError
+LibTest/typed_data/ByteBuffer/asByteData_A01_t01: RuntimeError
+LibTest/typed_data/ByteBuffer/asFloat32List_A01_t01: RuntimeError
+LibTest/typed_data/ByteBuffer/asFloat32x4List_A01_t01: RuntimeError
+LibTest/typed_data/ByteBuffer/asFloat64List_A01_t01: RuntimeError
+LibTest/typed_data/ByteBuffer/asFloat64x2List_A01_t01: RuntimeError
+LibTest/typed_data/ByteBuffer/asInt16List_A01_t01: RuntimeError
+LibTest/typed_data/ByteBuffer/asInt32List_A01_t01: RuntimeError
+LibTest/typed_data/ByteBuffer/asInt32x4List_A01_t01: RuntimeError
+LibTest/typed_data/ByteBuffer/asInt64List_A01_t01: RuntimeError
+LibTest/typed_data/ByteBuffer/asInt8List_A01_t01: RuntimeError
+LibTest/typed_data/ByteBuffer/asUint16List_A01_t01: RuntimeError
+LibTest/typed_data/ByteBuffer/asUint32List_A01_t01: RuntimeError
+LibTest/typed_data/ByteBuffer/asUint64List_A01_t01: RuntimeError
+LibTest/typed_data/ByteBuffer/asUint8ClampedList_A01_t01: RuntimeError
+LibTest/typed_data/ByteBuffer/asUint8List_A01_t01: RuntimeError
+LibTest/typed_data/Float32List/any_A01_t01: RuntimeError
+LibTest/typed_data/Float32List/every_A01_t01: RuntimeError
+LibTest/typed_data/Float32List/first_A01_t02: RuntimeError
+LibTest/typed_data/Float32List/last_A01_t02: RuntimeError
+LibTest/typed_data/Float32x4List/any_A01_t01: RuntimeError
+LibTest/typed_data/Float32x4List/every_A01_t01: RuntimeError
+LibTest/typed_data/Float32x4List/first_A01_t02: RuntimeError
+LibTest/typed_data/Float32x4List/last_A01_t02: RuntimeError
+LibTest/typed_data/Float32x4List/shuffle_A01_t01: RuntimeError
+LibTest/typed_data/Float64List/any_A01_t01: RuntimeError
+LibTest/typed_data/Float64List/every_A01_t01: RuntimeError
+LibTest/typed_data/Float64List/first_A01_t02: RuntimeError
+LibTest/typed_data/Float64List/last_A01_t02: RuntimeError
+LibTest/typed_data/Float64x2List/first_A01_t02: RuntimeError
+LibTest/typed_data/Float64x2List/last_A01_t02: RuntimeError
+LibTest/typed_data/Float64x2List/shuffle_A01_t01: RuntimeError
+LibTest/typed_data/Float64x2List/sort_A01_t01: RuntimeError
+LibTest/typed_data/Int16List/any_A01_t01: RuntimeError
+LibTest/typed_data/Int16List/every_A01_t01: RuntimeError
+LibTest/typed_data/Int16List/first_A01_t02: RuntimeError
+LibTest/typed_data/Int16List/last_A01_t02: RuntimeError
+LibTest/typed_data/Int32List/any_A01_t01: RuntimeError
+LibTest/typed_data/Int32List/every_A01_t01: RuntimeError
+LibTest/typed_data/Int32List/first_A01_t02: RuntimeError
+LibTest/typed_data/Int32List/last_A01_t02: RuntimeError
+LibTest/typed_data/Int32x4List/Int32x4List.fromList_A01_t01: RuntimeError
+LibTest/typed_data/Int32x4List/Int32x4List.fromList_A01_t02: RuntimeError
+LibTest/typed_data/Int32x4List/Int32x4List.view_A01_t01: RuntimeError
+LibTest/typed_data/Int32x4List/clear_A01_t01: RuntimeError
+LibTest/typed_data/Int32x4List/first_A01_t02: RuntimeError
+LibTest/typed_data/Int32x4List/fold_A01_t01: RuntimeError
+LibTest/typed_data/Int32x4List/forEach_A01_t01: RuntimeError
+LibTest/typed_data/Int32x4List/last_A01_t02: RuntimeError
+LibTest/typed_data/Int32x4List/lengthInBytes_A01_t01: RuntimeError
+LibTest/typed_data/Int32x4List/length_A01_t01: RuntimeError
+LibTest/typed_data/Int32x4List/offsetInBytes_A01_t01: RuntimeError
+LibTest/typed_data/Int32x4List/shuffle_A01_t01: RuntimeError
+LibTest/typed_data/Int32x4List/skip_A01_t01: RuntimeError
+LibTest/typed_data/Int32x4List/skip_A02_t01: RuntimeError
+LibTest/typed_data/Int32x4List/sublist_A01_t01: RuntimeError
+LibTest/typed_data/Int32x4List/take_A01_t01: RuntimeError
+LibTest/typed_data/Int32x4List/take_A02_t01: RuntimeError
+LibTest/typed_data/Int64List/any_A01_t01: RuntimeError
+LibTest/typed_data/Int64List/every_A01_t01: RuntimeError
+LibTest/typed_data/Int64List/first_A01_t02: RuntimeError
+LibTest/typed_data/Int64List/last_A01_t02: RuntimeError
+LibTest/typed_data/Int8List/any_A01_t01: RuntimeError
+LibTest/typed_data/Int8List/every_A01_t01: RuntimeError
+LibTest/typed_data/Int8List/first_A01_t02: RuntimeError
+LibTest/typed_data/Int8List/last_A01_t02: RuntimeError
+LibTest/typed_data/Uint16List/any_A01_t01: RuntimeError
+LibTest/typed_data/Uint16List/every_A01_t01: RuntimeError
+LibTest/typed_data/Uint16List/first_A01_t02: RuntimeError
+LibTest/typed_data/Uint16List/last_A01_t02: RuntimeError
+LibTest/typed_data/Uint32List/any_A01_t01: RuntimeError
+LibTest/typed_data/Uint32List/every_A01_t01: RuntimeError
+LibTest/typed_data/Uint32List/first_A01_t02: RuntimeError
+LibTest/typed_data/Uint32List/last_A01_t02: RuntimeError
+LibTest/typed_data/Uint64List/any_A01_t01: RuntimeError
+LibTest/typed_data/Uint64List/every_A01_t01: RuntimeError
+LibTest/typed_data/Uint64List/first_A01_t02: RuntimeError
+LibTest/typed_data/Uint64List/last_A01_t02: RuntimeError
+LibTest/typed_data/Uint8ClampedList/any_A01_t01: RuntimeError
+LibTest/typed_data/Uint8ClampedList/every_A01_t01: RuntimeError
+LibTest/typed_data/Uint8ClampedList/first_A01_t02: RuntimeError
+LibTest/typed_data/Uint8ClampedList/last_A01_t02: RuntimeError
+LibTest/typed_data/Uint8List/any_A01_t01: RuntimeError
+LibTest/typed_data/Uint8List/every_A01_t01: RuntimeError
+LibTest/typed_data/Uint8List/first_A01_t02: RuntimeError
+LibTest/typed_data/Uint8List/last_A01_t02: RuntimeError
+Utils/tests/Expect/throws_A01_t04: RuntimeError
diff --git a/tests/co19_2/co19_2-runtime.status b/tests/co19_2/co19_2-runtime.status
new file mode 100644
index 0000000..5a133f5
--- /dev/null
+++ b/tests/co19_2/co19_2-runtime.status
@@ -0,0 +1,8 @@
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+[ $runtime == dart_precompiled || $runtime == flutter || $runtime == vm ]
+LayoutTests/fast/*: SkipByDesign # DOM not supported on VM.
+LibTest/html/*: SkipByDesign # dart:html not supported on VM.
+WebPlatformTest/*: SkipByDesign # dart:html not supported on VM.
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_typedef.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_typedef.dart
new file mode 100644
index 0000000..892f55e
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_typedef.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../libs/deferred_typedef_lib1.dart' deferred as lib1;
+
+/*element: main:OutputUnit(main, {})*/
+main() async {
+  await lib1.loadLibrary();
+  print(lib1.cA);
+  print(lib1.cB);
+}
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_typedef_lib1.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_typedef_lib1.dart
new file mode 100644
index 0000000..9344b77
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_typedef_lib1.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library deferred_typedef_lib1;
+
+class C {
+  /*element: C.a:OutputUnit(1, {lib1})*/
+  final a;
+
+  /*element: C.b:OutputUnit(1, {lib1})*/
+  final b;
+
+  /*element: C.:OutputUnit(1, {lib1})*/
+  const C(this.a, this.b);
+}
+
+typedef void MyF1();
+
+typedef void MyF2();
+
+/*element: topLevelMethod:OutputUnit(1, {lib1})*/
+topLevelMethod() {}
+
+/*element: cA:OutputUnit(1, {lib1})*/
+const cA = /*OutputUnit(1, {lib1})*/ const C(MyF1, topLevelMethod);
+
+/*element: cB:OutputUnit(1, {lib1})*/
+const cB = /*OutputUnit(1, {lib1})*/ MyF2;
diff --git a/tests/compiler/dart2js/old_frontend/mock_compiler.dart b/tests/compiler/dart2js/old_frontend/mock_compiler.dart
index 239aceb..94ea07a 100644
--- a/tests/compiler/dart2js/old_frontend/mock_compiler.dart
+++ b/tests/compiler/dart2js/old_frontend/mock_compiler.dart
@@ -282,7 +282,7 @@
   }
 
   /// Create a new [MockCompiler] and apply it asynchronously to [f].
-  static Future<T> create<T>(T f(MockCompiler compiler)) {
+  static Future<T> create<T>(FutureOr<T> f(MockCompiler compiler)) {
     MockCompiler compiler = new MockCompiler.internal();
     return compiler.init().then((_) => f(compiler));
   }
diff --git a/tests/compiler/dart2js/old_frontend/parser_test.dart b/tests/compiler/dart2js/old_frontend/parser_test.dart
index 0ef19e8..c4f9881 100644
--- a/tests/compiler/dart2js/old_frontend/parser_test.dart
+++ b/tests/compiler/dart2js/old_frontend/parser_test.dart
@@ -361,21 +361,6 @@
   Expect.throws(parse, check);
 }
 
-void testUnmatchedAngleBracket() {
-  final String source = 'A<'; // unmatched '<'
-  parse() {
-    fullParseUnit(source, reporter: new Collector());
-  }
-
-  check(exn) {
-    Collector c = exn;
-    Expect.equals(LT_TOKEN, c.token);
-    return true;
-  }
-
-  Expect.throws(parse, check);
-}
-
 void main() {
   testGenericTypes();
   // TODO(ahe): Enable this test when we handle library prefixes.
@@ -393,5 +378,4 @@
   testOperatorParse();
   testMissingCloseParen();
   testMissingCloseBraceInClass();
-  testUnmatchedAngleBracket();
 }
diff --git a/tests/compiler/dart2js/rti/data/generic_class_instantiate.dart b/tests/compiler/dart2js/rti/data/generic_class_instantiate.dart
index c0c24b1..8bf986a 100644
--- a/tests/compiler/dart2js/rti/data/generic_class_instantiate.dart
+++ b/tests/compiler/dart2js/rti/data/generic_class_instantiate.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.
 
-/*class: A:explicit=[B<A>],required*/
+/*class: A:arg,explicit=[B<A>]*/
 class A {}
 
 /*class: B:deps=[C],explicit=[B<A>],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/generic_class_is.dart b/tests/compiler/dart2js/rti/data/generic_class_is.dart
index ad3cf6c..d82f758 100644
--- a/tests/compiler/dart2js/rti/data/generic_class_is.dart
+++ b/tests/compiler/dart2js/rti/data/generic_class_is.dart
@@ -4,7 +4,7 @@
 
 import 'package:meta/dart2js.dart';
 
-/*class: A:checks=[A],implicit=[A],required*/
+/*class: A:arg,checked,implicit=[A]*/
 class A {}
 
 /*class: B:direct,explicit=[B.T],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/generic_class_is2.dart b/tests/compiler/dart2js/rti/data/generic_class_is2.dart
new file mode 100644
index 0000000..612fe1d
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/generic_class_is2.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:meta/dart2js.dart';
+
+// TODO(johnniwinther): A, C and C2 should be checked or A1, C1, and C2 should
+// have checks againts A, C and C, respectively.
+/*class: A:arg,checks=[A],implicit=[List<A<C2>>,List<A<C>>]*/
+class A<T> {}
+
+/*class: A1:arg,checks=[A]*/
+class A1 implements A<C1> {}
+
+/*class: B:direct,explicit=[B.T],needsArgs*/
+class B<T> {
+  @noInline
+  method(var t) => t is T;
+}
+
+/*class: C:arg,checks=[C],implicit=[List<A<C>>]*/
+class C {}
+
+/*class: C1:arg*/
+class C1 implements C {}
+
+/*class: C2:arg,checks=[C,C2],implicit=[List<A<C2>>]*/
+class C2 implements C {}
+
+main() {
+  Expect.isTrue(new B<List<A<C>>>().method(new List<A1>()));
+  Expect.isFalse(new B<List<A<C2>>>().method(new List<A1>()));
+}
diff --git a/tests/compiler/dart2js/rti/data/generic_closure_instantiate.dart b/tests/compiler/dart2js/rti/data/generic_closure_instantiate.dart
index 8fc9584..cc83ed0 100644
--- a/tests/compiler/dart2js/rti/data/generic_closure_instantiate.dart
+++ b/tests/compiler/dart2js/rti/data/generic_closure_instantiate.dart
@@ -6,7 +6,7 @@
 class A {}
 
 /*ast.class: B:deps=[closure],explicit=[B<A>],needsArgs*/
-/*kernel.class: B:deps=[closure],explicit=[B<A>],needsArgs,required*/
+/*kernel.class: B:arg,checks=[B],deps=[closure],explicit=[B<A>],needsArgs*/
 class B<T> {}
 
 main() {
diff --git a/tests/compiler/dart2js/rti/data/generic_instanceof4.dart b/tests/compiler/dart2js/rti/data/generic_instanceof4.dart
index 0da5574..b035806 100644
--- a/tests/compiler/dart2js/rti/data/generic_instanceof4.dart
+++ b/tests/compiler/dart2js/rti/data/generic_instanceof4.dart
@@ -12,7 +12,7 @@
   }
 }
 
-/*class: BB:checks=[BB],implicit=[BB],required*/
+/*class: BB:arg,checked,implicit=[BB]*/
 class BB {}
 
 /*class: B:implicit=[B.T],indirect,needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/generic_method1_strong.dart b/tests/compiler/dart2js/rti/data/generic_method1_strong.dart
index 7549db2..376861d 100644
--- a/tests/compiler/dart2js/rti/data/generic_method1_strong.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method1_strong.dart
@@ -13,16 +13,15 @@
   }
 }
 
-// TODO(johnniwinther): Should include 'required'. Update the 'checkedArguments'
+// TODO(johnniwinther): Should include 'arg'. Update the 'checkedArguments'
 // computation to take method type arguments into account.
-/*class: BB:implicit=[BB]*/
+/*class: BB:checked,implicit=[BB]*/
 class BB {}
 
 /*element: method2:deps=[B],implicit=[method2.T],indirect,needsArgs*/
 @noInline
 method2<T>() => new A<T>();
 
-// TODO(johnniwinther): Should include 'checks=[BB]'.
 /*class: B:deps=[method1],implicit=[B.T],indirect,needsArgs*/
 class B<T> implements BB {
   @noInline
diff --git a/tests/compiler/dart2js/rti/data/generic_method2_strong.dart b/tests/compiler/dart2js/rti/data/generic_method2_strong.dart
index 27a1d49..1235481 100644
--- a/tests/compiler/dart2js/rti/data/generic_method2_strong.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method2_strong.dart
@@ -13,7 +13,9 @@
   }
 }
 
-/*class: BB:implicit=[BB]*/
+// TODO(johnniwinther): Should include 'arg'. Update the 'checkedArguments'
+// computation to take method type arguments into account.
+/*class: BB:checked,implicit=[BB]*/
 class BB {}
 
 /*class: B:deps=[method1],implicit=[B.T],indirect,needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/generic_method3_strong.dart b/tests/compiler/dart2js/rti/data/generic_method3_strong.dart
index 3e7bc03..dddc5f0 100644
--- a/tests/compiler/dart2js/rti/data/generic_method3_strong.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method3_strong.dart
@@ -13,14 +13,13 @@
   }
 }
 
-/*class: BB:checks=[BB],implicit=[BB],required*/
+/*class: BB:arg,checked,implicit=[BB]*/
 class BB {}
 
 /*element: method2:deps=[B],implicit=[method2.T],indirect,needsArgs*/
 @noInline
 method2<T>() => new A<T>();
 
-// TODO(johnniwinther): Should include 'checks=[BB]'.
 /*class: B:implicit=[B.T],indirect,needsArgs*/
 class B<T> implements BB {
   @noInline
diff --git a/tests/compiler/dart2js/rti/data/generic_method_is_strong.dart b/tests/compiler/dart2js/rti/data/generic_method_is_strong.dart
index db9a3f7..bcd1f4b 100644
--- a/tests/compiler/dart2js/rti/data/generic_method_is_strong.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method_is_strong.dart
@@ -12,29 +12,30 @@
 
 class B2 {}
 
-/*class: C1:implicit=[C1]*/
+/*class: C1:checked,implicit=[C1]*/
 class C1 {}
 
 class C2 {}
 
+/*class: C3:checked*/
 class C3 {}
 
-/*class: D1:implicit=[D1]*/
+/*class: D1:checked,implicit=[D1]*/
 class D1 {}
 
 class D2 {}
 
-/*class: E1:implicit=[E1]*/
+/*class: E1:checked,implicit=[E1]*/
 class E1 {}
 
 class E2 {}
 
-/*class: F1:implicit=[F1]*/
+/*class: F1:checked,implicit=[F1]*/
 class F1 {}
 
 class F2 {}
 
-/*class: F3:implicit=[F3]*/
+/*class: F3:checked,implicit=[F3]*/
 class F3 {}
 
 /*element: topLevelMethod1:direct,explicit=[topLevelMethod1.T],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/list_to_set.dart b/tests/compiler/dart2js/rti/data/list_to_set.dart
index bdb8503..fd08537 100644
--- a/tests/compiler/dart2js/rti/data/list_to_set.dart
+++ b/tests/compiler/dart2js/rti/data/list_to_set.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /*class: global#List:deps=[Class],explicit=[List],indirect,needsArgs*/
-/*class: global#JSArray:deps=[List],explicit=[JSArray],implicit=[JSArray.E],indirect,needsArgs*/
+/*class: global#JSArray:checked,deps=[List],explicit=[JSArray],implicit=[JSArray.E],indirect,needsArgs*/
 
 main() {
   var c = new Class<int>();
diff --git a/tests/compiler/dart2js/rti/data/map_literal.dart b/tests/compiler/dart2js/rti/data/map_literal.dart
index 8b7bb96..409bb7d 100644
--- a/tests/compiler/dart2js/rti/data/map_literal.dart
+++ b/tests/compiler/dart2js/rti/data/map_literal.dart
@@ -5,7 +5,8 @@
 /*class: global#Map:*/
 /*class: global#LinkedHashMap:deps=[Map]*/
 /*class: global#JsLinkedHashMap:deps=[LinkedHashMap]*/
-/*class: global#double:checks=[num],explicit=[double],required*/
+/*class: global#double:arg,explicit=[double]*/
+/*class: global#JSDouble:*/
 
 main() {
   <int, double>{}[0] = 0.5;
diff --git a/tests/compiler/dart2js/rti/data/map_literal_checked.dart b/tests/compiler/dart2js/rti/data/map_literal_checked.dart
index c9f25c1..a6dc521 100644
--- a/tests/compiler/dart2js/rti/data/map_literal_checked.dart
+++ b/tests/compiler/dart2js/rti/data/map_literal_checked.dart
@@ -2,10 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*class: global#Map:explicit=[Map],indirect,needsArgs*/
-/*class: global#LinkedHashMap:deps=[Map],explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.KLinkedHashMap.V],indirect,needsArgs*/
-/*class: global#JsLinkedHashMap:deps=[LinkedHashMap],direct,explicit=[JsLinkedHashMap.KJsLinkedHashMap.VJsLinkedHashMap<JsLinkedHashMap.K,JsLinkedHashMap.V>void Function(JsLinkedHashMap.K,JsLinkedHashMap.V)],implicit=[JsLinkedHashMap.KJsLinkedHashMap.V],needsArgs*/
-/*class: global#double:checks=[double,num,Object],explicit=[double],implicit=[double],required*/
+/*class: global#Map:checked,explicit=[Map],indirect,needsArgs*/
+/*class: global#LinkedHashMap:checked,deps=[Map],explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],indirect,needsArgs*/
+/*class: global#JsLinkedHashMap:checked,deps=[LinkedHashMap],direct,explicit=[JsLinkedHashMap.K,JsLinkedHashMap.V,JsLinkedHashMap<JsLinkedHashMap.K,JsLinkedHashMap.V>,void Function(JsLinkedHashMap.K,JsLinkedHashMap.V)],implicit=[JsLinkedHashMap.K,JsLinkedHashMap.V],needsArgs*/
+/*class: global#double:arg,checked,explicit=[double],implicit=[double]*/
+/*class: global#JSDouble:*/
 
 main() {
   <int, double>{}[0] = 0.5;
diff --git a/tests/compiler/dart2js/rti/data/map_to_set.dart b/tests/compiler/dart2js/rti/data/map_to_set.dart
index 2d79522..2d8037c 100644
--- a/tests/compiler/dart2js/rti/data/map_to_set.dart
+++ b/tests/compiler/dart2js/rti/data/map_to_set.dart
@@ -5,7 +5,8 @@
 /*class: global#Map:deps=[Class],needsArgs*/
 /*class: global#LinkedHashMap:deps=[Map],needsArgs*/
 /*class: global#JsLinkedHashMap:deps=[LinkedHashMap],implicit=[JsLinkedHashMap.K],needsArgs*/
-/*class: global#double:checks=[num],explicit=[double],required*/
+/*class: global#double:arg,explicit=[double]*/
+/*class: global#JSDouble:*/
 
 main() {
   var c = new Class<double, int>();
diff --git a/tests/compiler/dart2js/rti/data/subtype_named_args.dart b/tests/compiler/dart2js/rti/data/subtype_named_args.dart
new file mode 100644
index 0000000..10e7145
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/subtype_named_args.dart
@@ -0,0 +1,80 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// From co19/Language/Types/Function_Types/subtype_named_args_t02.
+
+import 'package:expect/expect.dart';
+
+/*ast.class: A:arg,checks=[A,Object],explicit=[dynamic Function({a:A,b:B,c:C,d:D}),dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>})]*/
+/*kernel.class: A:arg,checks=[A,Object],explicit=[dynamic Function({a:A,b:B,c:C,d:D}),dynamic Function({f1:dynamic Function({a:A,b:B,c:C,d:D}),f2:dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>}),f3:dynamic Function({v:dynamic,x:dynamic,y:dynamic,z:dynamic})}),dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>})]*/
+class A {}
+
+/*class: A1:arg,checks=[A1,Object]*/
+class A1 {}
+
+/*class: A2:arg,checks=[A2,Object]*/
+class A2 {}
+
+/*ast.class: B:arg,checks=[A,A1,A2,B,Object],explicit=[dynamic Function({a:A,b:B,c:C,d:D}),dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>})]*/
+/*kernel.class: B:arg,checks=[A,A1,A2,B,Object],explicit=[dynamic Function({a:A,b:B,c:C,d:D}),dynamic Function({f1:dynamic Function({a:A,b:B,c:C,d:D}),f2:dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>}),f3:dynamic Function({v:dynamic,x:dynamic,y:dynamic,z:dynamic})}),dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>})]*/
+class B implements A, A1, A2 {}
+
+/*ast.class: C:arg,checks=[A,A1,A2,B,C,Object],explicit=[dynamic Function({a:A,b:B,c:C,d:D}),dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>})]*/
+/*kernel.class: C:arg,checks=[A,A1,A2,B,C,Object],explicit=[dynamic Function({a:A,b:B,c:C,d:D}),dynamic Function({f1:dynamic Function({a:A,b:B,c:C,d:D}),f2:dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>}),f3:dynamic Function({v:dynamic,x:dynamic,y:dynamic,z:dynamic})}),dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>})]*/
+class C implements B {}
+
+/*ast.class: D:arg,checks=[A,A1,A2,B,C,D,Object],explicit=[dynamic Function({a:A,b:B,c:C,d:D}),dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>})]*/
+/*kernel.class: D:arg,checks=[A,A1,A2,B,C,D,Object],explicit=[dynamic Function({a:A,b:B,c:C,d:D}),dynamic Function({f1:dynamic Function({a:A,b:B,c:C,d:D}),f2:dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>}),f3:dynamic Function({v:dynamic,x:dynamic,y:dynamic,z:dynamic})}),dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>})]*/
+class D implements C {}
+
+/*ast.class: G:arg,checks=[G,Object],explicit=[dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>})]*/
+/*kernel.class: G:arg,checks=[G,Object],explicit=[dynamic Function({f1:dynamic Function({a:A,b:B,c:C,d:D}),f2:dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>}),f3:dynamic Function({v:dynamic,x:dynamic,y:dynamic,z:dynamic})}),dynamic Function({g:G<A,B,C,D>,l:List<List<B>>,m:Map<num,int>})]*/
+class G<T, S, U, W> {}
+
+typedef classesFunc({A a, B b, C c, D d});
+typedef genericsFunc({Map<num, int> m, List<List<B>> l, G<A, B, C, D> g});
+typedef dynamicFunc({var x, var y, var z, var v});
+typedef funcFunc({classesFunc f1, genericsFunc f2, dynamicFunc f3});
+typedef mixFunc({var x, B b, G<A, B, C, D> g, funcFunc f});
+
+typedef okWithClassesFunc_1({A a, A1 b, A1 c, A1 d});
+typedef okWithClassesFunc_2({D a, D b, D c, D d});
+
+typedef okWithGenericsFunc_1(
+    {Map<num, num> m, List<List<A1>> l, G<A, A1, A1, A1> g});
+typedef okWithGenericsFunc_2(
+    {Map<int, int> m, List<List<D>> l, G<D, D, D, D> g});
+
+typedef okWithDynamicFunc_1({A x, G y, mixFunc z, var v});
+typedef okWithDynamicFunc_2({int x, bool y, List<Map> z, classesFunc v});
+
+main() {
+  Expect.isTrue(({D a, B b, C c, A d}) {} is classesFunc);
+  Expect.isTrue(({A a, A b, A c, A d}) {} is classesFunc);
+  Expect.isTrue(({D a, A1 b, A1 c, A1 d}) {} is classesFunc);
+  Expect.isTrue(({D a, A2 b, A2 c, A2 d}) {} is classesFunc);
+  Expect.isTrue(({D a, D b, D c, D d}) {} is classesFunc);
+  Expect.isTrue(({var a, var b, var c, var d}) {} is classesFunc);
+  Expect.isTrue(({Object a, Object b, Object c, Object d}) {} is classesFunc);
+
+  Expect.isTrue(({Map<num, num> m, List<List<A1>> l, G<A, A1, A1, A1> g}) {}
+      is genericsFunc);
+  Expect.isTrue(
+      ({Map<int, int> m, List<List<D>> l, G<D, D, D, D> g}) {} is genericsFunc);
+  Expect.isTrue(({var m, var l, var g}) {} is genericsFunc);
+  Expect.isTrue(({Object m, Object l, Object g}) {} is genericsFunc);
+
+  Expect.isTrue(({A x, G y, mixFunc z, var v}) {} is dynamicFunc);
+  Expect
+      .isTrue(({int x, bool y, List<Map> z, classesFunc v}) {} is dynamicFunc);
+
+  Expect.isTrue((
+      {okWithClassesFunc_1 f1,
+      okWithGenericsFunc_1 f2,
+      okWithDynamicFunc_1 f3}) {} is funcFunc);
+  Expect.isTrue((
+      {okWithClassesFunc_2 f1,
+      okWithGenericsFunc_2 f2,
+      okWithDynamicFunc_2 f3}) {} is funcFunc);
+}
diff --git a/tests/compiler/dart2js/rti/data/type_argument_substitution.dart b/tests/compiler/dart2js/rti/data/type_argument_substitution.dart
new file mode 100644
index 0000000..c1e227e
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/type_argument_substitution.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that substitutions are emitted for classes that are only used as
+// type arguments.
+
+import 'package:expect/expect.dart';
+
+/*class: K:arg*/
+class K {}
+
+/*class: A:arg,checks=[A],explicit=[X<A<String>>]*/
+class A<T> {}
+
+/*class: B:arg,checks=[A]*/
+class B extends A<K> {}
+
+/*class: X:checked,explicit=[X<A<String>>],needsArgs*/
+class X<T> {}
+
+main() {
+  var v = new DateTime.now().millisecondsSinceEpoch != 42
+      ? new X<B>()
+      : new X<A<String>>();
+  Expect.isFalse(v is X<A<String>>);
+}
diff --git a/tests/compiler/dart2js/rti/rti_need_test.dart b/tests/compiler/dart2js/rti/rti_need_test.dart
index bcac3f2..75a94d4 100644
--- a/tests/compiler/dart2js/rti/rti_need_test.dart
+++ b/tests/compiler/dart2js/rti/rti_need_test.dart
@@ -12,6 +12,7 @@
 import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
 import 'package:compiler/src/elements/elements.dart';
 import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/elements/resolution_types.dart';
 import 'package:compiler/src/elements/types.dart';
 import 'package:compiler/src/tree/nodes.dart' as ast;
 import 'package:compiler/src/js_backend/runtime_types.dart';
@@ -70,8 +71,23 @@
   static const String directTypeArgumentTest = 'direct';
   static const String indirectTypeArgumentTest = 'indirect';
   static const String typeLiteral = 'exp';
-  static const String requiredArgumentClass = 'required';
   static const String typeChecks = 'checks';
+
+  /// This class is needed as a checked type argument.
+  ///
+  /// For instance directly in `String` in `o is List<String>` or indirectly
+  /// as `String` in
+  ///
+  ///   class C<T> {
+  ///     method(o) => o is T;
+  ///   }
+  ///   main() => new C<String>().method('');
+  static const String argumentClass = 'arg';
+
+  // Objects are checked against this class.
+  //
+  // For instance `String` in `o is String`.
+  static const String checkedClass = 'checked';
 }
 
 abstract class ComputeValueMixin<T> {
@@ -84,11 +100,7 @@
   RuntimeTypesNeed get rtiNeed => compiler.backendClosedWorldForTesting.rtiNeed;
   RuntimeTypesChecks get rtiChecks =>
       compiler.backend.emitter.typeTestRegistry.rtiChecks;
-  TypeChecks get requiredChecks =>
-      // TODO(johnniwinther): This should have been
-      //   rtiChecks.requiredChecks;
-      // but it is incomplete and extended? by this:
-      compiler.backend.emitter.typeTestRegistry.requiredChecks;
+  TypeChecks get requiredChecks => rtiChecks.requiredChecks;
   ClassEntity getFrontendClass(ClassEntity cls);
   MemberEntity getFrontendMember(MemberEntity member);
   Local getFrontendClosure(MemberEntity member);
@@ -104,7 +116,7 @@
     }
     List<String> list = types.map(typeToString).toList()..sort();
     if (list.isNotEmpty) {
-      features[key] = '[${list.join('')}]';
+      features[key] = '[${list.join(',')}]';
     }
   }
 
@@ -140,13 +152,16 @@
         rtiNeedBuilder.typeVariableTests.explicitIsChecks);
     findChecks(features, Tags.implicitTypeCheck, frontendClass,
         rtiNeedBuilder.typeVariableTests.implicitIsChecks);
+    if (rtiChecks.checkedClasses.contains(backendClass)) {
+      features.add(Tags.checkedClass);
+    }
     if (rtiChecks.getRequiredArgumentClasses().contains(backendClass)) {
-      features.add(Tags.requiredArgumentClass);
+      features.add(Tags.argumentClass);
     }
     Iterable<TypeCheck> checks = requiredChecks[backendClass];
     if (checks.isNotEmpty) {
       features[Tags.typeChecks] =
-          '[${checks.map((c) => c.cls.name).join(',')}]';
+          '[${(checks.map((c) => c.cls.name).toList()..sort()).join(',')}]';
     }
     return features.getText();
   }
@@ -203,7 +218,7 @@
 }
 
 /// Visitor that determines whether a type refers to [entity].
-class FindTypeVisitor extends BaseDartTypeVisitor<bool, Null> {
+class FindTypeVisitor extends BaseResolutionDartTypeVisitor<bool, Null> {
   final Entity entity;
 
   FindTypeVisitor(this.entity);
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index 5065972..441c6d5 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -11,6 +11,7 @@
 local_function_call_test: RuntimeError # Issue 31879
 mirror_printer_test: Pass, Slow # Issue 25940, 16473
 mirrors_used_closure_test: Fail # Issue 17939
+generic_class_is_test: Fail # Issue 32004
 no_such_method_test: Fail # Wrong Invocation.memberName.
 statements_test: Fail
 typed_locals_test: Pass, Fail
@@ -84,7 +85,6 @@
 deferred_fail_and_retry_worker_test: Fail
 dummy_compiler_test: CompileTimeError
 invalid_annotation2_test/none: RuntimeError
-label_test/06: MissingCompileTimeError
 minus_zero_test/01: MissingCompileTimeError
 mirror_invalid_field_access2_test: RuntimeError
 mirror_invalid_field_access3_test: RuntimeError
@@ -132,7 +132,6 @@
 deferred/reflect_multiple_default_arg_test: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred_fail_and_retry_test: RuntimeError
 deferred_fail_and_retry_worker_test: Fail
-label_test/06: MissingCompileTimeError
 mirror_enqueuer_regression_test: Pass
 private_symbol_literal_test/01: MissingCompileTimeError
 private_symbol_literal_test/02: MissingCompileTimeError
@@ -160,7 +159,6 @@
 deferred_fail_and_retry_worker_test: Fail
 inference_nsm_mirrors_test: CompileTimeError
 invalid_annotation2_test/none: CompileTimeError
-label_test/06: MissingCompileTimeError
 mirror_enqueuer_regression_test: CompileTimeError
 mirror_invalid_field_access2_test: CompileTimeError
 mirror_invalid_field_access3_test: CompileTimeError
@@ -209,7 +207,6 @@
 dummy_compiler_test: CompileTimeError
 inference_nsm_mirrors_test: CompileTimeError
 invalid_annotation2_test/none: CompileTimeError
-label_test/06: MissingCompileTimeError
 mirror_enqueuer_regression_test: CompileTimeError
 mirror_invalid_field_access2_test: CompileTimeError
 mirror_invalid_field_access3_test: CompileTimeError
diff --git a/tests/compiler/dart2js_extra/generic_class_is_test.dart b/tests/compiler/dart2js_extra/generic_class_is_test.dart
new file mode 100644
index 0000000..d97cb7c
--- /dev/null
+++ b/tests/compiler/dart2js_extra/generic_class_is_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:meta/dart2js.dart';
+
+class A<T> {}
+
+class A1 implements A<C1> {}
+
+class B<T> {
+  @noInline
+  method(var t) => t is T;
+}
+
+class C {}
+
+class C1 implements C {}
+
+class C2 implements C {}
+
+main() {
+  Expect.isTrue(new B<List<A<C>>>().method(new List<A1>()));
+  Expect.isFalse(new B<List<A<C2>>>().method(new List<A1>()));
+}
diff --git a/tests/compiler/dart2js_extra/recursive_metadata_test.dart b/tests/compiler/dart2js_extra/recursive_metadata_test.dart
new file mode 100644
index 0000000..1c46209
--- /dev/null
+++ b/tests/compiler/dart2js_extra/recursive_metadata_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+// Tests that the compiler doesn't crash resolving annotations that refer
+// to other annotated types.
+
+class Annotation {
+  final String value;
+  const Annotation({this.value});
+}
+
+enum Enum {
+  a,
+  b,
+}
+
+class SubAnno extends Annotation {
+  final Enum e;
+  final Type type;
+  const SubAnno({String value, this.e, this.type}) : super(value: value);
+}
+
+@SubAnno(value: 'super')
+class A {}
+
+@SubAnno(value: 'sub')
+class B extends A {}
+
+@SubAnno(type: B)
+class C {}
+
+main() {
+  var c = new C();
+  Expect.isTrue(c != null);
+}
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index b4055c8..0fa1d5c 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -3,12 +3,51 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dart2analyzer ]
+big_integer_arith_vm_test/add: CompileTimeError # int64
+big_integer_arith_vm_test/div: CompileTimeError # int64
+big_integer_arith_vm_test/gcd: CompileTimeError # int64
+big_integer_arith_vm_test/mod: CompileTimeError # int64
+big_integer_arith_vm_test/modInv: CompileTimeError # int64
+big_integer_arith_vm_test/modPow: CompileTimeError # int64
+big_integer_arith_vm_test/mul: CompileTimeError # int64
+big_integer_arith_vm_test/negate: CompileTimeError # int64
+big_integer_arith_vm_test/none: CompileTimeError # int64
+big_integer_arith_vm_test/overflow: CompileTimeError # int64
+big_integer_arith_vm_test/shift: CompileTimeError # int64
+big_integer_arith_vm_test/sub: CompileTimeError # int64
+big_integer_arith_vm_test/trunDiv: CompileTimeError # int64
+bit_twiddling_bigint_test: CompileTimeError # int64
+bit_twiddling_test: CompileTimeError # int64
+double_ceil_test: CompileTimeError # int64
+double_floor_test: CompileTimeError # int64
+double_round_test: CompileTimeError # int64
+double_truncate_test: CompileTimeError # int64
 duration2_test: StaticWarning, OK # Test generates error on purpose.
 error_stack_trace_test: StaticWarning, OK # Test generates errors on purpose.
 hash_set_type_check_test: StaticWarning, OK # Tests failing type tests.
+int_ceil_test: CompileTimeError # int64
+int_ceil_to_double_test: CompileTimeError # int64
+int_floor_test: CompileTimeError # int64
+int_floor_to_double_test: CompileTimeError # int64
+int_from_environment_test: CompileTimeError # int64
+int_modulo_arith_test/bignum: CompileTimeError # int64
+int_modulo_arith_test/modPow: CompileTimeError # int64
+int_modulo_arith_test/none: CompileTimeError # int64
 int_parse_radix_bad_handler_test: Fail
+int_parse_radix_test/02: CompileTimeError # int64
+int_round_test: CompileTimeError # int64
+int_round_to_double_test: CompileTimeError # int64
+int_to_int_test: CompileTimeError # int64
+int_truncate_test: CompileTimeError # int64
+int_truncate_to_double_test: CompileTimeError # int64
+integer_to_radix_string_test: CompileTimeError # int64
+integer_to_string_test/01: CompileTimeError # int64
 iterable_element_at_test: StaticWarning, OK # Test generates errors on purpose.
 num_clamp_test: StaticWarning, OK # Test generates errors on purpose.
+num_parse_test/01: CompileTimeError # int64
+num_parse_test/none: CompileTimeError # int64
+num_sign_test: CompileTimeError # int64
+regress_r21715_test: CompileTimeError # int64
 string_test: StaticWarning, OK # Test generates error on purpose.
 
 [ $compiler == dart2js ]
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index a5abcca..3ba808b 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -3,6 +3,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dart2analyzer ]
+compare_to2_test: CompileTimeError # invalid test
 int_parse_radix_bad_handler_test: MissingCompileTimeError
 iterable_element_at_test/static: Pass
 num_sign_test: Crash, Pass # Issue 31768
@@ -130,14 +131,14 @@
 [ $compiler == dart2js && $runtime == drt && $csp && !$dart2js_with_kernel && $minified ]
 core_runtime_types_test: Pass, Fail # Issue 27913
 
+[ $compiler == dart2js && $runtime != none ]
+regexp/pcre_test: Pass, Slow # Issue 21593
+
 [ $compiler == dart2js && $runtime != none && !$checked && !$dart2js_with_kernel ]
 growable_list_test: RuntimeError # Concurrent modifications test always runs
 splay_tree_from_iterable_test: RuntimeError
 string_split_test/checkedstore: RuntimeError # Issue 30548: does not check stores into List<String>
 
-[ $compiler == dart2js && $runtime != none ]
-regexp/pcre_test: Pass, Slow # Issue 21593
-
 [ $compiler == dart2js && $runtime != none && !$dart2js_with_kernel ]
 error_stack_trace1_test: RuntimeError # Issue 12399
 int_parse_radix_test/01: RuntimeError
@@ -181,6 +182,7 @@
 iterable_return_type_test/01: RuntimeError
 iterable_return_type_test/02: RuntimeError
 iterable_to_list_test/01: RuntimeError
+list_replace_range_test: RuntimeError # Issue 32010
 list_test/01: Crash # Unsupported operation: Unsupported type parameter type node T.
 list_test/none: Crash # Unsupported operation: Unsupported type parameter type node T.
 map_test: Crash # tests/corelib_2/map_test.dart:903:7: Internal problem: Unhandled Null in installDefaultConstructor.
@@ -250,6 +252,8 @@
 list_concurrent_modify_test: RuntimeError
 list_filled_type_argument_test: RuntimeError
 list_insert_all_test: RuntimeError
+list_replace_range_test: RuntimeError
+list_set_all_test: RuntimeError
 list_test/01: RuntimeError
 list_test/none: RuntimeError
 list_unmodifiable_test: Crash # Assertion failure: Unexpected arguments. Expected 1 argument, actual: [invoke dynamic getter: selector=Selector(getter, length, arity=0), mask=[subtype=SetMixin], HTypeInfoReadVariable(SetMixin.E)].
@@ -313,6 +317,8 @@
 list_concurrent_modify_test: RuntimeError
 list_filled_type_argument_test: RuntimeError
 list_insert_all_test: RuntimeError
+list_replace_range_test: RuntimeError # Issue 32010
+list_set_all_test: RuntimeError # Issue 32010
 list_test/01: RuntimeError
 list_test/none: RuntimeError
 list_unmodifiable_test: Crash # Wrong number of template arguments, given 2, expected 1
@@ -380,6 +386,7 @@
 iterable_mapping_test/01: MissingCompileTimeError
 
 [ $compiler == dartdevc && $runtime != none ]
+compare_to2_test: CompileTimeError # invalid test
 symbol_operator_test: RuntimeError # Issue 29921
 
 [ $compiler != dartdevc && $compiler != dartdevk && $checked && !$strong ]
@@ -406,9 +413,6 @@
 bool_from_environment2_test/03: MissingCompileTimeError
 iterable_to_list_test/01: RuntimeError
 iterable_to_list_test/none: RuntimeError
-json_map_test: RuntimeError
-list_replace_range_test: RuntimeError
-list_set_all_test: RuntimeError
 null_nosuchmethod_test/01: CompileTimeError # Issue 31402 (Invocation arguments)
 null_nosuchmethod_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
 string_from_environment3_test/03: MissingCompileTimeError # Issue 31936 - throwing const constructors.
@@ -429,9 +433,6 @@
 bool_from_environment2_test/03: MissingCompileTimeError
 iterable_to_list_test/01: RuntimeError
 iterable_to_list_test/none: RuntimeError
-json_map_test: RuntimeError
-list_replace_range_test: RuntimeError
-list_set_all_test: RuntimeError
 null_nosuchmethod_test/01: CompileTimeError # Issue 31402 (Invocation arguments)
 null_nosuchmethod_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
 regexp/stack-overflow_test: RuntimeError
@@ -494,7 +495,6 @@
 integer_parsed_arith_vm_test: RuntimeError # Issues 10245, 29921
 integer_parsed_div_rem_vm_test: RuntimeError # Issue 29921
 integer_parsed_mul_div_vm_test: RuntimeError # Issue 29921
-json_map_test: RuntimeError
 regress_r21715_test: RuntimeError # Requires fixed-size int64 support.
 typed_data_with_limited_ints_test: Skip # dart2js and dartdevc don't know about --limit-ints-to-64-bits
 
@@ -516,11 +516,8 @@
 integer_to_string_test/01: RuntimeError # Issue 29921
 iterable_return_type_test/02: RuntimeError # Issue 29921
 iterable_to_list_test/*: RuntimeError
-json_map_test: RuntimeError # Issue 29921
 list_concurrent_modify_test: RuntimeError # DDC uses ES6 array iterators so it does not issue this
 list_removeat_test: RuntimeError # Issue 29921
-list_replace_range_test: RuntimeError # Issue 29921
-list_set_all_test: RuntimeError # Issue 29921
 main_test: RuntimeError # Issue 29921
 nan_infinity_test/01: RuntimeError # Issue 29921
 null_nosuchmethod_test/01: RuntimeError # DDC checks type before too many arguments, so TypeError instead of NSM
diff --git a/tests/corelib_2/json_map_test.dart b/tests/corelib_2/json_map_test.dart
index 2e288cd..ed0544c 100644
--- a/tests/corelib_2/json_map_test.dart
+++ b/tests/corelib_2/json_map_test.dart
@@ -9,7 +9,7 @@
 import 'dart:collection' show LinkedHashMap, HashMap;
 
 bool useReviver = false;
-Map jsonify(Map map) {
+Map<String, dynamic> jsonify(Map map) {
   String encoded = json.encode(map);
   return useReviver
       ? json.decode(encoded, reviver: (key, value) => value)
@@ -35,7 +35,10 @@
   testEmpty(jsonify({}));
   testAtoB(jsonify({'a': 'b'}));
 
-  Map map = jsonify({});
+  // You can write 'Map<String, dynamic>' here (or 'var' which infers the
+  // same), but if you write just 'Map' as the type, then the type of the
+  // constant argument in the addAll below is not inferred correctly.
+  var map = jsonify({});
   map['a'] = 'b';
   testAtoB(map);
 
@@ -298,17 +301,12 @@
 }
 
 void testType() {
+  // The documentation of json.decode doesn't actually specify that it returns
+  // a map (it's marked dynamic), but it's a reasonable expectation if you
+  // don't provide a reviver function.
   Expect.isTrue(jsonify({}) is Map);
-  Expect.isTrue(jsonify({}) is HashMap);
-  Expect.isTrue(jsonify({}) is LinkedHashMap);
-
   Expect.isTrue(jsonify({}) is Map<String, dynamic>);
-  Expect.isTrue(jsonify({}) is HashMap<String, dynamic>);
-  Expect.isTrue(jsonify({}) is LinkedHashMap<String, dynamic>);
-
   Expect.isFalse(jsonify({}) is Map<int, dynamic>);
-  Expect.isFalse(jsonify({}) is HashMap<int, dynamic>);
-  Expect.isFalse(jsonify({}) is LinkedHashMap<int, dynamic>);
 }
 
 void testClear() {
diff --git a/tests/corelib_2/list_replace_range_test.dart b/tests/corelib_2/list_replace_range_test.dart
index 237774aa..964ed44 100644
--- a/tests/corelib_2/list_replace_range_test.dart
+++ b/tests/corelib_2/list_replace_range_test.dart
@@ -5,7 +5,7 @@
 import "package:expect/expect.dart";
 import "dart:collection";
 
-test(List list, int start, int end, Iterable iterable) {
+test(List<int> list, int start, int end, Iterable<int> iterable) {
   List copy = list.toList();
   list.replaceRange(start, end, iterable);
   List iterableList = iterable.toList();
@@ -22,7 +22,7 @@
   }
 }
 
-class MyList extends ListBase {
+class MyList<T> extends ListBase<T> {
   List list;
   MyList(this.list);
   get length => list.length;
diff --git a/tests/corelib_2/list_set_all_test.dart b/tests/corelib_2/list_set_all_test.dart
index d5f9a60..85f2081 100644
--- a/tests/corelib_2/list_set_all_test.dart
+++ b/tests/corelib_2/list_set_all_test.dart
@@ -5,7 +5,7 @@
 import "package:expect/expect.dart";
 import "dart:collection";
 
-test(List list, int index, Iterable iterable) {
+test(List<int> list, int index, Iterable<int> iterable) {
   List copy = list.toList();
   list.setAll(index, iterable);
   Expect.equals(copy.length, list.length);
@@ -21,7 +21,7 @@
   }
 }
 
-class MyList extends ListBase {
+class MyList<T> extends ListBase<T> {
   List list;
   MyList(this.list);
   get length => list.length;
diff --git a/tests/corelib_2/regexp/regexp_escape_test.dart b/tests/corelib_2/regexp/regexp_escape_test.dart
new file mode 100644
index 0000000..e082206
--- /dev/null
+++ b/tests/corelib_2/regexp/regexp_escape_test.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+var escapeChars = r"([)}{]?*+.$^|\";
+
+var nonEscapeAscii = "\x00\x01\x02\x03\x04\x05\x06\x07" //
+    "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" //
+    "\x10\x11\x12\x13\x14\x15\x16\x17" //
+    "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" //
+    """ !"#%&',-/0123456789:;<=>""" //
+    """@ABCDEFGHIJKLMNOPQRSTUVWXYZ_""" //
+    """`abcdefghijklmnopqrstuvwxyz~\x7f""";
+var someNonAscii =
+    new String.fromCharCodes(new List.generate(0x1000 - 128, (x) => x + 128));
+
+test(String string, [bool shouldEscape]) {
+  var escape = RegExp.escape(string);
+  Expect.isTrue(new RegExp(escape).hasMatch(string), "$escape");
+  Expect.equals(string, new RegExp(escape).firstMatch(string)[0], "$escape");
+  if (shouldEscape == true) {
+    Expect.notEquals(string, escape);
+  } else if (shouldEscape == false) {
+    Expect.equals(string, escape);
+  }
+}
+
+main() {
+  for (var c in escapeChars.split("")) {
+    test(c, true);
+  }
+  for (var c in nonEscapeAscii.split("")) {
+    test(c, false);
+  }
+  test(escapeChars, true);
+  test(nonEscapeAscii, false);
+  test(someNonAscii, false);
+  test((nonEscapeAscii + escapeChars) * 3, true);
+  test(r'.abc', true); // First only.
+  test(r'abc.', true); // Last only.
+}
diff --git a/tests/kernel/kernel.status b/tests/kernel/kernel.status
index a39cb57..9c3de36 100644
--- a/tests/kernel/kernel.status
+++ b/tests/kernel/kernel.status
@@ -17,6 +17,8 @@
 
 [ $compiler == dart2analyzer && $runtime == none ]
 unsorted/invocation_errors_test: StaticWarning
+unsorted/loop_test: CompileTimeError # int64
+unsorted/simple_literal_test: CompileTimeError # int64
 unsorted/super_mixin_test: CompileTimeError
 
 [ $compiler == dartk && $strong ]
diff --git a/tests/language/language.status b/tests/language/language.status
index 25f3407..ebde631 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -424,7 +424,6 @@
 example_constructor_test: Fail, OK # Failures related to super call in ctor initializer list
 field_initialization_order_test: Fail, OK # Failures related to super call in ctor initializer list
 final_field_initialization_order_test: Fail, OK # Failures related to super call in ctor initializer list
-generalized_void_syntax_test: CompileTimeError
 generic_methods_type_expression_test: RuntimeError # Issue 25869 / 27460
 least_upper_bound_expansive_test/*: Fail, OK # Non-contractive types are not supported in the vm.
 main_not_a_function_test/01: Skip # Skipped temporaril until Issue 29895 is fixed.
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index d2c1b6f..b567887 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -11,6 +11,9 @@
 accessor_conflict_import_prefixed_test: StaticWarning # Issue 25624
 accessor_conflict_import_test: StaticWarning # Issue 25624
 application_negative_test: CompileTimeError # Issue 14528, The following tests are currently assumed to be failing because the test is wrong.
+assert_message_test: StaticWarning
+assertion_initializer_test: StaticWarning
+assertion_test: StaticWarning
 bad_initializer1_negative_test: CompileTimeError # Issue 14529, The following tests are currently assumed to be failing because the test is wrong.
 bad_initializer2_negative_test: Fail # Issue 14880
 bad_named_constructor_negative_test: CompileTimeError # Issue 18693, The following tests are currently assumed to be failing because the test is wrong.
@@ -387,6 +390,7 @@
 unresolved_in_factory_negative_test: Fail # Issue 12163
 unresolved_top_level_method_negative_test: StaticWarning
 unresolved_top_level_var_negative_test: Fail # Issue 12163
+vm/canonicalization_preserves_deopt_test: StaticWarning
 vm/debug_break_enabled_vm_test: Skip
 vm/debug_break_vm_test/*: Skip
 vm/reflect_core_vm_test: CompileTimeError # This test uses "const Symbol('_setAt')"
@@ -398,12 +402,25 @@
 *: Skip # Issue 28649
 
 [ $compiler == dart2analyzer && $runtime == none ]
-assertion_initializer_const_function_error_test/01: MissingCompileTimeError
-assertion_initializer_const_function_test/01: MissingStaticWarning
+arithmetic_test: CompileTimeError # int64
+bit_operations_test/01: CompileTimeError # int64
+bit_operations_test/02: CompileTimeError # int64
+bit_operations_test/03: CompileTimeError # int64
+bit_operations_test/04: CompileTimeError # int64
+bit_operations_test/none: CompileTimeError # int64
+deopt_inlined_function_lazy_test: CompileTimeError # int64
+guess_cid_test: CompileTimeError # int64
+identical_closure2_test: CompileTimeError # int64
+int2_test: CompileTimeError # int64
+mint_compares_test: CompileTimeError # int64
+number_identity_test: CompileTimeError # int64
+vm/regress_14903_test: CompileTimeError # int64
 
 [ $compiler == dart2analyzer && $runtime == none && $checked ]
-assertion_initializer_const_error2_test/*: MissingCompileTimeError # Issue #
 assertion_initializer_const_error2_test/cc10: Pass # Issue #31321
 assertion_initializer_const_error2_test/cc11: Pass # Issue #31321
 assertion_initializer_const_error2_test/none: Pass
 
+[ $compiler == dart2analyzer && $runtime == none && !$checked ]
+assertion_initializer_const_function_error_test/01: MissingCompileTimeError
+
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index d88c1e5..e2e9167 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -62,7 +62,6 @@
 async_return_types_test/nestedFuture: Fail # Issue 26429
 async_return_types_test/wrongTypeParameter: Fail # Issue 26429
 async_star_cancel_while_paused_test: RuntimeError
-bad_constructor_test/06: Crash # NoSuchMethodError: The getter 'iterator' was called on null.
 bad_override_test/03: MissingCompileTimeError
 bad_override_test/04: MissingCompileTimeError
 bad_override_test/05: MissingCompileTimeError
@@ -479,7 +478,6 @@
 assertion_initializer_test: CompileTimeError
 assertion_test: RuntimeError
 async_star_cancel_while_paused_test: RuntimeError
-bad_constructor_test/06: Crash # NoSuchMethodError: The getter 'iterator' was called on null.
 bad_override_test/03: MissingCompileTimeError
 bad_override_test/04: MissingCompileTimeError
 bad_override_test/05: MissingCompileTimeError
@@ -786,7 +784,6 @@
 assertion_test: RuntimeError
 async_star_cancel_while_paused_test: RuntimeError
 async_test/setter1: Crash # 'file:*/pkg/compiler/lib/src/kernel/element_map_impl.dart': Failed assertion: line 939 pos 18: 'asyncMarker == AsyncMarker.SYNC': is not true.
-bad_constructor_test/06: Crash # NoSuchMethodError: The getter 'iterator' was called on null.
 bad_override_test/03: MissingCompileTimeError
 bad_override_test/04: MissingCompileTimeError
 bad_override_test/05: MissingCompileTimeError
@@ -837,13 +834,9 @@
 cyclic_constructor_test/01: Crash # Issue 30856
 deferred_constraints_constants_test/none: CompileTimeError
 deferred_constraints_constants_test/reference_after_load: CompileTimeError
-deferred_constraints_type_annotation_test/as_operation: RuntimeError
-deferred_constraints_type_annotation_test/catch_check: RuntimeError
-deferred_constraints_type_annotation_test/is_check: RuntimeError
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
-deferred_load_constants_test/none: RuntimeError
 deferred_load_library_wrong_args_test/01: MissingRuntimeError
 deferred_not_loaded_check_test: RuntimeError
 deferred_redirecting_factory_test: RuntimeError
@@ -959,16 +952,8 @@
 mixin_illegal_superclass_test/28: MissingCompileTimeError
 mixin_illegal_superclass_test/29: MissingCompileTimeError
 mixin_illegal_superclass_test/30: MissingCompileTimeError
-mixin_issue10216_2_test: RuntimeError
 mixin_mixin2_test: RuntimeError
 mixin_mixin3_test: RuntimeError
-mixin_mixin4_test: RuntimeError
-mixin_mixin5_test: RuntimeError
-mixin_mixin6_test: RuntimeError
-mixin_mixin7_test: RuntimeError
-mixin_mixin_bound2_test: RuntimeError
-mixin_mixin_bound_test: RuntimeError
-mixin_mixin_test: RuntimeError
 mixin_mixin_type_arguments_test: RuntimeError
 mixin_of_mixin_test/01: CompileTimeError
 mixin_of_mixin_test/02: CompileTimeError
@@ -1111,7 +1096,6 @@
 assertion_initializer_test: CompileTimeError
 assertion_test: RuntimeError
 async_star_cancel_while_paused_test: RuntimeError
-bad_constructor_test/06: Crash # NoSuchMethodError: The getter 'iterator' was called on null.
 bad_override_test/03: MissingCompileTimeError
 bad_override_test/04: MissingCompileTimeError
 bad_override_test/05: MissingCompileTimeError
@@ -1158,25 +1142,11 @@
 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
-cyclic_type2_test: RuntimeError
-cyclic_type_test/00: RuntimeError
-cyclic_type_test/01: RuntimeError
-cyclic_type_test/02: RuntimeError
-cyclic_type_test/03: RuntimeError
-cyclic_type_test/04: RuntimeError
 deferred_constraints_constants_test/none: CompileTimeError
 deferred_constraints_constants_test/reference_after_load: CompileTimeError
-deferred_constraints_type_annotation_test/as_operation: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
-deferred_constraints_type_annotation_test/as_operation: RuntimeError
-deferred_constraints_type_annotation_test/catch_check: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
-deferred_constraints_type_annotation_test/catch_check: RuntimeError
-deferred_constraints_type_annotation_test/is_check: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
-deferred_constraints_type_annotation_test/is_check: RuntimeError
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
-deferred_load_constants_test/none: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
-deferred_load_constants_test/none: RuntimeError
 deferred_load_library_wrong_args_test/01: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
 deferred_load_library_wrong_args_test/01: MissingRuntimeError
 deferred_not_loaded_check_test: RuntimeError
@@ -1196,7 +1166,6 @@
 external_test/10: MissingRuntimeError
 external_test/13: MissingRuntimeError
 external_test/20: MissingRuntimeError
-f_bounded_quantification4_test: RuntimeError
 f_bounded_quantification5_test: RuntimeError
 factory_redirection_test/07: MissingCompileTimeError
 fauxverride_test/03: MissingCompileTimeError
@@ -1214,7 +1183,6 @@
 full_stacktrace1_test: RuntimeError # Issue 12698
 full_stacktrace2_test: RuntimeError # Issue 12698
 full_stacktrace3_test: RuntimeError # Issue 12698
-generic_closure_test: RuntimeError
 generic_methods_type_expression_test/01: RuntimeError
 generic_methods_type_expression_test/03: RuntimeError
 generic_methods_type_expression_test/none: RuntimeError
@@ -1255,7 +1223,6 @@
 mixin_forwarding_constructor4_test/01: MissingCompileTimeError
 mixin_forwarding_constructor4_test/02: MissingCompileTimeError
 mixin_forwarding_constructor4_test/03: MissingCompileTimeError
-mixin_generic_test: RuntimeError
 mixin_illegal_super_use_test/01: MissingCompileTimeError
 mixin_illegal_super_use_test/02: MissingCompileTimeError
 mixin_illegal_super_use_test/03: MissingCompileTimeError
@@ -1297,16 +1264,6 @@
 mixin_illegal_superclass_test/28: MissingCompileTimeError
 mixin_illegal_superclass_test/29: MissingCompileTimeError
 mixin_illegal_superclass_test/30: MissingCompileTimeError
-mixin_issue10216_2_test: RuntimeError
-mixin_mixin2_test: RuntimeError
-mixin_mixin3_test: RuntimeError
-mixin_mixin4_test: RuntimeError
-mixin_mixin5_test: RuntimeError
-mixin_mixin6_test: RuntimeError
-mixin_mixin7_test: RuntimeError
-mixin_mixin_bound2_test: RuntimeError
-mixin_mixin_bound_test: RuntimeError
-mixin_mixin_test: RuntimeError
 mixin_mixin_type_arguments_test: RuntimeError
 mixin_of_mixin_test/01: CompileTimeError
 mixin_of_mixin_test/02: CompileTimeError
@@ -1406,7 +1363,6 @@
 regress_17382_test: RuntimeError
 regress_18535_test: CompileTimeError
 regress_20394_test/01: MissingCompileTimeError
-regress_21795_test: RuntimeError
 regress_22936_test/01: RuntimeError
 regress_24283_test: RuntimeError
 regress_27572_test: RuntimeError
@@ -1416,7 +1372,6 @@
 regress_28255_test: CompileTimeError
 setter_override_test/00: MissingCompileTimeError
 setter_override_test/03: MissingCompileTimeError
-stack_trace_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
@@ -1633,21 +1588,21 @@
 regress_26855_test/4: Crash # Issue 26867
 
 [ $compiler == dart2js && !$dart2js_with_kernel && $minified ]
-cyclic_type2_test: Fail # Issue 12605
-cyclic_type_test/0*: Fail # Issue 12605
-f_bounded_quantification4_test: Fail, Pass # Issue 12605
-generic_closure_test: Fail # Issue 12605
-mixin_generic_test: Fail # Issue 12605
-mixin_mixin2_test: Fail # Issue 12605
-mixin_mixin3_test: Fail # Issue 12605
-mixin_mixin4_test: Fail # Issue 12605
-mixin_mixin5_test: Fail # Issue 12605
-mixin_mixin6_test: Fail # Issue 12605
-mixin_mixin_bound2_test: RuntimeError # Issue 12605
-mixin_mixin_bound_test: RuntimeError # Issue 12605
 symbol_conflict_test: RuntimeError # Issue 23857
 
-[ !$dart2js_with_kernel && $minified ]
-regress_21795_test: RuntimeError # Issue 12605
-stack_trace_test: Fail, OK # Stack trace not preserved in minified code.
+[ $compiler == dart2js && $minified ]
+cyclic_type2_test: RuntimeError, OK # runtimeType.toString not preserved in minified code.
+cyclic_type_test/0*: RuntimeError, OK # runtimeType.toString not preserved in minified code. 
+f_bounded_quantification4_test: RuntimeError, OK # runtimeType.toString not preserved in minified code.
+generic_closure_test: RuntimeError, OK # runtimeType.toString not preserved in minified code.
+mixin_generic_test: RuntimeError, OK # runtimeType.toString not preserved in minified code.
+mixin_mixin2_test: RuntimeError, OK # runtimeType.toString not preserved in minified code.
+mixin_mixin3_test: RuntimeError, OK # runtimeType.toString not preserved in minified code.
+mixin_mixin4_test: RuntimeError, OK # runtimeType.toString not preserved in minified code.
+mixin_mixin5_test: RuntimeError, OK # runtimeType.toString not preserved in minified code.
+mixin_mixin6_test: RuntimeError, OK # runtimeType.toString not preserved in minified code.
+mixin_mixin_bound2_test: RuntimeError, OK # runtimeType.toString not preserved in minified code.
+mixin_mixin_bound_test: RuntimeError, OK # runtimeType.toString not preserved in minified code.
+regress_21795_test: RuntimeError, OK # runtimeType.toString not preserved in minified code.
+stack_trace_test: RuntimeError, OK # Stack trace not preserved in minified code.
 
diff --git a/tests/language_2/assertion_initializer_const_error2_test.dart b/tests/language_2/assertion_initializer_const_error2_test.dart
index e21bc80..cf7788d 100644
--- a/tests/language_2/assertion_initializer_const_error2_test.dart
+++ b/tests/language_2/assertion_initializer_const_error2_test.dart
@@ -10,38 +10,38 @@
   final int x;
   // Const constructors.
   const C.cc01(this.x, y)
-      : assert(x < y)  //# cc01: checked mode compile-time error
+      : assert(x < y)  //# cc01: compile-time error
       ;
   const C.cc02(x, y) : x = x
-      , assert(x < y)  //# cc02: checked mode compile-time error
+      , assert(x < y)  //# cc02: compile-time error
       ;
   const C.cc03(x, y) :
-      assert(x < y),  //# cc03: checked mode compile-time error
+      assert(x < y),  //# cc03: compile-time error
       x = x;
   const C.cc05(this.x, y) :
-      assert(x < y),   //# cc05: checked mode compile-time error
+      assert(x < y),   //# cc05: compile-time error
       super();
   const C.cc06(x, y) : x = x
-      , assert(x < y)  //# cc06: checked mode compile-time error
+      , assert(x < y)  //# cc06: compile-time error
       , super()
       ;
   const C.cc07(x, y) :
-      assert(x < y),  //# cc07: checked mode compile-time error
+      assert(x < y),  //# cc07: compile-time error
       x = x, super();
   const C.cc08(x, y) :
-      assert(x < y),  //# cc08: checked mode compile-time error
+      assert(x < y),  //# cc08: compile-time error
       x = x
       , assert(y > x)  //# cc08: continued
       , super()
       ;
   const C.cc09(this.x, y)
-      : assert(x < y, "$x < $y")  //# cc09: checked mode compile-time error
+      : assert(x < y, "$x < $y")  //# cc09: compile-time error
       ;
   const C.cc10(this.x, y)
-      : assert(x < y,)  //# cc10: checked mode compile-time error
+      : assert(x < y,)  //# cc10: compile-time error
       ;
   const C.cc11(this.x, y)
-      : assert(x < y, "$x < $y",)  //# cc11: checked mode compile-time error
+      : assert(x < y, "$x < $y",)  //# cc11: compile-time error
       ;
 }
 
diff --git a/tests/language_2/assertion_initializer_test.dart b/tests/language_2/assertion_initializer_test.dart
index 9ff69c9..b2fe755 100644
--- a/tests/language_2/assertion_initializer_test.dart
+++ b/tests/language_2/assertion_initializer_test.dart
@@ -15,11 +15,10 @@
   C.c01(this.x, y) : assert(x < y);
   C.c02(x, y) : x = x, assert(x < y);
   C.c03(x, y) : assert(x < y), x = x;
-  C.c04(this.x, y) : super(), assert(x < y);
   C.c05(this.x, y) : assert(x < y), super();
-  C.c06(x, y) : x = x, super(), assert(x < y);
-  C.c07(x, y) : assert(x < y), super(), x = x;
-  C.c08(x, y) : assert(x < y), super(), x = x, assert(y > x);
+  C.c06(x, y) : x = x, assert(x < y), super();
+  C.c07(x, y) : assert(x < y), x = x, super();
+  C.c08(x, y) : assert(x < y), x = x, assert(y > x), super();
   C.c09(this.x, y) : assert(x < y, "$x < $y");
   C.c10(this.x, y) : assert(x < y,);
   C.c11(this.x, y) : assert(x < y, "$x < $y",);
@@ -27,11 +26,10 @@
   const C.cc01(this.x, y) : assert(x < y);
   const C.cc02(x, y) : x = x, assert(x < y);
   const C.cc03(x, y) : assert(x < y), x = x;
-  const C.cc04(this.x, y) : super(), assert(x < y);
   const C.cc05(this.x, y) : assert(x < y), super();
-  const C.cc06(x, y) : x = x, super(), assert(x < y);
-  const C.cc07(x, y) : assert(x < y), super(), x = x;
-  const C.cc08(x, y) : assert(x < y), super(), x = x, assert(y > x);
+  const C.cc06(x, y) : x = x, assert(x < y), super();
+  const C.cc07(x, y) : assert(x < y), x = x, super();
+  const C.cc08(x, y) : assert(x < y), x = x, assert(y > x), super();
   const C.cc09(this.x, y) : assert(x < y, "$x < $y");
   const C.cc10(this.x, y) : assert(x < y,);
   const C.cc11(this.x, y) : assert(x < y, "$x < $y",);
@@ -39,26 +37,24 @@
   C.nc01(this.x, y) : assert(check(x, y));
   C.nc02(x, y) : x = x, assert(check(x, y));
   C.nc03(x, y) : assert(check(x, y)), x = x;
-  C.nc04(this.x, y) : super(), assert(check(x, y));
   C.nc05(this.x, y) : assert(check(x, y)), super();
-  C.nc06(x, y) : x = x, super(), assert(check(x, y));
-  C.nc07(x, y) : assert(check(x, y)), super(), x = x;
-  C.nc08(x, y) : assert(check(x, y)), super(), x = x, assert(y > x);
+  C.nc06(x, y) : x = x, assert(check(x, y)), super();
+  C.nc07(x, y) : assert(check(x, y)), x = x, super();
+  C.nc08(x, y) : assert(check(x, y)), x = x, assert(y > x), super();
   C.nc09(this.x, y) : assert(check(x, y), "$x < $y");
   C.nc10(this.x, y) : assert(check(x, y),);
   C.nc11(this.x, y) : assert(check(x, y), "$x < $y",);
 
-  C.fc01(this.x, y) : assert(() => x < y);
-  C.fc02(x, y) : x = x, assert(() => x < y);
-  C.fc03(x, y) : assert(() => x < y), x = x;
-  C.fc04(this.x, y) : super(), assert(() => x < y);
-  C.fc05(this.x, y) : assert(() => x < y), super();
-  C.fc06(x, y) : x = x, super(), assert(() => x < y);
-  C.fc07(x, y) : assert(() => x < y), super(), x = x;
-  C.fc08(x, y) : assert(() => x < y), super(), x = x, assert(y > x);
-  C.fc09(this.x, y) : assert(() => x < y, "$x < $y");
-  C.fc10(this.x, y) : assert(() => x < y,);
-  C.fc11(this.x, y) : assert(() => x < y, "$x < $y",);
+  C.fc01(this.x, y) : assert((() => x < y)());
+  C.fc02(x, y) : x = x, assert((() => x < y)());
+  C.fc03(x, y) : assert((() => x < y)()), x = x;
+  C.fc05(this.x, y) : assert((() => x < y)()), super();
+  C.fc06(x, y) : x = x, assert((() => x < y)()), super();
+  C.fc07(x, y) : assert((() => x < y)()), x = x, super();
+  C.fc08(x, y) : assert((() => x < y)()),x = x, assert(y > x), super();
+  C.fc09(this.x, y) : assert((() => x < y)(), "$x < $y");
+  C.fc10(this.x, y) : assert((() => x < y)(),);
+  C.fc11(this.x, y) : assert((() => x < y)(), "$x < $y",);
 }
 
 
@@ -73,7 +69,6 @@
   Expect.identical(c1, const C.cc01(1, 2));
   Expect.identical(c1, const C.cc02(1, 2));
   Expect.identical(c1, const C.cc03(1, 2));
-  Expect.identical(c1, const C.cc04(1, 2));
   Expect.identical(c1, const C.cc05(1, 2));
   Expect.identical(c1, const C.cc06(1, 2));
   Expect.identical(c1, const C.cc07(1, 2));
@@ -94,7 +89,6 @@
   doTest(() => new C.c01(x, y));
   doTest(() => new C.c02(x, y));
   doTest(() => new C.c03(x, y));
-  doTest(() => new C.c04(x, y));
   doTest(() => new C.c05(x, y));
   doTest(() => new C.c06(x, y));
   doTest(() => new C.c07(x, y));
@@ -105,7 +99,6 @@
   doTest(() => new C.cc01(x, y));
   doTest(() => new C.cc02(x, y));
   doTest(() => new C.cc03(x, y));
-  doTest(() => new C.cc04(x, y));
   doTest(() => new C.cc05(x, y));
   doTest(() => new C.cc06(x, y));
   doTest(() => new C.cc07(x, y));
@@ -116,7 +109,6 @@
   doTest(() => new C.nc01(x, y));
   doTest(() => new C.nc02(x, y));
   doTest(() => new C.nc03(x, y));
-  doTest(() => new C.nc04(x, y));
   doTest(() => new C.nc05(x, y));
   doTest(() => new C.nc06(x, y));
   doTest(() => new C.nc07(x, y));
@@ -127,7 +119,6 @@
   doTest(() => new C.fc01(x, y));
   doTest(() => new C.fc02(x, y));
   doTest(() => new C.fc03(x, y));
-  doTest(() => new C.fc04(x, y));
   doTest(() => new C.fc05(x, y));
   doTest(() => new C.fc06(x, y));
   doTest(() => new C.fc07(x, y));
diff --git a/tests/language_2/async_await_test.dart b/tests/language_2/async_await_test.dart
index 4048692..7c19b9c 100644
--- a/tests/language_2/async_await_test.dart
+++ b/tests/language_2/async_await_test.dart
@@ -19,8 +19,8 @@
       return expect42(f());
     });
 
-    test("async waits", () {
-      // Calling an "async" function won't do anything immediately.
+    test("async starts synchronously", () {
+      // Calling an "async" function starts immediately.
       var result = [];
       f() async {
         result.add(1);
@@ -31,7 +31,7 @@
       var future = f();
       result.add(0);
       return future.whenComplete(() {
-        expect(result, equals([0, 1]));
+        expect(result, equals([1, 0]));
       });
     });
 
@@ -184,7 +184,6 @@
         return new Future.error("err"); // Not awaited.
       }
 
-      ;
       return throwsErr(f());
     });
 
diff --git a/tests/language_2/async_call_test.dart b/tests/language_2/async_call_test.dart
index a3643f9..bc107b6 100644
--- a/tests/language_2/async_call_test.dart
+++ b/tests/language_2/async_call_test.dart
@@ -14,6 +14,8 @@
 
 bar() async {
   result += "bar";
+  await null;
+  result += "bar2";
 }
 
 main() {
@@ -21,13 +23,13 @@
   () async {
     var f = new Future(foo);
     var b = bar();
-    Expect.equals("", result);
+    Expect.equals("bar", result);
     scheduleMicrotask(() => result += "micro");
     await b;
     await f;
 
     // Validates that bar is scheduled as a microtask, before foo.
-    Expect.equals("barmicrofoo", result);
+    Expect.equals("barbar2microfoo", result);
     asyncEnd();
   }();
 }
diff --git a/tests/language_2/async_error_timing_test.dart b/tests/language_2/async_error_timing_test.dart
new file mode 100644
index 0000000..4b840c7
--- /dev/null
+++ b/tests/language_2/async_error_timing_test.dart
@@ -0,0 +1,264 @@
+// 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 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+
+class AsyncTracker {
+  int runningAsyncs = 0;
+  List expectedEvents;
+  final List actualEvents = [];
+
+  AsyncTracker() {
+    asyncStart();
+  }
+
+  void start(String event) {
+    actualEvents.add("start $event");
+    runningAsyncs++;
+  }
+
+  void stop(String event) {
+    actualEvents.add("stop $event");
+    if (--runningAsyncs == 0) {
+      Expect.listEquals(expectedEvents, actualEvents);
+      asyncEnd();
+    }
+  }
+
+  void add(e) {
+    actualEvents.add(e);
+  }
+}
+
+void test1() {
+  var tracker = new AsyncTracker();
+
+  Future foo() async {
+    tracker.add("error-foo");
+    throw "foo";
+  }
+
+  tracker.start("micro1");
+  scheduleMicrotask(() {
+    tracker.start("micro2");
+    scheduleMicrotask(() {
+      tracker.stop("micro2");
+    });
+    tracker.stop("micro1");
+  });
+
+  tracker.start("foo");
+  foo().catchError((e) {
+    tracker.stop("foo");
+  });
+  tracker.start("micro3");
+  scheduleMicrotask(() {
+    tracker.stop("micro3");
+  });
+
+  tracker.expectedEvents = [
+    "start micro1",
+    "start foo",
+    "error-foo",
+    "start micro3",
+    "start micro2",
+    "stop micro1",
+    "stop foo",
+    "stop micro3",
+    "stop micro2",
+  ];
+}
+
+void test2() {
+  var tracker = new AsyncTracker();
+
+  Future bar() async {
+    tracker.add("await null");
+    await null;
+    tracker.add("error-bar");
+    throw "bar";
+  }
+
+  tracker.start("micro1");
+  scheduleMicrotask(() {
+    tracker.start("micro2");
+    scheduleMicrotask(() {
+      tracker.start("micro3");
+      scheduleMicrotask(() {
+        tracker.stop("micro3");
+      });
+      tracker.stop("micro2");
+    });
+    tracker.stop("micro1");
+  });
+
+  tracker.start("bar");
+  bar().catchError((e) {
+    tracker.stop("bar");
+  });
+  tracker.start("micro4");
+  scheduleMicrotask(() {
+    tracker.start("micro5");
+    scheduleMicrotask(() {
+      tracker.stop("micro5");
+    });
+    tracker.stop("micro4");
+  });
+
+  tracker.expectedEvents = [
+    "start micro1",
+    "start bar",
+    "await null",
+    "start micro4",
+    "start micro2",
+    "stop micro1",
+    "error-bar",
+    "stop bar",
+    "start micro5",
+    "stop micro4",
+    "start micro3",
+    "stop micro2",
+    "stop micro5",
+    "stop micro3",
+  ];
+}
+
+void test3() {
+  var tracker = new AsyncTracker();
+
+  Future gee() async {
+    tracker.add("error-gee");
+    return new Future.error("gee");
+  }
+
+  tracker.start("micro1");
+  scheduleMicrotask(() {
+    tracker.start("micro2");
+    scheduleMicrotask(() {
+      tracker.stop("micro2");
+    });
+    tracker.stop("micro1");
+  });
+
+  tracker.start("gee");
+  gee().catchError((e) {
+    tracker.stop("gee");
+  });
+  tracker.start("micro3");
+  scheduleMicrotask(() {
+    tracker.stop("micro3");
+  });
+
+  tracker.expectedEvents = [
+    "start micro1",
+    "start gee",
+    "error-gee",
+    "start micro3",
+    "start micro2",
+    "stop micro1",
+    "stop gee",
+    "stop micro3",
+    "stop micro2",
+  ];
+}
+
+void test4() {
+  var tracker = new AsyncTracker();
+
+  Future toto() async {
+    tracker.add("await null");
+    await null;
+    tracker.add("error-toto");
+    return new Future.error("toto");
+  }
+
+  tracker.start("micro1");
+  scheduleMicrotask(() {
+    tracker.start("micro2");
+    scheduleMicrotask(() {
+      tracker.start("micro3");
+      scheduleMicrotask(() {
+        tracker.stop("micro3");
+      });
+      tracker.stop("micro2");
+    });
+    tracker.stop("micro1");
+  });
+
+  tracker.start("toto");
+  toto().catchError((e) {
+    tracker.stop("toto");
+  });
+  tracker.start("micro4");
+  scheduleMicrotask(() {
+    tracker.start("micro5");
+    scheduleMicrotask(() {
+      tracker.stop("micro5");
+    });
+    tracker.stop("micro4");
+  });
+
+  tracker.expectedEvents = [
+    "start micro1",
+    "start toto",
+    "await null",
+    "start micro4",
+    "start micro2",
+    "stop micro1",
+    "error-toto",
+    "start micro5",
+    "stop micro4",
+    "start micro3",
+    "stop micro2",
+    "stop toto",
+    "stop micro5",
+    "stop micro3",
+  ];
+}
+
+void test5() {
+  var tracker = new AsyncTracker();
+
+  Future foo() async {
+    tracker.add("throw");
+    throw "foo";
+  }
+
+  bar() async {
+    tracker.start('micro');
+    scheduleMicrotask(() {
+      tracker.stop('micro');
+    });
+    try {
+      tracker.start('foo');
+      await foo();
+    } catch (e) {
+      tracker.stop('foo');
+    }
+    tracker.stop("bar");
+  }
+
+  tracker.start('bar');
+
+  tracker.expectedEvents = [
+    "start bar",
+    "start micro",
+    "start foo",
+    "throw",
+    "stop micro",
+    "stop foo",
+    "stop bar",
+  ];
+}
+
+main() {
+  asyncStart();
+  test1();
+  test2();
+  test3();
+  test4();
+  asyncEnd();
+}
diff --git a/tests/language_2/asyncstar_throw_in_catch_test.dart b/tests/language_2/asyncstar_throw_in_catch_test.dart
index e1a3a95..884b492 100644
--- a/tests/language_2/asyncstar_throw_in_catch_test.dart
+++ b/tests/language_2/asyncstar_throw_in_catch_test.dart
@@ -40,9 +40,9 @@
     yield 3;
     tracer.trace("f");
   } finally {
-    tracer.trace("f");
+    tracer.trace("g");
   }
-  tracer.trace("g");
+  tracer.trace("h");
 }
 
 foo2(Tracer tracer) async* {
@@ -116,10 +116,10 @@
 test() async {
   // TODO(sigurdm): These tests are too dependent on scheduling, and buffering
   // behavior.
-  await runTest(foo1, "abcdYefC", null, true);
+  await runTest(foo1, "abcYdgC", null, true);
   await runTest(foo2, "abcX", "Error", false);
   await runTest(foo3, "abcYX", "Error", false);
-  await runTest(foo4, "abcdYeYfX", "Error2", false);
+  await runTest(foo4, "abcYdYefX", "Error2", false);
 }
 
 void main() {
diff --git a/tests/language_2/await_nonfuture_test.dart b/tests/language_2/await_nonfuture_test.dart
index 739f73a..1aa6855 100644
--- a/tests/language_2/await_nonfuture_test.dart
+++ b/tests/language_2/await_nonfuture_test.dart
@@ -5,16 +5,23 @@
 // VMOptions=--optimization-counter-threshold=5
 
 import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 
 var X = 0;
 
 foo() async {
-  Expect.equals(X, 10); // foo runs after main returns.
-  return await 5;
+  Expect.equals(X, 0);
+  await 5;
+  Expect.equals(X, 10);
+  return await 499;
 }
 
 main() {
+  asyncStart();
   var f = foo();
-  f.then((res) => print("f completed with $res"));
+  f.then((res) {
+    Expect.equals(499, res);
+    asyncEnd();
+  });
   X = 10;
 }
diff --git a/tests/language_2/await_not_started_immediately_test.dart b/tests/language_2/await_started_immediately_test.dart
similarity index 84%
rename from tests/language_2/await_not_started_immediately_test.dart
rename to tests/language_2/await_started_immediately_test.dart
index 5101c58..c21591f 100644
--- a/tests/language_2/await_not_started_immediately_test.dart
+++ b/tests/language_2/await_started_immediately_test.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.
 
-// Test that an async function does not start immediately.
+// Test that an async function does start immediately.
 
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
@@ -18,5 +18,5 @@
 void main() {
   asyncStart();
   foo().then((_) => Expect.equals(2, x)).whenComplete(asyncEnd);
-  Expect.equals(0, x);
+  Expect.equals(1, x);
 }
diff --git a/tests/language_2/function_subtype_bound_closure1_test.dart b/tests/language_2/function_subtype_bound_closure1_test.dart
index c55a741..01363e0 100644
--- a/tests/language_2/function_subtype_bound_closure1_test.dart
+++ b/tests/language_2/function_subtype_bound_closure1_test.dart
@@ -30,10 +30,10 @@
   Expect.isFalse(foo is Baz<int>, 'foo is Baz<int>');
   Expect.isFalse(foo is Boz<int>, 'foo is Boz<int>');
 
-  Expect.isTrue(foo is Foo, 'foo is Foo');
-  Expect.isTrue(foo is Bar, 'foo is Bar');
+  Expect.isFalse(foo is Foo, 'foo is Foo');
+  Expect.isFalse(foo is Bar, 'foo is Bar');
   Expect.isFalse(foo is Baz, 'foo is Baz');
-  Expect.isTrue(foo is Boz, 'foo is Boz');
+  Expect.isFalse(foo is Boz, 'foo is Boz');
 
   var baz = c.baz;
   Expect.isFalse(baz is Foo<bool>, 'baz is Foo<bool>');
@@ -48,6 +48,6 @@
 
   Expect.isFalse(baz is Foo, 'baz is Foo');
   Expect.isFalse(baz is Bar, 'baz is Bar');
-  Expect.isTrue(baz is Baz, 'baz is Baz');
-  Expect.isTrue(baz is Boz, 'baz is Boz');
+  Expect.isFalse(baz is Baz, 'baz is Baz');
+  Expect.isFalse(baz is Boz, 'baz is Boz');
 }
diff --git a/tests/language_2/function_subtype_bound_closure2_test.dart b/tests/language_2/function_subtype_bound_closure2_test.dart
index 9a7da9c..d8f4a40 100644
--- a/tests/language_2/function_subtype_bound_closure2_test.dart
+++ b/tests/language_2/function_subtype_bound_closure2_test.dart
@@ -36,5 +36,6 @@
 main() {
   new C<bool>().test('bool', true);
   new C<int>().test('int', false);
-  new C().test('dynamic', true);
+  new C<Object>().test('Object', false);
+  new C<dynamic>().test('dynamic', false);
 }
diff --git a/tests/language_2/function_subtype_bound_closure3_test.dart b/tests/language_2/function_subtype_bound_closure3_test.dart
index 6334342..471f2ca 100644
--- a/tests/language_2/function_subtype_bound_closure3_test.dart
+++ b/tests/language_2/function_subtype_bound_closure3_test.dart
@@ -32,5 +32,5 @@
 main() {
   new C<bool>().test('bool');
   new C<int>().test('int');
-  new C().test('dynamic');
+  new C<dynamic>().test('dynamic');
 }
diff --git a/tests/language_2/function_subtype_bound_closure4_test.dart b/tests/language_2/function_subtype_bound_closure4_test.dart
index 1b6bf7a..a48fb94 100644
--- a/tests/language_2/function_subtype_bound_closure4_test.dart
+++ b/tests/language_2/function_subtype_bound_closure4_test.dart
@@ -34,5 +34,5 @@
 main() {
   new D<String, bool>().test('bool');
   new D<bool, int>().test('int');
-  new D().test('dynamic');
+  new D<dynamic, dynamic>().test('dynamic');
 }
diff --git a/tests/language_2/function_subtype_bound_closure5_test.dart b/tests/language_2/function_subtype_bound_closure5_test.dart
index 39cfba8..4c6d36c 100644
--- a/tests/language_2/function_subtype_bound_closure5_test.dart
+++ b/tests/language_2/function_subtype_bound_closure5_test.dart
@@ -38,5 +38,7 @@
 main() {
   new D<String, bool>().test('bool', true);
   new D<bool, int>().test('int', false);
-  new D().test('dynamic', true);
+  new D<Object, Object>().test('Object', false);
+  new D<Null, Null>().test('Null', true);
+  new D<dynamic, dynamic>().test('dynamic', false);
 }
diff --git a/tests/language_2/function_subtype_bound_closure5a_test.dart b/tests/language_2/function_subtype_bound_closure5a_test.dart
index 7f4d209..6b240ed 100644
--- a/tests/language_2/function_subtype_bound_closure5a_test.dart
+++ b/tests/language_2/function_subtype_bound_closure5a_test.dart
@@ -40,5 +40,7 @@
 main() {
   new D<String, bool>().test('bool', true);
   new D<bool, int>().test('int', false);
-  new D().test('dynamic', true);
+  new D<Object, Object>().test('Object', false);
+  new D<Null, Null>().test('Null', true);
+  new D<dynamic, dynamic>().test('dynamic', false);
 }
diff --git a/tests/language_2/function_subtype_bound_closure6_test.dart b/tests/language_2/function_subtype_bound_closure6_test.dart
index 78651e3..721d78b 100644
--- a/tests/language_2/function_subtype_bound_closure6_test.dart
+++ b/tests/language_2/function_subtype_bound_closure6_test.dart
@@ -40,5 +40,7 @@
 main() {
   new C<bool>().test('bool', true);
   new C<int>().test('int', false);
-  new C().test('dynamic', true);
+  new C<Object>().test('Object', false);
+  new C<dynamic>().test('dynamic', false);
+  new C<Null>().test('Null', true);
 }
diff --git a/tests/language_2/function_subtype_cast2_test.dart b/tests/language_2/function_subtype_cast2_test.dart
index 6f16bb0..123af74 100644
--- a/tests/language_2/function_subtype_cast2_test.dart
+++ b/tests/language_2/function_subtype_cast2_test.dart
@@ -24,7 +24,9 @@
 void bar(int i) {}
 
 void main() {
-  new Class().test(true, bar, "dynamic");
+  new Class<dynamic>().test(false, bar, "dynamic");
+  new Class<Object>().test(false, bar, "Object");
+  new Class<Null>().test(true, bar, "Null");
   new Class<int>().test(true, bar, "int");
   new Class<bool>().test(false, bar, "bool");
 }
diff --git a/tests/language_2/function_subtype_cast3_test.dart b/tests/language_2/function_subtype_cast3_test.dart
index edcc4e8..ec222ac 100644
--- a/tests/language_2/function_subtype_cast3_test.dart
+++ b/tests/language_2/function_subtype_cast3_test.dart
@@ -28,7 +28,8 @@
 void bar(int i) {}
 
 void main() {
-  new Class().test(true, bar, "dynamic");
+  new Class<dynamic>().test(false, bar, "dynamic");
+  new Class<Object>().test(false, bar, "Object");
   new Class<int>().test(true, bar, "int");
   new Class<bool>().test(false, bar, "bool");
 }
diff --git a/tests/language_2/function_subtype_checked0_test.dart b/tests/language_2/function_subtype_checked0_test.dart
index c5e4e004..0ded8d0 100644
--- a/tests/language_2/function_subtype_checked0_test.dart
+++ b/tests/language_2/function_subtype_checked0_test.dart
@@ -67,5 +67,7 @@
 main() {
   new C<bool>().test('bool', true);
   new C<int>().test('int', false);
-  new C().test('dynamic', true);
+  new C<dynamic>().test('dynamic', false);
+  new C<Object>().test('Object', false);
+  new C<Null>().test('Null', true);
 }
diff --git a/tests/language_2/function_subtype_inline0_test.dart b/tests/language_2/function_subtype_inline0_test.dart
index dca9e6b..3e1db32 100644
--- a/tests/language_2/function_subtype_inline0_test.dart
+++ b/tests/language_2/function_subtype_inline0_test.dart
@@ -37,5 +37,5 @@
 main() {
   new C<bool>().test('bool', true);
   new C<int>().test('int', false);
-  new C().test('dynamic', true);
+  new C<dynamic>().test('dynamic', true);
 }
diff --git a/tests/language_2/function_subtype_local1_test.dart b/tests/language_2/function_subtype_local1_test.dart
index d41b360..83f9350 100644
--- a/tests/language_2/function_subtype_local1_test.dart
+++ b/tests/language_2/function_subtype_local1_test.dart
@@ -26,10 +26,10 @@
   Expect.isFalse(foo is Baz<int>, 'foo is Baz<int>');
   Expect.isFalse(foo is Boz<int>, 'foo is Boz<int>');
 
-  Expect.isTrue(foo is Foo, 'foo is Foo');
-  Expect.isTrue(foo is Bar, 'foo is Bar');
+  Expect.isFalse(foo is Foo, 'foo is Foo');
+  Expect.isFalse(foo is Bar, 'foo is Bar');
   Expect.isFalse(foo is Baz, 'foo is Baz');
-  Expect.isTrue(foo is Boz, 'foo is Boz');
+  Expect.isFalse(foo is Boz, 'foo is Boz');
 
   Expect.isFalse(baz is Foo<bool>, 'baz is Foo<bool>');
   Expect.isFalse(baz is Bar<bool>, 'baz is Bar<bool>');
@@ -43,6 +43,6 @@
 
   Expect.isFalse(baz is Foo, 'baz is Foo');
   Expect.isFalse(baz is Bar, 'baz is Bar');
-  Expect.isTrue(baz is Baz, 'baz is Baz');
-  Expect.isTrue(baz is Boz, 'baz is Boz');
+  Expect.isFalse(baz is Baz, 'baz is Baz');
+  Expect.isFalse(baz is Boz, 'baz is Boz');
 }
diff --git a/tests/language_2/function_subtype_local2_test.dart b/tests/language_2/function_subtype_local2_test.dart
index 65d470d..0f774fb 100644
--- a/tests/language_2/function_subtype_local2_test.dart
+++ b/tests/language_2/function_subtype_local2_test.dart
@@ -36,5 +36,7 @@
 main() {
   new C<bool>().test('bool', true);
   new C<int>().test('int', false);
-  new C().test('dynamic', true);
+  new C<dynamic>().test('dynamic', false);
+  new C<Object>().test('Object', false);
+  new C<Null>().test('Null', true);
 }
diff --git a/tests/language_2/function_subtype_local3_test.dart b/tests/language_2/function_subtype_local3_test.dart
index 344f7c2..e491dde 100644
--- a/tests/language_2/function_subtype_local3_test.dart
+++ b/tests/language_2/function_subtype_local3_test.dart
@@ -32,5 +32,5 @@
 main() {
   new C<bool>().test('bool', true);
   new C<int>().test('int', false);
-  new C().test('dynamic', true);
+  new C<dynamic>().test('dynamic', true);
 }
diff --git a/tests/language_2/function_subtype_local5_test.dart b/tests/language_2/function_subtype_local5_test.dart
index be742bf..00f18af 100644
--- a/tests/language_2/function_subtype_local5_test.dart
+++ b/tests/language_2/function_subtype_local5_test.dart
@@ -38,5 +38,7 @@
 main() {
   new D<String, bool>().test('bool', true);
   new D<bool, int>().test('int', false);
-  new D().test('dynamic', true);
+  new D<dynamic, dynamic>().test('dynamic', false);
+  new D<Object, Object>().test('Object', false);
+  new D<Null, Null>().test('Null', true);
 }
diff --git a/tests/language_2/function_subtype_not0_test.dart b/tests/language_2/function_subtype_not0_test.dart
index 60ab4c7..4959ece 100644
--- a/tests/language_2/function_subtype_not0_test.dart
+++ b/tests/language_2/function_subtype_not0_test.dart
@@ -13,7 +13,7 @@
 void bar(int i) {}
 
 void main() {
-  Expect.isFalse(bar is! Foo);
+  Expect.isTrue(bar is! Foo);
   Expect.isTrue(bar is! Foo<bool>);
   Expect.isFalse(bar is! Foo<int>);
   Expect.isFalse(bar is! Bar);
diff --git a/tests/language_2/function_subtype_not2_test.dart b/tests/language_2/function_subtype_not2_test.dart
index 5481a8c..218c04d 100644
--- a/tests/language_2/function_subtype_not2_test.dart
+++ b/tests/language_2/function_subtype_not2_test.dart
@@ -20,7 +20,9 @@
 void bar(int i) {}
 
 void main() {
-  new Class().test(false, bar, "dynamic");
+  new Class<dynamic>().test(true, bar, "dynamic");
+  new Class<Object>().test(true, bar, "Object");
+  new Class<Null>().test(false, bar, "Null");
   new Class<int>().test(false, bar, "int");
   new Class<bool>().test(true, bar, "bool");
 }
diff --git a/tests/language_2/function_subtype_not3_test.dart b/tests/language_2/function_subtype_not3_test.dart
index 0c8d2bb..07c40ea 100644
--- a/tests/language_2/function_subtype_not3_test.dart
+++ b/tests/language_2/function_subtype_not3_test.dart
@@ -24,7 +24,9 @@
 void bar(int i) {}
 
 void main() {
-  new Class().test(false, bar, "dynamic");
+  new Class<dynamic>().test(true, bar, "dynamic");
+  new Class<Object>().test(true, bar, "Object");
+  new Class<Null>().test(false, bar, "Null");
   new Class<int>().test(false, bar, "int");
   new Class<bool>().test(true, bar, "bool");
 }
diff --git a/tests/language_2/function_subtype_simple1_test.dart b/tests/language_2/function_subtype_simple1_test.dart
index dc276c5..1d0b053 100644
--- a/tests/language_2/function_subtype_simple1_test.dart
+++ b/tests/language_2/function_subtype_simple1_test.dart
@@ -8,21 +8,28 @@
 import 'package:expect/expect.dart';
 
 typedef Args0();
-typedef Args1(a);
-typedef Args2(a, b);
-typedef Args3(a, b, c);
-typedef Args4(a, b, c, d);
-typedef Args5(a, b, c, d, e);
-typedef Args6(a, b, c, d, e, f);
-typedef Args7(a, b, c, d, e, f, g);
-typedef Args8(a, b, c, d, e, f, g, h);
-typedef Args9(a, b, c, d, e, f, g, h, i);
-typedef Args10(a, b, c, d, e, f, g, h, i, j);
-typedef Args11(a, b, c, d, e, f, g, h, i, j, k);
-typedef Args12(a, b, c, d, e, f, g, h, i, j, k, l);
-typedef Args13(a, b, c, d, e, f, g, h, i, j, k, l, m);
-typedef Args14(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
-typedef Args15(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);
+typedef Args1(Null a);
+typedef Args2(Null a, Null b);
+typedef Args3(Null a, Null b, Null c);
+typedef Args4(Null a, Null b, Null c, Null d);
+typedef Args5(Null a, Null b, Null c, Null d, Null e);
+typedef Args6(Null a, Null b, Null c, Null d, Null e, Null f);
+typedef Args7(Null a, Null b, Null c, Null d, Null e, Null f, Null g);
+typedef Args8(Null a, Null b, Null c, Null d, Null e, Null f, Null g, Null h);
+typedef Args9(
+    Null a, Null b, Null c, Null d, Null e, Null f, Null g, Null h, Null i);
+typedef Args10(Null a, Null b, Null c, Null d, Null e, Null f, Null g, Null h,
+    Null i, Null j);
+typedef Args11(Null a, Null b, Null c, Null d, Null e, Null f, Null g, Null h,
+    Null i, Null j, Null k);
+typedef Args12(Null a, Null b, Null c, Null d, Null e, Null f, Null g, Null h,
+    Null i, Null j, Null k, Null l);
+typedef Args13(Null a, Null b, Null c, Null d, Null e, Null f, Null g, Null h,
+    Null i, Null j, Null k, Null l, Null m);
+typedef Args14(Null a, Null b, Null c, Null d, Null e, Null f, Null g, Null h,
+    Null i, Null j, Null k, Null l, Null m, Null n);
+typedef Args15(Null a, Null b, Null c, Null d, Null e, Null f, Null g, Null h,
+    Null i, Null j, Null k, Null l, Null m, Null n, Null o);
 
 void args0() {}
 void args1(int a) {}
diff --git a/tests/language_2/function_subtype_top_level1_test.dart b/tests/language_2/function_subtype_top_level1_test.dart
index bc89332..d522349 100644
--- a/tests/language_2/function_subtype_top_level1_test.dart
+++ b/tests/language_2/function_subtype_top_level1_test.dart
@@ -38,5 +38,7 @@
 main() {
   new C<bool>().test('bool', true);
   new C<int>().test('int', false);
-  new C().test('dynamic', true);
+  new C<Object>().test('Object', false);
+  new C<dynamic>().test('dynamic', false);
+  new C<Null>().test('Null', true);
 }
diff --git a/tests/language_2/function_subtype_typearg5_test.dart b/tests/language_2/function_subtype_typearg5_test.dart
index 763e187..018d592 100644
--- a/tests/language_2/function_subtype_typearg5_test.dart
+++ b/tests/language_2/function_subtype_typearg5_test.dart
@@ -19,11 +19,11 @@
 
 class CheckEnv<X, Y> {
   test(bool intX) {
-    Expect.isTrue(<F<X>>[] is List<F>);
+    Expect.isTrue(<F<X>>[] is! List<F>);
     Expect.isTrue(<F<X>>[] is List<F<X>>);
     Expect.isTrue(<F<X>>[] is List<G<Y, X>>);
 
-    Expect.isTrue(dyn(<F<X>>[]) is List<F>);
+    Expect.isTrue(dyn(<F<X>>[]) is! List<F>);
     Expect.isTrue(dyn(<F<X>>[]) is List<F<X>>);
     Expect.isTrue(dyn(<F<X>>[]) is List<G<Y, X>>);
 
diff --git a/tests/language_2/function_type_alias2_test.dart b/tests/language_2/function_type_alias2_test.dart
index 8bd1c95..fdc0b00 100644
--- a/tests/language_2/function_type_alias2_test.dart
+++ b/tests/language_2/function_type_alias2_test.dart
@@ -21,16 +21,16 @@
 int bar({int a, int b, int c}) {}
 
 main() {
-  Expect.isTrue(baz is f1);
+  Expect.isFalse(baz is f1);
   Expect.isFalse(baz is f3);
   Expect.isFalse(bar is f1);
-  Expect.isTrue(bar is f3);
-  Expect.isTrue(baz is f1);
+  Expect.isFalse(bar is f3);
+  Expect.isFalse(baz is f1);
   Expect.isTrue(baz is f1<int>);
   Expect.isTrue(bar is f3<int>);
   Expect.isFalse(baz is f1<double>);
   Expect.isFalse(bar is f3<double>);
-  Expect.isTrue(baz is f2);
+  Expect.isFalse(baz is f2);
   Expect.isFalse(bar is f4);
   Expect.isTrue(baz is f2<int>);
   Expect.isFalse(bar is f2<int>);
diff --git a/tests/language_2/function_type_alias3_test.dart b/tests/language_2/function_type_alias3_test.dart
index 33d6b23..dad6b8a 100644
--- a/tests/language_2/function_type_alias3_test.dart
+++ b/tests/language_2/function_type_alias3_test.dart
@@ -17,10 +17,10 @@
 main() {
   var a = new A<lib11.Library111<bool>>();
   var b = new A<lib11.Library111<int>>();
-  Expect.isTrue(a.foo is F);
+  Expect.isTrue(a.foo is! F);
   Expect.isTrue(a.foo is F<bool>);
   Expect.isTrue(a.foo is! F<int>);
-  Expect.isTrue(b.foo is F);
+  Expect.isTrue(b.foo is! F);
   Expect.isTrue(b.foo is! F<bool>);
   Expect.isTrue(a.foo is! F<int>);
 }
diff --git a/tests/language_2/function_type_alias4_test.dart b/tests/language_2/function_type_alias4_test.dart
index 7e06db9..3d68fd4 100644
--- a/tests/language_2/function_type_alias4_test.dart
+++ b/tests/language_2/function_type_alias4_test.dart
@@ -16,8 +16,10 @@
 }
 
 main() {
-  Expect.isTrue(bar is F);
-  Expect.isTrue(baz is F);
+  Expect.isTrue(bar is! F);
+  Expect.isTrue(baz is! F);
+  Expect.isTrue(bar is! F<Object>);
+  Expect.isTrue(baz is! F<Object>);
   Expect.isTrue(bar is F<bool>);
   Expect.isTrue(baz is F<int>);
   Expect.isTrue(bar is! F<int>);
@@ -25,8 +27,12 @@
 
   var b = new A<bool>();
   var i = new A<int>();
-  Expect.isTrue(b.foo is F);
-  Expect.isTrue(i.foo is F);
+  Expect.isTrue(b.foo is F, 'runtime type of covaraint parameters is Object');
+  Expect.isTrue(i.foo is F, 'runtime type of covaraint parameters is Object');
+  Expect.isTrue(
+      b.foo is F<Object>, 'runtime type of covaraint parameters is Object');
+  Expect.isTrue(
+      i.foo is F<Object>, 'runtime type of covaraint parameters is Object');
   Expect.isTrue(b.foo is F<bool>);
   Expect.isTrue(i.foo is F<int>);
   Expect.isTrue(b.foo is! F<int>);
diff --git a/tests/language_2/function_type_alias_test.dart b/tests/language_2/function_type_alias_test.dart
index 486a980..b725a5f 100644
--- a/tests/language_2/function_type_alias_test.dart
+++ b/tests/language_2/function_type_alias_test.dart
@@ -7,11 +7,11 @@
 
 import "package:expect/expect.dart";
 
-typedef Fun(a, b);
+typedef Fun(Null a, Null b);
 
-typedef int IntFun(a, b);
+typedef int IntFun(Null a, Null b);
 
-typedef bool BoolFun(a, b);
+typedef bool BoolFun(Null a, Null b);
 
 typedef int CompareObj(Object a, Object b);
 
diff --git a/tests/language_2/generic_closure_test.dart b/tests/language_2/generic_closure_test.dart
index 501141c..333ba2f 100644
--- a/tests/language_2/generic_closure_test.dart
+++ b/tests/language_2/generic_closure_test.dart
@@ -26,7 +26,7 @@
     Expect.equals(14, g(14));
     Expect.isTrue(f is Function);
     Expect.isTrue(g is Function);
-    Expect.isTrue(f is F);
+    Expect.isTrue(f is! F);
     Expect.isTrue(g is F);
     Expect.isTrue(f is F<int>);
     Expect.isTrue(g is F<int>);
@@ -46,7 +46,7 @@
     var g = c.g;
     Expect.equals("(bool) => bool", f.runtimeType.toString()); //# 01: ok
     Expect.equals("(Object) => bool", g.runtimeType.toString()); //# 01: ok
-    Expect.isTrue(f is F);
+    Expect.isTrue(f is! F);
     Expect.isTrue(g is F);
     Expect.isTrue(f is! F<int>);
     Expect.isTrue(g is! F<int>);
diff --git a/tests/language_2/generic_test.dart b/tests/language_2/generic_test.dart
index df51fbd..0b00d05 100644
--- a/tests/language_2/generic_test.dart
+++ b/tests/language_2/generic_test.dart
@@ -29,7 +29,7 @@
   }
 }
 
-class C<T> {
+class C<T extends A> {
   B<T> b_;
   C(T t) : b_ = new B<T>(t) {}
 }
@@ -40,34 +40,19 @@
 }
 
 class E {
-  C<AX> cax_;
-  E() : cax_ = new C<AX>(const AX()) {}
-}
-
-class GenericTest {
-  static test() {
-    int result = 0;
-    D d = new D();
-    Expect.equals(true, d.caa_.b_ is B<AA>);
-    Expect.equals(true, d.caa_.b_.isT(const AA()));
-    C c = new C(const AA()); // c is of raw type C, T in C<T> is dynamic.
-    Expect.equals(true, c.b_ is B);
-    Expect.equals(true, c.b_ is B<AA>);
-    Expect.equals(true, c.b_.isT(const AA()));
-    Expect.equals(true, c.b_.isT(const AX()));
-    try {
-      E e = new E(); // Throws a type error, if type checks are enabled.
-    } on TypeError catch (error) {
-      result = 1;
-    }
-    return result;
-  }
-
-  static testMain() {
-    Expect.equals(1, test());
-  }
+  C<AX> cax_ = new C<AX>(const AX()); //# 01: compile-time error
 }
 
 main() {
-  GenericTest.testMain();
+  D d = new D();
+  Expect.equals(true, d.caa_.b_ is B<AA>);
+  Expect.equals(true, d.caa_.b_.isT(const AA()));
+  C c = new C(const AA()); // inferred as `C<A>` because of the `extends A`.
+  Expect.equals(true, c is C<A>);
+  Expect.equals(false, c is C<AA>, 'C<A> is not a subtype of C<AA>');
+  Expect.equals(true, c.b_ is B);
+  Expect.equals(false, c.b_ is B<AA>);
+  Expect.equals(true, c.b_.isT(const AA()), 'AA is a subtype of A');
+  Expect.equals(false, c.b_.isT(const AX()), 'AX is not a subtype of A');
+  new E();
 }
diff --git a/tests/language_2/generics_test.dart b/tests/language_2/generics_test.dart
index 931083b..e676434 100644
--- a/tests/language_2/generics_test.dart
+++ b/tests/language_2/generics_test.dart
@@ -5,7 +5,7 @@
 
 import "package:expect/expect.dart";
 
-class GenericsTest<T, V> implements Map<int, int> {
+abstract class GenericsTest<T, V> implements Map<int, int> {
   static int myFunc(bool a, bool b) {
     Expect.equals(true, a);
     Expect.equals(false, b);
diff --git a/tests/language_2/language_2.status b/tests/language_2/language_2.status
index 9f38477..fea64fd 100644
--- a/tests/language_2/language_2.status
+++ b/tests/language_2/language_2.status
@@ -43,6 +43,29 @@
 [ $compiler != dartdevc && !$checked ]
 function_type/*: Skip # Needs checked mode.
 
+[ $compiler != dartdevc && !$fasta && $strong ]
+implicit_creation/implicit_const_context_constructor_generic_named_test: CompileTimeError
+implicit_creation/implicit_const_context_constructor_generic_test: CompileTimeError
+implicit_creation/implicit_const_context_constructor_named_test: CompileTimeError
+implicit_creation/implicit_const_context_constructor_test: CompileTimeError
+implicit_creation/implicit_const_context_list_test: CompileTimeError
+implicit_creation/implicit_const_context_map_test: CompileTimeError
+implicit_creation/implicit_const_context_prefix_constructor_generic_named_test: CompileTimeError
+implicit_creation/implicit_const_context_prefix_constructor_generic_test: CompileTimeError
+implicit_creation/implicit_const_context_prefix_constructor_named_test: CompileTimeError
+implicit_creation/implicit_const_context_prefix_constructor_test: CompileTimeError
+implicit_creation/implicit_new_constructor_generic_named_test: CompileTimeError
+implicit_creation/implicit_new_constructor_generic_test: CompileTimeError
+implicit_creation/implicit_new_constructor_named_test: CompileTimeError
+implicit_creation/implicit_new_constructor_test: CompileTimeError
+implicit_creation/implicit_new_or_const_composite_test: CompileTimeError
+implicit_creation/implicit_new_or_const_generic_test: CompileTimeError
+implicit_creation/implicit_new_or_const_test: CompileTimeError
+implicit_creation/implicit_new_prefix_constructor_generic_named_test: CompileTimeError
+implicit_creation/implicit_new_prefix_constructor_generic_test: CompileTimeError
+implicit_creation/implicit_new_prefix_constructor_named_test: CompileTimeError
+implicit_creation/implicit_new_prefix_constructor_test: CompileTimeError
+
 [ $compiler != dartk && $compiler != dartkp && $mode == debug && $runtime == vm ]
 built_in_identifier_type_annotation_test/15: Crash # Not supported by legacy VM front-end.
 
@@ -186,29 +209,6 @@
 regress_21795_test: RuntimeError # Issue 12605
 stack_trace_test: Fail, OK # Stack trace not preserved in minified code.
 
-[ !$fasta && $strong ]
-implicit_creation/implicit_const_context_constructor_generic_named_test: CompileTimeError
-implicit_creation/implicit_const_context_constructor_generic_test: CompileTimeError
-implicit_creation/implicit_const_context_constructor_named_test: CompileTimeError
-implicit_creation/implicit_const_context_constructor_test: CompileTimeError
-implicit_creation/implicit_const_context_list_test: CompileTimeError
-implicit_creation/implicit_const_context_map_test: CompileTimeError
-implicit_creation/implicit_const_context_prefix_constructor_generic_named_test: CompileTimeError
-implicit_creation/implicit_const_context_prefix_constructor_generic_test: CompileTimeError
-implicit_creation/implicit_const_context_prefix_constructor_named_test: CompileTimeError
-implicit_creation/implicit_const_context_prefix_constructor_test: CompileTimeError
-implicit_creation/implicit_new_constructor_generic_named_test: CompileTimeError
-implicit_creation/implicit_new_constructor_generic_test: CompileTimeError
-implicit_creation/implicit_new_constructor_named_test: CompileTimeError
-implicit_creation/implicit_new_constructor_test: CompileTimeError
-implicit_creation/implicit_new_or_const_composite_test: CompileTimeError
-implicit_creation/implicit_new_or_const_generic_test: CompileTimeError
-implicit_creation/implicit_new_or_const_test: CompileTimeError
-implicit_creation/implicit_new_prefix_constructor_generic_named_test: CompileTimeError
-implicit_creation/implicit_new_prefix_constructor_generic_test: CompileTimeError
-implicit_creation/implicit_new_prefix_constructor_named_test: CompileTimeError
-implicit_creation/implicit_new_prefix_constructor_test: CompileTimeError
-
 [ !$fasta && !$strong ]
 implicit_creation/implicit_const_context_constructor_generic_named_test: Fail # No support for implicit creation.
 implicit_creation/implicit_const_context_constructor_generic_test: Fail # No support for implicit creation.
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index 73292b2e..29ec35a 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -7,8 +7,6 @@
 abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError # Issue #30568
 abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError # Issue #30568
 abstract_override_adds_optional_args_supercall_test: MissingCompileTimeError # Issue #30568
-assertion_initializer_const_function_test/01: MissingCompileTimeError
-async_return_types_test/nestedFuture: MissingCompileTimeError
 bad_initializer2_negative_test: Fail # Issue 14880
 black_listed_test/none: Fail # Issue 14228
 built_in_identifier_prefix_test: CompileTimeError
@@ -43,8 +41,6 @@
 generic_local_functions_test: CompileTimeError # Issue 28515
 generic_methods_generic_function_parameter_test: CompileTimeError # Issue 28515
 generic_no_such_method_dispatcher_simple_test: Skip # This test is just for kernel.
-generic_test: StaticWarning
-generics_test: StaticWarning
 getter_declaration_negative_test: CompileTimeError
 getter_setter_in_lib_test: Fail # Issue 23286
 import_core_prefix_test: StaticWarning
@@ -357,16 +353,9 @@
 void_type_usage_test/paren_while: MissingCompileTimeError
 
 [ $compiler == dart2analyzer && $runtime == none ]
-assertion_initializer_const_function_test/01: CompileTimeError
 error_stacktrace_test/00: MissingCompileTimeError
 vm/lazy_deopt_with_exception_test: CompileTimeError
 
-[ $compiler == dart2analyzer && $checked ]
-assertion_initializer_const_error2_test/*: MissingCompileTimeError # Issue #
-assertion_initializer_const_error2_test/cc10: Pass # Issue #31321
-assertion_initializer_const_error2_test/cc11: Pass # Issue #31321
-assertion_initializer_const_error2_test/none: Pass
-
 [ $compiler == dart2analyzer && $checked && !$strong ]
 abstract_beats_arguments_test: MissingCompileTimeError
 abstract_exact_selector_test/01: MissingCompileTimeError
@@ -535,8 +524,6 @@
 generic_methods_recursive_bound_test/02: MissingCompileTimeError
 generic_no_such_method_dispatcher_test: StaticWarning
 generic_tearoff_test: CompileTimeError
-generic_test: CompileTimeError
-generics_test: CompileTimeError
 getter_no_setter2_test/00: MissingCompileTimeError
 getter_no_setter2_test/01: MissingCompileTimeError
 getter_no_setter2_test/03: MissingCompileTimeError
@@ -766,13 +753,22 @@
 type_variable_static_context_test: MissingCompileTimeError
 unresolved_in_factory_test: MissingCompileTimeError
 
-# Analyzer only implements Dart 2.0 static type checking with "--strong".
 [ $compiler == dart2analyzer && !$checked && !$strong ]
 abstract_beats_arguments_test: MissingCompileTimeError
 abstract_exact_selector_test/01: MissingCompileTimeError
 abstract_factory_constructor_test/00: MissingCompileTimeError
 abstract_getter_test/01: MissingCompileTimeError
 abstract_syntax_test/00: MissingCompileTimeError
+assertion_initializer_const_error2_test/cc01: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc02: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc03: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc05: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc06: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc07: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc08: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc09: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc10: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc11: MissingCompileTimeError # Not reporting failed assert() at compile time.
 assign_static_type_test/01: MissingCompileTimeError
 assign_static_type_test/02: MissingCompileTimeError
 assign_static_type_test/03: MissingCompileTimeError
@@ -1228,9 +1224,6 @@
 accessor_conflict_import_prefixed_test: CompileTimeError # Issue 25626
 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
 cascaded_forwarding_stubs_test: CompileTimeError
 config_import_corelib_test: CompileTimeError
 const_types_test/07: MissingCompileTimeError # Incorrectly allows using type parameter in const expression.
@@ -1246,12 +1239,8 @@
 generic_methods_overriding_test/03: MissingCompileTimeError # Issue 29070
 generic_no_such_method_dispatcher_test: CompileTimeError
 generic_tearoff_test: CompileTimeError
-generic_test: CompileTimeError
-generics_test: CompileTimeError
 import_core_prefix_test: CompileTimeError # "dynamic" should be defined in core.
 instantiate_type_variable_test/01: CompileTimeError
-int64_literal_test/03: MissingCompileTimeError # http://dartbug.com/31479
-int64_literal_test/30: MissingCompileTimeError # http://dartbug.com/31479
 interceptor6_test: CompileTimeError
 issue13673_test: StaticWarning # Issue 31925
 issue31596_implement_covariant_test: CompileTimeError
@@ -1361,7 +1350,7 @@
 additional_interface_adds_optional_args_test: StaticWarning
 argument_assignability_function_typed_test/01: MissingCompileTimeError
 argument_assignability_function_typed_test/02: MissingCompileTimeError
-assertion_initializer_const_function_test/01: MissingStaticWarning
+assertion_initializer_const_function_test/01: MissingCompileTimeError
 async_congruence_local_test/01: MissingCompileTimeError
 async_congruence_local_test/02: MissingCompileTimeError
 async_congruence_method_test/01: MissingCompileTimeError
@@ -1491,6 +1480,7 @@
 generic_field_mixin6_test/01: MissingCompileTimeError
 generic_function_typedef2_test/04: MissingCompileTimeError
 generic_methods_generic_function_result_test/01: MissingCompileTimeError # Issue #30207
+generic_test/01: MissingCompileTimeError
 identical_const_test/01: MissingCompileTimeError
 identical_const_test/02: MissingCompileTimeError
 identical_const_test/03: MissingCompileTimeError
@@ -1532,8 +1522,6 @@
 inferrer_constructor5_test/01: MissingCompileTimeError
 initializing_formal_type_test: MissingCompileTimeError
 instantiate_type_variable_test/01: StaticWarning
-int64_literal_test/03: MissingCompileTimeError
-int64_literal_test/30: MissingCompileTimeError
 interceptor6_test: StaticWarning
 invalid_cast_test/01: MissingCompileTimeError
 invalid_cast_test/02: MissingCompileTimeError
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index 8c77d68..16de69c 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -40,15 +40,13 @@
 field_override_optimization_test: RuntimeError
 field_type_check2_test/01: MissingRuntimeError
 
-[ $compiler == dart2js && $runtime != drt && !$dart2js_with_kernel ]
-issue23244_test: RuntimeError # 23244
-
 [ $compiler == dart2js && $runtime == ff && !$dart2js_with_kernel ]
 field_override_optimization_test: RuntimeError
 field_type_check2_test/01: MissingRuntimeError
 round_test: Pass, Fail, OK # Fixed in ff 35. Common JavaScript engine Math.round bug.
 
 [ $compiler == dart2js && $runtime == jsshell ]
+async_call_test: RuntimeError # Timer interface not supported: Issue 7728.
 async_star_test/01: RuntimeError
 async_star_test/02: RuntimeError
 async_star_test/03: RuntimeError
@@ -71,17 +69,32 @@
 
 [ $compiler == dart2js && $runtime != none && $checked ]
 assert_with_message_test: RuntimeError
+function_subtype_bound_closure1_test: RuntimeError
+function_subtype_bound_closure2_test: RuntimeError
 function_subtype_bound_closure3_test: RuntimeError
 function_subtype_bound_closure4_test: RuntimeError
+function_subtype_bound_closure5_test: RuntimeError
+function_subtype_bound_closure5a_test: RuntimeError
+function_subtype_bound_closure6_test: RuntimeError
 function_subtype_bound_closure7_test: RuntimeError
 function_subtype_call1_test: RuntimeError
 function_subtype_call2_test: RuntimeError
 function_subtype_cast1_test: RuntimeError
+function_subtype_cast2_test: RuntimeError
+function_subtype_cast3_test: RuntimeError
+function_subtype_checked0_test: RuntimeError
+function_subtype_local1_test: RuntimeError
+function_subtype_local2_test: RuntimeError
+function_subtype_local5_test: RuntimeError
 function_subtype_named1_test: RuntimeError
 function_subtype_named2_test: RuntimeError
+function_subtype_not0_test: RuntimeError
 function_subtype_not1_test: RuntimeError
+function_subtype_not2_test: RuntimeError
+function_subtype_not3_test: RuntimeError
 function_subtype_optional1_test: RuntimeError
 function_subtype_optional2_test: RuntimeError
+function_subtype_top_level1_test: RuntimeError
 function_subtype_typearg2_test: RuntimeError
 function_subtype_typearg3_test: RuntimeError
 function_subtype_typearg5_test: RuntimeError
@@ -154,6 +167,8 @@
 function_type/function_type96_test: RuntimeError # Issue 30476
 function_type/function_type9_test: RuntimeError # Issue 30476
 function_type_alias2_test: RuntimeError
+function_type_alias3_test: RuntimeError
+function_type_alias4_test: RuntimeError
 
 [ $compiler == dart2js && $runtime != none && !$checked && !$dart2js_with_kernel ]
 callable_test/none: RuntimeError
@@ -169,29 +184,45 @@
 covariant_subtyping_unsafe_call1_test: RuntimeError
 covariant_subtyping_unsafe_call2_test: RuntimeError
 covariant_subtyping_unsafe_call3_test: RuntimeError
+function_subtype_bound_closure1_test: RuntimeError
+function_subtype_bound_closure2_test: RuntimeError
 function_subtype_bound_closure3_test: RuntimeError
 function_subtype_bound_closure4_test: RuntimeError
+function_subtype_bound_closure5_test: RuntimeError
+function_subtype_bound_closure5a_test: RuntimeError
+function_subtype_bound_closure6_test: RuntimeError
 function_subtype_bound_closure7_test: RuntimeError
 function_subtype_call1_test: RuntimeError
 function_subtype_call2_test: RuntimeError
 function_subtype_cast1_test: RuntimeError
+function_subtype_cast2_test: RuntimeError
+function_subtype_cast3_test: RuntimeError
 function_subtype_checked0_test: RuntimeError
 function_subtype_closure0_test: RuntimeError
 function_subtype_closure1_test: RuntimeError
 function_subtype_factory1_test: RuntimeError
 function_subtype_inline1_test: RuntimeError
+function_subtype_local1_test: RuntimeError
+function_subtype_local2_test: RuntimeError
+function_subtype_local5_test: RuntimeError
 function_subtype_named1_test: RuntimeError
 function_subtype_named2_test: RuntimeError
+function_subtype_not0_test: RuntimeError
 function_subtype_not1_test: RuntimeError
+function_subtype_not2_test: RuntimeError
+function_subtype_not3_test: RuntimeError
 function_subtype_optional1_test: RuntimeError
 function_subtype_optional2_test: RuntimeError
 function_subtype_regression_ddc_588_test: RuntimeError
 function_subtype_setter0_test: RuntimeError
+function_subtype_top_level1_test: RuntimeError
 function_subtype_typearg2_test: RuntimeError
 function_subtype_typearg3_test: RuntimeError
 function_subtype_typearg5_test: RuntimeError
 function_type2_test: RuntimeError
 function_type_alias2_test: RuntimeError
+function_type_alias3_test: RuntimeError
+function_type_alias4_test: RuntimeError
 function_type_call_getter2_test/none: RuntimeError
 function_type_test: RuntimeError
 generic_field_mixin6_test/none: RuntimeError
@@ -281,6 +312,7 @@
 invalid_cast_test/09: MissingCompileTimeError
 invalid_cast_test/10: MissingCompileTimeError
 invalid_cast_test/11: MissingCompileTimeError
+issue23244_test: RuntimeError # 23244
 issue31596_super_test/05: RuntimeError
 many_generic_instanceof_test: RuntimeError
 map_literal8_test: RuntimeError
@@ -334,7 +366,6 @@
 
 [ $compiler == dart2js && $checked && $dart2js_with_kernel && $strong ]
 assertion_initializer_const_function_test/01: MissingCompileTimeError
-assertion_initializer_test: CompileTimeError
 assertion_test: RuntimeError
 async_star_cancel_while_paused_test: RuntimeError
 async_star_test/02: RuntimeError
@@ -727,6 +758,8 @@
 function_type_call_getter2_test/03: MissingCompileTimeError
 function_type_call_getter2_test/04: MissingCompileTimeError
 function_type_call_getter2_test/05: MissingCompileTimeError
+generic_test/01: MissingCompileTimeError
+generic_test/none: RuntimeError
 malbounded_instantiation_test/01: Fail # Issue 12702
 malbounded_redirecting_factory_test/02: Fail # Issue 12825
 malbounded_redirecting_factory_test/03: Fail # Issue 12825
@@ -759,8 +792,6 @@
 type_argument_in_super_type_test: RuntimeError
 
 [ $compiler == dart2js && !$checked && $dart2js_with_kernel ]
-assertion_initializer_const_error2_test/*: CompileTimeError # Issue #31321
-assertion_initializer_const_error2_test/none: Pass
 cascaded_forwarding_stubs_generic_test: RuntimeError
 cascaded_forwarding_stubs_test: RuntimeError
 checked_setter3_test: RuntimeError # Issue 31128
@@ -823,7 +854,8 @@
 forwarding_stub_tearoff_generic_test: RuntimeError
 forwarding_stub_tearoff_test: RuntimeError
 function_subtype_inline2_test: RuntimeError
-generic_test: RuntimeError, OK
+generic_test/01: MissingCompileTimeError
+generic_test/none: RuntimeError # test requires Dart 2 subtyping for `is`
 issue31596_implement_covariant_test: RuntimeError
 issue31596_test: RuntimeError
 list_literal1_test/01: MissingCompileTimeError
@@ -833,6 +865,7 @@
 function_subtype_inline2_test: RuntimeError
 
 [ $compiler == dart2js && $dart2js_with_kernel ]
+async_error_timing_test: Crash
 bug31436_test: RuntimeError
 built_in_identifier_type_annotation_test/22: Crash # Issue 28815
 built_in_identifier_type_annotation_test/52: MissingCompileTimeError # Issue 28815
@@ -855,6 +888,7 @@
 checked_setter_test: RuntimeError # Issue 31128
 closure_param_null_to_object_test: RuntimeError
 extract_type_arguments_test: Crash # Issue 31371
+generic_test/01: MissingCompileTimeError # front end does not validate `extends`
 implicit_downcast_during_constructor_invocation_test: RuntimeError
 implicit_downcast_during_for_in_element_test: RuntimeError
 implicit_downcast_during_for_in_iterable_test: RuntimeError
@@ -874,7 +908,6 @@
 [ $compiler == dart2js && $dart2js_with_kernel && $fast_startup && $strong ]
 assertion_initializer_const_error2_test/none: CompileTimeError
 assertion_initializer_const_function_test/01: MissingCompileTimeError
-assertion_initializer_test: CompileTimeError
 assertion_test: RuntimeError
 async_star_cancel_while_paused_test: RuntimeError
 async_star_test/02: RuntimeError
@@ -1079,7 +1112,7 @@
 generic_list_checked_test: RuntimeError
 generic_local_functions_test: Crash # Unsupported operation: Unsupported type parameter type node Y.
 generic_tearoff_test: Crash # Unsupported operation: Unsupported type parameter type node T.
-generic_test: RuntimeError
+generic_test/none: RuntimeError
 generic_typedef_test: Crash # Unsupported operation: Unsupported type parameter type node S.
 getter_override2_test/02: MissingCompileTimeError
 getter_override_test/00: MissingCompileTimeError
@@ -1409,6 +1442,7 @@
 await_null_aware_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 await_postfix_expr_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 await_regression_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
+await_started_immediately_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 await_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 bad_named_parameters2_test/01: MissingCompileTimeError
 bad_named_parameters_test/01: MissingCompileTimeError
@@ -1526,24 +1560,11 @@
 deferred_constant_list_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 deferred_constraints_constants_test/none: CompileTimeError
 deferred_constraints_constants_test/reference_after_load: CompileTimeError
-deferred_constraints_type_annotation_test/as_operation: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/catch_check: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/is_check: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 deferred_constraints_type_annotation_test/new: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/new_before_load: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 deferred_constraints_type_annotation_test/new_generic1: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/new_generic2: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/new_generic3: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 deferred_constraints_type_annotation_test/none: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 deferred_constraints_type_annotation_test/static_method: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/type_annotation1: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/type_annotation_generic1: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/type_annotation_generic2: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/type_annotation_generic3: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/type_annotation_generic4: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 deferred_constraints_type_annotation_test/type_annotation_non_deferred: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/type_annotation_null: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/type_annotation_top_level: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 deferred_function_type_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 deferred_global_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 deferred_import_core_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
@@ -1624,12 +1645,19 @@
 full_stacktrace2_test: RuntimeError
 full_stacktrace3_test: RuntimeError
 function_propagation_test: CompileTimeError
+function_subtype_bound_closure1_test: RuntimeError
+function_subtype_bound_closure2_test: RuntimeError
 function_subtype_bound_closure3_test: RuntimeError
 function_subtype_bound_closure4_test: RuntimeError
+function_subtype_bound_closure5_test: RuntimeError
+function_subtype_bound_closure5a_test: RuntimeError
+function_subtype_bound_closure6_test: RuntimeError
 function_subtype_bound_closure7_test: Crash # Assertion failure: kind=special,memberName=instantiate,callStructure:CallStructure(arity=0, types=1)
 function_subtype_call1_test: RuntimeError
 function_subtype_call2_test: RuntimeError
 function_subtype_cast1_test: RuntimeError
+function_subtype_cast2_test: RuntimeError
+function_subtype_cast3_test: RuntimeError
 function_subtype_checked0_test: RuntimeError
 function_subtype_closure0_test: RuntimeError
 function_subtype_closure1_test: RuntimeError
@@ -1637,18 +1665,27 @@
 function_subtype_factory1_test: RuntimeError
 function_subtype_inline1_test: RuntimeError
 function_subtype_inline2_test: RuntimeError
+function_subtype_local1_test: RuntimeError
+function_subtype_local2_test: RuntimeError
+function_subtype_local5_test: RuntimeError
 function_subtype_named1_test: RuntimeError
 function_subtype_named2_test: RuntimeError
+function_subtype_not0_test: RuntimeError
 function_subtype_not1_test: RuntimeError
+function_subtype_not2_test: RuntimeError
+function_subtype_not3_test: RuntimeError
 function_subtype_optional1_test: RuntimeError
 function_subtype_optional2_test: RuntimeError
 function_subtype_regression_ddc_588_test: RuntimeError
 function_subtype_setter0_test: RuntimeError
+function_subtype_top_level1_test: RuntimeError
 function_subtype_typearg2_test: RuntimeError
 function_subtype_typearg3_test: RuntimeError
 function_subtype_typearg5_test: RuntimeError
 function_type2_test: RuntimeError
 function_type_alias2_test: RuntimeError
+function_type_alias3_test: RuntimeError
+function_type_alias4_test: RuntimeError
 function_type_alias_test: RuntimeError
 function_type_call_getter2_test/none: RuntimeError
 function_type_test: RuntimeError
@@ -1658,7 +1695,7 @@
 generic_closure_test/01: RuntimeError
 generic_closure_test/none: RuntimeError
 generic_field_mixin6_test/none: RuntimeError
-generic_function_bounds_test: CompileTimeError
+generic_function_bounds_test: Crash # Unsupported operation: Unsupported type parameter type node U.
 generic_function_dcall_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_function_type_as_type_argument_test/01: MissingCompileTimeError
 generic_function_type_as_type_argument_test/02: MissingCompileTimeError
@@ -1682,7 +1719,7 @@
 generic_methods_unused_parameter_test: Crash # Assertion failure: kind=special,memberName=instantiate,callStructure:CallStructure(arity=0, types=1)
 generic_no_such_method_dispatcher_simple_test: CompileTimeError
 generic_no_such_method_dispatcher_test: CompileTimeError
-generic_tearoff_test: Crash # Unsupported operation: Unsupported type parameter type node T.
+generic_tearoff_test: CompileTimeError
 generic_test: RuntimeError
 getter_override2_test/02: MissingCompileTimeError
 getter_override_test/00: MissingCompileTimeError
@@ -1847,16 +1884,8 @@
 mixin_invalid_bound_test/08: MissingCompileTimeError
 mixin_invalid_bound_test/09: MissingCompileTimeError
 mixin_invalid_bound_test/10: MissingCompileTimeError
-mixin_issue10216_2_test: RuntimeError
 mixin_mixin2_test: RuntimeError
 mixin_mixin3_test: RuntimeError
-mixin_mixin4_test: RuntimeError
-mixin_mixin5_test: RuntimeError
-mixin_mixin6_test: RuntimeError
-mixin_mixin7_test: RuntimeError
-mixin_mixin_bound2_test: RuntimeError
-mixin_mixin_bound_test: RuntimeError
-mixin_mixin_test: RuntimeError
 mixin_mixin_type_arguments_test: RuntimeError
 mixin_of_mixin_test/none: CompileTimeError
 mixin_super_2_test/none: CompileTimeError
@@ -2313,6 +2342,7 @@
 await_null_aware_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 await_postfix_expr_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 await_regression_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
+await_started_immediately_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 await_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 bad_named_parameters2_test/01: MissingCompileTimeError
 bad_named_parameters_test/01: MissingCompileTimeError
@@ -2428,24 +2458,11 @@
 deferred_constant_list_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 deferred_constraints_constants_test/none: CompileTimeError
 deferred_constraints_constants_test/reference_after_load: CompileTimeError
-deferred_constraints_type_annotation_test/as_operation: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/catch_check: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/is_check: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 deferred_constraints_type_annotation_test/new: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/new_before_load: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 deferred_constraints_type_annotation_test/new_generic1: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/new_generic2: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/new_generic3: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 deferred_constraints_type_annotation_test/none: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 deferred_constraints_type_annotation_test/static_method: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/type_annotation1: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/type_annotation_generic1: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/type_annotation_generic2: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/type_annotation_generic3: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/type_annotation_generic4: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 deferred_constraints_type_annotation_test/type_annotation_non_deferred: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/type_annotation_null: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-deferred_constraints_type_annotation_test/type_annotation_top_level: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 deferred_function_type_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 deferred_global_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 deferred_import_core_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
@@ -2527,12 +2544,19 @@
 full_stacktrace2_test: RuntimeError # Issue 12698
 full_stacktrace3_test: RuntimeError # Issue 12698
 function_propagation_test: CompileTimeError
+function_subtype_bound_closure1_test: RuntimeError
+function_subtype_bound_closure2_test: RuntimeError
 function_subtype_bound_closure3_test: RuntimeError
 function_subtype_bound_closure4_test: RuntimeError
+function_subtype_bound_closure5_test: RuntimeError
+function_subtype_bound_closure5a_test: RuntimeError
+function_subtype_bound_closure6_test: RuntimeError
 function_subtype_bound_closure7_test: RuntimeError
 function_subtype_call1_test: RuntimeError
 function_subtype_call2_test: RuntimeError
 function_subtype_cast1_test: RuntimeError
+function_subtype_cast2_test: RuntimeError
+function_subtype_cast3_test: RuntimeError
 function_subtype_checked0_test: RuntimeError
 function_subtype_closure0_test: RuntimeError
 function_subtype_closure1_test: RuntimeError
@@ -2540,18 +2564,27 @@
 function_subtype_factory1_test: RuntimeError
 function_subtype_inline1_test: RuntimeError
 function_subtype_inline2_test: RuntimeError
+function_subtype_local1_test: RuntimeError
+function_subtype_local2_test: RuntimeError
+function_subtype_local5_test: RuntimeError
 function_subtype_named1_test: RuntimeError
 function_subtype_named2_test: RuntimeError
+function_subtype_not0_test: RuntimeError
 function_subtype_not1_test: RuntimeError
+function_subtype_not2_test: RuntimeError
+function_subtype_not3_test: RuntimeError
 function_subtype_optional1_test: RuntimeError
 function_subtype_optional2_test: RuntimeError
 function_subtype_regression_ddc_588_test: RuntimeError
 function_subtype_setter0_test: RuntimeError
+function_subtype_top_level1_test: RuntimeError
 function_subtype_typearg2_test: RuntimeError
 function_subtype_typearg3_test: RuntimeError
 function_subtype_typearg5_test: RuntimeError
 function_type2_test: RuntimeError
 function_type_alias2_test: RuntimeError
+function_type_alias3_test: RuntimeError
+function_type_alias4_test: RuntimeError
 function_type_alias_test: RuntimeError
 function_type_call_getter2_test/none: RuntimeError
 function_type_test: RuntimeError
@@ -2559,7 +2592,7 @@
 generic_async_star_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 generic_async_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 generic_field_mixin6_test/none: RuntimeError
-generic_function_bounds_test: CompileTimeError
+generic_function_bounds_test: Crash # Unsupported operation: Unsupported type parameter type node U.
 generic_function_dcall_test: RuntimeError
 generic_function_type_as_type_argument_test/01: MissingCompileTimeError
 generic_function_type_as_type_argument_test/02: MissingCompileTimeError
@@ -2583,8 +2616,7 @@
 generic_methods_unused_parameter_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [Instance of 'LiteralNull', null]
 generic_no_such_method_dispatcher_simple_test: CompileTimeError
 generic_no_such_method_dispatcher_test: CompileTimeError
-generic_tearoff_test: Crash # Unsupported operation: Unsupported type parameter type node T.
-generic_test: RuntimeError
+generic_tearoff_test: CompileTimeError
 getter_override2_test/02: MissingCompileTimeError
 getter_override_test/00: MissingCompileTimeError
 getter_override_test/01: MissingCompileTimeError
@@ -2747,9 +2779,6 @@
 mixin_invalid_bound_test/08: MissingCompileTimeError
 mixin_invalid_bound_test/09: MissingCompileTimeError
 mixin_invalid_bound_test/10: MissingCompileTimeError
-mixin_issue10216_2_test: RuntimeError
-mixin_mixin7_test: RuntimeError
-mixin_mixin_test: RuntimeError
 mixin_mixin_type_arguments_test: RuntimeError
 mixin_of_mixin_test/none: CompileTimeError
 mixin_super_2_test/none: CompileTimeError
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index 5deda7c..6cee575 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -11,20 +11,11 @@
 accessor_conflict_import_prefixed_test: CompileTimeError # Issue 25626
 accessor_conflict_import_test: CompileTimeError # Issue 25626
 additional_interface_adds_optional_args_test: CompileTimeError # Issue #30568
-assertion_initializer_const_error2_test/*: Crash # Issue #27809
-assertion_initializer_const_error2_test/cc10: Pass # Issue #31319
-assertion_initializer_const_error2_test/cc11: Pass # Issue #31319
-assertion_initializer_const_error2_test/none: Pass
-assertion_initializer_const_function_test/01: Crash
-assertion_initializer_test: CompileTimeError
 black_listed_test/none: Fail # Issue 14228
 built_in_identifier_prefix_test: CompileTimeError
 built_in_identifier_type_annotation_test/22: MissingCompileTimeError # Issue 28816
-call_type_literal_test: CompileTimeError
 cascaded_forwarding_stubs_generic_test: RuntimeError
 cascaded_forwarding_stubs_test: CompileTimeError
-class_literal_static_test/none: CompileTimeError
-class_literal_test/none: CompileTimeError
 conflicting_type_variable_and_setter_test: CompileTimeError
 const_for_in_variable_test/01: MissingCompileTimeError
 const_types_test/07: MissingCompileTimeError
@@ -32,7 +23,6 @@
 const_types_test/14: MissingCompileTimeError
 const_types_test/15: MissingCompileTimeError
 constant_type_literal_test/01: MissingCompileTimeError # DDC allows type parameter type literals in const expressions.
-constructor_call_as_function_test: CompileTimeError
 emit_const_fields_test: CompileTimeError
 enum_syntax_test/05: MissingCompileTimeError
 enum_syntax_test/06: MissingCompileTimeError
@@ -49,10 +39,21 @@
 generic_methods_generic_function_result_test/none: CompileTimeError # Issue #30208
 generic_no_such_method_dispatcher_simple_test: Skip # This test is just for kernel.
 generic_no_such_method_dispatcher_test: CompileTimeError
-generic_test: CompileTimeError
-generics_test: CompileTimeError
 getter_setter_in_lib_test: CompileTimeError
-implicit_downcast_during_assert_initializer_test: Crash
+implicit_creation/implicit_const_context_constructor_generic_named_test: CompileTimeError
+implicit_creation/implicit_const_context_constructor_generic_test: CompileTimeError
+implicit_creation/implicit_const_context_constructor_named_test: CompileTimeError
+implicit_creation/implicit_const_context_list_test: CompileTimeError
+implicit_creation/implicit_const_context_map_test: CompileTimeError
+implicit_creation/implicit_const_context_prefix_constructor_generic_named_test: CompileTimeError
+implicit_creation/implicit_const_context_prefix_constructor_generic_test: CompileTimeError
+implicit_creation/implicit_const_context_prefix_constructor_named_test: CompileTimeError
+implicit_creation/implicit_new_constructor_generic_named_test: CompileTimeError
+implicit_creation/implicit_new_constructor_generic_test: CompileTimeError
+implicit_creation/implicit_new_or_const_composite_test: CompileTimeError
+implicit_creation/implicit_new_or_const_generic_test: RuntimeError
+implicit_creation/implicit_new_or_const_test: RuntimeError
+implicit_creation/implicit_new_prefix_constructor_generic_test: CompileTimeError
 import_core_prefix_test: CompileTimeError
 import_private_test/01: MissingCompileTimeError # Issue 29920
 initializing_formal_final_test: MissingCompileTimeError
@@ -100,11 +101,12 @@
 parameter_initializer_test: CompileTimeError
 part_refers_to_core_library_test/01: Crash
 prefix10_negative_test: Fail # Issue 29920
+private_access_test/04: MissingCompileTimeError
 regress_23408_test: CompileTimeError
 regress_29025_test: CompileTimeError # Issue 29081
 regress_29349_test: CompileTimeError # Issue 31093
 regress_29405_test: CompileTimeError # Issue 29421
-regress_29784_test/02: CompileTimeError, Crash # Issue 27809
+regress_29784_test/02: MissingCompileTimeError
 regress_30121_test: CompileTimeError # Issue 31087
 regress_30339_test: CompileTimeError # As expected. Should we make this a multi test?
 reify_typevar_static_test/00: MissingCompileTimeError # Issue 29920
@@ -118,7 +120,7 @@
 try_catch_on_syntax_test/11: MissingCompileTimeError
 type_inference_circularity_test: MissingCompileTimeError
 type_inference_inconsistent_inheritance_test: MissingCompileTimeError
-type_literal_prefix_call_test: CompileTimeError
+type_literal_prefix_call_test: RuntimeError
 type_promotion_functions_test/02: CompileTimeError # Issue 30895
 type_promotion_functions_test/03: CompileTimeError # Issue 30895
 type_promotion_functions_test/04: CompileTimeError # Issue 30895
@@ -340,13 +342,13 @@
 additional_interface_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
 additional_interface_adds_optional_args_concrete_test: MissingCompileTimeError
 additional_interface_adds_optional_args_supercall_test: MissingCompileTimeError
-assertion_initializer_test: CompileTimeError
 async_await_syntax_test/c10a: MissingCompileTimeError
 async_await_syntax_test/d08b: MissingCompileTimeError
 async_await_syntax_test/d10a: MissingCompileTimeError
 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
+async_return_types_test/nestedFuture: MissingCompileTimeError
 async_return_types_test/tooManyTypeParameters: MissingCompileTimeError
 async_return_types_test/wrongReturnType: MissingCompileTimeError
 bad_named_parameters2_test/01: MissingCompileTimeError
@@ -438,19 +440,6 @@
 default_factory2_test/01: MissingCompileTimeError
 default_factory_test/01: MissingCompileTimeError
 deferred_constraints_constants_test/default_argument2: MissingCompileTimeError
-deferred_constraints_type_annotation_test/as_operation: MissingCompileTimeError
-deferred_constraints_type_annotation_test/catch_check: MissingCompileTimeError
-deferred_constraints_type_annotation_test/is_check: MissingCompileTimeError
-deferred_constraints_type_annotation_test/new_before_load: MissingCompileTimeError
-deferred_constraints_type_annotation_test/new_generic2: MissingCompileTimeError
-deferred_constraints_type_annotation_test/new_generic3: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation1: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic1: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic2: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic3: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic4: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_null: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_top_level: MissingCompileTimeError
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
@@ -482,80 +471,15 @@
 field_override_test/00: MissingCompileTimeError
 field_override_test/01: MissingCompileTimeError
 function_propagation_test: CompileTimeError
-function_type/function_type10_test: RuntimeError # Issue 31766
-function_type/function_type11_test: RuntimeError # Issue 31766
-function_type/function_type14_test: RuntimeError # Issue 31766
-function_type/function_type15_test: RuntimeError # Issue 31766
-function_type/function_type18_test: RuntimeError # Issue 31766
-function_type/function_type19_test: RuntimeError # Issue 31766
-function_type/function_type20_test: RuntimeError # Issue 31766
-function_type/function_type21_test: RuntimeError # Issue 31766
-function_type/function_type22_test: RuntimeError # Issue 31766
-function_type/function_type23_test: RuntimeError # Issue 31766
-function_type/function_type24_test: RuntimeError # Issue 31766
-function_type/function_type25_test: RuntimeError # Issue 31766
-function_type/function_type26_test: RuntimeError # Issue 31766
-function_type/function_type27_test: RuntimeError # Issue 31766
-function_type/function_type28_test: RuntimeError # Issue 31766
-function_type/function_type29_test: RuntimeError # Issue 31766
-function_type/function_type2_test: RuntimeError # Issue 31766
-function_type/function_type30_test: RuntimeError # Issue 31766
-function_type/function_type31_test: RuntimeError # Issue 31766
-function_type/function_type32_test: RuntimeError # Issue 31766
-function_type/function_type33_test: RuntimeError # Issue 31766
-function_type/function_type34_test: RuntimeError # Issue 31766
-function_type/function_type35_test: RuntimeError # Issue 31766
-function_type/function_type36_test: RuntimeError # Issue 31766
-function_type/function_type37_test: RuntimeError # Issue 31766
-function_type/function_type38_test: RuntimeError # Issue 31766
-function_type/function_type39_test: RuntimeError # Issue 31766
-function_type/function_type3_test: RuntimeError # Issue 31766
-function_type/function_type40_test: RuntimeError # Issue 31766
-function_type/function_type41_test: RuntimeError # Issue 31766
-function_type/function_type42_test: RuntimeError # Issue 31766
-function_type/function_type43_test: RuntimeError # Issue 31766
-function_type/function_type44_test: RuntimeError # Issue 31766
-function_type/function_type45_test: RuntimeError # Issue 31766
-function_type/function_type46_test: RuntimeError # Issue 31766
-function_type/function_type47_test: RuntimeError # Issue 31766
-function_type/function_type48_test: RuntimeError # Issue 31766
-function_type/function_type49_test: RuntimeError # Issue 31766
-function_type/function_type50_test: RuntimeError # Issue 31766
-function_type/function_type51_test: RuntimeError # Issue 31766
-function_type/function_type54_test: RuntimeError # Issue 31766
-function_type/function_type55_test: RuntimeError # Issue 31766
-function_type/function_type58_test: RuntimeError # Issue 31766
-function_type/function_type59_test: RuntimeError # Issue 31766
-function_type/function_type62_test: RuntimeError # Issue 31766
-function_type/function_type63_test: RuntimeError # Issue 31766
-function_type/function_type66_test: RuntimeError # Issue 31766
-function_type/function_type67_test: RuntimeError # Issue 31766
-function_type/function_type6_test: RuntimeError # Issue 31766
-function_type/function_type70_test: RuntimeError # Issue 31766
-function_type/function_type71_test: RuntimeError # Issue 31766
-function_type/function_type74_test: RuntimeError # Issue 31766
-function_type/function_type75_test: RuntimeError # Issue 31766
-function_type/function_type78_test: RuntimeError # Issue 31766
-function_type/function_type79_test: RuntimeError # Issue 31766
-function_type/function_type7_test: RuntimeError # Issue 31766
-function_type/function_type82_test: RuntimeError # Issue 31766
-function_type/function_type83_test: RuntimeError # Issue 31766
-function_type/function_type86_test: RuntimeError # Issue 31766
-function_type/function_type87_test: RuntimeError # Issue 31766
-function_type/function_type90_test: RuntimeError # Issue 31766
-function_type/function_type91_test: RuntimeError # Issue 31766
-function_type/function_type94_test: RuntimeError # Issue 31766
-function_type/function_type95_test: RuntimeError # Issue 31766
-function_type/function_type98_test: RuntimeError # Issue 31766
-function_type/function_type99_test: RuntimeError # Issue 31766
 function_type_parameter2_negative_test: Fail
 function_type_parameter_negative_test: Fail
-generic_function_bounds_test: CompileTimeError
+generic_function_bounds_test: RuntimeError
 generic_methods_bounds_test/01: MissingCompileTimeError
 generic_methods_generic_function_result_test/01: MissingCompileTimeError
 generic_methods_recursive_bound_test/02: MissingCompileTimeError
 generic_no_such_method_dispatcher_simple_test: CompileTimeError # Warning: Superclass has no method named 'foo'.
 generic_no_such_method_dispatcher_test: CompileTimeError # Issue 31533
+generic_test/01: MissingCompileTimeError # front end does not validate `extends`
 getter_override2_test/02: MissingCompileTimeError
 getter_override_test/00: MissingCompileTimeError
 getter_override_test/01: MissingCompileTimeError
@@ -834,9 +758,7 @@
 execute_finally6_test: RuntimeError # Issue 29920
 expect_test: RuntimeError # Issue 29920
 f_bounded_quantification3_test: RuntimeError # Issue 29920
-final_field_initialization_order_test: RuntimeError # Issue 31058
 forwarding_stub_tearoff_generic_test: RuntimeError
-fuzzy_arrows_test/03: RuntimeError # Issue 29630
 generic_methods_overriding_test/03: MissingCompileTimeError # Issue 29920
 getter_closure_execution_order_test: RuntimeError # Issue 29920
 implicit_downcast_during_compound_assignment_test: RuntimeError
@@ -870,32 +792,8 @@
 [ $compiler == dartdevk && $runtime != none ]
 conditional_import_string_test: CompileTimeError # Test is broken
 conditional_import_test: CompileTimeError # Test is broken
-function_subtype_bound_closure1_test: RuntimeError # Expect.isTrue(false, 'foo is Foo') fails.
-function_subtype_bound_closure2_test: RuntimeError # ReferenceError: TAndStringToint is not defined
-function_subtype_bound_closure5_test: RuntimeError # ReferenceError: TAndStringToint is not defined
-function_subtype_bound_closure5a_test: RuntimeError # ReferenceError: TAndStringToint is not defined
-function_subtype_bound_closure6_test: RuntimeError # ReferenceError: TAndStringToint is not defined
 function_subtype_cast0_test: RuntimeError # CastError: Casting value of type '(int) => void' to type '(dynamic) => void' which is incompatible
-function_subtype_cast2_test: RuntimeError # ReferenceError: TTovoid is not defined
-function_subtype_cast3_test: RuntimeError # ReferenceError: TTovoid is not defined
-function_subtype_checked0_test: RuntimeError # Expect.throws(TypeError) fails: Did not throw
 function_subtype_closure0_test: RuntimeError # Expect.throws(TypeError) fails: Did not throw
-function_subtype_local1_test: RuntimeError # Expect.isTrue(false, 'foo is Foo') fails.
-function_subtype_local2_test: RuntimeError # ReferenceError: TAndStringToint is not defined
-function_subtype_local5_test: RuntimeError # ReferenceError: TAndStringToint is not defined
-function_subtype_not0_test: RuntimeError # Expect.isFalse(true) fails.
-function_subtype_not2_test: RuntimeError # ReferenceError: TTovoid is not defined
-function_subtype_not3_test: RuntimeError # ReferenceError: TTovoid is not defined
-function_subtype_simple1_test: RuntimeError # Expect.isTrue(false) fails.
-function_subtype_top_level1_test: RuntimeError # ReferenceError: TAndStringToint is not defined
-function_subtype_typearg5_test: RuntimeError # ReferenceError: JSArrayOfXAndXToX is not defined
-function_type_alias2_test: RuntimeError # Expect.isTrue(false) fails.
-function_type_alias3_test: RuntimeError # TypeError: library11.Library111$ is not a function
-function_type_alias4_test: RuntimeError # Expect.isTrue(false) fails.
-function_type_alias_test: RuntimeError # Expect.isTrue(false) fails.
-generic_closure_test/01: RuntimeError # ReferenceError: TToT is not defined
-generic_closure_test/none: RuntimeError # ReferenceError: TToT is not defined
-generic_test: RuntimeError # ReferenceError: BOfT is not defined
 implicit_creation/implicit_new_or_const_composite_test: RuntimeError
 implicit_creation/implicit_new_or_const_test: RuntimeError
 library_env_test/has_io_support: RuntimeError # Unsupported operation: bool.fromEnvironment can only be used as a const constructor
@@ -1034,7 +932,6 @@
 abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError # Issue #30568
 abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError # Issue #30568
 abstract_override_adds_optional_args_supercall_test: MissingCompileTimeError # Issue #30568
-async_return_types_test/nestedFuture: MissingCompileTimeError
 bit_operations_test/01: MissingCompileTimeError
 bit_operations_test/02: MissingCompileTimeError
 built_in_identifier_prefix_test: CompileTimeError
diff --git a/tests/language_2/language_2_flutter.status b/tests/language_2/language_2_flutter.status
index 2953d2c..8ed9601 100644
--- a/tests/language_2/language_2_flutter.status
+++ b/tests/language_2/language_2_flutter.status
@@ -85,7 +85,6 @@
 field_increment_bailout_test: CompileTimeError
 field_override_test/01: CompileTimeError
 function_malformed_result_type_test: CompileTimeError
-generalized_void_syntax_test: CompileTimeError # Issue #30176
 generic_function_typedef2_test/04: CompileTimeError
 instance_creation_in_function_annotation_test: CompileTimeError
 internal_library_test/01: CompileTimeError
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index 032adc8..981f39d 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -274,7 +274,6 @@
 cyclic_type_variable_test/04: Crash
 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)
@@ -318,19 +317,10 @@
 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.
-async_await_syntax_test/c03a: RuntimeError
-async_await_syntax_test/c09a: RuntimeError
-async_await_syntax_test/d03a: RuntimeError
-async_await_syntax_test/d09a: RuntimeError
 async_await_test/02: RuntimeError
 async_await_test/03: RuntimeError
 async_await_test/none: RuntimeError
 async_return_types_test/nestedFuture: Fail
-async_return_types_test/none: RuntimeError
-async_star_regression_2238_test: RuntimeError
-async_star_take_reyield_test: RuntimeError
-asyncstar_yield_test: RuntimeError
-asyncstar_yieldstar_test: RuntimeError
 compile_time_constant_checked_test/02: MissingCompileTimeError
 const_constructor2_test/20: MissingCompileTimeError
 const_constructor2_test/22: MissingCompileTimeError
@@ -340,74 +330,6 @@
 covariance_type_parameter_test/03: RuntimeError
 covariance_type_parameter_test/none: RuntimeError
 default_factory2_test/01: Fail
-f_bounded_quantification4_test: RuntimeError
-function_type/function_type10_test: RuntimeError
-function_type/function_type11_test: RuntimeError
-function_type/function_type14_test: RuntimeError
-function_type/function_type15_test: RuntimeError
-function_type/function_type18_test: RuntimeError
-function_type/function_type19_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_type50_test: RuntimeError
-function_type/function_type51_test: RuntimeError
-function_type/function_type54_test: RuntimeError
-function_type/function_type55_test: RuntimeError
-function_type/function_type58_test: RuntimeError
-function_type/function_type59_test: RuntimeError
-function_type/function_type62_test: RuntimeError
-function_type/function_type63_test: RuntimeError
-function_type/function_type66_test: RuntimeError
-function_type/function_type67_test: RuntimeError
-function_type/function_type6_test: RuntimeError
-function_type/function_type70_test: RuntimeError
-function_type/function_type71_test: RuntimeError
-function_type/function_type74_test: RuntimeError
-function_type/function_type75_test: RuntimeError
-function_type/function_type78_test: RuntimeError
-function_type/function_type79_test: RuntimeError
-function_type/function_type7_test: RuntimeError
-function_type/function_type82_test: RuntimeError
-function_type/function_type83_test: RuntimeError
-function_type/function_type86_test: RuntimeError
-function_type/function_type87_test: RuntimeError
-function_type/function_type90_test: RuntimeError
-function_type/function_type91_test: RuntimeError
-function_type/function_type94_test: RuntimeError
-function_type/function_type95_test: RuntimeError
-function_type/function_type98_test: RuntimeError
-function_type/function_type99_test: RuntimeError
-known_identifier_usage_error_test/none: RuntimeError # Issue 28814
 malbounded_redirecting_factory_test/03: Fail
 malbounded_redirecting_factory_test/04: Fail
 malbounded_type_test_test/03: Fail
@@ -417,6 +339,7 @@
 mixin_invalid_bound2_test/10: Fail
 mixin_invalid_bound_test/06: Fail
 mixin_invalid_bound_test/07: Fail
+recursive_inheritance_test: RuntimeError
 recursive_mixin_test: Crash
 redirecting_factory_infinite_steps_test/01: Fail
 redirecting_factory_malbounded_test/01: Fail
@@ -449,17 +372,16 @@
 
 # ===== dartk + vm status lines =====
 [ $compiler == dartk && $runtime == vm && $strong ]
-abstract_factory_constructor_test/00: MissingCompileTimeError
-abstract_getter_test/01: MissingCompileTimeError
-abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
-abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError
-abstract_override_adds_optional_args_supercall_test: MissingCompileTimeError
-abstract_syntax_test/00: MissingCompileTimeError
-additional_interface_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
-additional_interface_adds_optional_args_concrete_test: MissingCompileTimeError
-additional_interface_adds_optional_args_supercall_test: MissingCompileTimeError
+abstract_factory_constructor_test/00: MissingCompileTimeError # Issue 32013.
+abstract_getter_test/01: MissingCompileTimeError # Issue 32013.
+abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError # Issue 32013.
+abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError # Issue 32014.
+abstract_override_adds_optional_args_supercall_test: MissingCompileTimeError # Issue 32014.
+abstract_syntax_test/00: MissingCompileTimeError # Issue 32013.
+additional_interface_adds_optional_args_concrete_subclass_test: MissingCompileTimeError # Issue 32014.
+additional_interface_adds_optional_args_concrete_test: MissingCompileTimeError # Issue 32014.
+additional_interface_adds_optional_args_supercall_test: MissingCompileTimeError # Issue 32014.
 arithmetic2_test: RuntimeError # Throws CastError instead of TypeError
-assertion_initializer_test: CompileTimeError # Issue 31402 (Assert statement)
 async_await_syntax_test/c10a: MissingCompileTimeError
 async_await_syntax_test/d08b: MissingCompileTimeError
 async_await_syntax_test/d10a: MissingCompileTimeError
@@ -505,7 +427,7 @@
 call_non_method_field_test/02: MissingCompileTimeError
 call_with_no_such_method_test: CompileTimeError # Issue 31402 (Invocation arguments)
 callable_test/none: CompileTimeError # Issue 31402 (Variable declaration)
-cha_deopt1_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+cha_deopt1_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 cha_deopt1_test: RuntimeError
 check_member_static_test/01: MissingCompileTimeError
 closure_invoked_through_interface_target_field_test: MissingCompileTimeError
@@ -522,8 +444,8 @@
 compile_time_constant_static5_test/16: CompileTimeError # Issue 31537
 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_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+conditional_import_string_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+conditional_import_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 config_import_corelib_test: CompileTimeError # Issue 31533
 config_import_test: RuntimeError # KernelVM bug: Configurable imports.
 const_constructor2_test/11: CompileTimeError # Issue 31402 (Invocation arguments)
@@ -573,45 +495,45 @@
 cyclic_typedef_test/11: Crash
 default_factory2_test/01: MissingCompileTimeError
 default_factory_test/01: MissingCompileTimeError
-deferred_call_empty_before_load_test: CompileTimeError # 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/new: CompileTimeError # Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/new_generic1: CompileTimeError # Deferred loading kernel issue 28335
-deferred_constraints_type_annotation_test/none: CompileTimeError # Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/static_method: CompileTimeError # Deferred loading kernel issue 28335.
-deferred_constraints_type_annotation_test/type_annotation_non_deferred: CompileTimeError # 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: MissingCompileTimeError # 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: CompileTimeError # 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 # 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 # 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: 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/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.
+deferred_call_empty_before_load_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_closurize_load_library_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_constant_list_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_constraints_constants_test/default_argument2: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 30273.
+deferred_constraints_constants_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_constraints_constants_test/reference_after_load: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_constraints_type_annotation_test/new: CompileTimeError # Deferred loading kernel issue 30273.
+deferred_constraints_type_annotation_test/new_generic1: CompileTimeError # Deferred loading kernel issue 30273
+deferred_constraints_type_annotation_test/none: CompileTimeError # Deferred loading kernel issue 30273.
+deferred_constraints_type_annotation_test/static_method: CompileTimeError # Deferred loading kernel issue 30273.
+deferred_constraints_type_annotation_test/type_annotation_non_deferred: CompileTimeError # Deferred loading kernel issue 30273.
+deferred_function_type_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_global_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_import_core_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_inheritance_constraints_test/extends: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
+deferred_inheritance_constraints_test/implements: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
+deferred_inheritance_constraints_test/mixin: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
+deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
+deferred_inlined_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_load_constants_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_load_inval_code_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_load_library_wrong_args_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 30273.
+deferred_load_library_wrong_args_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_mixin_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_no_such_method_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_not_loaded_check_test: CompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
+deferred_only_constant_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_optimized_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_redirecting_factory_test: RuntimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_regression_22995_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_regression_28678_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_shadow_load_library_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_shared_and_unshared_classes_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_static_seperate_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_super_dependency_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 30273.
+deferred_type_dependency_test/as: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_type_dependency_test/is: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_type_dependency_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_type_dependency_test/type_annotation: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 disassemble_test: Pass, Slow
 duplicate_export_negative_test: Fail # Issue 6134
 dynamic_prefix_core_test/none: CompileTimeError
@@ -637,36 +559,13 @@
 for_in_side_effects_test/01: MissingCompileTimeError
 function_propagation_test: CompileTimeError # Issue 31402 (Variable declaration)
 function_subtype3_test: RuntimeError
-function_subtype_bound_closure1_test: RuntimeError
-function_subtype_bound_closure2_test: RuntimeError
-function_subtype_bound_closure5_test: RuntimeError
-function_subtype_bound_closure5a_test: RuntimeError
-function_subtype_bound_closure6_test: RuntimeError
 function_subtype_call1_test: RuntimeError
 function_subtype_call2_test: RuntimeError
 function_subtype_cast0_test: RuntimeError
-function_subtype_cast2_test: RuntimeError
-function_subtype_cast3_test: RuntimeError
-function_subtype_checked0_test: RuntimeError
 function_subtype_inline2_test: RuntimeError
-function_subtype_local1_test: RuntimeError
-function_subtype_local2_test: RuntimeError
-function_subtype_local5_test: RuntimeError
-function_subtype_not0_test: RuntimeError
-function_subtype_not2_test: RuntimeError
-function_subtype_not3_test: RuntimeError
-function_subtype_simple1_test: RuntimeError
-function_subtype_top_level1_test: RuntimeError
-function_subtype_typearg5_test: RuntimeError
 function_type2_test: RuntimeError
-function_type_alias2_test: RuntimeError
-function_type_alias3_test: RuntimeError
-function_type_alias4_test: RuntimeError
 function_type_alias6_test/none: RuntimeError
-function_type_alias_test: RuntimeError
-generic_closure_test: RuntimeError
-generic_function_bounds_test: CompileTimeError
-generic_function_bounds_test: RuntimeError
+generic_function_bounds_test: Crash # Issue 32012
 generic_function_dcall_test: RuntimeError
 generic_instanceof2_test: RuntimeError
 generic_is_check_test: RuntimeError
@@ -677,7 +576,7 @@
 generic_no_such_method_dispatcher_test: CompileTimeError # Issue 31533
 generic_tearoff_test: CompileTimeError
 generic_tearoff_test: RuntimeError
-generic_test: RuntimeError
+generic_test/01: MissingCompileTimeError # front end does not validate `extends`
 getter_override_test/03: MissingCompileTimeError
 identical_const_test/01: MissingCompileTimeError
 identical_const_test/02: MissingCompileTimeError
@@ -698,7 +597,7 @@
 issue31596_super_test/03: CompileTimeError
 issue31596_super_test/04: MissingCompileTimeError
 issue31596_super_test/05: RuntimeError
-issue_1751477_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+issue_1751477_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 issue_25671a_test/01: CompileTimeError # Test assumes Dart 1.0 semantics
 issue_25671b_test/01: DartkCrash
 least_upper_bound_expansive_test/none: CompileTimeError
@@ -866,13 +765,13 @@
 redirecting_factory_infinite_steps_test/01: MissingCompileTimeError
 redirecting_factory_long_test: RuntimeError # Fasta bug: Bad compilation of type arguments for redirecting factory.
 redirecting_factory_malbounded_test/01: MissingCompileTimeError
-regress_22443_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+regress_22443_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 regress_23089_test: Crash
-regress_23408_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+regress_23408_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 regress_23408_test: RuntimeError
 regress_25550_test: CompileTimeError # Issue 31402 (Variable declaration)
 regress_27617_test/1: MissingCompileTimeError # Fasta bug: Bad constructor redirection.
-regress_28278_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+regress_28278_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 regress_29025_test: CompileTimeError # Issue 31402 (Variable declaration)
 regress_29405_test: CompileTimeError # Issue 31402 (Invocation arguments)
 regress_29784_test/01: MissingCompileTimeError
@@ -936,7 +835,7 @@
 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/optimized_guarded_field_isolates_test: RuntimeError # Issue 31402 (Variable declaration)
-vm/regress_27201_test: CompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
+vm/regress_27201_test: CompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
 vm/regress_29145_test: Skip # Issue 29145
 vm/type_cast_vm_test: RuntimeError
 void_block_return_test/00: MissingCompileTimeError
@@ -950,8 +849,18 @@
 ct_const2_test: Fail
 
 [ $compiler == dartk && $strong ]
-cha_deopt2_test: CompileTimeError, DartkCrash # KernelVM bug: Deferred loading kernel issue 28335.
-cha_deopt3_test: CompileTimeError, DartkCrash # KernelVM bug: Deferred loading kernel issue 28335.
+assertion_initializer_const_error2_test/cc01: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc02: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc03: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc05: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc06: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc07: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc08: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc09: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc10: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc11: MissingCompileTimeError # Not reporting failed assert() at compile time.
+cha_deopt2_test: CompileTimeError, DartkCrash # KernelVM bug: Deferred loading kernel issue 30273.
+cha_deopt3_test: CompileTimeError, DartkCrash # KernelVM bug: Deferred loading kernel issue 30273.
 hello_dart_test: Crash
 recursive_mixin_test: Crash
 redirecting_factory_reflection_test: Crash
@@ -960,12 +869,8 @@
 # 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) ]
-class_cycle_test/02: MissingCompileTimeError # Please triage.
-class_cycle_test/03: MissingCompileTimeError # Please triage.
-deferred_constraints_constants_test/default_argument2: MissingCompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-duplicate_implements_test/01: MissingCompileTimeError # Please triage.
-duplicate_implements_test/02: MissingCompileTimeError # Please triage.
-generic_methods_generic_function_result_test/01: MissingCompileTimeError # Please triage.
+deferred_constraints_constants_test/default_argument2: MissingCompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+duplicate_implements_test/02: Slow, Pass
 least_upper_bound_expansive_test/none: RuntimeError # Please triage.
 
 [ $compiler == dartk && !$strong ]
@@ -1035,16 +940,8 @@
 assertion_initializer_const_error2_test/cc09: Crash
 assertion_initializer_const_error2_test/cc10: Crash
 assertion_initializer_const_error2_test/cc11: Crash
-async_await_syntax_test/c03a: RuntimeError
-async_await_syntax_test/c09a: RuntimeError
-async_await_syntax_test/d03a: RuntimeError
-async_await_syntax_test/d09a: RuntimeError
 async_await_test: RuntimeError
 async_return_types_test/nestedFuture: Fail
-async_return_types_test/none: RuntimeError
-async_star_take_reyield_test: RuntimeError
-asyncstar_yield_test: RuntimeError
-asyncstar_yieldstar_test: RuntimeError
 compile_time_constant_checked_test/02: MissingCompileTimeError
 const_constructor2_test/20: MissingCompileTimeError
 const_constructor2_test/22: MissingCompileTimeError
@@ -1061,72 +958,6 @@
 function_subtype_inline1_test: Pass
 function_subtype_inline2_test: Pass
 function_subtype_setter0_test: Pass
-function_type/function_type10_test: RuntimeError
-function_type/function_type11_test: RuntimeError
-function_type/function_type14_test: RuntimeError
-function_type/function_type15_test: RuntimeError
-function_type/function_type18_test: RuntimeError
-function_type/function_type19_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_type50_test: RuntimeError
-function_type/function_type51_test: RuntimeError
-function_type/function_type54_test: RuntimeError
-function_type/function_type55_test: RuntimeError
-function_type/function_type58_test: RuntimeError
-function_type/function_type59_test: RuntimeError
-function_type/function_type62_test: RuntimeError
-function_type/function_type63_test: RuntimeError
-function_type/function_type66_test: RuntimeError
-function_type/function_type67_test: RuntimeError
-function_type/function_type6_test: RuntimeError
-function_type/function_type70_test: RuntimeError
-function_type/function_type71_test: RuntimeError
-function_type/function_type74_test: RuntimeError
-function_type/function_type75_test: RuntimeError
-function_type/function_type78_test: RuntimeError
-function_type/function_type79_test: RuntimeError
-function_type/function_type7_test: RuntimeError
-function_type/function_type82_test: RuntimeError
-function_type/function_type83_test: RuntimeError
-function_type/function_type86_test: RuntimeError
-function_type/function_type87_test: RuntimeError
-function_type/function_type90_test: RuntimeError
-function_type/function_type91_test: RuntimeError
-function_type/function_type94_test: RuntimeError
-function_type/function_type95_test: RuntimeError
-function_type/function_type98_test: RuntimeError
-function_type/function_type99_test: RuntimeError
 function_type2_test: RuntimeError
 generic_functions_test: Pass # Issue 25869
 generic_local_functions_test: Pass # Issue 25869
@@ -1144,6 +975,7 @@
 mixin_invalid_bound2_test/10: Fail
 mixin_invalid_bound_test/06: Fail
 mixin_invalid_bound_test/07: Fail
+recursive_inheritance_test: RuntimeError
 redirecting_factory_infinite_steps_test/01: Fail
 redirecting_factory_malbounded_test/01: Fail
 regress_22728_test: Fail # Dartk Issue 28498
@@ -1197,18 +1029,17 @@
 
 # ==== dartkp + dart_precompiled status lines ====
 [ $compiler == dartkp && $runtime == dart_precompiled && $strong ]
-abstract_factory_constructor_test/00: MissingCompileTimeError
-abstract_getter_test/01: MissingCompileTimeError
-abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
-abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError
-abstract_override_adds_optional_args_supercall_test: MissingCompileTimeError
-abstract_syntax_test/00: MissingCompileTimeError
-additional_interface_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
-additional_interface_adds_optional_args_concrete_test: MissingCompileTimeError
-additional_interface_adds_optional_args_supercall_test: MissingCompileTimeError
+abstract_factory_constructor_test/00: MissingCompileTimeError # Issue 32013.
+abstract_getter_test/01: MissingCompileTimeError # Issue 32013.
+abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError # Issue 32013.
+abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError # Issue 32014.
+abstract_override_adds_optional_args_supercall_test: MissingCompileTimeError # Issue 32014.
+abstract_syntax_test/00: MissingCompileTimeError # Issue 32013.
+additional_interface_adds_optional_args_concrete_subclass_test: MissingCompileTimeError # Issue 32014.
+additional_interface_adds_optional_args_concrete_test: MissingCompileTimeError # Issue 32014.
+additional_interface_adds_optional_args_supercall_test: MissingCompileTimeError # Issue 32014.
 assert_with_type_test_or_cast_test: Pass, Crash
 assertion_initializer_const_error_test/01: Pass
-assertion_initializer_test: CompileTimeError # Issue 31402 (Assert statement)
 async_await_syntax_test/c10a: MissingCompileTimeError
 async_await_syntax_test/d08b: MissingCompileTimeError
 async_await_syntax_test/d10a: MissingCompileTimeError
@@ -1256,9 +1087,9 @@
 call_non_method_field_test/02: MissingCompileTimeError
 call_with_no_such_method_test: CompileTimeError # Issue 31402 (Invocation arguments)
 callable_test/none: CompileTimeError # Issue 31402 (Variable declaration)
-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.
+cha_deopt1_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+cha_deopt2_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+cha_deopt3_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 check_member_static_test/01: MissingCompileTimeError
 checked_setter3_test/01: MissingCompileTimeError
 checked_setter3_test/02: MissingCompileTimeError
@@ -1279,8 +1110,8 @@
 compile_time_constant_static5_test/16: CompileTimeError # Issue 31537
 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_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+conditional_import_string_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+conditional_import_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 config_import_corelib_test: CompileTimeError # Issue 31533
 config_import_test: RuntimeError # KernelVM bug: Configurable imports.
 const_constructor2_test/11: CompileTimeError # Issue 31402 (Invocation arguments)
@@ -1330,47 +1161,47 @@
 deep_nesting2_negative_test: Skip # Issue 31158
 default_factory2_test/01: MissingCompileTimeError
 default_factory_test/01: MissingCompileTimeError
-deferred_call_empty_before_load_test: CompileTimeError # 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_call_empty_before_load_test: CompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
+deferred_closurize_load_library_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_constant_list_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 deferred_constraints_constants_test: SkipByDesign
-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_constants_test/default_argument2: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 30273.
+deferred_constraints_constants_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_constraints_constants_test/reference_after_load: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 deferred_constraints_type_annotation_test/new: CompileTimeError
 deferred_constraints_type_annotation_test/new_generic1: CompileTimeError
 deferred_constraints_type_annotation_test/none: CompileTimeError
 deferred_constraints_type_annotation_test/static_method: CompileTimeError
 deferred_constraints_type_annotation_test/type_annotation_non_deferred: CompileTimeError
-deferred_function_type_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
-deferred_global_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+deferred_function_type_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_global_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 deferred_global_test: Fail
-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_import_core_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_inheritance_constraints_test/extends: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
+deferred_inheritance_constraints_test/implements: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
+deferred_inheritance_constraints_test/mixin: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
 deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError
-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: CompileTimeError # 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: CompileTimeError, Fail, Crash # Issue 23408, 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 # 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: 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/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.
+deferred_inlined_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_load_constants_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_load_inval_code_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_load_library_wrong_args_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 30273.
+deferred_load_library_wrong_args_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_mixin_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_no_such_method_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_not_loaded_check_test: CompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
+deferred_only_constant_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_optimized_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_redirecting_factory_test: CompileTimeError, Fail, Crash # Issue 23408, KernelVM bug: Deferred loading kernel issue 30273.
+deferred_regression_22995_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_regression_28678_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_shadow_load_library_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_shared_and_unshared_classes_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_static_seperate_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_super_dependency_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 30273.
+deferred_type_dependency_test/as: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_type_dependency_test/is: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_type_dependency_test/none: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
+deferred_type_dependency_test/type_annotation: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 deopt_inlined_function_lazy_test: Skip # Incompatible flag: --deoptimize-alot
 duplicate_export_negative_test: Fail # Issue 6134
 duplicate_implements_test/01: MissingCompileTimeError
@@ -1405,36 +1236,14 @@
 for_in_side_effects_test/01: MissingCompileTimeError
 function_propagation_test: CompileTimeError # Issue 31402 (Variable declaration)
 function_subtype3_test: RuntimeError
-function_subtype_bound_closure1_test: RuntimeError
-function_subtype_bound_closure2_test: RuntimeError
-function_subtype_bound_closure5_test: RuntimeError
-function_subtype_bound_closure5a_test: RuntimeError
-function_subtype_bound_closure6_test: RuntimeError
 function_subtype_call1_test: RuntimeError
 function_subtype_call2_test: RuntimeError
 function_subtype_cast0_test: RuntimeError
-function_subtype_cast2_test: RuntimeError
-function_subtype_cast3_test: RuntimeError
-function_subtype_checked0_test: RuntimeError
 function_subtype_inline2_test: RuntimeError
-function_subtype_local1_test: RuntimeError
-function_subtype_local2_test: RuntimeError
-function_subtype_local5_test: RuntimeError
-function_subtype_not0_test: RuntimeError
-function_subtype_not2_test: RuntimeError
-function_subtype_not3_test: RuntimeError
 function_subtype_setter0_test: RuntimeError
-function_subtype_simple1_test: RuntimeError
-function_subtype_top_level1_test: RuntimeError
-function_subtype_typearg5_test: RuntimeError
 function_type2_test: RuntimeError
-function_type_alias2_test: RuntimeError
-function_type_alias3_test: RuntimeError
-function_type_alias4_test: RuntimeError
 function_type_alias6_test/none: RuntimeError
-function_type_alias_test: RuntimeError
-generic_closure_test: RuntimeError
-generic_function_bounds_test: CompileTimeError
+generic_function_bounds_test: Crash # Issue 32012
 generic_function_dcall_test: RuntimeError
 generic_instanceof2_test: RuntimeError
 generic_is_check_test: RuntimeError
@@ -1451,7 +1260,7 @@
 generic_no_such_method_dispatcher_simple_test: CompileTimeError # Issue 31533
 generic_no_such_method_dispatcher_test: CompileTimeError # Issue 31533
 generic_tearoff_test: CompileTimeError
-generic_test: RuntimeError
+generic_test/01: MissingCompileTimeError # front end does not validate `extends`
 getter_override_test/03: MissingCompileTimeError
 hello_dart_test: Skip # Incompatible flag: --compile_all
 identical_const_test/01: MissingCompileTimeError
@@ -1498,7 +1307,7 @@
 issue31596_super_test/03: CompileTimeError
 issue31596_super_test/04: MissingCompileTimeError
 issue31596_super_test/05: RuntimeError
-issue_1751477_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+issue_1751477_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 issue_25671a_test/01: CompileTimeError # Test assumes Dart 1.0 semantics
 issue_25671b_test/01: Crash
 least_upper_bound_expansive_test/none: RuntimeError
@@ -1677,14 +1486,14 @@
 regress_13462_0_test: SkipByDesign
 regress_13462_1_test: SkipByDesign
 regress_18535_test: SkipByDesign
-regress_22443_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+regress_22443_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 regress_23089_test: Crash
-regress_23408_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+regress_23408_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 regress_23408_test: RuntimeError
 regress_25550_test: CompileTimeError # Issue 31402 (Variable declaration)
 regress_27617_test/1: MissingCompileTimeError # Fasta bug: Bad constructor redirection.
 regress_28255_test: SkipByDesign
-regress_28278_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 28335.
+regress_28278_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 regress_29025_test: CompileTimeError # Issue 31402 (Variable declaration)
 regress_29405_test: CompileTimeError # Issue 31402 (Invocation arguments)
 regress_29784_test/01: MissingCompileTimeError
@@ -1757,7 +1566,7 @@
 vm/optimized_stacktrace_test: Crash
 vm/optimized_stacktrace_test: Skip # Issue 30198
 vm/reflect_core_vm_test: SkipByDesign
-vm/regress_27201_test: CompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 28335.
+vm/regress_27201_test: CompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
 vm/regress_27201_test: Fail
 vm/regress_27671_test: Skip # Unsupported
 vm/regress_27671_test: Crash
diff --git a/tests/language_2/language_2_precompiled.status b/tests/language_2/language_2_precompiled.status
index 043971c..139219d 100644
--- a/tests/language_2/language_2_precompiled.status
+++ b/tests/language_2/language_2_precompiled.status
@@ -376,7 +376,6 @@
 function_type_call_getter2_test/05: MissingCompileTimeError
 fuzzy_arrows_test/01: MissingCompileTimeError
 fuzzy_arrows_test/03: RuntimeError
-generalized_void_syntax_test: CompileTimeError # Issue #30176
 generic_closure_test: RuntimeError
 generic_constructor_mixin2_test/01: MissingCompileTimeError
 generic_constructor_mixin3_test/01: MissingCompileTimeError
@@ -884,6 +883,8 @@
 symbol_literal_test/01: MissingCompileTimeError
 sync_generator1_test/01: MissingCompileTimeError
 syntax_test/59: MissingCompileTimeError, OK # Issue 30516.
+syntax_test/60: MissingCompileTimeError, OK # Issue 30516.
+syntax_test/61: MissingCompileTimeError, OK # Issue 30516.
 top_level_getter_no_setter1_test: MissingCompileTimeError
 top_level_getter_no_setter2_test: MissingCompileTimeError
 transitive_private_library_access_test: MissingCompileTimeError
diff --git a/tests/language_2/language_2_vm.status b/tests/language_2/language_2_vm.status
index af851e4..dc3c9fe 100644
--- a/tests/language_2/language_2_vm.status
+++ b/tests/language_2/language_2_vm.status
@@ -4,6 +4,16 @@
 # Sections in this file should contain "$runtime == vm".
 
 [ $compiler == dartkp ]
+assertion_initializer_const_error2_test/cc01: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc02: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc03: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc05: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc06: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc07: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc08: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc09: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc10: MissingCompileTimeError # Not reporting failed assert() at compile time.
+assertion_initializer_const_error2_test/cc11: MissingCompileTimeError # Not reporting failed assert() at compile time.
 implicit_creation/implicit_new_or_const_composite_test: RuntimeError
 implicit_creation/implicit_new_or_const_test: RuntimeError
 
@@ -46,7 +56,6 @@
 example_constructor_test: Fail, OK
 export_ambiguous_main_negative_test: Fail # Issue 14763
 field_initialization_order_test: Fail, OK
-generalized_void_syntax_test: CompileTimeError # Issue #30176
 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
@@ -372,14 +381,31 @@
 for_in3_test: MissingCompileTimeError
 for_in_side_effects_test/01: MissingCompileTimeError
 function_malformed_result_type_test/00: MissingCompileTimeError
+function_subtype_bound_closure1_test: RuntimeError
+function_subtype_bound_closure2_test: RuntimeError
 function_subtype_bound_closure3_test: RuntimeError
 function_subtype_bound_closure4_test: RuntimeError
+function_subtype_bound_closure5_test: RuntimeError
+function_subtype_bound_closure5a_test: RuntimeError
+function_subtype_bound_closure6_test: RuntimeError
 function_subtype_bound_closure7_test: RuntimeError
 function_subtype_call1_test: RuntimeError
 function_subtype_call2_test: RuntimeError
 function_subtype_cast1_test: RuntimeError
+function_subtype_cast2_test: RuntimeError
+function_subtype_cast3_test: RuntimeError
+function_subtype_checked0_test: RuntimeError
+function_subtype_local1_test: RuntimeError
+function_subtype_local2_test: RuntimeError
+function_subtype_local5_test: RuntimeError
+function_subtype_not0_test: RuntimeError
 function_subtype_not1_test: RuntimeError
+function_subtype_not2_test: RuntimeError
+function_subtype_not3_test: RuntimeError
+function_subtype_top_level1_test: RuntimeError
 function_subtype_typearg5_test: RuntimeError
+function_type_alias3_test: RuntimeError
+function_type_alias4_test: RuntimeError
 function_type_alias_test: RuntimeError
 function_type_call_getter2_test/00: MissingCompileTimeError
 function_type_call_getter2_test/01: MissingCompileTimeError
@@ -411,6 +437,8 @@
 generic_methods_unused_parameter_test: RuntimeError
 generic_no_such_method_dispatcher_simple_test: Skip # This test is only for kernel.
 generic_tearoff_test: RuntimeError
+generic_test/01: MissingCompileTimeError
+generic_test/none: RuntimeError # test requires Dart 2 subtyping for `is`
 getter_no_setter2_test/00: MissingCompileTimeError
 getter_no_setter2_test/01: MissingCompileTimeError
 getter_no_setter2_test/03: MissingCompileTimeError
@@ -846,6 +874,8 @@
 symbol_literal_test/01: MissingCompileTimeError
 sync_generator1_test/01: MissingCompileTimeError
 syntax_test/59: MissingCompileTimeError, OK # Issue 30516.
+syntax_test/60: MissingCompileTimeError, OK # Issue 30516.
+syntax_test/61: MissingCompileTimeError, OK # Issue 30516.
 top_level_getter_no_setter1_test: MissingCompileTimeError
 top_level_getter_no_setter2_test: MissingCompileTimeError
 transitive_private_library_access_test: MissingCompileTimeError
@@ -1212,7 +1242,6 @@
 example_constructor_test: Fail, OK
 export_ambiguous_main_negative_test: Fail # Issue 14763
 field_initialization_order_test: Fail, OK
-generalized_void_syntax_test: CompileTimeError # Issue #30176
 generic_methods_bounds_test/02: MissingRuntimeError
 library_env_test/has_html_support: RuntimeError, OK
 library_env_test/has_no_io_support: RuntimeError, OK
diff --git a/tests/language_2/method_not_found_test.dart b/tests/language_2/method_not_found_test.dart
new file mode 100644
index 0000000..803f251
--- /dev/null
+++ b/tests/language_2/method_not_found_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {
+  B(); //# 01: compile-time error
+  static const field = const B();
+}
+
+class B {
+  const B();
+}
+
+main() {
+  print(A.field);
+}
diff --git a/tests/language_2/mixin_accessor_test.dart b/tests/language_2/mixin_accessor_test.dart
new file mode 100644
index 0000000..bb346e8
--- /dev/null
+++ b/tests/language_2/mixin_accessor_test.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test case for DDC bug where if a getter/setter is mixed in
+// without a corresponding getter/setter, DDC fails to install a the
+// corresponding getter/setter that calls super.
+
+import "package:expect/expect.dart";
+
+abstract class C<E> {
+  E get first;
+  set first(E value);
+  E operator [](int index);
+  operator []=(int index, E value);
+}
+
+abstract class CMixin<E> implements C<E> {
+  E get first => this[0];
+  set first(E x) {
+    this[0] = x;
+  }
+}
+
+abstract class CBase<E> extends Object with CMixin<E> {}
+
+abstract class DMixin<E> implements C<E> {
+  set first(E _) => throw new UnsupportedError('');
+  operator []=(int index, E value) => throw new UnsupportedError('');
+}
+
+abstract class DBase<E> = CBase<E> with DMixin<E>;
+
+class DView<E> extends DBase<E> {
+  final Iterable<E> _source;
+  DView(this._source);
+  E operator [](int index) => _source.elementAt(index);
+}
+
+abstract class FMixin<E> implements C<E> {
+  E get first => throw new UnsupportedError('');
+  E operator [](int index) => throw new UnsupportedError('');
+}
+
+class FView<E> extends CBase<E> with FMixin<E> {
+  List<E> _values;
+  FView(this._values);
+  operator []=(int index, E value) {
+    _values[index] = value;
+  }
+}
+
+void main() {
+  var d = new DView([3]);
+  Expect.equals(3, d.first);
+  Expect.throws(() => d.first = 42, (e) => e is UnsupportedError);
+
+  var list = [3];
+  var f = new FView(list);
+  f.first = 42;
+  Expect.equals(42, list[0]);
+  Expect.throws(() => f.first, (e) => e is UnsupportedError);
+}
diff --git a/tests/language_2/super_call2_test.dart b/tests/language_2/super_call2_test.dart
index e3fd9dc..156d344 100644
--- a/tests/language_2/super_call2_test.dart
+++ b/tests/language_2/super_call2_test.dart
@@ -4,6 +4,10 @@
 
 // Regresion test for bug discovered in frog handling super calls: the test case
 // mixes generics, super calls, and purposely doesn't allocate the base type.
+//
+// Also is a regression test for https://github.com/dart-lang/sdk/issues/31973
+
+import 'package:expect/expect.dart';
 
 class C<T> {
   foo(T a) {}
@@ -15,7 +19,22 @@
   }
 }
 
+class A {
+  static int _value;
+  Function foo = (int x) => _value = x + 1;
+}
+
+class B extends A {
+  void m(int x) {
+    super.foo(x);
+  }
+}
+
 main() {
   var d = new D();
   d.foo(null);
+
+  var b = new B();
+  b.m(41);
+  Expect.equals(42, A._value);
 }
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 2784f4c..e6defdc 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -12,6 +12,9 @@
 mirrors/*: Skip # Issue 27929: Triage
 
 [ $compiler == dart2analyzer ]
+convert/base64_test/01: CompileTimeError # int64
+convert/utf82_test: CompileTimeError # int64
+math/double_pow_test: CompileTimeError # int64
 mirrors/generic_f_bounded_mixin_application_test: StaticWarning # Test Issue
 mirrors/immutable_collections_test: StaticWarning, OK # Expect failure for any type of Iterable.
 mirrors/inference_and_no_such_method_test: StaticWarning, OK # Expect to trigger noSuchMethod.
@@ -23,6 +26,7 @@
 mirrors/repeated_private_anon_mixin_app_test: StaticWarning, OK # Intentional library name conflict.
 profiler/metrics_num_test: Fail # Issue 20309
 profiler/metrics_test: Fail # Issue 20309
+typed_data/int32x4_bigint_test: CompileTimeError # int64
 
 [ $compiler == dart2js ]
 async/schedule_microtask6_test: RuntimeError # global error handling is not supported. Issue 5958
diff --git a/tests/lib_2/async/async_await_sync_completer_test.dart b/tests/lib_2/async/async_await_sync_completer_test.dart
index b6887d6..889632f 100644
--- a/tests/lib_2/async/async_await_sync_completer_test.dart
+++ b/tests/lib_2/async/async_await_sync_completer_test.dart
@@ -13,6 +13,10 @@
 var delayedError = new Completer();
 
 foo() async {
+  // Because of this `await null` the function returns and lets the caller
+  // install handlers. When the function finishes, it can then synchronously
+  // propagate the values.
+  await null;
   new Future.microtask(() => 'in microtask')
       .then(events.add)
       .then(delayedValue.complete);
@@ -20,6 +24,10 @@
 }
 
 bar() async {
+  // Because of this `await null` the function returns and lets the caller
+  // install handlers. When the function finishes, it can then synchronously
+  // propagate the values.
+  await null;
   new Future.microtask(() => throw 'in microtask error')
       .catchError(events.add)
       .then(delayedError.complete);
diff --git a/tests/lib_2/async/future_or_strong_test.dart b/tests/lib_2/async/future_or_strong_test.dart
index d026233..f9f1ff9 100644
--- a/tests/lib_2/async/future_or_strong_test.dart
+++ b/tests/lib_2/async/future_or_strong_test.dart
@@ -53,10 +53,7 @@
 
   void foo2(FutureOr<String> x) {}
 
-  // In is-checks `dynamic` is treat specially (counting as bottom in parameter
-  // positions).
-  Expect.isTrue(foo2 is FunTakes<dynamic>);
-
+  Expect.isFalse(foo2 is FunTakes<dynamic>);
   Expect.isFalse(foo2 is FunTakes<Object>);
   Expect.isFalse(foo2 is FunTakes<int>);
   Expect.isTrue(foo2 is FunTakes<String>);
@@ -86,10 +83,7 @@
 
   void foo3(String x) {}
 
-  // In is-checks `dynamic` is treat specially (counting as bottom in parameter
-  // positions).
-  Expect.isTrue(foo3 is FunTakes<dynamic>);
-
+  Expect.isFalse(foo3 is FunTakes<dynamic>);
   Expect.isFalse(foo3 is FunTakes<Object>);
   Expect.isFalse(foo3 is FunTakes<int>);
   Expect.isTrue(foo3 is FunTakes<String>);
diff --git a/tests/lib_2/async/slow_consumer2_test.dart b/tests/lib_2/async/slow_consumer2_test.dart
index 6b1ab56..de37668 100644
--- a/tests/lib_2/async/slow_consumer2_test.dart
+++ b/tests/lib_2/async/slow_consumer2_test.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.
 
-// VMOptions=--old_gen_heap_size=64
+// VMOptions=--old_gen_heap_size=64 --no-background-compilation
 
 library slow_consumer2_test;
 
diff --git a/tests/lib_2/async/slow_consumer3_test.dart b/tests/lib_2/async/slow_consumer3_test.dart
index 17de0e0..806f929 100644
--- a/tests/lib_2/async/slow_consumer3_test.dart
+++ b/tests/lib_2/async/slow_consumer3_test.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.
 
-// VMOptions=--old_gen_heap_size=64
+// VMOptions=--old_gen_heap_size=64 --no-background-compilation
 
 library slow_consumer3_test;
 
diff --git a/tests/lib_2/async/slow_consumer_test.dart b/tests/lib_2/async/slow_consumer_test.dart
index 9a3c92e..2eaa8ef 100644
--- a/tests/lib_2/async/slow_consumer_test.dart
+++ b/tests/lib_2/async/slow_consumer_test.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.
 
-// VMOptions=--old_gen_heap_size=64
+// VMOptions=--old_gen_heap_size=64 --no-background-compilation
 
 library slow_consumer_test;
 
diff --git a/tests/lib_2/async/stream_zones_test.dart b/tests/lib_2/async/stream_zones_test.dart
index d87eb94..6d4582e 100644
--- a/tests/lib_2/async/stream_zones_test.dart
+++ b/tests/lib_2/async/stream_zones_test.dart
@@ -186,7 +186,7 @@
     test7(),
   ];
 
-  Future.wait(tests.map((l) => l.first)).then((_) {
+  Future.wait(tests.map((l) => l.first as Future)).then((_) {
     // Give time to complete all pending actions.
     Timer.run(() {
       tests.forEach((l) => (l.last)());
diff --git a/tests/lib_2/async/timer_cancel2_test.dart b/tests/lib_2/async/timer_cancel2_test.dart
index 0d992a5..7b3d0e2 100644
--- a/tests/lib_2/async/timer_cancel2_test.dart
+++ b/tests/lib_2/async/timer_cancel2_test.dart
@@ -5,19 +5,20 @@
 library timer_cancel2_test;
 
 import 'dart:async';
-
-import 'package:unittest/unittest.dart';
+import 'package:expect/expect.dart';
 
 main() {
   // Test that a timeout handler can cancel itself.
-  test("timer cancel test 2", () {
-    var cancelTimer;
+  var cancelTimer;
+  var completer = new Completer();
+  int calls = 0;
+  void cancelHandler(Timer timer) {
+    Expect.equals(1, ++calls);
+    cancelTimer.cancel();
+    completer.complete();
+  }
 
-    void cancelHandler(Timer timer) {
-      cancelTimer.cancel();
-    }
-
-    cancelTimer = new Timer.periodic(
-        const Duration(milliseconds: 1), expectAsync(cancelHandler));
-  });
+  cancelTimer =
+      new Timer.periodic(const Duration(milliseconds: 1), cancelHandler);
+  return completer.future;
 }
diff --git a/tests/lib_2/async/timer_cancel_test.dart b/tests/lib_2/async/timer_cancel_test.dart
index a7c5a7a..55d8303 100644
--- a/tests/lib_2/async/timer_cancel_test.dart
+++ b/tests/lib_2/async/timer_cancel_test.dart
@@ -6,39 +6,48 @@
 
 import 'dart:async';
 
-import 'package:unittest/unittest.dart';
+import 'package:expect/minitest.dart';
+
+final ms = const Duration(milliseconds: 1);
 
 main() {
-  final ms = const Duration(milliseconds: 1);
-  test("simple timer", () {
-    Timer cancelTimer;
-    int repeatTimer;
+  return testSimpleTimer().then((_) => cancelTimerWithSame());
+}
 
-    void unreachable() {
-      fail("should not be reached");
-    }
+Future testSimpleTimer() {
+  var cancelTimer = new Timer(ms * 1000, unreachable);
+  cancelTimer.cancel();
 
-    void handler() {
-      cancelTimer.cancel();
-    }
-
-    void repeatHandler(Timer timer) {
-      repeatTimer++;
-      timer.cancel();
-      expect(repeatTimer, 1);
-    }
-
-    cancelTimer = new Timer(ms * 1000, expectAsync(unreachable, count: 0));
+  var handler = new Completer();
+  var repeatHandler = new Completer();
+  new Timer(ms * 1000, () {
     cancelTimer.cancel();
-    new Timer(ms * 1000, expectAsync(handler));
-    cancelTimer = new Timer(ms * 2000, expectAsync(unreachable, count: 0));
-    repeatTimer = 0;
-    new Timer.periodic(ms * 1500, expectAsync(repeatHandler));
+    handler.complete();
   });
 
-  test("cancel timer with same time", () {
-    var t2;
-    var t1 = new Timer(ms * 0, expectAsync(() => t2.cancel()));
-    t2 = new Timer(ms * 0, expectAsync(t1.cancel, count: 0));
+  cancelTimer = new Timer(ms * 2000, unreachable);
+  var repeatTimer = 0;
+  new Timer.periodic(ms * 1500, (Timer timer) {
+    repeatTimer++;
+    timer.cancel();
+    expect(repeatTimer, 1);
+    repeatHandler.complete();
   });
+
+  return handler.future.then((_) => repeatHandler.future);
+}
+
+Future cancelTimerWithSame() {
+  var completer = new Completer();
+  var t2;
+  var t1 = new Timer(ms * 0, () {
+    t2.cancel();
+    completer.complete();
+  });
+  t2 = new Timer(ms * 0, unreachable);
+  return completer.future;
+}
+
+void unreachable() {
+  fail("should not be reached");
 }
diff --git a/tests/lib_2/async/timer_isActive_test.dart b/tests/lib_2/async/timer_isActive_test.dart
index 1c272a6..25aa1dd 100644
--- a/tests/lib_2/async/timer_isActive_test.dart
+++ b/tests/lib_2/async/timer_isActive_test.dart
@@ -5,13 +5,22 @@
 import 'dart:async';
 
 import 'package:unittest/unittest.dart';
+import 'package:unittest/src/expected_function.dart' show ExpectedFunction;
+
+T Function() expectAsync0<T>(T Function() callback,
+        {int count: 1, int max: 0}) =>
+    new ExpectedFunction<T>(callback, count, max).max0;
+
+T Function(A) expectAsync1<T, A>(T Function(A) callback,
+        {int count: 1, int max: 0}) =>
+    new ExpectedFunction<T>(callback, count, max).max1;
 
 main() {
   test("timer isActive test", () {
     Timer t;
 
     t = new Timer(const Duration(seconds: 1),
-        expectAsync(() => expect(t.isActive, equals(false))));
+        expectAsync0(() => expect(t.isActive, equals(false))));
     expect(t.isActive, equals(true));
   });
 
@@ -29,14 +38,14 @@
     }
 
     t = new Timer.periodic(
-        new Duration(milliseconds: 1), expectAsync(checkActive, count: 3));
+        new Duration(milliseconds: 1), expectAsync1(checkActive, count: 3));
     expect(t.isActive, equals(true));
   });
 
   test("timer cancel test", () {
     Timer timer = new Timer(
         const Duration(seconds: 15), () => fail("Should not be reached."));
-    Timer.run(expectAsync(() {
+    Timer.run(expectAsync0(() {
       expect(timer.isActive, equals(true));
       timer.cancel();
       expect(timer.isActive, equals(false));
diff --git a/tests/lib_2/async/timer_repeat_test.dart b/tests/lib_2/async/timer_repeat_test.dart
index 71d26fa..afe1957 100644
--- a/tests/lib_2/async/timer_repeat_test.dart
+++ b/tests/lib_2/async/timer_repeat_test.dart
@@ -6,7 +6,7 @@
 
 import 'dart:async';
 
-import 'package:unittest/unittest.dart';
+import 'package:expect/expect.dart';
 
 const Duration TIMEOUT = const Duration(milliseconds: 500);
 const int ITERATIONS = 5;
@@ -20,25 +20,26 @@
 // compiled by dart2js.
 int get safetyMargin => identical(1, 1.0) ? 100 : 0;
 
+var completer = new Completer();
+
 void timeoutHandler(Timer timer) {
   iteration++;
-  expect(iteration, lessThanOrEqualTo(ITERATIONS));
+  Expect.isTrue(iteration <= ITERATIONS);
   if (iteration == ITERATIONS) {
     // When we are done with all of the iterations, we expect a
     // certain amount of time to have passed.  Checking the time on
     // each iteration doesn't work because the timeoutHandler runs
     // concurrently with the periodic timer.
-    expect(stopwatch.elapsedMilliseconds + safetyMargin,
-        greaterThanOrEqualTo(ITERATIONS * TIMEOUT.inMilliseconds));
+    Expect.isTrue(stopwatch.elapsedMilliseconds + safetyMargin >=
+        ITERATIONS * TIMEOUT.inMilliseconds);
     timer.cancel();
+    completer.complete();
   }
 }
 
 main() {
-  test("timer_repeat", () {
-    iteration = 0;
-    stopwatch.start();
-    timer = new Timer.periodic(
-        TIMEOUT, expectAsync(timeoutHandler, count: ITERATIONS));
-  });
+  iteration = 0;
+  stopwatch.start();
+  timer = new Timer.periodic(TIMEOUT, timeoutHandler);
+  return completer.future;
 }
diff --git a/tests/lib_2/async/zone_run_unary_test.dart b/tests/lib_2/async/zone_run_unary_test.dart
index 03f9548..ebf78ee 100644
--- a/tests/lib_2/async/zone_run_unary_test.dart
+++ b/tests/lib_2/async/zone_run_unary_test.dart
@@ -13,12 +13,13 @@
   bool shouldForward = true;
   Expect.identical(Zone.root, Zone.current);
   Zone forked = Zone.current.fork(specification: new ZoneSpecification(runUnary:
-      <R, T>(Zone self, ZoneDelegate parent, Zone origin, R f(arg), T arg) {
+      <R, T>(Zone self, ZoneDelegate parent, Zone origin, R f(T arg), T arg) {
     // The zone is still the same as when origin.run was invoked, which
     // is the root zone. (The origin zone hasn't been set yet).
     Expect.identical(Zone.current, Zone.root);
     events.add("forked.run1");
-    if (shouldForward) return parent.runUnary(origin, f, (arg as int) + 1);
+    if (shouldForward)
+      return parent.runUnary<R, T>(origin, f, ((arg as int) + 1) as T);
     return 42 as R;
   }));
 
diff --git a/tests/lib_2/html/cross_domain_iframe_test.dart b/tests/lib_2/html/cross_domain_iframe_test.dart
index 9feee15..3b7cf7f 100644
--- a/tests/lib_2/html/cross_domain_iframe_test.dart
+++ b/tests/lib_2/html/cross_domain_iframe_test.dart
@@ -3,30 +3,27 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:html';
-
-import 'package:unittest/unittest.dart';
+import 'package:expect/minitest.dart';
 
 main() {
-  test('cross_domain_iframe', () {
-    var uri = Uri.parse(window.location.href);
+  var uri = Uri.parse(window.location.href);
 
-    var crossOriginPort = int.parse(uri.queryParameters['crossOriginPort']);
-    var crossOrigin = '${uri.scheme}://${uri.host}:$crossOriginPort';
-    var crossOriginUrl =
-        '$crossOrigin/root_dart/tests/html/cross_domain_iframe_script.html';
+  var crossOriginPort = int.parse(uri.queryParameters['crossOriginPort']);
+  var crossOrigin = '${uri.scheme}://${uri.host}:$crossOriginPort';
+  var crossOriginUrl =
+      '$crossOrigin/root_dart/tests/html/cross_domain_iframe_script.html';
 
-    var iframe = new IFrameElement();
-    iframe.src = crossOriginUrl;
-    document.body.append(iframe);
+  var iframe = new IFrameElement();
+  iframe.src = crossOriginUrl;
+  document.body.append(iframe);
 
-    window.onMessage
-        .where((MessageEvent event) {
-          return event.origin == crossOrigin;
-        })
-        .first
-        .then(expectAsync((MessageEvent event) {
-          expect(event.data, equals('foobar'));
-          expect(event.source, isNotNull);
-        }));
-  });
+  return window.onMessage
+      .where((MessageEvent event) {
+        return event.origin == crossOrigin;
+      })
+      .first
+      .then((MessageEvent event) {
+        expect(event.data, equals('foobar'));
+        expect(event.source, isNotNull);
+      });
 }
diff --git a/tests/lib_2/html/element_test.dart b/tests/lib_2/html/element_test.dart
index 25967d3..366b98d 100644
--- a/tests/lib_2/html/element_test.dart
+++ b/tests/lib_2/html/element_test.dart
@@ -6,11 +6,16 @@
 
 import 'package:unittest/unittest.dart';
 import 'package:unittest/html_individual_config.dart';
+import 'package:unittest/src/expected_function.dart' show ExpectedFunction;
 import 'dart:async';
 import 'dart:html';
 import 'dart:svg' as svg;
 import 'utils.dart';
 
+T Function(A) expectAsync1<T, A>(T Function(A) callback,
+        {int count: 1, int max: 0}) =>
+    new ExpectedFunction<T>(callback, count, max).max1;
+
 expectLargeRect(Rectangle rect) {
   expect(rect.top, 0);
   expect(rect.left, 0);
@@ -126,7 +131,8 @@
 
     test('.html caption', () {
       var table = new TableElement();
-      TableCaptionElement node = table.createFragment('<caption><p>Table 1.').nodes.single;
+      TableCaptionElement node =
+          table.createFragment('<caption><p>Table 1.').nodes.single;
       expect(
           node,
           predicate(
@@ -150,7 +156,8 @@
     test('.html tbody', () {
       var innerHtml = '<tr><td headers="n r1">Sad</td><td>Happy</td></tr>';
       var table = new TableElement();
-      TableSectionElement node = table.createFragment('<tbody>$innerHtml').nodes.single;
+      TableSectionElement node =
+          table.createFragment('<tbody>$innerHtml').nodes.single;
       expect(
           node,
           predicate(
@@ -165,7 +172,8 @@
     test('.html thead', () {
       var innerHtml = '<tr><th id="n">Negative</th><th>Positive</th></tr>';
       var table = new TableElement();
-      TableSectionElement node = table.createFragment('<thead>$innerHtml').nodes.single;
+      TableSectionElement node =
+          table.createFragment('<thead>$innerHtml').nodes.single;
       expect(
           node,
           predicate(
@@ -180,7 +188,8 @@
     test('.html tfoot', () {
       var innerHtml = '<tr><th>percentage</th><td>34.3%</td></tr>';
       var table = new TableElement();
-      TableSectionElement node = table.createFragment('<tfoot>$innerHtml').nodes.single;
+      TableSectionElement node =
+          table.createFragment('<tfoot>$innerHtml').nodes.single;
       expect(
           node,
           predicate(
@@ -196,7 +205,8 @@
       var table = new TableElement();
       document.body.append(table);
       var tBody = table.createTBody();
-      TableRowElement node = tBody.createFragment('<tr><td>foo<td>bar').nodes.single;
+      TableRowElement node =
+          tBody.createFragment('<tr><td>foo<td>bar').nodes.single;
       expect(
           node, predicate((x) => x is TableRowElement, 'is a TableRowElement'));
       expect(node.tagName, 'TR');
@@ -801,7 +811,7 @@
 
       document.body.onClick
           .matches('.selector')
-          .listen(expectAsync((Event event) {
+          .listen(expectAsync1((Event event) {
         expect(event.currentTarget, document.body);
         expect(event.target, clickOne);
         expect(event.matchingTarget, selectorOne);
@@ -809,7 +819,7 @@
 
       selectorOne.onClick
           .matches('.selector')
-          .listen(expectAsync((Event event) {
+          .listen(expectAsync1((Event event) {
         expect(event.currentTarget, selectorOne);
         expect(event.target, clickOne);
         expect(event.matchingTarget, selectorOne);
diff --git a/tests/lib_2/html/events_test.dart b/tests/lib_2/html/events_test.dart
index 43a6737..ef7e22e 100644
--- a/tests/lib_2/html/events_test.dart
+++ b/tests/lib_2/html/events_test.dart
@@ -8,6 +8,15 @@
 import 'dart:html';
 import 'package:unittest/unittest.dart';
 import 'package:unittest/html_config.dart';
+import 'package:unittest/src/expected_function.dart' show ExpectedFunction;
+
+T Function() expectAsync0<T>(T Function() callback,
+        {int count: 1, int max: 0}) =>
+    new ExpectedFunction<T>(callback, count, max).max0;
+
+T Function(A) expectAsync1<T, A>(T Function(A) callback,
+        {int count: 1, int max: 0}) =>
+    new ExpectedFunction<T>(callback, count, max).max1;
 
 main() {
   useHtmlConfiguration();
@@ -97,7 +106,7 @@
 
     // runZoned executes the function synchronously, but we don't want to
     // rely on this. We therefore wrap it into an expectAsync.
-    runZoned(expectAsync(() {
+    runZoned(expectAsync0(() {
       var zone = Zone.current;
       expect(zone, isNot(equals(Zone.root)));
 
@@ -106,13 +115,13 @@
       void handler(Event e) {
         expect(Zone.current, equals(zone));
 
-        scheduleMicrotask(expectAsync(() {
+        scheduleMicrotask(expectAsync0(() {
           expect(Zone.current, equals(zone));
           sub.cancel();
         }));
       }
 
-      sub = element.on['test'].listen(expectAsync(handler));
+      sub = element.on['test'].listen(expectAsync1(handler));
     }));
     element.dispatchEvent(new Event('test'));
   });
diff --git a/tests/lib_2/html/file_sample_test.dart b/tests/lib_2/html/file_sample_test.dart
index 30c037d..51f846d 100644
--- a/tests/lib_2/html/file_sample_test.dart
+++ b/tests/lib_2/html/file_sample_test.dart
@@ -129,7 +129,7 @@
       expect(fileEntry.name, 'log.txt');
 
       List<Entry> entries = await readEntries(fs.root);
-      expect(entries.length, 1);
+      expect(entries.length > 0, true);
       expect(entries[0].isDirectory, true);
       expect(entries[0].name, 'my_directory');
 
diff --git a/tests/lib_2/html/fileapi_directory_reader_test.dart b/tests/lib_2/html/fileapi_directory_reader_test.dart
index 9d626ea..ea6280c 100644
--- a/tests/lib_2/html/fileapi_directory_reader_test.dart
+++ b/tests/lib_2/html/fileapi_directory_reader_test.dart
@@ -1,10 +1,11 @@
 library fileapi;
 
-import 'dart:html';
 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';
 
 class FileAndDir {
   FileEntry file;
@@ -14,37 +15,30 @@
 
 FileSystem fs;
 
-main() {
-  useHtmlIndividualConfiguration();
+main() async {
+  useHtmlConfiguration();
 
-  getFileSystem() {
-    return window.requestFileSystem(100).then((FileSystem fileSystem) {
-      fs = fileSystem;
-    });
+  getFileSystem() async {
+    var fileSystem = await window.requestFileSystem(100);
+    fs = fileSystem;
   }
 
   // Do the boilerplate to get several files and directories created to then
   // test the functions that use those items.
-  Future doDirSetup(String testName) {
-    return fs.root.createFile('file_$testName').then((Entry file) {
-      return fs.root
-          .createDirectory('dir_$testName')
-          .then((Entry dir) {
-        return new Future.value(new FileAndDir(file, dir));
-      });
-    });
+  Future doDirSetup(String testName) async {
+    await getFileSystem();
+
+    var file = await fs.root.createFile('file_$testName');
+    var dir = await fs.root.createDirectory('dir_$testName');
+    return new Future.value(new FileAndDir(file, dir));
   }
 
   if (FileSystem.supported) {
-    test('getFileSystem', getFileSystem);
-
-    test('readEntries', () {
-      return doDirSetup('readEntries').then((fileAndDir) {
-        var reader = fileAndDir.dir.createReader();
-        return reader.readEntries();
-      }).then((entries) {
-        expect(entries is List, true);
-      });
+    test('readEntries', () async {
+      var fileAndDir = await doDirSetup('readEntries');
+      var reader = await fileAndDir.dir.createReader();
+      var entries = await reader.readEntries();
+      expect(entries is List, true);
     });
   }
 }
diff --git a/tests/lib_2/html/fileapi_directory_test.dart b/tests/lib_2/html/fileapi_directory_test.dart
index 935dd03..6dda69a 100644
--- a/tests/lib_2/html/fileapi_directory_test.dart
+++ b/tests/lib_2/html/fileapi_directory_test.dart
@@ -4,7 +4,8 @@
 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';
 
 class FileAndDir {
   FileEntry file;
@@ -14,28 +15,29 @@
 
 FileSystem fs;
 
-main() {
-  useHtmlIndividualConfiguration();
+main() async {
+  useHtmlConfiguration();
 
-  getFileSystem() {
-    return window.requestFileSystem(100).then((FileSystem fileSystem) {
-      fs = fileSystem;
-    });
+  getFileSystem() async {
+    var fileSystem = await window.requestFileSystem(100);
+    fs = fileSystem;
   }
 
   if (FileSystem.supported) {
-    test('getFileSystem', getFileSystem);
+    await getFileSystem();
 
-    test('directoryDoesntExist', () {
-      return fs.root.getDirectory('directory2').catchError((error) {
-        expect(error.code, equals(FileError.NOT_FOUND_ERR));
-      }, test: (e) => e is FileError);
+    test('directoryDoesntExist', () async {
+      try {
+        await fs.root.getDirectory('directory2');
+      } catch (error) {
+        expect(true, error is DomException);
+        expect(DomException.NOT_FOUND, error.name);
+      }
     });
 
-    test('directoryCreate', () {
-      return fs.root.createDirectory('directory3').then((Entry e) {
-        expect(e.name, equals('directory3'));
-      });
+    test('directoryCreate', () async {
+      var entry = await fs.root.createDirectory('directory3');
+      expect(entry.name, equals('directory3'));
     });
   }
 }
diff --git a/tests/lib_2/html/fileapi_entry_test.dart b/tests/lib_2/html/fileapi_entry_test.dart
index 7d79a0e..8d8ece0 100644
--- a/tests/lib_2/html/fileapi_entry_test.dart
+++ b/tests/lib_2/html/fileapi_entry_test.dart
@@ -1,10 +1,11 @@
 library fileapi;
 
-import 'dart:html';
 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';
 
 class FileAndDir {
   FileEntry file;
@@ -14,65 +15,63 @@
 
 FileSystem fs;
 
-main() {
-  useHtmlIndividualConfiguration();
+main() async {
+  useHtmlConfiguration();
 
-  getFileSystem() {
-    return window.requestFileSystem(100).then((FileSystem fileSystem) {
+  getFileSystem() async {
+    return await window.requestFileSystem(100).then((FileSystem fileSystem) {
       fs = fileSystem;
     });
   }
 
   // Do the boilerplate to get several files and directories created to then
   // test the functions that use those items.
-  Future doDirSetup(String testName) {
-    return fs.root.createFile('file_$testName').then((Entry file) {
-      return fs.root
-          .createDirectory('dir_$testName')
-          .then((Entry dir) {
-        return new Future.value(new FileAndDir(file, dir));
-      });
-    });
+  Future doDirSetup(String testName) async {
+    await getFileSystem();
+
+    var file = await fs.root.createFile('file_$testName');
+    var dir = await fs.root.createDirectory('dir_$testName');
+    return new Future.value(new FileAndDir(file, dir));
   }
 
   if (FileSystem.supported) {
-    test('getFileSystem', getFileSystem);
+    test('copy_move', () async {
+      var fileAndDir = await doDirSetup('copyTo');
+      var entry = await fileAndDir.file.copyTo(fileAndDir.dir, name: 'copiedFile');
+      expect(entry.isFile, true, reason: "Expected File");
+      expect(entry.name, 'copiedFile');
 
-    test('copyTo', () {
-      return doDirSetup('copyTo').then((fileAndDir) {
-        return fileAndDir.file.copyTo(fileAndDir.dir, name: 'copiedFile');
-      }).then((entry) {
-        expect(entry.isFile, true);
-        expect(entry.name, 'copiedFile');
-      });
-    });
+      // getParent
+      fileAndDir = await doDirSetup('getParent');
+      entry = await fileAndDir.file.getParent();
+      expect(entry.name, '');
+      expect(entry.isDirectory, true, reason: "Expected Directory");
 
-    test('getParent', () {
-      return doDirSetup('getParent').then((fileAndDir) {
-        return fileAndDir.file.getParent();
-      }).then((entry) {
-        expect(entry.name, '');
-        expect(entry.isFile, false);
-      });
-    });
+      // moveTo
+      fileAndDir = await doDirSetup('moveTo');
+      entry = await fileAndDir.file.moveTo(fileAndDir.dir, name: 'movedFile');
+      expect(entry.name, 'movedFile');
+      expect(entry.fullPath, '/dir_moveTo/movedFile');
 
-    test('moveTo', () {
-      return doDirSetup('moveTo').then((fileAndDir) {
-        return fileAndDir.file.moveTo(fileAndDir.dir, name: 'movedFile');
-      }).then((entry) {
-        expect(entry.name, 'movedFile');
-        expect(entry.fullPath, '/dir_moveTo/movedFile');
-        return fs.root.getFile('file4');
-      }).catchError((error) {
-        expect(error.code, equals(FileError.NOT_FOUND_ERR));
-      }, test: (e) => e is FileError);
-    });
+      try {
+        entry = await fs.root.getFile('file4');
+        fail("File file4 should not exist.");
+      } catch (error) {
+        expect(error is DomException, true, reason: "Not DomException - not exist");
+        expect(DomException.NOT_FOUND, error.name);
+      }
 
-    test('remove', () {
-      return doDirSetup('remove').then((fileAndDir) {
-        return fileAndDir.file.remove().then((_) {});
-      });
+      // remove
+      fileAndDir = await doDirSetup('remove');
+      expect('file_remove', fileAndDir.file.name);
+      await fileAndDir.file.remove();
+      try {
+        var entry = await fileAndDir.dir.getFile(fileAndDir.file.name);
+        fail("file not removed");
+      } catch (error) {
+        expect(error is DomException, true, reason: "Not DomException - removed");
+        expect(DomException.NOT_FOUND, error.name);
+      }
     });
   }
 }
-
diff --git a/tests/lib_2/html/fileapi_file_entry_test.dart b/tests/lib_2/html/fileapi_file_entry_test.dart
index 495fefe..a047a01 100644
--- a/tests/lib_2/html/fileapi_file_entry_test.dart
+++ b/tests/lib_2/html/fileapi_file_entry_test.dart
@@ -1,10 +1,11 @@
 library fileapi;
 
-import 'dart:html';
 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';
 
 class FileAndDir {
   FileEntry file;
@@ -14,52 +15,40 @@
 
 FileSystem fs;
 
-main() {
-  useHtmlIndividualConfiguration();
+main() async {
+  useHtmlConfiguration();
 
-  getFileSystem() {
-    return window.requestFileSystem(100).then((FileSystem fileSystem) {
-      fs = fileSystem;
-    });
+  getFileSystem() async {
+    var fileSystem = await window.requestFileSystem(100);
+    fs = fileSystem;
   }
 
   // Do the boilerplate to get several files and directories created to then
   // test the functions that use those items.
-  Future doDirSetup(String testName) {
-    return fs.root.createFile('file_$testName').then((Entry file) {
-      return fs.root
-          .createDirectory('dir_$testName')
-          .then((Entry dir) {
-        return new Future.value(new FileAndDir(file, dir));
-      });
-    });
+  Future doDirSetup(String testName) async {
+    await getFileSystem();
+
+    var file = await fs.root.createFile('file_$testName');
+    var dir = await fs.root.createDirectory('dir_$testName');
+    return new Future.value(new FileAndDir(file, dir));
   }
 
   if (FileSystem.supported) {
-    test('getFileSystem', getFileSystem);
-
-    test('createWriter', () {
-      return doDirSetup('createWriter').then((fileAndDir) {
-        return fileAndDir.file.createWriter();
-      }).then((writer) {
-        expect(writer.position, 0);
-        expect(writer.readyState, FileWriter.INIT);
-        expect(writer.length, 0);
-      });
+    test('createWriter', () async {
+      var fileAndDir = await doDirSetup('createWriter');
+      var writer = await fileAndDir.file.createWriter();
+      expect(writer.position, 0);
+      expect(writer.readyState, FileWriter.INIT);
+      expect(writer.length, 0);
     });
 
-    test('file', () {
-      return doDirSetup('file').then((fileAndDir) {
-        return fileAndDir.file.file().then((fileObj) {
-          expect(fileObj.name, fileAndDir.file.name);
-          expect(fileObj.relativePath, '');
-          expect(
-              new DateTime.now()
-                  .difference(fileObj.lastModifiedDate)
-                  .inSeconds,
-              lessThan(60));
-        });
-      });
+    test('file', () async {
+      var fileAndDir = await doDirSetup('file');
+      var fileObj = await fileAndDir.file.file();
+      expect(fileObj.name, fileAndDir.file.name);
+      expect(fileObj.relativePath, '');
+      expect(new DateTime.now().difference(fileObj.lastModifiedDate).inSeconds,
+          lessThan(60));
     });
   }
 }
diff --git a/tests/lib_2/html/fileapi_file_test.dart b/tests/lib_2/html/fileapi_file_test.dart
index d1c9404..3511ec3 100644
--- a/tests/lib_2/html/fileapi_file_test.dart
+++ b/tests/lib_2/html/fileapi_file_test.dart
@@ -4,47 +4,43 @@
 import 'dart:html';
 
 import 'package:unittest/unittest.dart';
-import 'package:unittest/html_individual_config.dart';
-
-class FileAndDir {
-  FileEntry file;
-  DirectoryEntry dir;
-  FileAndDir(this.file, this.dir);
-}
+import 'package:unittest/html_config.dart';
+import 'package:async_helper/async_helper.dart';
 
 FileSystem fs;
 
-main() {
-  useHtmlIndividualConfiguration();
+main() async {
+  useHtmlConfiguration();
 
-  getFileSystem() {
-    return window.requestFileSystem(100).then((FileSystem fileSystem) {
-      fs = fileSystem;
-    });
+  getFileSystem() async {
+    var fileSystem = await window.requestFileSystem(100);
+    fs = fileSystem;
   }
 
   if (FileSystem.supported) {
-    test('getFileSystem', getFileSystem);
+    await getFileSystem();
 
-    test('fileDoesntExist', () {
-      return fs.root.getFile('file2').catchError((error) {
-        expect(error.code, equals(FileError.NOT_FOUND_ERR));
-      }, test: (e) => e is FileError);
+    test('fileDoesntExist', () async {
+      try {
+        var fileObj = await fs.root.getFile('file2');
+        fail("file found");
+      } catch (error) {
+        expect(true, error is DomException);
+        expect(DomException.NOT_FOUND, error.name);
+      }
     });
 
-    test('fileCreate', () {
-      return fs.root.createFile('file4').then((Entry e) {
-        expect(e.name, equals('file4'));
-        expect(e.isFile, isTrue);
-        return e.getMetadata();
-      }).then((Metadata metadata) {
-        var changeTime = metadata.modificationTime;
-        // Upped because our Windows buildbots can sometimes be particularly
-        // slow.
-        expect(
-            new DateTime.now().difference(changeTime).inMinutes, lessThan(4));
-        expect(metadata.size, equals(0));
-      });
+    test('fileCreate', () async {
+      var fileObj = await fs.root.createFile('file4');
+      expect(fileObj.name, equals('file4'));
+      expect(fileObj.isFile, isTrue);
+
+      var metadata = await fileObj.getMetadata();
+      var changeTime = metadata.modificationTime;
+
+      // Increased Windows buildbots can sometimes be particularly slow.
+      expect(new DateTime.now().difference(changeTime).inMinutes, lessThan(4));
+      expect(metadata.size, equals(0));
     });
   }
 }
diff --git a/tests/lib_2/html/fileapi_supported_throws_test.dart b/tests/lib_2/html/fileapi_supported_throws_test.dart
index 53afeb7..02e1d65 100644
--- a/tests/lib_2/html/fileapi_supported_throws_test.dart
+++ b/tests/lib_2/html/fileapi_supported_throws_test.dart
@@ -1,17 +1,19 @@
 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';
 
 main() {
-  useHtmlIndividualConfiguration();
+  useHtmlConfiguration();
 
-  test('requestFileSystem', () {
+  test('requestFileSystem', () async {
     var expectation = FileSystem.supported ? returnsNormally : throws;
-    expect(() {
-      window.requestFileSystem(100);
+    expect(() async {
+      await window.requestFileSystem(100);
     }, expectation);
   });
 }
diff --git a/tests/lib_2/lib_2_dart2js.status b/tests/lib_2/lib_2_dart2js.status
index 6e09990..b909ec3 100644
--- a/tests/lib_2/lib_2_dart2js.status
+++ b/tests/lib_2/lib_2_dart2js.status
@@ -15,11 +15,6 @@
 html/custom/entered_left_view_test/shadow_dom: Pass, Timeout # Roll 50 failure
 html/custom_elements_test: Pass, Timeout # Issue 26789
 html/debugger_test: CompileTimeError # Issue 30900
-html/fileapi_directory_reader_test: Pass, Timeout # Roll 50 failure
-html/fileapi_directory_test: Pass, Timeout # Roll 50 failure
-html/fileapi_entry_test: Pass, Timeout # Roll 50 failure
-html/fileapi_file_entry_test: Pass, Timeout # Roll 50 failure
-html/fileapi_file_test: Pass, Timeout # Roll 50 failure
 html/indexeddb_1_test/functional: Pass, Timeout # Roll 50 failure
 html/indexeddb_2_test: Pass, Timeout # Roll 50 failure
 html/indexeddb_3_test: Pass, Timeout # Roll 50 failure
@@ -85,9 +80,6 @@
 html/element_classes_test: RuntimeError # Issue 30291
 html/element_types_keygen_test: RuntimeError # Issue 29055
 html/file_sample_test: Pass, RuntimeError
-html/fileapi_directory_test: Fail # TODO(dart2js-team): Please triage this failure.
-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/speechrecognition_test: RuntimeError # Please triage.
 isolate/function_send_test: Skip # Crashes Chrome 62: https://bugs.chromium.org/p/chromium/issues/detail?id=775506
@@ -166,7 +158,6 @@
 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_constructors4_test: RuntimeError
 html/element_types_content_test: Pass, RuntimeError # Issues 28983, 29922
 html/element_types_keygen_test: RuntimeError # Issue 29922
 html/element_types_keygen_test: Fail
@@ -269,6 +260,7 @@
 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.
+html/fileapi_supported_throws_test: skip # FileSystem not supported on Safari
 isolate/cross_isolate_message_test: Skip # Issue 12627
 isolate/message_test: Skip # Issue 12627
 
@@ -279,6 +271,7 @@
 html/custom/created_callback_test: RuntimeError
 html/fontface_loaded_test: Fail # Support for promises.
 html/js_typed_interop_lazy_test/01: RuntimeError
+html/notification_permission_test: Timeout, Pass # Issue 32002
 html/private_extension_member_test: RuntimeError
 isolate/isolate_stress_test: Pass, Slow # Issue 10697
 js/null_test: RuntimeError # Issue 30652
@@ -575,11 +568,6 @@
 html/event_customevent_test: RuntimeError
 html/event_test: RuntimeError
 html/exceptions_test: RuntimeError
-html/fileapi_directory_reader_test: RuntimeError
-html/fileapi_directory_test: RuntimeError
-html/fileapi_entry_test: RuntimeError
-html/fileapi_file_entry_test: RuntimeError
-html/fileapi_file_test: RuntimeError
 html/fileapi_supported_test: RuntimeError
 html/filereader_test: RuntimeError
 html/filteredelementlist_test: RuntimeError
@@ -772,10 +760,6 @@
 isolate/kill_self_synchronously_test: RuntimeError
 
 [ $compiler == dart2js && ($runtime == d8 || $runtime == jsshell) ]
-html/fileapi_directory_test: Fail, Pass # TODO(dart2js-team): Please triage this failure.
-html/fileapi_entry_test: Fail, Pass # TODO(dart2js-team): Please triage this failure.
-html/fileapi_file_entry_test: Fail, Pass # TODO(dart2js-team): Please triage this failure.
-html/fileapi_file_test: Fail, Pass # TODO(dart2js-team): Please triage this failure.
 isolate/browser/issue_12474_test: RuntimeError # packageRoot not implemented.
 
 [ $compiler == dart2js && ($runtime == ff || $runtime == safari || $ie) ]
diff --git a/tests/lib_2/lib_2_dartdevc.status b/tests/lib_2/lib_2_dartdevc.status
index 17f16aa..8afe594 100644
--- a/tests/lib_2/lib_2_dartdevc.status
+++ b/tests/lib_2/lib_2_dartdevc.status
@@ -4,13 +4,12 @@
 
 [ $compiler == dartdevc ]
 async/futures_test: RuntimeError # Issue 29922
+html/cross_frame_test: Skip # Issue 32039, test reloads itself (not by design - investigate)
 html/xhr_test/xhr: RuntimeError # Issue 29922, strong mode cast failure
 
 [ $compiler == dartdevk ]
-async/future_or_strong_test: RuntimeError
 async/future_value_chain4_test: CompileTimeError
 async/slow_consumer_test: CompileTimeError
-async/zone_run_unary_test: CompileTimeError # Issue 31537
 collection/list_test: RuntimeError
 convert/chunked_conversion1_test: RuntimeError
 convert/chunked_conversion_utf82_test: RuntimeError
@@ -106,6 +105,7 @@
 html/media_stream_test: RuntimeError # Issue 29922
 html/mediasource_test: RuntimeError # Issue 29922
 html/no_linked_scripts_htmltest: Skip # Issue 29919
+html/notification_permission_test: Timeout # Issue 32002
 html/scripts_htmltest: Skip # Issue 29919
 html/transferables_test: CompileTimeError # Issue 30975
 html/transition_event_test: Pass, RuntimeError, Timeout # Issue 29922, this test seems flaky
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index de400ed..6c52840 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -45,18 +45,12 @@
 # ===== dartk + vm status lines =====
 [ $compiler == dartk && $runtime == vm && $strong ]
 async/async_await_sync_completer_test: RuntimeError
-async/future_or_strong_test: RuntimeError
 async/future_value_chain4_test: CompileTimeError # Issue 31616
 async/slow_consumer2_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/stream_controller_async_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/stream_join_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/stream_subscription_as_future_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/zone_run_unary_test: CompileTimeError # Issue 31537
 convert/streamed_conversion_json_utf8_decode_test: Pass, Slow # Infrequent timeouts.
 html/*: SkipByDesign # dart:html not supported on VM.
 isolate/compile_time_error_test/01: MissingCompileTimeError
@@ -216,11 +210,6 @@
 async/stream_distinct_test: RuntimeError
 async/stream_join_test: RuntimeError
 async/stream_subscription_as_future_test: RuntimeError
-async/timer_cancel2_test: RuntimeError
-async/timer_cancel_test: RuntimeError
-async/timer_isActive_test: RuntimeError
-async/timer_repeat_test: RuntimeError
-async/zone_run_unary_test: RuntimeError
 isolate/issue_22778_test: Crash
 isolate/kill_self_synchronously_test: RuntimeError
 isolate/message_test: RuntimeError
@@ -284,14 +273,13 @@
 # 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/count_test: RuntimeError
 isolate/cross_isolate_message_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
 isolate/error_at_spawnuri_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
 isolate/error_exit_at_spawnuri_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
 isolate/exit_at_spawnuri_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
 isolate/issue_21398_parent_isolate_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
 isolate/issue_24243_parent_isolate_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
-isolate/mandel_isolate_test: RuntimeError
+isolate/mandel_isolate_test: Pass, Timeout
 isolate/message2_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
 isolate/nested_spawn2_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
 isolate/nested_spawn_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
@@ -323,7 +311,6 @@
 # ===== dartkp + dart_precompiled status lines =====
 [ $compiler == dartkp && $runtime == dart_precompiled && $strong ]
 async/async_await_sync_completer_test: RuntimeError
-async/future_or_strong_test: RuntimeError
 async/future_test/01: RuntimeError
 async/future_test/none: RuntimeError
 async/future_value_chain4_test: CompileTimeError # Issue 31616
@@ -332,12 +319,7 @@
 async/stream_distinct_test: RuntimeError
 async/stream_join_test: RuntimeError
 async/stream_subscription_as_future_test: RuntimeError
-async/timer_cancel2_test: RuntimeError
-async/timer_cancel_test: RuntimeError
-async/timer_isActive_test: RuntimeError
 async/timer_not_available_test: RuntimeError
-async/timer_repeat_test: RuntimeError
-async/zone_run_unary_test: CompileTimeError # Issue 31537
 html/*: SkipByDesign # dart:html not supported on VM.
 isolate/compile_time_error_test/01: Crash
 isolate/compile_time_error_test/01: MissingCompileTimeError
diff --git a/tools/VERSION b/tools/VERSION
index 8d5ddec..64a9361 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 0
 PATCH 0
-PRERELEASE 20
+PRERELEASE 21
 PRERELEASE_PATCH 0
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index f71c0a7..0d597fd 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -249,7 +249,11 @@
         },
         {
           "name": "front-end tests",
-          "arguments": ["--compiler=none", "--checked"],
+          "arguments": [
+            "--compiler=none",
+            "--checked",
+            "--timeout=120"
+          ],
           "tests": ["pkg/front_end"]
         },
         {
@@ -731,10 +735,15 @@
         "dart2js-win-x64-ie11"
       ],
       "meta": {
-        "description": "These builders are triggered by dart-sdk-linux and runs the dart2js tests."
+        "description": "These builders run dart2js tests."
       },
       "steps": [
         {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": ["create_sdk"]
+        },
+        {
           "name": "dart2js tests",
           "arguments": [
             "--use-sdk",
@@ -852,10 +861,15 @@
     {
       "builders": ["dart2js-minified-linux-x64-d8"],
       "meta": {
-        "description": "This builder is triggered by dart-sdk-linux and runs the dart2js tests with minified."
+        "description": "This builder runs the dart2js tests in minified mode."
       },
       "steps": [
         {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": ["create_sdk"]
+        },
+        {
           "name": "dart2js tests",
           "arguments": [
             "--use-sdk",
@@ -983,10 +997,15 @@
     {
       "builders": ["dart2js-csp-minified-linux-x64-drt"],
       "meta": {
-        "description": "This builder is triggered by dart-sdk-linux and runs the dart2js tests with csp and minified."
+        "description": "This builder runs the dart2js tests in csp and minified mode."
       },
       "steps": [
         {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": ["create_sdk"]
+        },
+        {
           "name": "dart2js tests",
           "arguments": [
             "--use-sdk",
@@ -1135,15 +1154,6 @@
           "arguments": ["--arch=ia32,x64", "create_sdk" ]
         },
         {
-          "name": "trigger analyzer",
-          "trigger": [
-            "analyzer-linux-release",
-            "analyzer-strong-linux-release",
-            "analyzer-analysis-server-linux"
-          ],
-          "fileset": "analyzer"
-        },
-        {
           "name": "generate API docs",
           "script": "tools/bots/dart_sdk.py",
           "arguments": [ "api_docs" ]
@@ -1153,7 +1163,7 @@
     {
       "builders": ["dart-sdk-mac"],
       "meta": {
-        "description": "This configuration is used by the sdk-builder for mac. The builder triggers the analyzer and dart2js mac builders."
+        "description": "This configuration is used by the sdk-builder for mac."
       },
       "steps": [
         {
@@ -1166,7 +1176,7 @@
     {
       "builders": ["dart-sdk-win"],
       "meta": {
-        "description": "This configuration is used by the sdk-builder for windows. The builder triggers the analyzer and dart2js windows builders."
+        "description": "This configuration is used by the sdk-builder for windows."
       },
       "steps": [
         {
@@ -1187,6 +1197,11 @@
       },
       "steps": [
         {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": ["create_sdk"]
+        },
+        {
           "name": "analyze tests",
           "arguments": ["--compiler=dart2analyzer", "--use-sdk"]
         },
@@ -1261,6 +1276,11 @@
       },
       "steps": [
         {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": ["create_sdk"]
+        },
+        {
           "name": "analyze tests strong",
           "arguments": ["--compiler=dart2analyzer", "--use-sdk", "--strong"]
         },
@@ -1279,6 +1299,11 @@
       "builders": ["analyzer-analysis-server-linux"],
       "steps": [
         {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": ["create_sdk"]
+        },
+        {
           "name": "Analyze analysis_server",
           "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
           "arguments": ["--no-hints","pkg/analysis_server"]
@@ -1298,10 +1323,15 @@
     {
       "builders": ["pkg-linux-release","pkg-win-release","pkg-mac-release"],
       "meta": {
-        "description": "This configuration is used by the pkg builders. The builder is triggered by the SDK builders with the pkg fileset."
+        "description": "This configuration is used by the pkg builders."
       },
       "steps": [
         {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": ["create_sdk"]
+        },
+        {
           "name": "package unit tests",
           "arguments": [
             "--use-sdk",
diff --git a/tools/bots/try_benchmarks.sh b/tools/bots/try_benchmarks.sh
index bb824e0..8816f73 100755
--- a/tools/bots/try_benchmarks.sh
+++ b/tools/bots/try_benchmarks.sh
@@ -393,7 +393,7 @@
 EOF
     out/ReleaseX64/dart --profile-period=10000 --packages=.packages hello.dart
     out/ReleaseX64/dart --profile-period=10000 --packages=.packages --checked hello.dart
-    out/ReleaseX64/dart --profile-period=10000 --packages=.packages --dfe=out/ReleaseX64/gen/kernel-service.dart.snapshot --kernel-binaries=out/ReleaseX64 hello.dart
+    out/ReleaseX64/dart --profile-period=10000 --packages=.packages --dfe=out/ReleaseX64/gen/kernel-service.dart.snapshot hello.dart
     out/ReleaseX64/dart_bootstrap --packages=.packages --use-blobs --snapshot-kind=app-aot --snapshot=blob.bin hello.dart
     out/ReleaseX64/dart_precompiled_runtime --profile-period=10000 blob.bin
     DART_CONFIGURATION=ReleaseX64 pkg/vm/tool/dart2 --profile-period=10000 --packages=.packages hello.dart
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index 77f0680..ca1993b 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -180,6 +180,18 @@
   EntrySync getParent();
 };
 
+// Need to add for Blob which are really File that extends a Blob when called
+// via file() method on FileEntry
+callback interface FileCallback {
+    void handleEvent(File? file);
+};
+
+[DartSupplemental]
+interface FileEntry {
+    [DartSuppress] void file(BlobCallback successCallback, optional ErrorCallback errorCallback);
+    void file(FileCallback successCallback, optional ErrorCallback errorCallback);
+};
+
 [DartSupplemental,
   CustomConstructor,
   Constructor(Array blobParts, optional DOMString type, optional DOMString endings)
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index 3e81e9b..9438b07 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -231,6 +231,9 @@
   'XMLHttpRequest.open',
   ])
 
+def hasNamedFormals(full_name):
+  return full_name in _methods_with_named_formals
+
 def ReturnValueConversionHack(idl_type, value, interface_name):
   if idl_type == 'SVGMatrix':
     return '%sTearOff::create(%s)' % (idl_type, value)
@@ -696,12 +699,12 @@
     """
     return len(filter(lambda i: not i.is_optional, self.param_infos))
 
-  def ParametersAsArgumentList(self, parameter_count=None):
+  def ParametersAsArgumentList(self, parameter_count=None, ignore_named_parameters=False):
     """Returns a string of the parameter names suitable for passing the
     parameters as arguments.
     """
     def param_name(param_info):
-      if self.requires_named_arguments and param_info.is_optional:
+      if self.requires_named_arguments and param_info.is_optional and not ignore_named_parameters:
         return '%s : %s' % (param_info.name, param_info.name)
       else:
         return param_info.name
@@ -744,17 +747,6 @@
               # Events fired need use a JSFunction not a anonymous closure to
               # insure the event can really be removed.
               parameters.append('js.allowInterop(%s)' % p.name)
-# These commented out cases don't actually generate any code.
-#          elif dart_js_interop and type_id == 'FontFaceSetForEachCallback':
-              # forEach is supported in the DOM for FontFaceSet as it iterates
-              # over the Javascript Object the callback parameters are also
-              # Javascript objects and must be wrapped.
- #             parameters.append('(fontFace, fontFaceAgain, set) => %s(fontFace, fontFaceAgain, wrap_jso(set))' % p.name)
-#          elif dart_js_interop and type_id == 'HeadersForEachCallback':
-              # forEach is supported in the DOM for Headers as it iterates
-              # over the Javascript Object the callback parameters are also
-              # Javascript objects and must be wrapped.
-#              parameters.append('(String value, String key, map) => %s(value, key, wrap_jso(map))' % p.name)
           elif dart_js_interop and type_is_callback and not(isRemoveOperation):
             # Any remove operation that has a a callback doesn't need wrapping.
             # TODO(terry): Kind of hacky but handles all the cases we care about
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index 9a793a1..5bad37f 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -672,6 +672,9 @@
     callback_info = GetCallbackInfo(
         self._database.GetInterface(info.callback_args[0].type_id))
 
+    # Generated private members never have named arguments.
+    ignore_named_parameters = True if html_name.startswith('_') else False
+
     # If more than one callback then the second argument is the error callback.
     # Some error callbacks have 2 args (e.g., executeSql) where the second arg
     # is the error - this is the argument we want.
@@ -687,7 +690,7 @@
       error_callback = (',\n        %s(%s) { completer.completeError(%s); }' %
                         (('%s : ' % info.callback_args[1].name
                           if info.requires_named_arguments and
-                             info.callback_args[1].is_optional else ''),
+                             info.callback_args[1].is_optional and not(ignore_named_parameters) else ''),
                          errorCallbackVariables, errorName))
 
     extensions = GetDDC_Extension(self._interface, info.declared_name)
@@ -717,7 +720,7 @@
       completerVariable = callbackNames[-1]
       future_generic = '<%s>' % self._DartType(callback_info.param_infos[-1].type_id)
 
-    param_list = info.ParametersAsArgumentList()
+    param_list = info.ParametersAsArgumentList(None, ignore_named_parameters)
     metadata = ''
     if '_RenamingAnnotation' in dir(self):
       metadata = (self._RenamingAnnotation(info.declared_name, html_name) +
@@ -742,7 +745,7 @@
         PARAMS_LIST='' if param_list == '' else param_list + ',',
         NAMED_PARAM=('%s : ' % info.callback_args[0].name
             if info.requires_named_arguments and
-              info.callback_args[0].is_optional else ''),
+              info.callback_args[0].is_optional and not(ignore_named_parameters) else ''),
         VARIABLE_NAME=callbackVariables,
         COMPLETER_NAME=completerVariable,
         DDC_EXTENSION=ddc_extensions,
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index 7c35719..12e2de5 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -205,12 +205,17 @@
           'applyExtension(\'FileEntry\', value);',
       ]
   },
+  'Entry': {
+      'getMetadata': [
+          'applyExtension(\'Metadata\', value);',
+      ]
+  },
   'FileEntry': {
       'createWriter': [
           'applyExtension(\'FileWriter\', value);'
       ],
       'file': [
-          'applyExtension(\'Blob\', value);'
+          'applyExtension(\'File\', value);'
       ]
   },
   'SQLTransaction': {
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 7218109..8ab959c 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -1125,6 +1125,7 @@
       self._AddDirectNativeOperation(info, html_name)
 
   def _AddDirectNativeOperation(self, info, html_name):
+    force_optional = True if html_name.startswith('_') else False
     self._members_emitter.Emit(
         '\n'
         '  $RENAME$METADATA$MODIFIERS$TYPE $NAME($PARAMS) native;\n',
@@ -1134,7 +1135,7 @@
         MODIFIERS='static ' if info.IsStatic() else '',
         TYPE=self.SecureOutputType(info.type_name, False, True),
         NAME=html_name,
-        PARAMS=info.ParametersAsDeclaration(self._NarrowInputType))
+        PARAMS=info.ParametersAsDeclaration(self._NarrowInputType, force_optional))
 
   def _AddOperationWithConversions(self, info, html_name):
     # Assert all operations have same return type.
@@ -1183,12 +1184,16 @@
           TARGET=target,
           PARAMS=', '.join(target_parameters))
 
+    # private methods don't need named arguments.
+    full_name = '%s.%s' % (self._interface.id, info.declared_name)
+    force_optional = False if hasNamedFormals(full_name) and not(html_name.startswith('_')) else True
+
     declaration = '%s%s%s %s(%s)' % (
         self._Metadata(info.type_name, info.declared_name, return_type),
         'static ' if info.IsStatic() else '',
         return_type,
         html_name,
-        info.ParametersAsDeclaration(InputType))
+        info.ParametersAsDeclaration(InputType, force_optional))
     self._GenerateDispatcherBody(
         info,
         operations,
diff --git a/tools/gardening/lib/src/results/result_json_models.dart b/tools/gardening/lib/src/results/result_json_models.dart
index 6265cd4..5d82d62 100644
--- a/tools/gardening/lib/src/results/result_json_models.dart
+++ b/tools/gardening/lib/src/results/result_json_models.dart
@@ -93,7 +93,7 @@
       _boolToArg("host-checked", hostChecked),
       _boolToArg("minified", minified),
       _boolToArg("csp", csp),
-      _boolToArg("fasta", csp),
+      // We don't create a --fasta arg because fasta is synthesized variable.
       _stringToArg("system", system),
       _listToArg("vm-options", vmOptions),
       _boolToArg("use-sdk", useSdk),
diff --git a/tools/gardening/lib/src/results_workflow/fix_failing_test.dart b/tools/gardening/lib/src/results_workflow/fix_failing_test.dart
index 0dbacea..262330c 100644
--- a/tools/gardening/lib/src/results_workflow/fix_failing_test.dart
+++ b/tools/gardening/lib/src/results_workflow/fix_failing_test.dart
@@ -29,10 +29,10 @@
   List<FailingTest> _remainingTests;
 
   // These fields are mutated to persist user input.
-  String _lastComment = null;
+  String _lastComment;
   FixWorkingItem _lastWorkingItem;
   List<StatusSectionWithFile> _customSections = [];
-  bool _fixIfPossible = false;
+  StatusExpectations _statusExpectations;
 
   FixFailingTest(this._testResult);
 
@@ -46,45 +46,20 @@
     }
     // We have to compute status files on every show, because we modify the
     // status files on every fix.
-    var statusExpectations = new StatusExpectations(_testResult);
-    await statusExpectations.loadStatusFiles();
+    _statusExpectations = new StatusExpectations(_testResult);
+    await _statusExpectations.loadStatusFiles();
 
     _remainingTests = payload.sublist(1);
     var failingTest = payload.first;
 
-    if (!failingTest.stillFailing(statusExpectations)) {
+    if (!failingTest.stillFailing(_statusExpectations)) {
       return new NavigateStepWorkflowAction(this, _remainingTests);
     }
 
     _currentWorkingItem = new FixWorkingItem(failingTest.result.name,
-        failingTest, statusExpectations, _lastComment, this._customSections);
+        failingTest, _statusExpectations, _lastComment, this._customSections);
     _currentWorkingItem.init();
 
-    if (_lastWorkingItem != null && _fixIfPossible) {
-      // Outcome may be larger from the previous one, but current newOutcome
-      // will always be a singleton list. So we check by matching first
-      // element.
-      var outcomeIsSame = _currentWorkingItem.newOutcome.first ==
-          _lastWorkingItem.newOutcome.first;
-      var lastConfigurations =
-          _lastWorkingItem.failingTest.failingConfigurations;
-      var currentConfigurations =
-          _currentWorkingItem.failingTest.failingConfigurations;
-      var sameConfigurations = lastConfigurations.length ==
-              currentConfigurations.length &&
-          lastConfigurations.every(
-              (configuration) => currentConfigurations.contains(configuration));
-      if (outcomeIsSame && sameConfigurations) {
-        _lastWorkingItem.currentSections.forEach((section) {
-          addExpressionToCustomSections(
-              section.section.condition, section.statusFile.path);
-        });
-        print("Auto-fixing ${_currentWorkingItem.name}");
-        await fixFailingTest();
-        return new NavigateStepWorkflowAction(this, _remainingTests);
-      }
-    }
-
     print("");
     print("${_remainingTests.length + 1} tests remaining.");
     askAboutTest();
@@ -111,9 +86,8 @@
       _lastComment = _currentWorkingItem.comment;
     } else if (input == "f") {
       // Fix failing tests and try to fix the coming ones.
-      _fixIfPossible = true;
       await fixFailingTest();
-      return new NavigateStepWorkflowAction(this, _remainingTests);
+      return _fixAllSimilarTests();
     } else if (input == "o") {
       // Case change new outcome.
       _currentWorkingItem.newOutcome = getNewOutcome();
@@ -139,6 +113,35 @@
     return new WaitForInputWorkflowAction();
   }
 
+  Future<WorkflowAction> _fixAllSimilarTests() async {
+    for (FailingTest similarTest in _remainingTests) {
+      _currentWorkingItem = new FixWorkingItem(similarTest.result.name,
+          similarTest, _statusExpectations, _lastComment, this._customSections);
+      _currentWorkingItem.init();
+      // Outcome may be larger from the previous one, but current newOutcome
+      // will always be a singleton list. So we check by matching first
+      // element.
+      var outcomeIsSame = _currentWorkingItem.newOutcome.first ==
+          _lastWorkingItem.newOutcome.first;
+      var lastConfigurations =
+          _lastWorkingItem.failingTest.failingConfigurations;
+      var currentConfigurations =
+          _currentWorkingItem.failingTest.failingConfigurations;
+      var sameConfigurations = lastConfigurations.length ==
+              currentConfigurations.length &&
+          lastConfigurations.every(
+              (configuration) => currentConfigurations.contains(configuration));
+      if (outcomeIsSame && sameConfigurations) {
+        _currentWorkingItem.currentSections = _lastWorkingItem.currentSections;
+        print("Auto-fixing ${_currentWorkingItem.name}");
+        var realLast = _lastWorkingItem;
+        await fixFailingTest(); // Sets _lastWorkingItem to _currentWorkingItem
+        _lastWorkingItem = realLast; // Might not be needed
+      }
+    }
+    return new NavigateStepWorkflowAction(this, const <FailingTest>[]);
+  }
+
   @override
   Future<bool> onLeave() {
     return new Future.value(false);
@@ -164,10 +167,10 @@
   /// Fixes the failing test based on the data in [_currentWorkingItem].
   Future fixFailingTest() async {
     // Delete all existing entries that are wrong.
-    var statusFiles = new Set<StatusFile>();
+    var changedFiles = new Set<StatusFile>();
     for (var statusEntry in _currentWorkingItem.statusEntries) {
       statusEntry.section.entries.remove(statusEntry.entry);
-      statusFiles.add(statusEntry.statusFile);
+      changedFiles.add(statusEntry.statusFile);
     }
     // Add new expectations to status sections.
     var path = getQualifiedNameForTest(_currentWorkingItem.name);
@@ -184,12 +187,12 @@
         currentSection.statusFile.sections.add(currentSection.section);
       }
       currentSection.section.entries.add(statusEntry);
-      statusFiles.add(currentSection.statusFile);
+      changedFiles.add(currentSection.statusFile);
     }
     // Save the modified status files.
-    for (var statusFile in statusFiles) {
-      var normalized = normalizeStatusFile(statusFile);
-      await new File(statusFile.path).writeAsString(normalized.toString());
+    for (var file in changedFiles) {
+      await new File(file.path)
+          .writeAsString(normalizeStatusFile(file).toString());
     }
     _lastWorkingItem = _currentWorkingItem;
   }
@@ -210,7 +213,6 @@
         orElse: () => null);
     sectionToAdd ??= new StatusSection(expression, 0, []);
     var section = new StatusSectionWithFile(statusFile, sectionToAdd);
-    // This mutates the
     _customSections.add(section);
     _currentWorkingItem.currentSections.add(section);
   }
@@ -237,6 +239,9 @@
 /// user to pick the correct file.
 StatusFile getStatusFile(FixWorkingItem workingItem) {
   var statusFiles = workingItem.statusFiles();
+  if (statusFiles.length == 1) {
+    return statusFiles.first;
+  }
   print("Which status file should the section be added to/exists in?");
   int i = 0;
   for (var statusFile in statusFiles) {
@@ -382,7 +387,6 @@
     print("Sections to add the new outcome to. The selected sections are "
         "marked by *:");
     int groupCounter = "A".codeUnitAt(0);
-    ;
     int sectionCounter = 0;
     suggestedSections.forEach((suggestedSection) {
       print("  ${new String.fromCharCode(groupCounter++)} "
diff --git a/tools/migration/bin/run_tests.dart b/tools/migration/bin/run_tests.dart
index 8dd7cd7f..3fc8498 100644
--- a/tools/migration/bin/run_tests.dart
+++ b/tools/migration/bin/run_tests.dart
@@ -47,17 +47,10 @@
 /// possibly followed by some modifier for a specific bot or annotated step on
 /// a bot. The configs here are ordered the same order as the waterfall.
 final allConfigs = {
-  "vm": [noCompiler, vm],
   "vm-checked": [noCompiler, vm, checked],
-  "vm-app": [appJit, vm],
-  "vm-app-product": [productMode, appJit, vm],
-  "vm-kernel": [dartk, releaseMode, vm],
   "vm-kernel-strong": [dartk, releaseMode, vm, strong],
-  "vm-kernel-precomp": [dartkp, releaseMode, precompiled],
   "vm-kernel-precomp-strong": [dartkp, releaseMode, precompiled, strong],
-  "vm-precomp": [precompiler, precompiled],
   "vm-precomp-checked": [precompiler, precompiled, checked],
-  "vm-product": [productMode, noCompiler, vm],
   // TODO(rnystrom): Add dart2js-d8-hostchecked, dart2js-d8-minified, or
   // dart2js-jsshell?
   "analyzer": [analyzer, noRuntime, useSdk],
@@ -80,14 +73,6 @@
     useSdk,
     dart2jsBatch
   ],
-  "dart2js-d8-withkernel-checked": [
-    dart2js,
-    d8,
-    dart2jsWithKernel,
-    checked,
-    useSdk,
-    dart2jsBatch
-  ],
   "dart2js-jsshell": [dart2js, jsshell, fastStartup, useSdk, dart2jsBatch],
   // TODO(rnystrom): Is it worth running dart2js on Firefox too?
   "dartdevc": [dartdevc, chrome, useSdk, strong],
diff --git a/tools/sdks/linux/dart-sdk.tar.gz.sha1 b/tools/sdks/linux/dart-sdk.tar.gz.sha1
index 6411e77..249421a 100644
--- a/tools/sdks/linux/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/linux/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-49e617f9794692ed227c0722813e10c3d4196346
\ No newline at end of file
+3fde07bb67a56026714d80a368ef103dab2178c7
\ No newline at end of file
diff --git a/tools/sdks/mac/dart-sdk.tar.gz.sha1 b/tools/sdks/mac/dart-sdk.tar.gz.sha1
index 02551c5..5f44438 100644
--- a/tools/sdks/mac/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/mac/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-1874dc616540bedab2352f0e1c7b5351bc243983
\ No newline at end of file
+5aca8af43c877177661c6474900ab03a076d03a3
\ No newline at end of file
diff --git a/tools/sdks/win/dart-sdk.tar.gz.sha1 b/tools/sdks/win/dart-sdk.tar.gz.sha1
index 46075fb..a9bcb34 100644
--- a/tools/sdks/win/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/win/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-78643b42a0fc10aea1409d5ce9ed10a14d128e77
\ No newline at end of file
+d205e12e82d9605639bb2f36deb7287ca84bc18e
\ No newline at end of file
diff --git a/tools/testing/dart/browser_test.dart b/tools/testing/dart/browser_test.dart
index 011aa2d..19b39a7 100644
--- a/tools/testing/dart/browser_test.dart
+++ b/tools/testing/dart/browser_test.dart
@@ -40,7 +40,8 @@
 /// The [testName] is the short name of the test without any subdirectory path
 /// or extension, like "math_test". The [testJSDir] is the relative path to the
 /// build directory where the dartdevc-generated JS file is stored.
-String dartdevcHtml(String testName, String testJSDir, String buildDir) {
+String dartdevcHtml(String testName, String testJSDir, String buildDir,
+    {bool syncAsync}) {
   var packagePaths = testPackages
       .map((package) => '    "$package": "/root_dart/$buildDir/gen/utils/'
           'dartdevc/pkg/$package",')
@@ -86,7 +87,7 @@
 requirejs(["$testName", "dart_sdk", "async_helper"],
     function($testName, sdk, async_helper) {  
   sdk.dart.ignoreWhitelistedErrors(false);
-  
+  if ($syncAsync) sdk.dart.setStartAsyncSynchronously();
   // TODO(rnystrom): This uses DDC's forked version of async_helper. Unfork
   // these packages when possible.
   async_helper.async_helper.asyncTestInitialize(function() {});
diff --git a/tools/testing/dart/co19_test_config.dart b/tools/testing/dart/co19_test_config.dart
index 1a2fab4..f98f7a5 100644
--- a/tools/testing/dart/co19_test_config.dart
+++ b/tools/testing/dart/co19_test_config.dart
@@ -9,14 +9,13 @@
 class Co19TestSuite extends StandardTestSuite {
   RegExp _testRegExp = new RegExp(r"t[0-9]{2}.dart$");
 
-  Co19TestSuite(Configuration configuration)
-      : super(configuration, "co19", new Path("tests/co19/src"), [
-          "tests/co19/co19-co19.status",
-          "tests/co19/co19-analyzer.status",
-          "tests/co19/co19-analyzer2.status",
-          "tests/co19/co19-runtime.status",
-          "tests/co19/co19-dart2js.status",
-          "tests/co19/co19-kernel.status"
+  Co19TestSuite(Configuration configuration, String selector)
+      : super(configuration, selector, new Path("tests/$selector/src"), [
+          "tests/$selector/$selector-co19.status",
+          "tests/$selector/$selector-analyzer.status",
+          "tests/$selector/$selector-runtime.status",
+          "tests/$selector/$selector-dart2js.status",
+          "tests/$selector/$selector-kernel.status"
         ]);
 
   bool isTestFile(String filename) => _testRegExp.hasMatch(filename);
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index da1d9be..3bbb205 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -1065,6 +1065,7 @@
     final args = [
       _isAot ? '--aot' : '--no-aot',
       _isStrong ? '--strong-mode' : '--no-strong-mode',
+      _isStrong ? '--sync-async' : '--no-sync-async',
       '--platform=$vmPlatform',
       '-o',
       dillFile,
diff --git a/tools/testing/dart/expectation_set.dart b/tools/testing/dart/expectation_set.dart
index 60ff188..aa6247f 100644
--- a/tools/testing/dart/expectation_set.dart
+++ b/tools/testing/dart/expectation_set.dart
@@ -15,28 +15,37 @@
 /// For any given file path, returns the expected test results for that file.
 /// A set can be loaded from a collection of status files. A file path may
 /// exist in multiple files (or even multiple sections within the file). When
-/// that happens, all of the expectations of every entry are combined.
+/// that happens, all of the expectations of every entry are unioned together
+/// and the test is considered to pass if the outcome is any of those
+/// expectations.
 class ExpectationSet {
+  static final _passSet = [Expectation.pass].toSet();
+
+  /// A cache of path component glob strings (like "b*r") that we've previously
+  /// converted to regexes. This ensures we collapse multiple globs from the
+  /// same string to the same map key in [_PathNode.regExpChildren].
+  final Map<String, RegExp> _globCache = {};
+
+  /// The root of the expectation tree.
+  final _PathNode _tree = new _PathNode();
+
   /// Reads the expectations defined by the status files at [statusFilePaths]
   /// when in [configuration].
-  static ExpectationSet read(
+  ExpectationSet.read(
       List<String> statusFilePaths, Configuration configuration) {
     try {
       var environment = new ConfigurationEnvironment(configuration);
-      var expectations = new ExpectationSet._();
       for (var path in statusFilePaths) {
         var file = new StatusFile.read(path);
         file.validate(environment);
         for (var section in file.sections) {
           if (section.isEnabled(environment)) {
             for (var entry in section.entries) {
-              expectations.addEntry(entry);
+              addEntry(entry);
             }
           }
         }
       }
-
-      return expectations;
     } on SyntaxError catch (error) {
       stderr.writeln(error.toString());
       exit(1);
@@ -45,29 +54,21 @@
     }
   }
 
-  // Only create one copy of each Set<Expectation>.
-  // We just use .toString as a key, so we may make a few
-  // sets that only differ in their toString element order.
-  static Map<String, Set<Expectation>> _cachedSets = {};
-
-  Map<String, Set<Expectation>> _map = {};
-  Map<String, List<RegExp>> _keyToRegExps;
-
-  /// Create a TestExpectations object. See the [expectations] method
-  /// for an explanation of matching.
-  ExpectationSet._();
-
   /// Add [entry] to the set of expectations.
   void addEntry(StatusEntry entry) {
-    // Once we have started using the expectations we cannot add more
-    // rules.
-    if (_keyToRegExps != null) {
-      throw new StateError("Cannot add entries after it is already in use.");
+    var tree = _tree;
+    for (var part in entry.path.split('/')) {
+      if (part.contains("*")) {
+        var regExp = _globCache.putIfAbsent(part, () {
+          return new RegExp("^" + part.replaceAll("*", ".*") + r"$");
+        });
+        tree = tree.regExpChildren.putIfAbsent(regExp, () => new _PathNode());
+      } else {
+        tree = tree.stringChildren.putIfAbsent(part, () => new _PathNode());
+      }
     }
 
-    _map
-        .putIfAbsent(entry.path, () => new Set<Expectation>())
-        .addAll(entry.expectations);
+    tree.expectations.addAll(entry.expectations);
   }
 
   /// Get the expectations for the test at [path].
@@ -80,53 +81,71 @@
   /// the corresponding filename component.
   Set<Expectation> expectations(String path) {
     var result = new Set<Expectation>();
-    var parts = path.split('/');
+    _tree.walk(path.split('/'), 0, result);
 
-    // Create mapping from keys to list of RegExps once and for all.
-    _preprocessForMatching();
+    // If no status files modified the expectation, default to the test passing.
+    if (result.isEmpty) return _passSet;
 
-    _map.forEach((key, expectations) {
-      var regExps = _keyToRegExps[key];
-      if (regExps.length > parts.length) return;
-
-      for (var i = 0; i < regExps.length; i++) {
-        if (!regExps[i].hasMatch(parts[i])) return;
-      }
-
-      // If all components of the status file key matches the filename
-      // add the expectations to the result.
-      result.addAll(expectations);
-    });
-
-    // If no expectations were found the expectation is that the test
-    // passes.
-    if (result.isEmpty) {
-      result.add(Expectation.pass);
-    }
-    return _cachedSets.putIfAbsent(result.toString(), () => result);
+    return result;
   }
+}
 
-  /// Preprocesses the expectations for matching against filenames. Generates
-  /// lists of regular expressions once and for all for each key.
-  void _preprocessForMatching() {
-    if (_keyToRegExps != null) return;
+/// A single file system path component in the tree of expectations.
+///
+/// Given a list of status file entry paths (which may contain globs at various
+/// parts), we parse it into a tree of nodes. Then, later, when looking up the
+/// status for a single test, this lets us quickly consider only the status
+/// file entries that relate to that test.
+class _PathNode {
+  /// The non-glob child directory and file paths within this directory.
+  final Map<String, _PathNode> stringChildren = {};
 
-    _keyToRegExps = {};
-    var regExpCache = <String, RegExp>{};
+  /// The glob child directory and file paths within this directory.
+  final Map<RegExp, _PathNode> regExpChildren = {};
 
-    _map.forEach((key, expectations) {
-      if (_keyToRegExps[key] != null) return;
-      var splitKey = key.split('/');
-      var regExps = new List<RegExp>(splitKey.length);
+  /// The test expectatations that any test within this directory should
+  /// include.
+  final Set<Expectation> expectations = new Set();
 
-      for (var i = 0; i < splitKey.length; i++) {
-        var component = splitKey[i];
-        var regExp = regExpCache.putIfAbsent(component,
-            () => new RegExp("^${splitKey[i]}\$".replaceAll('*', '.*')));
-        regExps[i] = regExp;
+  /// Walks the list of path [parts], starting at [index] adding any
+  /// expectations to [result] from this node and any of its matching children.
+  ///
+  /// We need to include all matching children because multiple children may
+  /// match a single test, as in:
+  ///
+  ///     foo/bar/baz: Timeout
+  ///     foo/b*r/baz: Skip
+  ///     foo/*ar/baz: SkipByDesign
+  ///
+  /// Assuming this node is for "foo" and we are walking ["bar", "baz"], all
+  /// three of the above should match and the resulting expectation set should
+  /// include all three.
+  ///
+  /// Also if a status file entry is a prefix of the test's path, that matches
+  /// too:
+  ///
+  ///     foo/bar: Skip
+  ///
+  /// If the test path is "foo/baz/baz", the above entry will match it.
+  void walk(List<String> parts, int index, Set<Expectation> result) {
+    // We've reached this node itself, so add its expectations.
+    result.addAll(expectations);
+
+    // If this is a leaf node, stop traversing.
+    if (index >= parts.length) return;
+
+    var part = parts[index];
+
+    // Look for a non-glob child directory.
+    if (stringChildren.containsKey(part)) {
+      stringChildren[part].walk(parts, index + 1, result);
+    }
+
+    // Look for any matching glob directories.
+    for (var regExp in regExpChildren.keys) {
+      if (regExp.hasMatch(part)) {
+        regExpChildren[regExp].walk(parts, index + 1, result);
       }
-
-      _keyToRegExps[key] = regExps;
-    });
+    }
   }
 }
diff --git a/tools/testing/dart/test_configurations.dart b/tools/testing/dart/test_configurations.dart
index 77ac9f5..32c0c32 100644
--- a/tools/testing/dart/test_configurations.dart
+++ b/tools/testing/dart/test_configurations.dart
@@ -167,8 +167,8 @@
       }
 
       for (var key in configuration.selectors.keys) {
-        if (key == 'co19') {
-          testSuites.add(new Co19TestSuite(configuration));
+        if (['co19', 'co19_2'].contains(key)) {
+          testSuites.add(new Co19TestSuite(configuration, key));
         } else if ((configuration.compiler == Compiler.none ||
                 configuration.compiler == Compiler.dartk) &&
             configuration.runtime == Runtime.vm &&
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 1867b2a..e82a650 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -471,7 +471,7 @@
 
     var statusFiles =
         statusFilePaths.map((statusFile) => "$dartDir/$statusFile").toList();
-    var expectations = ExpectationSet.read(statusFiles, configuration);
+    var expectations = new ExpectationSet.read(statusFiles, configuration);
 
     try {
       for (var name in await _listTests(hostRunnerPath)) {
@@ -695,7 +695,7 @@
       return dartDir.append(statusFilePath).toNativePath();
     }).toList();
 
-    return ExpectationSet.read(statusFiles, configuration);
+    return new ExpectationSet.read(statusFiles, configuration);
   }
 
   Future enqueueTests() {
@@ -814,6 +814,12 @@
     var commonArguments =
         commonArgumentsFromFile(info.filePath, info.optionsFromFile);
 
+    // TODO(floitsch): Hack. When running the 2.0 tests always start
+    // async functions synchronously.
+    if (suiteName.endsWith("_2")) {
+      commonArguments.insert(0, "--sync-async");
+    }
+
     var vmOptionsList = getVmOptions(info.optionsFromFile);
     assert(!vmOptionsList.isEmpty);
 
@@ -1026,13 +1032,37 @@
       } else {
         var jsDir =
             new Path(compilationTempDir).relativeTo(Repository.dir).toString();
-        content = dartdevcHtml(nameNoExt, jsDir, buildDir);
+        // Always run with synchronous starts of `async` functions.
+        // If we want to make this dependent on other parameters or flags,
+        // this flag could be become conditional.
+        content = dartdevcHtml(nameNoExt, jsDir, buildDir, syncAsync: true);
       }
     }
 
     var htmlPath = '$tempDir/test.html';
     new File(htmlPath).writeAsStringSync(content);
 
+    // TODO(floitsch): Hack. When running the 2.0 tests always start
+    // async functions synchronously.
+    if (suiteName.endsWith("_2") &&
+        configuration.compiler == Compiler.dart2js) {
+      if (optionsFromFile == null) {
+        optionsFromFile = const <String, dynamic>{
+          'sharedOptions': const ['--sync-async']
+        };
+      } else {
+        optionsFromFile = new Map<String, dynamic>.from(optionsFromFile);
+        var sharedOptions = optionsFromFile['sharedOptions'];
+        if (sharedOptions == null) {
+          sharedOptions = const <String>['--sync-async'];
+        } else {
+          sharedOptions = sharedOptions.toList();
+          sharedOptions.insert(0, "--sync-async");
+        }
+        optionsFromFile['sharedOptions'] = sharedOptions;
+      }
+    }
+
     // Construct the command(s) that compile all the inputs needed by the
     // browser test. For running Dart in DRT, this will be noop commands.
     var commands = <Command>[];
@@ -1377,7 +1407,7 @@
   Map<String, dynamic> readOptionsFromFile(Path filePath) {
     if (filePath.filename.endsWith('.dill')) {
       return optionsFromKernelFile();
-    } else if (filePath.segments().contains('co19')) {
+    } else if (filePath.segments().any(['co19', 'co19_2'].contains)) {
       return readOptionsFromCo19File(filePath);
     }
     RegExp testOptionsRegExp = new RegExp(r"// VMOptions=(.*)");
@@ -1410,7 +1440,7 @@
 
     List<String> singleListOfOptions(String name) {
       var matches = new RegExp('// $name=(.*)').allMatches(contents);
-      var options;
+      List<String> options;
       for (var match in matches) {
         if (options != null) {
           throw new Exception(
