diff --git a/.packages b/.packages
index 68a0766..5e2e043 100644
--- a/.packages
+++ b/.packages
@@ -17,6 +17,7 @@
 barback:third_party/pkg/barback/lib
 bazel_worker:third_party/pkg/bazel_worker/lib
 boolean_selector:third_party/pkg/boolean_selector/lib
+build_integration:pkg/build_integration/lib
 charcode:third_party/pkg/charcode/lib
 charted:third_party/observatory_pub_packages/packages/charted/lib
 cli_util:third_party/pkg/cli_util/lib
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 563a2fb..e02675e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,21 @@
+## 2.0.0-dev.57.0
+
+* Support Javascript Promise APIs as a Dart Future.  In Javascript a Promise has two
+  callbacks one for success and one for failure.  For success the Future returns the
+  value e.g.,
+
+BackgroundFetchManager.get is exposed as:
+
+```dart
+  Future<BackgroundFetchRegistration> get(String id)
+```
+
+usage could be:
+
+   BackgroundFetchRegistration result = await fetchMgr.get('abc');
+
+  The underlying JS Promise to Future mechanism will be exposed as a public API in a future checkin.
+
 ## 2.0.0-dev.56.0
 
 ### Language
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index e949c17..db27347 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -1130,7 +1130,7 @@
         .toList();
     processOptionsForDriver(info, options, optionMap);
     ContextRoot contextRoot =
-        new ContextRoot(folder.path, containedExcludedPaths);
+        new ContextRoot(pathContext, folder.path, containedExcludedPaths);
     if (optionsFile != null) {
       contextRoot.optionsFilePath = optionsFile.path;
     }
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 77fd41b..1af301c 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -65,6 +65,11 @@
   SearchEngine searchEngine;
 
   /**
+   * The workspace for rename refactorings.
+   */
+  RefactoringWorkspace refactoringWorkspace;
+
+  /**
    * The object used to manage uncompleted refactorings.
    */
   _RefactoringManager refactoringManager;
@@ -74,6 +79,8 @@
    */
   EditDomainHandler(AnalysisServer server) : super(server) {
     searchEngine = server.searchEngine;
+    refactoringWorkspace =
+        new RefactoringWorkspace(server.driverMap.values, searchEngine);
     _newRefactoringManager();
   }
 
@@ -589,7 +596,7 @@
         // try RENAME
         {
           RenameRefactoring renameRefactoring = new RenameRefactoring(
-              searchEngine, server.getAstProvider(file), element);
+              refactoringWorkspace, server.getAstProvider(file), element);
           if (renameRefactoring != null) {
             kinds.add(RefactoringKind.RENAME);
           }
@@ -614,7 +621,7 @@
    * Initializes [refactoringManager] with a new instance.
    */
   void _newRefactoringManager() {
-    refactoringManager = new _RefactoringManager(server, searchEngine);
+    refactoringManager = new _RefactoringManager(server, refactoringWorkspace);
   }
 
   static int _getNumberOfScanParseErrors(List<engine.AnalysisError> errors) {
@@ -695,6 +702,7 @@
       const <RefactoringProblem>[];
 
   final AnalysisServer server;
+  final RefactoringWorkspace refactoringWorkspace;
   final SearchEngine searchEngine;
   StreamSubscription subscriptionToReset;
 
@@ -711,7 +719,8 @@
   Request request;
   EditGetRefactoringResult result;
 
-  _RefactoringManager(this.server, this.searchEngine) {
+  _RefactoringManager(this.server, this.refactoringWorkspace)
+      : searchEngine = refactoringWorkspace.searchEngine {
     _reset();
   }
 
@@ -978,7 +987,7 @@
 
         // do create the refactoring
         refactoring = new RenameRefactoring(
-            searchEngine, server.getAstProvider(file), element);
+            refactoringWorkspace, server.getAstProvider(file), element);
         feedback = new RenameFeedback(
             feedbackOffset, feedbackLength, 'kind', 'oldName');
       }
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 19c6a82..8497b25 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -560,10 +560,8 @@
     }
     // Use the returned expression as the field initializer.
     if (expression != null) {
-      AstNode beginNodeToReplace = getter.name;
       String code = 'final';
       if (getter.returnType != null) {
-        beginNodeToReplace = getter.returnType;
         code += ' ' + _getNodeText(getter.returnType);
       }
       code += ' ' + _getNodeText(getter.name);
@@ -571,7 +569,8 @@
         code += ' = ' + _getNodeText(expression);
       }
       code += ';';
-      SourceRange replacementRange = range.startEnd(beginNodeToReplace, getter);
+      SourceRange replacementRange =
+          range.startEnd(getter.returnType ?? getter.propertyKeyword, getter);
       DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addSimpleReplacement(replacementRange, code);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
index 96243dd..74f5d98 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
@@ -23,6 +23,7 @@
 import 'package:analyzer/dart/analysis/session.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/element/ast_provider.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     show RefactoringMethodParameter, SourceChange;
@@ -378,6 +379,25 @@
 }
 
 /**
+ * Information about the workspace refactorings operate it.
+ */
+class RefactoringWorkspace {
+  final Iterable<AnalysisDriver> drivers;
+  final SearchEngine searchEngine;
+
+  RefactoringWorkspace(this.drivers, this.searchEngine);
+
+  /**
+   * Whether the file with the given [path] is in a context root.
+   */
+  bool containsFile(String path) {
+    return drivers.any((driver) {
+      return driver.contextRoot.containsFile(path);
+    });
+  }
+}
+
+/**
  * Abstract [Refactoring] for renaming some [Element].
  */
 abstract class RenameRefactoring implements Refactoring {
@@ -386,8 +406,8 @@
    * maybe `null` if there is no support for renaming [Element]s of the given
    * type.
    */
-  factory RenameRefactoring(
-      SearchEngine searchEngine, AstProvider astProvider, Element element) {
+  factory RenameRefactoring(RefactoringWorkspace workspace,
+      AstProvider astProvider, Element element) {
     if (element == null) {
       return null;
     }
@@ -395,28 +415,27 @@
       element = (element as PropertyAccessorElement).variable;
     }
     if (element.enclosingElement is CompilationUnitElement) {
-      return new RenameUnitMemberRefactoringImpl(searchEngine, element);
+      return new RenameUnitMemberRefactoringImpl(workspace, element);
     }
     if (element is ConstructorElement) {
       return new RenameConstructorRefactoringImpl(
-          searchEngine, astProvider, element);
+          workspace, astProvider, element);
     }
     if (element is ImportElement) {
-      return new RenameImportRefactoringImpl(
-          searchEngine, astProvider, element);
+      return new RenameImportRefactoringImpl(workspace, astProvider, element);
     }
     if (element is LabelElement) {
-      return new RenameLabelRefactoringImpl(searchEngine, element);
+      return new RenameLabelRefactoringImpl(workspace, element);
     }
     if (element is LibraryElement) {
-      return new RenameLibraryRefactoringImpl(searchEngine, element);
+      return new RenameLibraryRefactoringImpl(workspace, element);
     }
     if (element is LocalElement) {
-      return new RenameLocalRefactoringImpl(searchEngine, astProvider, element);
+      return new RenameLocalRefactoringImpl(workspace, astProvider, element);
     }
     if (element.enclosingElement is ClassElement) {
       return new RenameClassMemberRefactoringImpl(
-          searchEngine, astProvider, element);
+          workspace, astProvider, element);
     }
     return null;
   }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename.dart b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
index db79f49..716b2de13 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
@@ -12,44 +12,14 @@
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/generated/java_core.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
-import 'package:path/path.dart' as pathos;
-
-bool isElementInPubCache(Element element) {
-  Source source = element.source;
-  String path = source.fullName;
-  return isPathInPubCache(path);
-}
-
-bool isElementInSdkOrPubCache(Element element) {
-  Source source = element.source;
-  String path = source.fullName;
-  return source.isInSystemLibrary || isPathInPubCache(path);
-}
-
-bool isPathInPubCache(String path) {
-  List<String> parts = pathos.split(path);
-  if (parts.contains('.pub-cache')) {
-    return true;
-  }
-  for (int i = 0; i < parts.length - 1; i++) {
-    if (parts[i] == 'Pub' && parts[i + 1] == 'Cache') {
-      return true;
-    }
-    if (parts[i] == 'third_party' &&
-        (parts[i + 1] == 'pkg' || parts[i + 1] == 'pkg_tested')) {
-      return true;
-    }
-  }
-  return false;
-}
 
 /**
  * An abstract implementation of [RenameRefactoring].
  */
 abstract class RenameRefactoringImpl extends RefactoringImpl
     implements RenameRefactoring {
+  final RefactoringWorkspace workspace;
   final SearchEngine searchEngine;
   final Element _element;
   final String elementKindName;
@@ -58,8 +28,8 @@
 
   String newName;
 
-  RenameRefactoringImpl(SearchEngine searchEngine, Element element)
-      : searchEngine = searchEngine,
+  RenameRefactoringImpl(this.workspace, Element element)
+      : searchEngine = workspace.searchEngine,
         _element = element,
         elementKindName = element.kind.displayName,
         oldName = _getDisplayName(element);
@@ -97,9 +67,9 @@
           getElementQualifiedName(element));
       result.addFatalError(message);
     }
-    if (isElementInPubCache(element)) {
+    if (!workspace.containsFile(element.source.fullName)) {
       String message = format(
-          "The {0} '{1}' is defined in a pub package, so cannot be renamed.",
+          "The {0} '{1}' is defined outside of the project, so cannot be renamed.",
           getElementKindName(element),
           getElementQualifiedName(element));
       result.addFatalError(message);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
index 9c10cdb..7c58a69 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
@@ -41,8 +41,8 @@
   _ClassMemberValidator _validator;
 
   RenameClassMemberRefactoringImpl(
-      SearchEngine searchEngine, this.astProvider, Element element)
-      : super(searchEngine, element);
+      RefactoringWorkspace workspace, this.astProvider, Element element)
+      : super(workspace, element);
 
   @override
   String get refactoringName {
@@ -102,7 +102,7 @@
     List<SourceReference> nameRefs = getSourceReferences(nameMatches);
     for (SourceReference reference in nameRefs) {
       // ignore references from SDK and pub cache
-      if (isElementInSdkOrPubCache(reference.element)) {
+      if (!workspace.containsFile(reference.element.source.fullName)) {
         continue;
       }
       // check the element being renamed is accessible
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
index e079875..ccdb578 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
@@ -27,9 +27,9 @@
 class RenameConstructorRefactoringImpl extends RenameRefactoringImpl {
   final AstProvider astProvider;
 
-  RenameConstructorRefactoringImpl(
-      SearchEngine searchEngine, this.astProvider, ConstructorElement element)
-      : super(searchEngine, element);
+  RenameConstructorRefactoringImpl(RefactoringWorkspace workspace,
+      this.astProvider, ConstructorElement element)
+      : super(workspace, element);
 
   @override
   ConstructorElement get element => super.element as ConstructorElement;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
index 2adca4d..826fcf0 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
@@ -27,8 +27,8 @@
   final AstProvider astProvider;
 
   RenameImportRefactoringImpl(
-      SearchEngine searchEngine, this.astProvider, ImportElement element)
-      : super(searchEngine, element);
+      RefactoringWorkspace workspace, this.astProvider, ImportElement element)
+      : super(workspace, element);
 
   @override
   ImportElement get element => super.element as ImportElement;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
index 651fc7ac..e8a62c9 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
@@ -8,15 +8,15 @@
 import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analysis_server/src/services/refactoring/rename.dart';
-import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/dart/element/element.dart';
 
 /**
  * A [Refactoring] for renaming [LabelElement]s.
  */
 class RenameLabelRefactoringImpl extends RenameRefactoringImpl {
-  RenameLabelRefactoringImpl(SearchEngine searchEngine, LabelElement element)
-      : super(searchEngine, element);
+  RenameLabelRefactoringImpl(
+      RefactoringWorkspace workspace, LabelElement element)
+      : super(workspace, element);
 
   @override
   LabelElement get element => super.element as LabelElement;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
index 1c72c89..ac8326b 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
@@ -8,7 +8,6 @@
 import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analysis_server/src/services/refactoring/rename.dart';
-import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/dart/element/element.dart';
 
 /**
@@ -16,8 +15,8 @@
  */
 class RenameLibraryRefactoringImpl extends RenameRefactoringImpl {
   RenameLibraryRefactoringImpl(
-      SearchEngine searchEngine, LibraryElement element)
-      : super(searchEngine, element);
+      RefactoringWorkspace workspace, LibraryElement element)
+      : super(workspace, element);
 
   @override
   LibraryElement get element => super.element as LibraryElement;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
index eca6220..d452e7d 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
@@ -12,7 +12,6 @@
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analysis_server/src/services/refactoring/rename.dart';
 import 'package:analysis_server/src/services/search/hierarchy.dart';
-import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -29,9 +28,9 @@
   List<LocalElement> elements = [];
 
   RenameLocalRefactoringImpl(
-      SearchEngine searchEngine, this.astProvider, LocalElement element)
+      RefactoringWorkspace workspace, this.astProvider, LocalElement element)
       : unitCache = new ResolvedUnitCache(astProvider),
-        super(searchEngine, element);
+        super(workspace, element);
 
   @override
   LocalElement get element => super.element as LocalElement;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
index fea2831..5f483a9 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
@@ -42,8 +42,9 @@
  * A [Refactoring] for renaming compilation unit member [Element]s.
  */
 class RenameUnitMemberRefactoringImpl extends RenameRefactoringImpl {
-  RenameUnitMemberRefactoringImpl(SearchEngine searchEngine, Element element)
-      : super(searchEngine, element);
+  RenameUnitMemberRefactoringImpl(
+      RefactoringWorkspace workspace, Element element)
+      : super(workspace, element);
 
   @override
   String get refactoringName {
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index 8cf628e..8060d58 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -137,7 +137,8 @@
         resourceProvider,
         new MemoryByteStore(),
         fileContentOverlay,
-        new ContextRoot(resourceProvider.convertPath('/project'), []),
+        new ContextRoot(resourceProvider.pathContext,
+            resourceProvider.convertPath('/project'), []),
         sourceFactory,
         new AnalysisOptionsImpl()..strongMode = true);
     scheduler.start();
diff --git a/pkg/analysis_server/test/abstract_single_unit.dart b/pkg/analysis_server/test/abstract_single_unit.dart
index 1ea09b0..1e9c3ef 100644
--- a/pkg/analysis_server/test/abstract_single_unit.dart
+++ b/pkg/analysis_server/test/abstract_single_unit.dart
@@ -31,7 +31,7 @@
   @override
   void setUp() {
     super.setUp();
-    testFile = resourceProvider.convertPath('/test.dart');
+    testFile = resourceProvider.convertPath('/project/test.dart');
   }
 
   void addTestSource(String code, [Uri uri]) {
diff --git a/pkg/analysis_server/test/services/correction/assist_test.dart b/pkg/analysis_server/test/services/correction/assist_test.dart
index 752c8af..986c6ae 100644
--- a/pkg/analysis_server/test/services/correction/assist_test.dart
+++ b/pkg/analysis_server/test/services/correction/assist_test.dart
@@ -104,7 +104,7 @@
   }
 
   test_addTypeAnnotation_BAD_privateType_closureParameter() async {
-    addSource('/my_lib.dart', '''
+    addSource('/project/my_lib.dart', '''
 library my_lib;
 class A {}
 class _B extends A {}
@@ -120,7 +120,7 @@
   }
 
   test_addTypeAnnotation_BAD_privateType_declaredIdentifier() async {
-    addSource('/my_lib.dart', '''
+    addSource('/project/my_lib.dart', '''
 library my_lib;
 class A {}
 class _B extends A {}
@@ -141,7 +141,7 @@
   test_addTypeAnnotation_BAD_privateType_list() async {
     // This is now failing because we're suggesting "List" rather than nothing.
     // Is it really better to produce nothing?
-    addSource('/my_lib.dart', '''
+    addSource('/project/my_lib.dart', '''
 library my_lib;
 class A {}
 class _B extends A {}
@@ -162,7 +162,7 @@
   }
 
   test_addTypeAnnotation_BAD_privateType_variable() async {
-    addSource('/my_lib.dart', '''
+    addSource('/project/my_lib.dart', '''
 library my_lib;
 class A {}
 class _B extends A {}
@@ -279,7 +279,7 @@
   }
 
   test_addTypeAnnotation_declaredIdentifier_OK_addImport_dartUri() async {
-    addSource('/my_lib.dart', r'''
+    addSource('/project/my_lib.dart', r'''
 import 'dart:async';
 List<Future<int>> getFutures() => null;
 ''');
@@ -416,7 +416,7 @@
   }
 
   test_addTypeAnnotation_local_OK_addImport_dartUri() async {
-    addSource('/my_lib.dart', r'''
+    addSource('/project/my_lib.dart', r'''
 import 'dart:async';
 Future<int> getFutureInt() => null;
 ''');
@@ -438,7 +438,7 @@
 
   test_addTypeAnnotation_local_OK_addImport_notLibraryUnit() async {
     // prepare library
-    addSource('/my_lib.dart', r'''
+    addSource('/project/my_lib.dart', r'''
 import 'dart:async';
 Future<int> getFutureInt() => null;
 ''');
@@ -455,8 +455,8 @@
 }
 ''';
     // add sources
-    addSource('/app.dart', appCode);
-    testSource = addSource('/test.dart', testCode);
+    addSource('/project/app.dart', appCode);
+    testSource = addSource('/project/test.dart', testCode);
     // resolve
     await resolveTestUnit(testCode);
     // prepare the assist
@@ -465,7 +465,7 @@
     change = assist.change;
     // verify
     {
-      var testFileEdit = change.getFileEdit(convertPath('/app.dart'));
+      var testFileEdit = change.getFileEdit(convertPath('/project/app.dart'));
       var resultCode = SourceEdit.applySequence(appCode, testFileEdit.edits);
       expect(resultCode, '''
 library my_app;
@@ -476,7 +476,7 @@
 ''');
     }
     {
-      var testFileEdit = change.getFileEdit(convertPath('/test.dart'));
+      var testFileEdit = change.getFileEdit(convertPath('/project/test.dart'));
       var resultCode = SourceEdit.applySequence(testCode, testFileEdit.edits);
       expect(resultCode, '''
 part of my_app;
@@ -488,10 +488,10 @@
   }
 
   test_addTypeAnnotation_local_OK_addImport_relUri() async {
-    addSource('/aa/bbb/lib_a.dart', r'''
+    addSource('/project/aa/bbb/lib_a.dart', r'''
 class MyClass {}
 ''');
-    addSource('/ccc/lib_b.dart', r'''
+    addSource('/project/ccc/lib_b.dart', r'''
 import '../aa/bbb/lib_a.dart';
 MyClass newMyClass() => null;
 ''');
@@ -1680,6 +1680,34 @@
 ''');
   }
 
+  test_convertToFinalField_OK_noReturnType() async {
+    await resolveTestUnit('''
+class A {
+  get foo => 42;
+}
+''');
+    await assertHasAssistAt(
+        'get foo', DartAssistKind.CONVERT_INTO_FINAL_FIELD, '''
+class A {
+  final foo = 42;
+}
+''');
+  }
+
+  test_convertToFinalField_OK_noReturnType_static() async {
+    await resolveTestUnit('''
+class A {
+  static get foo => 42;
+}
+''');
+    await assertHasAssistAt(
+        'get foo', DartAssistKind.CONVERT_INTO_FINAL_FIELD, '''
+class A {
+  static final foo = 42;
+}
+''');
+  }
+
   test_convertToFinalField_OK_notNull() async {
     await resolveTestUnit('''
 class A {
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index cde73fd..62b0d84 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -1100,7 +1100,7 @@
 
   test_addMissingRequiredArg_cons_single() async {
     _addMetaPackageSource();
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 import 'package:meta/meta.dart';
 
@@ -1128,7 +1128,7 @@
   test_addMissingRequiredArg_cons_single_closure() async {
     _addMetaPackageSource();
 
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 import 'package:meta/meta.dart';
 
@@ -1158,7 +1158,7 @@
   test_addMissingRequiredArg_cons_single_closure_2() async {
     _addMetaPackageSource();
 
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 import 'package:meta/meta.dart';
 
@@ -1188,7 +1188,7 @@
   test_addMissingRequiredArg_cons_single_closure_3() async {
     _addMetaPackageSource();
 
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 import 'package:meta/meta.dart';
 
@@ -1218,7 +1218,7 @@
   test_addMissingRequiredArg_cons_single_closure_4() async {
     _addMetaPackageSource();
 
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 import 'package:meta/meta.dart';
 
@@ -1248,7 +1248,7 @@
   test_addMissingRequiredArg_cons_single_list() async {
     _addMetaPackageSource();
 
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 import 'package:meta/meta.dart';
 
@@ -1495,13 +1495,13 @@
   }
 
   test_changeToStaticAccess_method_importType() async {
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 class A {
   static foo() {}
 }
 ''');
-    addSource('/libB.dart', r'''
+    addSource('/project/libB.dart', r'''
 library libB;
 import 'libA.dart';
 class B extends A {}
@@ -1556,13 +1556,13 @@
   }
 
   test_changeToStaticAccess_property_importType() async {
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 class A {
   static get foo => null;
 }
 ''');
-    addSource('/libB.dart', r'''
+    addSource('/project/libB.dart', r'''
 library libB;
 import 'libA.dart';
 class B extends A {}
@@ -1748,7 +1748,7 @@
 
 class A {}
 ''';
-    addSource('/lib.dart', libCode);
+    addSource('/project/lib.dart', libCode);
     await resolveTestUnit('''
 import 'lib.dart' as lib;
 
@@ -1764,7 +1764,7 @@
     List<SourceFileEdit> fileEdits = change.edits;
     expect(fileEdits, hasLength(1));
     SourceFileEdit fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/lib.dart'));
+    expect(fileEdit.file, convertPath('/project/lib.dart'));
     expect(SourceEdit.applySequence(libCode, fileEdit.edits), r'''
 library my.lib;
 
@@ -2165,11 +2165,11 @@
   }
 
   test_createConstructorSuperImplicit_importType() async {
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 class A {}
 ''');
-    addSource('/libB.dart', r'''
+    addSource('/project/libB.dart', r'''
 library libB;
 import 'libA.dart';
 class B {
@@ -2314,7 +2314,7 @@
   }
 
   test_createField_getter_qualified_instance_differentLibrary() async {
-    addSource('/other.dart', '''
+    addSource('/project/other.dart', '''
 /**
  * A comment to push the offset of the braces for the following class
  * declaration past the end of the content of the test file. Used to catch an
@@ -2343,7 +2343,7 @@
   int test;
 }
 ''',
-        target: '/other.dart');
+        target: '/project/other.dart');
   }
 
   test_createField_getter_qualified_instance_dynamicType() async {
@@ -2493,11 +2493,11 @@
   }
 
   test_createField_importType() async {
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 class A {}
 ''');
-    addSource('/libB.dart', r'''
+    addSource('/project/libB.dart', r'''
 library libB;
 import 'libA.dart';
 A getA() => null;
@@ -2938,7 +2938,7 @@
   }
 
   test_createGetter_qualified_instance_differentLibrary() async {
-    addSource('/other.dart', '''
+    addSource('/project/other.dart', '''
 /**
  * A comment to push the offset of the braces for the following class
  * declaration past the end of the content of the test file. Used to catch an
@@ -2967,7 +2967,7 @@
   int get test => null;
 }
 ''',
-        target: '/other.dart');
+        target: '/project/other.dart');
   }
 
   test_createGetter_qualified_instance_dynamicType() async {
@@ -3879,11 +3879,11 @@
   }
 
   test_creationFunction_forFunctionType_importType() async {
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 class A {}
 ''');
-    addSource('/libB.dart', r'''
+    addSource('/project/libB.dart', r'''
 library libB;
 import 'libA.dart';
 useFunction(int g(A a)) {}
@@ -5370,7 +5370,7 @@
   }
 
   test_undefinedFunction_create_importType() async {
-    addSource('/lib.dart', r'''
+    addSource('/project/lib.dart', r'''
 library lib;
 import 'dart:async';
 Future getFuture() => null;
@@ -6082,8 +6082,8 @@
 class D {
 }
 ''';
-    addSource('/test2.dart', code2);
-    addSource('/test3.dart', r'''
+    addSource('/project/test2.dart', code2);
+    addSource('/project/test3.dart', r'''
 library test3;
 class E {}
 ''');
@@ -6101,7 +6101,7 @@
     List<SourceFileEdit> fileEdits = change.edits;
     expect(fileEdits, hasLength(1));
     SourceFileEdit fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/test2.dart'));
+    expect(fileEdit.file, convertPath('/project/test2.dart'));
     expect(SourceEdit.applySequence(code2, fileEdit.edits), r'''
 library test2;
 import 'test3.dart' as bbb;
@@ -6119,7 +6119,7 @@
 }
 class E {}
 ''';
-    addSource('/test2.dart', code2);
+    addSource('/project/test2.dart', code2);
     await resolveTestUnit('''
 library test;
 import 'test2.dart' as test2;
@@ -6134,7 +6134,7 @@
     List<SourceFileEdit> fileEdits = change.edits;
     expect(fileEdits, hasLength(1));
     SourceFileEdit fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/test2.dart'));
+    expect(fileEdit.file, convertPath('/project/test2.dart'));
     expect(SourceEdit.applySequence(code2, fileEdit.edits), r'''
 library test2;
 class D {
diff --git a/pkg/analysis_server/test/services/correction/organize_directives_test.dart b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
index 459b78c..9576897 100644
--- a/pkg/analysis_server/test/services/correction/organize_directives_test.dart
+++ b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
@@ -96,8 +96,8 @@
   }
 
   test_remove_unresolvedDirectives() async {
-    addSource('/existing_part1.dart', 'part of lib;');
-    addSource('/existing_part2.dart', 'part of lib;');
+    addSource('/project/existing_part1.dart', 'part of lib;');
+    addSource('/project/existing_part2.dart', 'part of lib;');
     await _computeUnitAndErrors(r'''
 library lib;
 
diff --git a/pkg/analysis_server/test/services/correction/status_test.dart b/pkg/analysis_server/test/services/correction/status_test.dart
index 776fa14..cce27cd 100644
--- a/pkg/analysis_server/test/services/correction/status_test.dart
+++ b/pkg/analysis_server/test/services/correction/status_test.dart
@@ -29,7 +29,7 @@
     Element element = findElement('MyClass');
     // check
     Location location = newLocation_fromElement(element);
-    expect(location.file, convertPath('/test.dart'));
+    expect(location.file, convertPath('/project/test.dart'));
     expect(location.offset, 6);
     expect(location.length, 7);
     expect(location.startLine, 1);
@@ -52,7 +52,7 @@
         sourceRange);
     // check
     Location location = newLocation_fromMatch(match);
-    expect(location.file, convertPath('/test.dart'));
+    expect(location.file, convertPath('/project/test.dart'));
     expect(location.offset, sourceRange.offset);
     expect(location.length, sourceRange.length);
   }
@@ -65,7 +65,7 @@
     AstNode node = findNodeAtString('main');
     // check
     Location location = newLocation_fromNode(node);
-    expect(location.file, convertPath('/test.dart'));
+    expect(location.file, convertPath('/project/test.dart'));
     expect(location.offset, node.offset);
     expect(location.length, node.length);
   }
@@ -75,7 +75,7 @@
     SourceRange sourceRange = new SourceRange(10, 20);
     // check
     Location location = newLocation_fromUnit(testUnit, sourceRange);
-    expect(location.file, convertPath('/test.dart'));
+    expect(location.file, convertPath('/project/test.dart'));
     expect(location.offset, sourceRange.offset);
     expect(location.length, sourceRange.length);
   }
diff --git a/pkg/analysis_server/test/services/refactoring/abstract_rename.dart b/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
index 3d8633c..3bb9141 100644
--- a/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
+++ b/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
@@ -55,7 +55,8 @@
    * Fails if no [RenameRefactoring] can be created.
    */
   void createRenameRefactoringForElement(Element element) {
-    refactoring = new RenameRefactoring(searchEngine, astProvider, element);
+    var workspace = new RefactoringWorkspace([driver], searchEngine);
+    refactoring = new RenameRefactoring(workspace, astProvider, element);
     expect(refactoring, isNotNull, reason: "No refactoring for '$element'.");
   }
 
diff --git a/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart b/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
index 7712c7d..6702055 100644
--- a/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
@@ -87,7 +87,7 @@
   }
 
   test_change_multipleFiles() async {
-    await indexUnit('/other.dart', r'''
+    await indexUnit('/project/other.dart', r'''
 class A {
   int get test => 1;
 }
diff --git a/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart b/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
index e9cb4d8..60f38f8 100644
--- a/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
@@ -89,7 +89,7 @@
   }
 
   test_change_multipleFiles() async {
-    await indexUnit('/other.dart', r'''
+    await indexUnit('/project/other.dart', r'''
 class A {
   int test() => 1;
 }
diff --git a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
index bcdb836..59f1a21 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
@@ -2837,7 +2837,7 @@
   }
 
   void _addLibraryReturningAsync() {
-    addSource('/asyncLib.dart', r'''
+    addSource('/project/asyncLib.dart', r'''
 library asyncLib;
 import 'dart:async';
 Future<int> newFuture() => null;
diff --git a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
index f248500..00006c5 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
@@ -157,7 +157,7 @@
   test() {}
 }
 ''');
-    await indexUnit('/lib.dart', '''
+    await indexUnit('/project/lib.dart', '''
 library my.lib;
 import 'test.dart';
 
@@ -356,7 +356,7 @@
   newName() {} // marker
 }
 ''';
-    await indexUnit('/lib.dart', libCode);
+    await indexUnit('/project/lib.dart', libCode);
     await indexTestUnit('''
 import 'lib.dart';
 class B extends A {
diff --git a/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart b/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
index 1434a05..2f0f4a3 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
@@ -230,8 +230,8 @@
   }
 
   test_newInstance_nullElement() async {
-    RenameRefactoring refactoring =
-        new RenameRefactoring(searchEngine, null, null);
+    var workspace = new RefactoringWorkspace([driver], searchEngine);
+    var refactoring = new RenameRefactoring(workspace, null, null);
     expect(refactoring, isNull);
   }
 
diff --git a/pkg/analysis_server/test/services/refactoring/rename_library_test.dart b/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
index 1acca7d..19d2a4d 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
@@ -40,7 +40,7 @@
   }
 
   test_createChange() async {
-    addSource('/part.dart', '''
+    addSource('/project/part.dart', '''
 part of my.app;
 ''');
     await indexTestUnit('''
@@ -57,13 +57,13 @@
 library the.new.name;
 part 'part.dart';
 ''');
-    assertFileChangeResult('/part.dart', '''
+    assertFileChangeResult('/project/part.dart', '''
 part of the.new.name;
 ''');
   }
 
   test_createChange_hasWhitespaces() async {
-    addSource('/part.dart', '''
+    addSource('/project/part.dart', '''
 part of my .  app;
 ''');
     await indexTestUnit('''
@@ -80,7 +80,7 @@
 library the.new.name;
 part 'part.dart';
 ''');
-    assertFileChangeResult('/part.dart', '''
+    assertFileChangeResult('/project/part.dart', '''
 part of the.new.name;
 ''');
   }
diff --git a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
index 505843c..6b8c273 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
@@ -447,7 +447,7 @@
   A({test});
 }
 ''');
-    await indexUnit('/test2.dart', '''
+    await indexUnit('/project/test2.dart', '''
 import 'test.dart';
 main() {
   new A(test: 2);
@@ -463,7 +463,7 @@
   A({newName});
 }
 ''');
-    assertFileChangeResult('/test2.dart', '''
+    assertFileChangeResult('/project/test2.dart', '''
 import 'test.dart';
 main() {
   new A(newName: 2);
@@ -472,7 +472,7 @@
   }
 
   test_createChange_parameter_named_updateHierarchy() async {
-    await indexUnit('/test2.dart', '''
+    await indexUnit('/project/test2.dart', '''
 library test2;
 class A {
   void foo({int test: 1}) {
@@ -516,7 +516,7 @@
   }
 }
 ''');
-    assertFileChangeResult('/test2.dart', '''
+    assertFileChangeResult('/project/test2.dart', '''
 library test2;
 class A {
   void foo({int newName: 1}) {
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 6285bbd..e5c22bf 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
@@ -69,7 +69,7 @@
     await indexTestUnit('''
 class Test {}
 ''');
-    await indexUnit(convertPath('/lib.dart'), '''
+    await indexUnit(convertPath('/project/lib.dart'), '''
 library my.lib;
 import 'test.dart';
 
@@ -109,7 +109,7 @@
     await indexTestUnit('''
 class Test {}
 ''');
-    await indexUnit(convertPath('/lib.dart'), '''
+    await indexUnit(convertPath('/project/lib.dart'), '''
 library my.lib;
 import 'test.dart';
 class A {
@@ -214,44 +214,6 @@
     assertRefactoringStatusOK(status);
   }
 
-  test_checkInitialConditions_inPubCache_posix() async {
-    addSource('/.pub-cache/lib.dart', r'''
-class A {}
-''');
-    await indexTestUnit('''
-import "${convertPathForImport('/.pub-cache/lib.dart')}";
-main() {
-  A a;
-}
-''');
-    createRenameRefactoringAtString('A a');
-    // check status
-    refactoring.newName = 'NewName';
-    RefactoringStatus status = await refactoring.checkInitialConditions();
-    assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL,
-        expectedMessage:
-            "The class 'A' is defined in a pub package, so cannot be renamed.");
-  }
-
-  test_checkInitialConditions_inPubCache_windows() async {
-    addSource('/Pub/Cache/lib.dart', r'''
-class A {}
-''');
-    await indexTestUnit('''
-import "${convertPathForImport('/Pub/Cache/lib.dart')}";
-main() {
-  A a;
-}
-''');
-    createRenameRefactoringAtString('A a');
-    // check status
-    refactoring.newName = 'NewName';
-    RefactoringStatus status = await refactoring.checkInitialConditions();
-    assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL,
-        expectedMessage:
-            "The class 'A' is defined in a pub package, so cannot be renamed.");
-  }
-
   test_checkInitialConditions_inSDK() async {
     await indexTestUnit('''
 main() {
@@ -267,6 +229,25 @@
             "The class 'String' is defined in the SDK, so cannot be renamed.");
   }
 
+  test_checkInitialConditions_outsideOfProject() async {
+    addSource('/other/lib.dart', r'''
+class A {}
+''');
+    await indexTestUnit('''
+import "${convertPathForImport('/other/lib.dart')}";
+main() {
+  A a;
+}
+''');
+    createRenameRefactoringAtString('A a');
+    // check status
+    refactoring.newName = 'NewName';
+    RefactoringStatus status = await refactoring.checkInitialConditions();
+    assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL,
+        expectedMessage:
+            "The class 'A' is defined outside of the project, so cannot be renamed.");
+  }
+
   test_checkNewName_ClassElement() async {
     await indexTestUnit('''
 class Test {}
@@ -483,7 +464,7 @@
   }
 
   test_createChange_FunctionElement_imported() async {
-    await indexUnit('/foo.dart', r'''
+    await indexUnit('/project/foo.dart', r'''
 test() {}
 foo() {}
 ''');
@@ -510,7 +491,7 @@
   foo();
 }
 ''');
-    assertFileChangeResult('/foo.dart', '''
+    assertFileChangeResult('/project/foo.dart', '''
 newName() {}
 foo() {}
 ''');
diff --git a/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart b/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
index ef5fb8f..5fd654d 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
@@ -33,6 +33,10 @@
   });
 }
 
+ContextRoot _newContextRoot(String root, {List<String> exclude: const []}) {
+  return new ContextRoot(path.context, root, exclude);
+}
+
 @reflectiveTest
 class BuiltInPluginInfoTest {
   TestNotificationManager notificationManager;
@@ -45,7 +49,7 @@
   }
 
   test_addContextRoot() {
-    ContextRoot contextRoot1 = new ContextRoot('/pkg1', []);
+    ContextRoot contextRoot1 = _newContextRoot('/pkg1');
     plugin.addContextRoot(contextRoot1);
     expect(plugin.contextRoots, [contextRoot1]);
     plugin.addContextRoot(contextRoot1);
@@ -60,8 +64,8 @@
   }
 
   test_removeContextRoot() {
-    ContextRoot contextRoot1 = new ContextRoot('/pkg1', []);
-    ContextRoot contextRoot2 = new ContextRoot('/pkg2', []);
+    ContextRoot contextRoot1 = _newContextRoot('/pkg1');
+    ContextRoot contextRoot2 = _newContextRoot('/pkg2');
     plugin.addContextRoot(contextRoot1);
     expect(plugin.contextRoots, unorderedEquals([contextRoot1]));
     plugin.addContextRoot(contextRoot2);
@@ -119,7 +123,7 @@
 
   test_addContextRoot() {
     String optionsFilePath = '/pkg1/analysis_options.yaml';
-    ContextRoot contextRoot1 = new ContextRoot('/pkg1', []);
+    ContextRoot contextRoot1 = _newContextRoot('/pkg1');
     contextRoot1.optionsFilePath = optionsFilePath;
     PluginSession session = new PluginSession(plugin);
     TestServerCommunicationChannel channel =
@@ -144,8 +148,8 @@
   }
 
   test_removeContextRoot() {
-    ContextRoot contextRoot1 = new ContextRoot('/pkg1', []);
-    ContextRoot contextRoot2 = new ContextRoot('/pkg2', []);
+    ContextRoot contextRoot1 = _newContextRoot('/pkg1');
+    ContextRoot contextRoot2 = _newContextRoot('/pkg2');
     plugin.addContextRoot(contextRoot1);
     expect(plugin.contextRoots, unorderedEquals([contextRoot1]));
     plugin.addContextRoot(contextRoot2);
@@ -202,7 +206,7 @@
     io.Directory pkg1Dir = io.Directory.systemTemp.createTempSync('pkg1');
     String pkgPath = pkg1Dir.resolveSymbolicLinksSync();
     await withPlugin(test: (String pluginPath) async {
-      ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+      ContextRoot contextRoot = _newContextRoot(pkgPath);
       await manager.addPluginToContextRoot(contextRoot, pluginPath);
       await manager.stopAll();
     });
@@ -217,7 +221,7 @@
 //    io.Directory pkg1Dir = io.Directory.systemTemp.createTempSync('pkg1');
 //    String pkgPath = pkg1Dir.resolveSymbolicLinksSync();
 //    await withPubspecPlugin(test: (String pluginPath) async {
-//      ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+//      ContextRoot contextRoot = _newContextRoot(pkgPath);
 //      await manager.addPluginToContextRoot(contextRoot, pluginPath);
 //      String packagesPath =
 //          resourceProvider.pathContext.join(pluginPath, '.packages');
@@ -238,7 +242,7 @@
           await withPlugin(
               pluginName: 'plugin2',
               test: (String plugin2Path) async {
-                ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+                ContextRoot contextRoot = _newContextRoot(pkgPath);
                 await manager.addPluginToContextRoot(contextRoot, plugin1Path);
                 await manager.addPluginToContextRoot(contextRoot, plugin2Path);
 
@@ -264,7 +268,7 @@
           await withPlugin(
               pluginName: 'plugin2',
               test: (String plugin2Path) async {
-                ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+                ContextRoot contextRoot = _newContextRoot(pkgPath);
                 await manager.addPluginToContextRoot(contextRoot, plugin1Path);
                 await manager.addPluginToContextRoot(contextRoot, plugin2Path);
 
@@ -285,7 +289,7 @@
     await withPlugin(
         pluginName: 'plugin1',
         test: (String plugin1Path) async {
-          ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+          ContextRoot contextRoot = _newContextRoot(pkgPath);
           await manager.addPluginToContextRoot(contextRoot, plugin1Path);
           List<PluginInfo> plugins = manager.pluginsForContextRoot(contextRoot);
           expect(plugins, hasLength(1));
@@ -311,7 +315,7 @@
           await withPlugin(
               pluginName: 'plugin2',
               test: (String plugin2Path) async {
-                ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+                ContextRoot contextRoot = _newContextRoot(pkgPath);
                 await manager.addPluginToContextRoot(contextRoot, plugin1Path);
                 await manager.addPluginToContextRoot(contextRoot, plugin2Path);
 
@@ -333,7 +337,7 @@
     io.Directory pkg1Dir = io.Directory.systemTemp.createTempSync('pkg1');
     String pkgPath = pkg1Dir.resolveSymbolicLinksSync();
     await withPlugin(test: (String pluginPath) async {
-      ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+      ContextRoot contextRoot = _newContextRoot(pkgPath);
       await manager.addPluginToContextRoot(contextRoot, pluginPath);
 
       List<PluginInfo> plugins = manager.pluginsForContextRoot(contextRoot);
@@ -349,7 +353,7 @@
     io.Directory pkg1Dir = io.Directory.systemTemp.createTempSync('pkg1');
     String pkgPath = pkg1Dir.resolveSymbolicLinksSync();
     await withPlugin(test: (String pluginPath) async {
-      ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+      ContextRoot contextRoot = _newContextRoot(pkgPath);
       await manager.addPluginToContextRoot(contextRoot, pluginPath);
 
       manager.removedContextRoot(contextRoot);
@@ -370,8 +374,8 @@
           await withPlugin(
               pluginName: 'plugin2',
               test: (String plugin2Path) async {
-                ContextRoot contextRoot1 = new ContextRoot(pkg1Path, []);
-                ContextRoot contextRoot2 = new ContextRoot(pkg2Path, []);
+                ContextRoot contextRoot1 = _newContextRoot(pkg1Path);
+                ContextRoot contextRoot2 = _newContextRoot(pkg2Path);
                 await manager.addPluginToContextRoot(contextRoot1, plugin1Path);
                 await manager.addPluginToContextRoot(contextRoot1, plugin2Path);
                 await manager.addPluginToContextRoot(contextRoot2, plugin1Path);
@@ -415,7 +419,7 @@
   }
 
   void test_broadcastRequest_none() {
-    ContextRoot contextRoot = new ContextRoot('/pkg1', []);
+    ContextRoot contextRoot = _newContextRoot('/pkg1');
     Map<PluginInfo, Future<Response>> responses = manager.broadcastRequest(
         new CompletionGetSuggestionsParams('/pkg1/lib/pkg1.dart', 100),
         contextRoot: contextRoot);
@@ -498,7 +502,7 @@
   }
 
   void test_pluginsForContextRoot_none() {
-    ContextRoot contextRoot = new ContextRoot('/pkg1', []);
+    ContextRoot contextRoot = _newContextRoot('/pkg1');
     expect(manager.pluginsForContextRoot(contextRoot), isEmpty);
   }
 
diff --git a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
index 8c372a6..0951011 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
@@ -50,7 +50,8 @@
     newFile(
         '/pkg2/${PluginLocator.toolsFolderName}/${PluginLocator.defaultPluginFolderName}/bin/plugin.dart');
 
-    ContextRoot contextRoot = new ContextRoot(pkg1Path, []);
+    ContextRoot contextRoot =
+        new ContextRoot(resourceProvider.pathContext, pkg1Path, []);
     TestDriver driver = new TestDriver(resourceProvider, contextRoot);
     driver.analysisOptions.enabledPluginNames = ['pkg2'];
     watcher.addedDriver(driver, contextRoot);
@@ -79,7 +80,8 @@
     String pkg1Path = newFolder('/pkg1').path;
     newFile('/pkg1/lib/test1.dart');
 
-    ContextRoot contextRoot = new ContextRoot(pkg1Path, []);
+    ContextRoot contextRoot =
+        new ContextRoot(resourceProvider.pathContext, pkg1Path, []);
     TestDriver driver = new TestDriver(resourceProvider, contextRoot);
     driver.analysisOptions.enabledPluginNames = ['pkg3'];
     watcher.addedDriver(driver, contextRoot);
@@ -100,7 +102,8 @@
 
   test_removedDriver() {
     String pkg1Path = newFolder('/pkg1').path;
-    ContextRoot contextRoot = new ContextRoot(pkg1Path, []);
+    ContextRoot contextRoot =
+        new ContextRoot(resourceProvider.pathContext, pkg1Path, []);
     TestDriver driver = new TestDriver(resourceProvider, contextRoot);
     watcher.addedDriver(driver, contextRoot);
     watcher.removedDriver(driver);
diff --git a/pkg/analyzer/lib/src/context/context_root.dart b/pkg/analyzer/lib/src/context/context_root.dart
index a728860..1c32428 100644
--- a/pkg/analyzer/lib/src/context/context_root.dart
+++ b/pkg/analyzer/lib/src/context/context_root.dart
@@ -12,6 +12,11 @@
  */
 class ContextRoot {
   /**
+   * The path context to use when manipulating paths.
+   */
+  final path.Context pathContext;
+
+  /**
    * The absolute path of the root directory containing the files to be
    * analyzed.
    */
@@ -33,7 +38,7 @@
   /**
    * Initialize a newly created context root.
    */
-  ContextRoot(this.root, this.exclude);
+  ContextRoot(this.pathContext, this.root, this.exclude);
 
   @override
   int get hashCode {
@@ -59,11 +64,11 @@
    * directories.
    */
   bool containsFile(String filePath) {
-    if (!path.isWithin(root, filePath)) {
+    if (!pathContext.isWithin(root, filePath)) {
       return false;
     }
     for (String excluded in exclude) {
-      if (filePath == excluded || path.isWithin(excluded, filePath)) {
+      if (filePath == excluded || pathContext.isWithin(excluded, filePath)) {
         return false;
       }
     }
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
index 628d28c..2d54d53 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
@@ -80,7 +80,9 @@
     builder.performanceLog = performanceLog;
 
     old.ContextRoot oldContextRoot = new old.ContextRoot(
-        contextRoot.root.path, contextRoot.excludedPaths.toList());
+        resourceProvider.pathContext,
+        contextRoot.root.path,
+        contextRoot.excludedPaths.toList());
     AnalysisDriver driver = builder.buildDriver(oldContextRoot);
     DriverBasedAnalysisContext context =
         new DriverBasedAnalysisContext(resourceProvider, contextRoot, driver);
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
index e53835f..5d290be 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
@@ -100,8 +100,10 @@
     builder.performanceLog = performanceLog;
     List<AnalysisContext> contextList = <AnalysisContext>[];
     for (ContextRoot root in roots) {
-      old.ContextRoot contextRoot =
-          new old.ContextRoot(root.root.path, root.excludedPaths.toList());
+      old.ContextRoot contextRoot = new old.ContextRoot(
+          resourceProvider.pathContext,
+          root.root.path,
+          root.excludedPaths.toList());
       AnalysisDriver driver = builder.buildDriver(contextRoot);
       DriverBasedAnalysisContext context =
           new DriverBasedAnalysisContext(resourceProvider, root, driver);
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index bf98050..0d4084c 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -95,7 +95,7 @@
   /**
    * The version of data format, should be incremented on every format change.
    */
-  static const int DATA_VERSION = 58;
+  static const int DATA_VERSION = 59;
 
   /**
    * The number of exception contexts allowed to write. Once this field is
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 052b7ba..a706a0d 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -1979,7 +1979,7 @@
       push(prefix);
     } else if (prefix is SimpleIdentifier) {
       // TODO(paulberry): resolve [identifier].  Note that BodyBuilder handles
-      // this situation using SendAccessor.
+      // this situation using SendAccessGenerator.
       push(ast.prefixedIdentifier(prefix, period, identifier));
     } else {
       // TODO(paulberry): implement.
diff --git a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
index 52839a7..1f3035f 100644
--- a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
@@ -6,8 +6,6 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/src/dart/ast/ast_factory.dart';
 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
-import 'package:front_end/src/fasta/kernel/body_builder.dart'
-    show Identifier, Operator;
 import 'package:front_end/src/fasta/kernel/forest.dart';
 import 'package:kernel/ast.dart' as kernel;
 
@@ -60,9 +58,31 @@
   Expression asExpression(Expression expression, type, Token location) =>
       astFactory.asExpression(expression, location, type);
 
+  @override
   Expression asLiteralString(Expression value) => value;
 
   @override
+  ConstructorInitializer assertInitializer(
+          Token assertKeyword,
+          Token leftParenthesis,
+          Expression condition,
+          Token comma,
+          Expression message) =>
+      astFactory.assertInitializer(assertKeyword, leftParenthesis, condition,
+          comma, message, leftParenthesis.endGroup);
+
+  @override
+  Statement assertStatement(
+          Token assertKeyword,
+          Token leftParenthesis,
+          Expression condition,
+          Token comma,
+          Expression message,
+          Token semicolon) =>
+      astFactory.assertStatement(assertKeyword, leftParenthesis, condition,
+          comma, message, leftParenthesis.endGroup, semicolon);
+
+  @override
   Expression awaitExpression(Expression operand, Token awaitKeyword) =>
       astFactory.awaitExpression(awaitKeyword, operand);
 
@@ -71,6 +91,12 @@
       astFactory.block(openBrace, statements, closeBrace);
 
   @override
+  Statement breakStatement(
+          Token breakKeyword, Identifier label, Token semicolon) =>
+      astFactory.breakStatement(
+          breakKeyword, astFactory.simpleIdentifier(label.token), semicolon);
+
+  @override
   kernel.Arguments castArguments(_Arguments arguments) {
     // TODO(brianwilkerson) Implement this or remove it from the API.
     throw new UnimplementedError();
@@ -89,6 +115,12 @@
           condition, question, thenExpression, colon, elseExpression);
 
   @override
+  Statement continueStatement(
+          Token continueKeyword, Identifier label, Token semicolon) =>
+      astFactory.continueStatement(
+          continueKeyword, astFactory.simpleIdentifier(label.token), semicolon);
+
+  @override
   Statement doStatement(Token doKeyword, Statement body, Token whileKeyword,
           ParenthesizedExpression condition, Token semicolon) =>
       astFactory.doStatement(
@@ -104,6 +136,7 @@
   Statement emptyStatement(Token semicolon) =>
       astFactory.emptyStatement(semicolon);
 
+  @override
   Statement expressionStatement(Expression expression, Token semicolon) =>
       astFactory.expressionStatement(expression, semicolon);
 
diff --git a/pkg/analyzer/test/generated/parser_fasta_listener.dart b/pkg/analyzer/test/generated/parser_fasta_listener.dart
index a7b6f00..2d36b5a 100644
--- a/pkg/analyzer/test/generated/parser_fasta_listener.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_listener.dart
@@ -1158,7 +1158,9 @@
 
   @override
   void handleImportPrefix(Token deferredKeyword, Token asKeyword) {
-    expectIn('Import');
+    // This event normally happens within "Import",
+    // but happens within "CompilationUnit" during recovery.
+    expectInOneOf(const ['Import', 'CompilationUnit']);
     listener.handleImportPrefix(deferredKeyword, asKeyword);
   }
 
diff --git a/pkg/analyzer/test/generated/parser_forest_test.dart b/pkg/analyzer/test/generated/parser_forest_test.dart
index 425b0a0..1ec29cc 100644
--- a/pkg/analyzer/test/generated/parser_forest_test.dart
+++ b/pkg/analyzer/test/generated/parser_forest_test.dart
@@ -3181,6 +3181,8 @@
   @failingTest
   void test_parsePrimaryExpression_const() {
     super.test_parsePrimaryExpression_const();
+    fail(
+        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
   }
 
   @failingTest
@@ -4017,6 +4019,11 @@
   }
 
   @failingTest
+  void test_combinator_badIdentifier() {
+    super.test_combinator_badIdentifier();
+  }
+
+  @failingTest
   void test_combinator_missingIdentifier() {
     super.test_combinator_missingIdentifier();
   }
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 611ee186..56f90ba 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -10787,6 +10787,25 @@
             : [ParserErrorCode.EXPECTED_TOKEN]);
   }
 
+  void test_combinator_badIdentifier() {
+    createParser('import "/testB.dart" show @');
+    parser.parseCompilationUnit2();
+    listener.assertErrors(usingFastaParser
+        ? [
+            expectedError(ParserErrorCode.MISSING_IDENTIFIER, 26, 1),
+            expectedError(ParserErrorCode.EXPECTED_TOKEN, 27, 0),
+            expectedError(
+                ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 27, 0),
+            expectedError(ParserErrorCode.EXPECTED_TOKEN, 27, 0)
+          ]
+        : [
+            expectedError(ParserErrorCode.MISSING_IDENTIFIER, 26, 1),
+            expectedError(ParserErrorCode.EXPECTED_TOKEN, 26, 1),
+            expectedError(ParserErrorCode.MISSING_IDENTIFIER, 26, 1),
+            expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 27, 1)
+          ]);
+  }
+
   void test_combinator_missingIdentifier() {
     createParser('import "/testB.dart" show ;');
     parser.parseCompilationUnit2();
@@ -13558,15 +13577,6 @@
     expect(arguments, hasLength(1));
   }
 
-  void test_parseArgumentList_typeArguments_prefixed() {
-    createParser('(a<b,p.c>(d))');
-    ArgumentList argumentList = parser.parseArgumentList();
-    expectNotNullIfNoErrors(argumentList);
-    assertNoErrors();
-    NodeList<Expression> arguments = argumentList.arguments;
-    expect(arguments, hasLength(1));
-  }
-
   void test_parseArgumentList_typeArguments_none() {
     createParser('(a<b,p.q.c>(d))');
     ArgumentList argumentList = parser.parseArgumentList();
@@ -13576,6 +13586,15 @@
     expect(arguments, hasLength(2));
   }
 
+  void test_parseArgumentList_typeArguments_prefixed() {
+    createParser('(a<b,p.c>(d))');
+    ArgumentList argumentList = parser.parseArgumentList();
+    expectNotNullIfNoErrors(argumentList);
+    assertNoErrors();
+    NodeList<Expression> arguments = argumentList.arguments;
+    expect(arguments, hasLength(1));
+  }
+
   void test_parseCombinators_h() {
     createParser('hide a');
     List<Combinator> combinators = parser.parseCombinators();
@@ -14716,7 +14735,10 @@
   }
 
   void test_parseBreakStatement_label() {
-    var statement = parseStatement('break foo;') as BreakStatement;
+    LabeledStatement labeledStatement =
+        parseStatement('foo: while (true) { break foo; }');
+    WhileStatement whileStatement = labeledStatement.statement;
+    BreakStatement statement = (whileStatement.body as Block).statements[0];
     assertNoErrors();
     expect(statement.breakKeyword, isNotNull);
     expect(statement.label, isNotNull);
@@ -14724,24 +14746,30 @@
   }
 
   void test_parseBreakStatement_noLabel() {
-    var statement = parseStatement('break;') as BreakStatement;
-    assertErrorsWithCodes([ParserErrorCode.BREAK_OUTSIDE_OF_LOOP]);
+    WhileStatement whileStatement = parseStatement('while (true) { break; }');
+    BreakStatement statement = (whileStatement.body as Block).statements[0];
+    assertNoErrors();
     expect(statement.breakKeyword, isNotNull);
     expect(statement.label, isNull);
     expect(statement.semicolon, isNotNull);
   }
 
   void test_parseContinueStatement_label() {
-    var statement = parseStatement('continue foo;') as ContinueStatement;
-    assertErrorsWithCodes([ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
+    LabeledStatement labeledStatement =
+        parseStatement('foo: while (true) { continue foo; }');
+    WhileStatement whileStatement = labeledStatement.statement;
+    ContinueStatement statement = (whileStatement.body as Block).statements[0];
+    assertNoErrors();
     expect(statement.continueKeyword, isNotNull);
     expect(statement.label, isNotNull);
     expect(statement.semicolon, isNotNull);
   }
 
   void test_parseContinueStatement_noLabel() {
-    var statement = parseStatement('continue;') as ContinueStatement;
-    assertErrorsWithCodes([ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
+    WhileStatement whileStatement =
+        parseStatement('while (true) { continue; }');
+    ContinueStatement statement = (whileStatement.body as Block).statements[0];
+    assertNoErrors();
     expect(statement.continueKeyword, isNotNull);
     expect(statement.label, isNull);
     expect(statement.semicolon, isNotNull);
diff --git a/pkg/analyzer/test/src/context/builder_test.dart b/pkg/analyzer/test/src/context/builder_test.dart
index 17789d4368..dc970a1 100644
--- a/pkg/analyzer/test/src/context/builder_test.dart
+++ b/pkg/analyzer/test/src/context/builder_test.dart
@@ -891,7 +891,7 @@
     - empty_constructor_bodies
 ''');
 
-    ContextRoot root = new ContextRoot(path, []);
+    ContextRoot root = new ContextRoot(pathContext, path, []);
     builder.getAnalysisOptions(path, contextRoot: root);
     expect(root.optionsFilePath, equals(filePath));
   }
diff --git a/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart b/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart
index ab21c64..99320a1 100644
--- a/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart
+++ b/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart
@@ -21,8 +21,7 @@
 import 'package:front_end/src/fasta/constant_context.dart';
 import 'package:front_end/src/fasta/dill/dill_target.dart';
 import "package:front_end/src/fasta/fasta_codes.dart";
-import 'package:front_end/src/fasta/kernel/body_builder.dart' hide Identifier;
-import 'package:front_end/src/fasta/kernel/forest.dart';
+import 'package:front_end/src/fasta/kernel/forest.dart' hide Identifier;
 import 'package:front_end/src/fasta/kernel/kernel_builder.dart';
 import "package:front_end/src/fasta/kernel/kernel_target.dart";
 import 'package:front_end/src/fasta/modifier.dart' as Modifier;
@@ -514,7 +513,7 @@
         false /* strong mode */,
       ));
 
-      BodyBuilder builder = new AstBodyBuilder(
+      AstBodyBuilder builder = new AstBodyBuilder(
         library,
         procedureBuilder,
         library.scope,
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart
index 1b2fdee..06105e3 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart
@@ -12,47 +12,116 @@
 
 class AnnotationTest extends PartialCodeTest {
   buildAll() {
-    List<TestDescriptor> descriptors = <TestDescriptor>[
-      new TestDescriptor(
-        'ampersand',
-        '@',
-        [ParserErrorCode.MISSING_IDENTIFIER],
-        '@_s_',
-        allFailing: true,
-      ),
-      new TestDescriptor(
-        'leftParen',
-        '@a(',
-        [ParserErrorCode.EXPECTED_TOKEN],
-        '@a()',
-        allFailing: true,
-      ),
-    ];
     buildTests(
       'annotation_topLevel',
-      expectErrors(descriptors, [ParserErrorCode.EXPECTED_EXECUTABLE]),
+      [
+        new TestDescriptor(
+            'ampersand',
+            '@',
+            [
+              ParserErrorCode.MISSING_IDENTIFIER,
+              ParserErrorCode.EXPECTED_EXECUTABLE
+            ],
+            '@_s_',
+            expectedErrorsInValidCode: [ParserErrorCode.EXPECTED_EXECUTABLE]),
+        new TestDescriptor(
+            'leftParen',
+            '@a(',
+            [
+              ScannerErrorCode.EXPECTED_TOKEN,
+              ParserErrorCode.EXPECTED_EXECUTABLE
+            ],
+            '@a()',
+            expectedErrorsInValidCode: [ParserErrorCode.EXPECTED_EXECUTABLE]),
+      ],
       [],
     );
     buildTests(
       'annotation_topLevel',
-      descriptors,
+      [
+        new TestDescriptor(
+            'ampersand', '@', [ParserErrorCode.MISSING_IDENTIFIER], '@_s_',
+            failing: ['typedef', 'functionNonVoid', 'getter', 'setter']),
+        new TestDescriptor(
+            'leftParen', '@a(', [ScannerErrorCode.EXPECTED_TOKEN], '@a()',
+            allFailing: true),
+      ],
       PartialCodeTest.declarationSuffixes,
       includeEof: false,
     );
+
     buildTests(
       'annotation_classMember',
-      descriptors,
-      PartialCodeTest.classMemberSuffixes,
+      [
+        new TestDescriptor(
+            'ampersand',
+            '@',
+            [
+              ParserErrorCode.MISSING_IDENTIFIER,
+              ParserErrorCode.EXPECTED_CLASS_MEMBER
+            ],
+            '@_s_',
+            expectedErrorsInValidCode: [ParserErrorCode.EXPECTED_CLASS_MEMBER]),
+        new TestDescriptor(
+            'leftParen',
+            '@a(',
+            [
+              ScannerErrorCode.EXPECTED_TOKEN,
+              ParserErrorCode.EXPECTED_CLASS_MEMBER
+            ],
+            '@a()',
+            expectedErrorsInValidCode: [ParserErrorCode.EXPECTED_CLASS_MEMBER]),
+      ],
+      [],
       head: 'class C { ',
       tail: ' }',
     );
     buildTests(
+      'annotation_classMember',
+      [
+        new TestDescriptor(
+            'ampersand', '@', [ParserErrorCode.MISSING_IDENTIFIER], '@_s_',
+            failing: ['methodNonVoid', 'getter', 'setter']),
+        new TestDescriptor(
+            'leftParen', '@a(', [ScannerErrorCode.EXPECTED_TOKEN], '@a()',
+            allFailing: true),
+      ],
+      PartialCodeTest.classMemberSuffixes,
+      includeEof: false,
+      head: 'class C { ',
+      tail: ' }',
+    );
+
+    buildTests(
       'annotation_local',
-      expectErrors(descriptors, [
-        ParserErrorCode.EXPECTED_TOKEN,
-        ParserErrorCode.EXPECTED_TYPE_NAME,
-        ParserErrorCode.MISSING_IDENTIFIER,
-      ]),
+      [
+        new TestDescriptor(
+            'ampersand',
+            '@',
+            [
+              ParserErrorCode.MISSING_IDENTIFIER,
+              ParserErrorCode.EXPECTED_TOKEN,
+              ParserErrorCode.MISSING_IDENTIFIER
+            ],
+            '@_s_',
+            expectedErrorsInValidCode: [
+              ParserErrorCode.MISSING_IDENTIFIER,
+              ParserErrorCode.EXPECTED_TOKEN
+            ]),
+        new TestDescriptor(
+            'leftParen',
+            '@a(',
+            [
+              ScannerErrorCode.EXPECTED_TOKEN,
+              ParserErrorCode.EXPECTED_TOKEN,
+              ParserErrorCode.MISSING_IDENTIFIER
+            ],
+            '@a()',
+            expectedErrorsInValidCode: [
+              ParserErrorCode.MISSING_IDENTIFIER,
+              ParserErrorCode.EXPECTED_TOKEN
+            ]),
+      ],
       [],
       head: 'f() { ',
       tail: ' }',
@@ -60,24 +129,71 @@
     // TODO(brianwilkerson) Many of the combinations produced by the following
     // produce "valid" code that is not valid. Even when we recover the
     // annotation, the following statement is not allowed to have an annotation.
+    const localAllowed = const [
+      'localVariable',
+      'localFunctionNonVoid',
+      'localFunctionVoid'
+    ];
+    List<TestSuffix> localAnnotationAllowedSuffixes = PartialCodeTest
+        .statementSuffixes
+        .where((t) => localAllowed.contains(t.name))
+        .toList();
+    List<TestSuffix> localAnnotationNotAllowedSuffixes = PartialCodeTest
+        .statementSuffixes
+        .where((t) => !localAllowed.contains(t.name))
+        .toList();
+
     buildTests(
       'annotation_local',
-      descriptors,
-      PartialCodeTest.statementSuffixes,
-      head: 'f() { ',
+      [
+        new TestDescriptor(
+            'ampersand', '@', [ParserErrorCode.MISSING_IDENTIFIER], '@_s_',
+            failing: ['localFunctionNonVoid']),
+        new TestDescriptor(
+            'leftParen', '@a(', [ParserErrorCode.MISSING_IDENTIFIER], '@a()',
+            allFailing: true),
+      ],
+      localAnnotationAllowedSuffixes,
       includeEof: false,
+      head: 'f() { ',
+      tail: ' }',
+    );
+    buildTests(
+      'annotation_local',
+      [
+        new TestDescriptor(
+            'ampersand',
+            '@',
+            [
+              ParserErrorCode.MISSING_IDENTIFIER,
+              ParserErrorCode.EXPECTED_TOKEN,
+              ParserErrorCode.MISSING_IDENTIFIER
+            ],
+            '@_s_',
+            expectedErrorsInValidCode: [
+              ParserErrorCode.MISSING_IDENTIFIER,
+              ParserErrorCode.EXPECTED_TOKEN
+            ],
+            failing: ['labeled']),
+        new TestDescriptor(
+            'leftParen',
+            '@a(',
+            [
+              ScannerErrorCode.EXPECTED_TOKEN,
+              ParserErrorCode.EXPECTED_TOKEN,
+              ParserErrorCode.MISSING_IDENTIFIER
+            ],
+            '@a()',
+            expectedErrorsInValidCode: [
+              ParserErrorCode.MISSING_IDENTIFIER,
+              ParserErrorCode.EXPECTED_TOKEN
+            ],
+            allFailing: true),
+      ],
+      localAnnotationNotAllowedSuffixes,
+      includeEof: false,
+      head: 'f() { ',
       tail: ' }',
     );
   }
-
-  /**
-   * Return a list of descriptors just like the given [descriptors] except that
-   * they have the given list of [errors] as the errors that are expected to be
-   * in the valid code.
-   */
-  List<TestDescriptor> expectErrors(
-          List<TestDescriptor> descriptors, List<ParserErrorCode> errors) =>
-      descriptors
-          .map((descriptor) => descriptor.withExpectedErrorsInValidCode(errors))
-          .toList();
 }
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 7c73192..fda0f64 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
@@ -12,20 +12,6 @@
 
 class ExportDirectivesTest extends PartialCodeTest {
   buildAll() {
-    List<String> allExceptEof = <String>[
-      'import',
-      'export',
-      'part',
-      'class',
-      'typedef',
-      'functionVoid',
-      'functionNonVoid',
-      'var',
-      'const',
-      'final',
-      'getter',
-      'setter'
-    ];
     buildTests(
         'export_directive',
         [
@@ -51,7 +37,7 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "export 'a.dart' hide _s_;",
-              failing: allExceptEof),
+              failing: ['functionNonVoid', 'getter']),
           new TestDescriptor('hideName', "export 'a.dart' hide A",
               [ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart' hide A;"),
           new TestDescriptor(
@@ -62,7 +48,7 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "export 'a.dart' hide A, _s_;",
-              failing: allExceptEof),
+              failing: ['functionNonVoid', 'getter']),
           new TestDescriptor('hideCommaName', "export 'a.dart' hide A, B",
               [ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart' hide A, B;"),
           new TestDescriptor(
@@ -73,7 +59,7 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "export 'a.dart' hide A show _s_;",
-              failing: allExceptEof),
+              failing: ['functionNonVoid', 'getter']),
           new TestDescriptor(
               'show',
               "export 'a.dart' show",
@@ -82,7 +68,7 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "export 'a.dart' show _s_;",
-              failing: allExceptEof),
+              failing: ['functionNonVoid', 'getter']),
           new TestDescriptor('showName', "export 'a.dart' show A",
               [ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart' show A;"),
           new TestDescriptor(
@@ -93,7 +79,7 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "export 'a.dart' show A, _s_;",
-              failing: allExceptEof),
+              failing: ['functionNonVoid', 'getter']),
           new TestDescriptor('showCommaName', "export 'a.dart' show A, B",
               [ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart' show A, B;"),
           new TestDescriptor(
@@ -104,7 +90,7 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "export 'a.dart' show A hide _s_;",
-              failing: allExceptEof),
+              failing: ['functionNonVoid', 'getter']),
         ],
         PartialCodeTest.prePartSuffixes);
   }
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 dd46a45..4c1c8e1 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
@@ -85,6 +85,15 @@
               ],
               "import 'a.dart' as _s_;",
               failing: ['functionNonVoid', 'getter']),
+          new TestDescriptor(
+              'show',
+              "import 'a.dart' show",
+              [
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.MISSING_IDENTIFIER
+              ],
+              "import 'a.dart' show _s_;",
+              failing: ['functionNonVoid', 'getter']),
         ],
         PartialCodeTest.prePartSuffixes);
   }
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 7432c7f..24b5890 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
@@ -12,17 +12,18 @@
 
 class PartOfDirectivesTest extends PartialCodeTest {
   buildAll() {
-    List<String> allExceptEof = <String>[
-      'class',
+    List<String> identifiers = const [
       'typedef',
-      'functionVoid',
       'functionNonVoid',
-      'var',
-      'const',
-      'final',
       'getter',
       'setter'
     ];
+    List<TestSuffix> identifierSuffixes = PartialCodeTest.declarationSuffixes
+        .where((t) => identifiers.contains(t.name))
+        .toList();
+    List<TestSuffix> nonIdentifierSuffixes = PartialCodeTest.declarationSuffixes
+        .where((t) => !identifiers.contains(t.name))
+        .toList();
     buildTests(
         'part_of_directive',
         [
@@ -30,11 +31,31 @@
               'keyword',
               'part of',
               [
-                ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE,
+                ParserErrorCode.EXPECTED_STRING_LITERAL,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              'part of "";',
+              failing: []),
+        ],
+        nonIdentifierSuffixes);
+    buildTests(
+        'part_of_directive',
+        [
+          new TestDescriptor(
+              'keyword',
+              'part of',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               'part of _s_;',
-              allFailing: true),
+              failing: ['functionNonVoid', 'getter']),
+        ],
+        identifierSuffixes,
+        includeEof: false);
+    buildTests(
+        'part_of_directive',
+        [
           new TestDescriptor('name', 'part of lib',
               [ParserErrorCode.EXPECTED_TOKEN], 'library lib;',
               allFailing: true),
@@ -46,7 +67,7 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               'part of lib._s_;',
-              failing: allExceptEof),
+              failing: ['functionNonVoid', 'getter']),
           new TestDescriptor('nameDotName', 'part of lib.a',
               [ParserErrorCode.EXPECTED_TOKEN], 'part of lib.a;'),
           new TestDescriptor('emptyUri', "part of ''",
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 faaddf6..533c856 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
@@ -260,17 +260,6 @@
    */
   TestDescriptor(this.name, this.invalid, this.errorCodes, this.valid,
       {this.allFailing: false, this.failing, this.expectedErrorsInValidCode});
-
-  /**
-   * Return a new description that is exactly like this descriptor except with
-   * the given [expectedErrorsInValidCode].
-   */
-  TestDescriptor withExpectedErrorsInValidCode(
-          List<ErrorCode> expectedErrorsInValidCode) =>
-      new TestDescriptor(name, invalid, errorCodes, valid,
-          allFailing: allFailing,
-          failing: failing,
-          expectedErrorsInValidCode: expectedErrorsInValidCode);
 }
 
 /**
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 af85dc1..d9da37e 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
@@ -43,7 +43,12 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "try {} on _s_ {}",
-              failing: allExceptEof),
+              failing: [
+                'block',
+                'labeled',
+                'localFunctionNonVoid',
+                'localFunctionVoid'
+              ]),
           new TestDescriptor('on_identifier', 'try {} on A',
               [ParserErrorCode.EXPECTED_TOKEN], "try {} on A {}",
               failing: ['block']),
diff --git a/pkg/build_integration/README.md b/pkg/build_integration/README.md
new file mode 100644
index 0000000..2b97b10
--- /dev/null
+++ b/pkg/build_integration/README.md
@@ -0,0 +1,4 @@
+## Package build\_integration
+
+This package contains libraries for integrating Dart tools with build systems
+like bazel and build\_runner.
diff --git a/pkg/front_end/lib/src/multi_root_file_system.dart b/pkg/build_integration/lib/file_system/multi_root.dart
similarity index 95%
rename from pkg/front_end/lib/src/multi_root_file_system.dart
rename to pkg/build_integration/lib/file_system/multi_root.dart
index a30e75f..1163d39 100644
--- a/pkg/front_end/lib/src/multi_root_file_system.dart
+++ b/pkg/build_integration/lib/file_system/multi_root.dart
@@ -2,9 +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.
 
-/// A file system that implements [CopilerOptions.multiRoots].
-library front_end.src.multi_roots_file_system;
-
 import 'dart:async';
 
 import 'package:front_end/src/api_prototype/file_system.dart';
diff --git a/pkg/build_integration/pubspec.yaml b/pkg/build_integration/pubspec.yaml
new file mode 100644
index 0000000..cb58f97
--- /dev/null
+++ b/pkg/build_integration/pubspec.yaml
@@ -0,0 +1,9 @@
+name: build_integration
+version: 0.0.1
+author: Dart Team <misc@dartlang.org>
+description: >
+  Libraries for integrating Dart tools with build systems like bazel
+  and build_runner.
+homepage: https://github.com/dart-lang/sdk/tree/master/pkg/build_integration
+dependencies:
+  front_end: ^0.1.0
diff --git a/pkg/front_end/test/src/multi_root_file_system_test.dart b/pkg/build_integration/test/file_system/multi_root_test.dart
similarity index 97%
rename from pkg/front_end/test/src/multi_root_file_system_test.dart
rename to pkg/build_integration/test/file_system/multi_root_test.dart
index 9a29993..e86fc3f 100644
--- a/pkg/front_end/test/src/multi_root_file_system_test.dart
+++ b/pkg/build_integration/test/file_system/multi_root_test.dart
@@ -6,8 +6,8 @@
 
 import 'dart:async';
 
+import 'package:build_integration/file_system/multi_root.dart';
 import 'package:front_end/src/api_prototype/memory_file_system.dart';
-import 'package:front_end/src/multi_root_file_system.dart';
 
 import 'package:test/test.dart';
 
diff --git a/pkg/compiler/lib/src/constant_system_dart.dart b/pkg/compiler/lib/src/constant_system_dart.dart
index b7201df..4179a3b 100644
--- a/pkg/compiler/lib/src/constant_system_dart.dart
+++ b/pkg/compiler/lib/src/constant_system_dart.dart
@@ -60,45 +60,45 @@
     if (left.isInt && right.isInt) {
       IntConstantValue leftInt = left;
       IntConstantValue rightInt = right;
-      int resultValue = foldInts(leftInt.intValue, rightInt.intValue);
+      BigInt resultValue = foldInts(leftInt.intValue, rightInt.intValue);
       if (resultValue == null) return null;
       return DART_CONSTANT_SYSTEM.createInt(resultValue);
     }
     return null;
   }
 
-  int foldInts(int left, int right);
+  BigInt foldInts(BigInt left, BigInt right);
 }
 
 class BitOrOperation extends BinaryBitOperation {
   final String name = '|';
   const BitOrOperation();
-  int foldInts(int left, int right) => left | right;
+  BigInt foldInts(BigInt left, BigInt right) => left | right;
   apply(left, right) => left | right;
 }
 
 class BitAndOperation extends BinaryBitOperation {
   final String name = '&';
   const BitAndOperation();
-  int foldInts(int left, int right) => left & right;
+  BigInt foldInts(BigInt left, BigInt right) => left & right;
   apply(left, right) => left & right;
 }
 
 class BitXorOperation extends BinaryBitOperation {
   final String name = '^';
   const BitXorOperation();
-  int foldInts(int left, int right) => left ^ right;
+  BigInt foldInts(BigInt left, BigInt right) => left ^ right;
   apply(left, right) => left ^ right;
 }
 
 class ShiftLeftOperation extends BinaryBitOperation {
   final String name = '<<';
   const ShiftLeftOperation();
-  int foldInts(int left, int right) {
+  BigInt foldInts(BigInt left, BigInt right) {
     // TODO(floitsch): find a better way to guard against excessive shifts to
     // the left.
-    if (right > 100 || right < 0) return null;
-    return left << right;
+    if (right > new BigInt.from(100) || right < BigInt.zero) return null;
+    return left << right.toInt();
   }
 
   apply(left, right) => left << right;
@@ -107,9 +107,9 @@
 class ShiftRightOperation extends BinaryBitOperation {
   final String name = '>>';
   const ShiftRightOperation();
-  int foldInts(int left, int right) {
-    if (right < 0) return null;
-    return left >> right;
+  BigInt foldInts(BigInt left, BigInt right) {
+    if (right < BigInt.zero) return null;
+    return left >> right.toInt();
   }
 
   apply(left, right) => left >> right;
@@ -150,7 +150,7 @@
     if (left.isNum && right.isNum) {
       NumConstantValue leftNum = left;
       NumConstantValue rightNum = right;
-      num foldedValue;
+      var foldedValue;
       if (left.isInt && right.isInt) {
         IntConstantValue leftInt = leftNum;
         IntConstantValue rightInt = rightNum;
@@ -161,7 +161,7 @@
       // A division by 0 means that we might not have a folded value.
       if (foldedValue == null) return null;
       if (left.isInt && right.isInt && !isDivide() || isTruncatingDivide()) {
-        assert(foldedValue is int);
+        assert(foldedValue is BigInt);
         return DART_CONSTANT_SYSTEM.createInt(foldedValue);
       } else {
         return DART_CONSTANT_SYSTEM.createDouble(foldedValue);
@@ -172,13 +172,14 @@
 
   bool isDivide() => false;
   bool isTruncatingDivide() => false;
-  num foldInts(int left, int right) => foldNums(left, right);
-  num foldNums(num left, num right);
+  foldInts(BigInt left, BigInt right);
+  foldNums(num left, num right);
 }
 
 class SubtractOperation extends ArithmeticNumOperation {
   final String name = '-';
   const SubtractOperation();
+  BigInt foldInts(BigInt left, BigInt right) => left - right;
   num foldNums(num left, num right) => left - right;
   apply(left, right) => left - right;
 }
@@ -186,6 +187,7 @@
 class MultiplyOperation extends ArithmeticNumOperation {
   final String name = '*';
   const MultiplyOperation();
+  BigInt foldInts(BigInt left, BigInt right) => left * right;
   num foldNums(num left, num right) => left * right;
   apply(left, right) => left * right;
 }
@@ -193,8 +195,8 @@
 class ModuloOperation extends ArithmeticNumOperation {
   final String name = '%';
   const ModuloOperation();
-  int foldInts(int left, int right) {
-    if (right == 0) return null;
+  BigInt foldInts(BigInt left, BigInt right) {
+    if (right == BigInt.zero) return null;
     return left % right;
   }
 
@@ -205,6 +207,7 @@
 class RemainderOperation extends ArithmeticNumOperation {
   final String name = 'remainder';
   const RemainderOperation();
+  BigInt foldInts(BigInt left, BigInt right) => null;
   // Not a defined constant operation.
   num foldNums(num left, num right) => null;
   apply(left, right) => left.remainder(right);
@@ -213,15 +216,15 @@
 class TruncatingDivideOperation extends ArithmeticNumOperation {
   final String name = '~/';
   const TruncatingDivideOperation();
-  int foldInts(int left, int right) {
-    if (right == 0) return null;
+  BigInt foldInts(BigInt left, BigInt right) {
+    if (right == BigInt.zero) return null;
     return left ~/ right;
   }
 
-  num foldNums(num left, num right) {
+  BigInt foldNums(num left, num right) {
     num ratio = left / right;
     if (ratio.isNaN || ratio.isInfinite) return null;
-    return ratio.truncate().toInt();
+    return new BigInt.from(ratio.truncate().toInt());
   }
 
   apply(left, right) => left ~/ right;
@@ -231,6 +234,7 @@
 class DivideOperation extends ArithmeticNumOperation {
   final String name = '/';
   const DivideOperation();
+  double foldInts(BigInt left, BigInt right) => left / right;
   num foldNums(num left, num right) => left / right;
   bool isDivide() => true;
   apply(left, right) => left / right;
@@ -243,7 +247,7 @@
     if (left.isInt && right.isInt) {
       IntConstantValue leftInt = left;
       IntConstantValue rightInt = right;
-      int result = leftInt.intValue + rightInt.intValue;
+      BigInt result = leftInt.intValue + rightInt.intValue;
       return DART_CONSTANT_SYSTEM.createInt(result);
     } else if (left.isNum && right.isNum) {
       NumConstantValue leftNum = left;
@@ -281,14 +285,14 @@
     return DART_CONSTANT_SYSTEM.createBool(foldedValue);
   }
 
-  bool foldInts(int left, int right);
+  bool foldInts(BigInt left, BigInt right);
   bool foldNums(num left, num right);
 }
 
 class LessOperation extends RelationalNumOperation {
   final String name = '<';
   const LessOperation();
-  bool foldInts(int left, int right) => left < right;
+  bool foldInts(BigInt left, BigInt right) => left < right;
   bool foldNums(num left, num right) => left < right;
   apply(left, right) => left < right;
 }
@@ -296,7 +300,7 @@
 class LessEqualOperation extends RelationalNumOperation {
   final String name = '<=';
   const LessEqualOperation();
-  bool foldInts(int left, int right) => left <= right;
+  bool foldInts(BigInt left, BigInt right) => left <= right;
   bool foldNums(num left, num right) => left <= right;
   apply(left, right) => left <= right;
 }
@@ -304,7 +308,7 @@
 class GreaterOperation extends RelationalNumOperation {
   final String name = '>';
   const GreaterOperation();
-  bool foldInts(int left, int right) => left > right;
+  bool foldInts(BigInt left, BigInt right) => left > right;
   bool foldNums(num left, num right) => left > right;
   apply(left, right) => left > right;
 }
@@ -312,7 +316,7 @@
 class GreaterEqualOperation extends RelationalNumOperation {
   final String name = '>=';
   const GreaterEqualOperation();
-  bool foldInts(int left, int right) => left >= right;
+  bool foldInts(BigInt left, BigInt right) => left >= right;
   bool foldNums(num left, num right) => left >= right;
   apply(left, right) => left >= right;
 }
@@ -387,10 +391,10 @@
       StringConstantValue stringConstant = left;
       IntConstantValue indexConstant = right;
       String string = stringConstant.stringValue;
-      int index = indexConstant.intValue;
+      int index = indexConstant.intValue.toInt();
       if (index < 0 || index >= string.length) return null;
       int value = string.codeUnitAt(index);
-      return DART_CONSTANT_SYSTEM.createInt(value);
+      return DART_CONSTANT_SYSTEM.createIntFromInt(value);
     }
     return null;
   }
@@ -442,7 +446,7 @@
   const DartConstantSystem();
 
   @override
-  IntConstantValue createInt(int i) => new IntConstantValue(i);
+  IntConstantValue createInt(BigInt i) => new IntConstantValue(i);
 
   @override
   DoubleConstantValue createDouble(double d) => new DoubleConstantValue(d);
diff --git a/pkg/compiler/lib/src/constants/constant_system.dart b/pkg/compiler/lib/src/constants/constant_system.dart
index 2a3d5ee..c543720 100644
--- a/pkg/compiler/lib/src/constants/constant_system.dart
+++ b/pkg/compiler/lib/src/constants/constant_system.dart
@@ -59,7 +59,8 @@
 
   const ConstantSystem();
 
-  ConstantValue createInt(int i);
+  ConstantValue createInt(BigInt i);
+  ConstantValue createIntFromInt(int i) => createInt(new BigInt.from(i));
   ConstantValue createDouble(double d);
   ConstantValue createString(String string);
   ConstantValue createBool(bool value);
diff --git a/pkg/compiler/lib/src/constants/expressions.dart b/pkg/compiler/lib/src/constants/expressions.dart
index b590b23..7916753 100644
--- a/pkg/compiler/lib/src/constants/expressions.dart
+++ b/pkg/compiler/lib/src/constants/expressions.dart
@@ -235,7 +235,7 @@
 
 /// Integer literal constant.
 class IntConstantExpression extends ConstantExpression {
-  final int intValue;
+  final BigInt intValue;
 
   IntConstantExpression(this.intValue);
 
@@ -1533,7 +1533,8 @@
       return new NonConstantValue();
     } else {
       StringConstantValue stringValue = value;
-      return constantSystem.createInt(stringValue.stringValue.length);
+      return constantSystem
+          .createInt(new BigInt.from(stringValue.stringValue.length));
     }
   }
 
@@ -1907,9 +1908,9 @@
       StringConstantValue nameStringConstantValue = nameConstantValue;
       String text =
           environment.readFromEnvironment(nameStringConstantValue.stringValue);
-      int value;
+      BigInt value;
       if (text != null) {
-        value = int.parse(text, onError: (_) => null);
+        value = BigInt.tryParse(text);
       }
       if (value == null) {
         return defaultConstantValue;
diff --git a/pkg/compiler/lib/src/constants/values.dart b/pkg/compiler/lib/src/constants/values.dart
index abf5d5a..48f4397 100644
--- a/pkg/compiler/lib/src/constants/values.dart
+++ b/pkg/compiler/lib/src/constants/values.dart
@@ -205,55 +205,38 @@
 }
 
 class IntConstantValue extends NumConstantValue {
-  final int intValue;
+  final BigInt intValue;
+
+  // Caching IntConstantValues representing -2 through 10 so that we don't have
+  // to create new ones every time those values are used.
+  static Map<BigInt, IntConstantValue> _cachedValues = {};
+
   double get doubleValue => intValue.toDouble();
 
-  factory IntConstantValue(int value) {
-    switch (value) {
-      case 0:
-        return const IntConstantValue._internal(0);
-      case 1:
-        return const IntConstantValue._internal(1);
-      case 2:
-        return const IntConstantValue._internal(2);
-      case 3:
-        return const IntConstantValue._internal(3);
-      case 4:
-        return const IntConstantValue._internal(4);
-      case 5:
-        return const IntConstantValue._internal(5);
-      case 6:
-        return const IntConstantValue._internal(6);
-      case 7:
-        return const IntConstantValue._internal(7);
-      case 8:
-        return const IntConstantValue._internal(8);
-      case 9:
-        return const IntConstantValue._internal(9);
-      case 10:
-        return const IntConstantValue._internal(10);
-      case -1:
-        return const IntConstantValue._internal(-1);
-      case -2:
-        return const IntConstantValue._internal(-2);
-      default:
-        return new IntConstantValue._internal(value);
+  factory IntConstantValue(BigInt value) {
+    var existing = _cachedValues[value];
+    if (existing != null) return existing;
+    var intConstantVal = new IntConstantValue._internal(value);
+    var intValue = value.toInt();
+    if (intValue <= -2 && intValue >= 10) {
+      _cachedValues[value] = intConstantVal;
     }
+    return intConstantVal;
   }
 
   const IntConstantValue._internal(this.intValue);
 
   bool get isInt => true;
 
-  bool isUInt31() => intValue >= 0 && intValue < (1 << 31);
+  bool isUInt31() => intValue.toUnsigned(31) == intValue;
 
-  bool isUInt32() => intValue >= 0 && intValue < (1 << 32);
+  bool isUInt32() => intValue.toUnsigned(32) == intValue;
 
-  bool isPositive() => intValue >= 0;
+  bool isPositive() => intValue >= BigInt.zero;
 
-  bool get isZero => intValue == 0;
+  bool get isZero => intValue == BigInt.zero;
 
-  bool get isOne => intValue == 1;
+  bool get isOne => intValue == BigInt.one;
 
   DartType getType(CommonElements types) => types.intType;
 
@@ -264,7 +247,7 @@
     return intValue == otherInt.intValue;
   }
 
-  int get hashCode => intValue & Hashing.SMI_MASK;
+  int get hashCode => intValue.hashCode & Hashing.SMI_MASK;
 
   accept(ConstantValueVisitor visitor, arg) => visitor.visitInt(this, arg);
 
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index 2998bbf..c995cfb 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -615,8 +615,8 @@
     ConstantSystem constantSystem = _closedWorld.constantSystem;
     // The JavaScript backend may turn this literal into a double at
     // runtime.
-    return _types.getConcreteTypeFor(
-        computeTypeMask(_closedWorld, constantSystem.createInt(node.value)));
+    return _types.getConcreteTypeFor(computeTypeMask(
+        _closedWorld, constantSystem.createIntFromInt(node.value)));
   }
 
   @override
@@ -1012,7 +1012,7 @@
         ConstantValue value = _elementMap.getFieldConstantValue(member);
         if (value != null && value.isInt) {
           IntConstantValue intValue = value;
-          return intValue.intValue;
+          return intValue.intValue.toInt();
         }
       }
     }
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 7188cf6..f1c234f 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -964,6 +964,7 @@
       CodegenRegistry registry,
       FunctionEntity element,
       jsAst.Expression code,
+      DartType asyncTypeParameter,
       SourceInformation bodySourceInformation,
       SourceInformation exitSourceInformation) {
     if (element.asyncMarker == AsyncMarker.SYNC) return code;
@@ -974,8 +975,8 @@
 
     switch (element.asyncMarker) {
       case AsyncMarker.ASYNC:
-        rewriter = _makeAsyncRewriter(
-            commonElements, elementEnvironment, registry, element, code, name);
+        rewriter = _makeAsyncRewriter(commonElements, elementEnvironment,
+            registry, element, code, asyncTypeParameter, name);
         break;
       case AsyncMarker.SYNC_STAR:
         rewriter = new SyncStarRewriter(reporter, element,
@@ -983,8 +984,7 @@
                 emitter.staticFunctionAccess(commonElements.endOfIteration),
             iterableFactory: emitter
                 .staticFunctionAccess(commonElements.syncStarIterableFactory),
-            iterableFactoryTypeArguments:
-                _fetchItemType(element, elementEnvironment),
+            iterableFactoryTypeArguments: _fetchItemType(asyncTypeParameter),
             yieldStarExpression:
                 emitter.staticFunctionAccess(commonElements.yieldStar),
             uncaughtErrorExpression: emitter
@@ -1006,8 +1006,7 @@
             wrapBody: emitter.staticFunctionAccess(commonElements.wrapBody),
             newController: emitter.staticFunctionAccess(
                 commonElements.asyncStarStreamControllerFactory),
-            newControllerTypeArguments:
-                _fetchItemType(element, elementEnvironment),
+            newControllerTypeArguments: _fetchItemType(asyncTypeParameter),
             safeVariableName: namer.safeVariablePrefixForAsyncRewrite,
             yieldExpression:
                 emitter.staticFunctionAccess(commonElements.yieldSingle),
@@ -1024,22 +1023,15 @@
     return rewriter.rewrite(code, bodySourceInformation, exitSourceInformation);
   }
 
-  /// Returns an optional expression that evaluates the type argument to the
-  /// Future/Stream/Iterable.
-  /// Returns an empty list if the type is not needed.
-  /// Returns `null` if the type expression is determined by
-  /// the outside context and should be added as a function parameter.
-  List<jsAst.Expression> _fetchItemType(
-      FunctionEntity element, ElementEnvironment elementEnvironment) {
-    //DartType type =
-    //  elementEnvironment.getFunctionAsyncOrSyncStarElementType(element);
-
-    //if (!type.containsFreeTypeVariables) {
-    //  var ast = rtiEncoder.getTypeRepresentation(emitter.emitter, type, null);
-    //  return <jsAst.Expression>[ast];
-    //}
-
-    return null;
+  /// Returns an optional expression that evaluates [type].  Returns `null` if
+  /// the type expression is determined by the outside context and should be
+  /// added as a function parameter to the rewritten code.
+  // TODO(sra): We could also return an empty list if the generator takes no
+  // type (e.g. due to rtiNeed optimization).
+  List<jsAst.Expression> _fetchItemType(DartType type) {
+    if (type == null) return null;
+    var ast = rtiEncoder.getTypeRepresentation(emitter.emitter, type, null);
+    return <jsAst.Expression>[ast];
   }
 
   AsyncRewriter _makeAsyncRewriter(
@@ -1048,6 +1040,7 @@
       CodegenRegistry registry,
       FunctionEntity element,
       jsAst.Expression code,
+      DartType elementType,
       jsAst.Name name) {
     bool startAsyncSynchronously = compiler.options.startAsyncSynchronously;
 
@@ -1058,8 +1051,7 @@
         ? commonElements.asyncAwaitCompleterFactory
         : commonElements.syncCompleterFactory;
 
-    List<jsAst.Expression> itemTypeExpression =
-        _fetchItemType(element, elementEnvironment);
+    List<jsAst.Expression> itemTypeExpression = _fetchItemType(elementType);
 
     var rewriter = new AsyncRewriter(reporter, element,
         asyncStart: emitter.staticFunctionAccess(startFunction),
diff --git a/pkg/compiler/lib/src/js_backend/constant_emitter.dart b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
index c5915dc..7069820 100644
--- a/pkg/compiler/lib/src/js_backend/constant_emitter.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
@@ -120,7 +120,7 @@
 
   @override
   jsAst.Expression visitInt(IntConstantValue constant, [_]) {
-    int value = constant.intValue;
+    BigInt value = constant.intValue;
     // Since we are in JavaScript we can shorten long integers to their shorter
     // exponential representation, for example: "1e4" is shorter than "10000".
     //
@@ -131,9 +131,9 @@
     String representation = value.toString();
     String alternative = null;
     int cutoff = _options.enableMinification ? 10000 : 1e10.toInt();
-    if (value.abs() >= cutoff) {
-      alternative =
-          _shortenExponentialRepresentation(value.toStringAsExponential());
+    if (value.abs() >= new BigInt.from(cutoff)) {
+      alternative = _shortenExponentialRepresentation(
+          value.toDouble().toStringAsExponential());
     }
     if (alternative != null && alternative.length < representation.length) {
       representation = alternative;
diff --git a/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart b/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
index 26f845e..d454cf3 100644
--- a/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
@@ -43,7 +43,7 @@
 
   JavaScriptConstantCompiler();
 
-  ConstantSystem get constantSystem => JAVA_SCRIPT_CONSTANT_SYSTEM;
+  ConstantSystem get constantSystem => JavaScriptConstantSystem.only;
 
   @override
   void registerLazyStatic(FieldEntity element) {
diff --git a/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart b/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
index a2bd855..cb869ee 100644
--- a/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
@@ -11,18 +11,18 @@
 import '../elements/types.dart';
 import '../elements/entities.dart';
 
-const JAVA_SCRIPT_CONSTANT_SYSTEM = const JavaScriptConstantSystem();
-
 class JavaScriptBitNotOperation extends BitNotOperation {
   const JavaScriptBitNotOperation();
 
   ConstantValue fold(ConstantValue constant) {
-    if (JAVA_SCRIPT_CONSTANT_SYSTEM.isInt(constant)) {
+    if (JavaScriptConstantSystem.only.isInt(constant)) {
       // In JavaScript we don't check for -0 and treat it as if it was zero.
-      if (constant.isMinusZero) constant = DART_CONSTANT_SYSTEM.createInt(0);
+      if (constant.isMinusZero) {
+        constant = DART_CONSTANT_SYSTEM.createInt(BigInt.zero);
+      }
       IntConstantValue intConstant = constant;
       // We convert the result of bit-operations to 32 bit unsigned integers.
-      return JAVA_SCRIPT_CONSTANT_SYSTEM.createInt32(~intConstant.intValue);
+      return JavaScriptConstantSystem.only.createInt32(~intConstant.intValue);
     }
     return null;
   }
@@ -41,12 +41,16 @@
 
   ConstantValue fold(ConstantValue left, ConstantValue right) {
     // In JavaScript we don't check for -0 and treat it as if it was zero.
-    if (left.isMinusZero) left = DART_CONSTANT_SYSTEM.createInt(0);
-    if (right.isMinusZero) right = DART_CONSTANT_SYSTEM.createInt(0);
+    if (left.isMinusZero) {
+      left = DART_CONSTANT_SYSTEM.createInt(BigInt.zero);
+    }
+    if (right.isMinusZero) {
+      right = DART_CONSTANT_SYSTEM.createInt(BigInt.zero);
+    }
     IntConstantValue result = dartBitOperation.fold(left, right);
     if (result != null) {
       // We convert the result of bit-operations to 32 bit unsigned integers.
-      return JAVA_SCRIPT_CONSTANT_SYSTEM.createInt32(result.intValue);
+      return JavaScriptConstantSystem.only.createInt32(result.intValue);
     }
     return result;
   }
@@ -61,9 +65,9 @@
     // Truncate the input value to 32 bits if necessary.
     if (left.isInt) {
       IntConstantValue intConstant = left;
-      int value = intConstant.intValue;
-      int truncatedValue = value & JAVA_SCRIPT_CONSTANT_SYSTEM.BITS32;
-      if (value < 0) {
+      BigInt value = intConstant.intValue;
+      BigInt truncatedValue = value & JavaScriptConstantSystem.only.BITS32;
+      if (value < BigInt.zero) {
         // Sign-extend if the input was negative. The current semantics don't
         // make much sense, since we only look at bit 31.
         // TODO(floitsch): we should treat the input to right shifts as
@@ -74,8 +78,8 @@
         // Example: 0xFFFFFFFF - 0x100000000 => -1.
         // We simply and with the sign-bit and multiply by two. If the sign-bit
         // was set, then the result is 0. Otherwise it will become 2^32.
-        final int SIGN_BIT = 0x80000000;
-        truncatedValue -= 2 * (truncatedValue & SIGN_BIT);
+        final BigInt SIGN_BIT = new BigInt.from(0x80000000);
+        truncatedValue -= BigInt.two * (truncatedValue & SIGN_BIT);
       }
       if (value != truncatedValue) {
         left = DART_CONSTANT_SYSTEM.createInt(truncatedValue);
@@ -95,8 +99,8 @@
   ConstantValue fold(ConstantValue constant) {
     if (constant.isInt) {
       IntConstantValue intConstant = constant;
-      if (intConstant.intValue == 0) {
-        return JAVA_SCRIPT_CONSTANT_SYSTEM.createDouble(-0.0);
+      if (intConstant.intValue == BigInt.zero) {
+        return JavaScriptConstantSystem.only.createDouble(-0.0);
       }
     }
     return dartNegateOperation.fold(constant);
@@ -112,7 +116,7 @@
   ConstantValue fold(ConstantValue left, ConstantValue right) {
     ConstantValue result = _addOperation.fold(left, right);
     if (result != null && result.isNum) {
-      return JAVA_SCRIPT_CONSTANT_SYSTEM.convertToJavaScriptConstant(result);
+      return JavaScriptConstantSystem.only.convertToJavaScriptConstant(result);
     }
     return result;
   }
@@ -125,8 +129,8 @@
 
   const JavaScriptRemainderOperation();
 
-  int foldInts(int left, int right) {
-    if (right == 0) return null;
+  BigInt foldInts(BigInt left, BigInt right) {
+    if (right == BigInt.zero) return null;
     return left.remainder(right);
   }
 
@@ -144,7 +148,7 @@
   ConstantValue fold(ConstantValue left, ConstantValue right) {
     ConstantValue result = dartArithmeticOperation.fold(left, right);
     if (result == null) return result;
-    return JAVA_SCRIPT_CONSTANT_SYSTEM.convertToJavaScriptConstant(result);
+    return JavaScriptConstantSystem.only.convertToJavaScriptConstant(result);
   }
 
   apply(left, right) => dartArithmeticOperation.apply(left, right);
@@ -186,7 +190,7 @@
   ConstantValue fold(ConstantValue constant) {
     // Be careful to round() only values that do not throw on either the host or
     // target platform.
-    ConstantValue tryToRound(num value) {
+    ConstantValue tryToRound(double value) {
       // Due to differences between browsers, only 'round' easy cases. Avoid
       // cases where nudging the value up or down changes the answer.
       // 13 digits is safely within the ~15 digit precision of doubles.
@@ -196,13 +200,13 @@
       double rounded1 = (value * (1.0 + severalULP)).roundToDouble();
       double rounded2 = (value * (1.0 - severalULP)).roundToDouble();
       if (rounded != rounded1 || rounded != rounded2) return null;
-      return JAVA_SCRIPT_CONSTANT_SYSTEM
-          .convertToJavaScriptConstant(new IntConstantValue(value.round()));
+      return JavaScriptConstantSystem.only.convertToJavaScriptConstant(
+          new IntConstantValue(new BigInt.from(value.round())));
     }
 
     if (constant.isInt) {
       IntConstantValue intConstant = constant;
-      int value = intConstant.intValue;
+      double value = intConstant.intValue.toDouble();
       if (value >= -double.maxFinite && value <= double.maxFinite) {
         return tryToRound(value);
       }
@@ -224,7 +228,7 @@
  * compiled to JavaScript.
  */
 class JavaScriptConstantSystem extends ConstantSystem {
-  final int BITS32 = 0xFFFFFFFF;
+  final BITS32 = new BigInt.from(0xFFFFFFFF);
 
   final add = const JavaScriptAddOperation();
   final bitAnd = const JavaScriptBinaryBitOperation(const BitAndOperation());
@@ -260,13 +264,16 @@
   final round = const JavaScriptRoundOperation();
   final abs = const UnfoldedUnaryOperation('abs');
 
-  const JavaScriptConstantSystem();
+  static final JavaScriptConstantSystem only =
+      new JavaScriptConstantSystem._internal();
+
+  JavaScriptConstantSystem._internal();
 
   /**
    * Returns true if [value] will turn into NaN or infinity
    * at runtime.
    */
-  bool integerBecomesNanOrInfinity(int value) {
+  bool integerBecomesNanOrInfinity(BigInt value) {
     double doubleValue = value.toDouble();
     return doubleValue.isNaN || doubleValue.isInfinite;
   }
@@ -274,13 +281,13 @@
   NumConstantValue convertToJavaScriptConstant(NumConstantValue constant) {
     if (constant.isInt) {
       IntConstantValue intConstant = constant;
-      int intValue = intConstant.intValue;
+      BigInt intValue = intConstant.intValue;
       if (integerBecomesNanOrInfinity(intValue)) {
         return new DoubleConstantValue(intValue.toDouble());
       }
       // If the integer loses precision with JavaScript numbers, use
       // the floored version JavaScript will use.
-      int floorValue = intValue.toDouble().floor().toInt();
+      BigInt floorValue = new BigInt.from(intValue.toDouble());
       if (floorValue != intValue) {
         return new IntConstantValue(floorValue);
       }
@@ -290,9 +297,9 @@
       if (!doubleValue.isInfinite &&
           !doubleValue.isNaN &&
           !constant.isMinusZero) {
-        int intValue = doubleValue.truncate();
-        if (intValue == doubleValue) {
-          return new IntConstantValue(intValue);
+        double truncated = doubleValue.truncateToDouble();
+        if (truncated == doubleValue) {
+          return new IntConstantValue(new BigInt.from(truncated));
         }
       }
     }
@@ -300,11 +307,11 @@
   }
 
   @override
-  NumConstantValue createInt(int i) {
+  NumConstantValue createInt(BigInt i) {
     return convertToJavaScriptConstant(new IntConstantValue(i));
   }
 
-  NumConstantValue createInt32(int i) => new IntConstantValue(i & BITS32);
+  NumConstantValue createInt32(BigInt i) => new IntConstantValue(i & BITS32);
   NumConstantValue createDouble(double d) =>
       convertToJavaScriptConstant(new DoubleConstantValue(d));
   StringConstantValue createString(String string) {
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index b732c81..4ce047a 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -1893,7 +1893,7 @@
   @override
   void visitInt(IntConstantValue constant, [_]) {
     // No `addRoot` since IntConstants are always inlined.
-    if (constant.intValue < 0) {
+    if (constant.intValue < BigInt.zero) {
       add('m${-constant.intValue}');
     } else {
       add('${constant.intValue}');
@@ -2088,7 +2088,11 @@
 
   @override
   int visitInt(IntConstantValue constant, [_]) {
-    return _hashInt(constant.intValue);
+    BigInt value = constant.intValue;
+    if (value.toSigned(32) == value) {
+      return value.toUnsigned(32).toInt() & _MASK;
+    }
+    return _hashDouble(value.toDouble());
   }
 
   @override
diff --git a/pkg/compiler/lib/src/js_model/elements.dart b/pkg/compiler/lib/src/js_model/elements.dart
index 43e81b6..c86157d 100644
--- a/pkg/compiler/lib/src/js_model/elements.dart
+++ b/pkg/compiler/lib/src/js_model/elements.dart
@@ -143,8 +143,9 @@
     return new JConstructorBody(constructor);
   }
 
-  JGeneratorBody createGeneratorBody(FunctionEntity function) {
-    return new JGeneratorBody(function);
+  JGeneratorBody createGeneratorBody(
+      FunctionEntity function, DartType elementType) {
+    return new JGeneratorBody(function, elementType);
   }
 
   IndexedFunction createGetter(LibraryEntity library,
@@ -504,9 +505,10 @@
 
 class JGeneratorBody extends JFunction {
   final FunctionEntity function;
+  final DartType elementType;
   final int hashCode;
 
-  JGeneratorBody(this.function)
+  JGeneratorBody(this.function, this.elementType)
       : hashCode = function.hashCode + 1, // Hack stabilize sort order.
         super(function.library, function.enclosingClass, function.memberName,
             function.parameterStructure, function.asyncMarker,
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index c4c47a1..28e67b6 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -346,7 +346,7 @@
         elementEnvironment: _elementEnvironment,
         dartTypes: _elementMap.types,
         commonElements: _commonElements,
-        constantSystem: const JavaScriptConstantSystem(),
+        constantSystem: JavaScriptConstantSystem.only,
         backendUsage: backendUsage,
         noSuchMethodData: noSuchMethodData,
         nativeData: nativeData,
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index a6e104d..fe02b86 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -1881,7 +1881,7 @@
   KernelConstantEnvironment(this._elementMap, this._environment);
 
   @override
-  ConstantSystem get constantSystem => const JavaScriptConstantSystem();
+  ConstantSystem get constantSystem => JavaScriptConstantSystem.only;
 
   ConstantValue _getConstantValue(
       Spannable spannable, ConstantExpression expression,
@@ -2920,12 +2920,13 @@
   }
 
   JGeneratorBody getGeneratorBody(covariant IndexedFunction function) {
-    FunctionData functionData = _members.getData(function);
-    ir.TreeNode node = functionData.definition.node;
-    // TODO(sra): Maybe store this in the FunctionData.
     JGeneratorBody generatorBody = _generatorBodies[function];
     if (generatorBody == null) {
-      generatorBody = createGeneratorBody(function);
+      FunctionData functionData = _members.getData(function);
+      ir.TreeNode node = functionData.definition.node;
+      DartType elementType =
+          _elementEnvironment.getFunctionAsyncOrSyncStarElementType(function);
+      generatorBody = createGeneratorBody(function, elementType);
       _members.register<IndexedFunction, FunctionData>(
           generatorBody,
           new GeneratorBodyFunctionData(
@@ -2942,7 +2943,8 @@
     return generatorBody;
   }
 
-  JGeneratorBody createGeneratorBody(FunctionEntity function);
+  JGeneratorBody createGeneratorBody(
+      FunctionEntity function, DartType elementType);
 }
 
 class KernelClassQueries extends ClassQueries {
diff --git a/pkg/compiler/lib/src/kernel/element_map_mixins.dart b/pkg/compiler/lib/src/kernel/element_map_mixins.dart
index a7f7901..c661c48 100644
--- a/pkg/compiler/lib/src/kernel/element_map_mixins.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_mixins.dart
@@ -295,7 +295,7 @@
         assert(constant.fields.length == 1 || constant.fields.length == 2);
         ConstantValue indexConstant = constant.fields.values.first;
         if (indexConstant is IntConstantValue) {
-          return indexConstant.intValue;
+          return indexConstant.intValue.toInt();
         }
       }
     }
@@ -604,7 +604,7 @@
 
   @override
   ConstantExpression visitIntLiteral(ir.IntLiteral node) {
-    return new IntConstantExpression(node.value);
+    return new IntConstantExpression(new BigInt.from(node.value));
   }
 
   @override
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 26834cf..c8a203c 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -1013,37 +1013,19 @@
         isStatement: true));
   }
 
-  /// Builds a SSA graph for a sync*/async/async* generator.
+  /// Builds a SSA graph for a sync*/async/async* generator.  We generate a
+  /// entry function which tail-calls a body function. The entry contains
+  /// per-invocation checks and the body, which is later transformed, contains
+  /// the re-entrant 'state machine' code.
   void buildGenerator(FunctionEntity function, ir.FunctionNode functionNode) {
-    // TODO(sra): Optimize by generating a merged entry + body when (1) there
-    // are no checks in the entry and (2) the element type is simple.
-    if (true == true) {
-      buildGeneratorEntry(function, functionNode);
-    } else {
-      openFunction(function, functionNode);
-      functionNode.body.accept(this);
-      closeFunction();
-    }
-  }
-
-  /// Builds a SSA graph for a sync*/async/async* generator body.
-  void buildGeneratorEntry(
-      FunctionEntity function, ir.FunctionNode functionNode) {
-    graph.isGeneratorEntry = true;
-
-    // TODO(sra): Omit entry checks.
     openFunction(function, functionNode);
 
-    // Generate type argument for generator class.
-
-    // Tail-call body.
-    JGeneratorBody body = _elementMap.getGeneratorBody(function);
-    backend.outputUnitData.registerColocatedMembers(function, body);
+    // Prepare to tail-call the body.
 
     // Is 'buildAsyncBody' the best location for the entry?
     var sourceInformation = _sourceInformationBuilder.buildAsyncBody();
 
-    // Forward all the parameters.
+    // Forward all the parameters to the body.
     List<HInstruction> inputs = <HInstruction>[];
     if (graph.thisInstruction != null) {
       inputs.add(graph.thisInstruction);
@@ -1061,8 +1043,29 @@
     // Add the type parameter for the generator's element type.
     DartType elementType = _elementMap.elementEnvironment
         .getAsyncOrSyncStarElementType(function.asyncMarker, _returnType);
-    inputs.add(typeBuilder.analyzeTypeArgument(elementType, function));
 
+    if (elementType.containsFreeTypeVariables) {
+      // Type must be computed in the entry function, where the type variables
+      // are in scope, and passed to the body function.
+      inputs.add(typeBuilder.analyzeTypeArgument(elementType, function));
+    } else {
+      // Types with no type variables can be emitted as part of the generator,
+      // avoiding an extra argument.
+      if (_generatedEntryIsEmpty()) {
+        // If the entry function is empty (e.g. no argument checks) and the type
+        // can be generated in body, 'inline' the body by generating it in
+        // place. This works because the subsequent transformation of the code
+        // is 'correct' for the empty entry function code.
+        graph.needsAsyncRewrite = true;
+        graph.asyncElementType = elementType;
+        functionNode.body.accept(this);
+        closeFunction();
+        return;
+      }
+    }
+
+    JGeneratorBody body = _elementMap.getGeneratorBody(function);
+    backend.outputUnitData.registerColocatedMembers(function, body);
     push(new HInvokeGeneratorBody(
         body,
         inputs,
@@ -1078,13 +1081,28 @@
   /// Builds a SSA graph for a sync*/async/async* generator body.
   void buildGeneratorBody(
       JGeneratorBody function, ir.FunctionNode functionNode) {
-    // TODO(sra): Omit entry checks.
     FunctionEntity entry = function.function;
     openFunction(entry, functionNode);
+    graph.needsAsyncRewrite = true;
+    if (!function.elementType.containsFreeTypeVariables) {
+      // We can generate the element type in place
+      graph.asyncElementType = function.elementType;
+    }
     functionNode.body.accept(this);
     closeFunction();
   }
 
+  bool _generatedEntryIsEmpty() {
+    HBasicBlock block = current;
+    // If `block.id` is not 1 then we generated some control flow.
+    if (block.id != 1) return false;
+    for (HInstruction node = block.first; node != null; node = node.next) {
+      if (node is HGoto) continue;
+      return false;
+    }
+    return true;
+  }
+
   void _potentiallyAddFunctionParameterTypeChecks(ir.FunctionNode function) {
     // Put the type checks in the first successor of the entry,
     // because that is where the type guards will also be inserted.
@@ -1107,6 +1125,7 @@
         return;
       }
       HInstruction newParameter = localsHandler.directLocals[local];
+
       newParameter = typeBuilder.potentiallyCheckOrTrustTypeOfParameter(
           newParameter, _getDartTypeIfValid(variable.type));
       localsHandler.directLocals[local] = newParameter;
@@ -1225,20 +1244,20 @@
     }
   }
 
-  void openFunction(MemberEntity member, [ir.FunctionNode function]) {
+  void openFunction(MemberEntity member, [ir.FunctionNode functionNode]) {
     Map<Local, TypeMask> parameterMap = <Local, TypeMask>{};
-    if (function != null) {
+    if (functionNode != null) {
       void handleParameter(ir.VariableDeclaration node) {
         Local local = localsMap.getLocalVariable(node);
         parameterMap[local] =
             _typeInferenceMap.getInferredTypeOfParameter(local);
       }
 
-      function.positionalParameters.forEach(handleParameter);
-      function.namedParameters.toList()
+      functionNode.positionalParameters.forEach(handleParameter);
+      functionNode.namedParameters.toList()
         ..sort(namedOrdering)
         ..forEach(handleParameter);
-      _returnType = _elementMap.getDartType(function.returnType);
+      _returnType = _elementMap.getDartType(functionNode.returnType);
     }
 
     HBasicBlock block = graph.addNewBlock();
@@ -1258,8 +1277,8 @@
     _addClassTypeVariablesIfNeeded(member);
     _addFunctionTypeVariablesIfNeeded(member);
 
-    if (function != null) {
-      _potentiallyAddFunctionParameterTypeChecks(function);
+    if (functionNode != null) {
+      _potentiallyAddFunctionParameterTypeChecks(functionNode);
     }
     _insertTraceCall(member);
     _insertCoverageCall(member);
@@ -2361,7 +2380,9 @@
 
       List<ConstantValue> getConstants(
           ir.SwitchStatement parentSwitch, ir.SwitchCase switchCase) {
-        return <ConstantValue>[constantSystem.createInt(caseIndex[switchCase])];
+        return <ConstantValue>[
+          constantSystem.createIntFromInt(caseIndex[switchCase])
+        ];
       }
 
       void buildSwitchCase(ir.SwitchCase switchCase) {
@@ -4278,7 +4299,7 @@
     add(argumentNamesInstruction);
 
     ConstantValue kindConstant =
-        constantSystem.createInt(selector.invocationMirrorKind);
+        constantSystem.createIntFromInt(selector.invocationMirrorKind);
 
     _pushStaticInvocation(
         _commonElements.createInvocationMirror,
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index 5d70634..1e94b01 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -47,7 +47,7 @@
 
   String get name => 'SSA code generator';
 
-  js.Fun buildJavaScriptFunction(bool isGeneratorEntry, FunctionEntity element,
+  js.Fun buildJavaScriptFunction(bool needsAsyncRewrite, FunctionEntity element,
       List<js.Parameter> parameters, js.Block body) {
     js.Fun finish(js.AsyncModifier asyncModifier) {
       return new js.Fun(parameters, body, asyncModifier: asyncModifier)
@@ -56,15 +56,17 @@
               .buildDeclaration(element));
     }
 
-    if (isGeneratorEntry) return finish(const js.AsyncModifier.sync());
-
-    return finish(element.asyncMarker.isAsync
-        ? (element.asyncMarker.isYielding
-            ? const js.AsyncModifier.asyncStar()
-            : const js.AsyncModifier.async())
-        : (element.asyncMarker.isYielding
-            ? const js.AsyncModifier.syncStar()
-            : const js.AsyncModifier.sync()));
+    if (needsAsyncRewrite) {
+      return finish(element.asyncMarker.isAsync
+          ? (element.asyncMarker.isYielding
+              ? const js.AsyncModifier.asyncStar()
+              : const js.AsyncModifier.async())
+          : (element.asyncMarker.isYielding
+              ? const js.AsyncModifier.syncStar()
+              : const js.AsyncModifier.sync()));
+    } else {
+      return finish(const js.AsyncModifier.sync());
+    }
   }
 
   js.Expression generateCode(
@@ -122,7 +124,7 @@
           work);
       codegen.visitGraph(graph);
       backend.tracer.traceGraph("codegen", graph);
-      return buildJavaScriptFunction(graph.isGeneratorEntry, work.element,
+      return buildJavaScriptFunction(graph.needsAsyncRewrite, work.element,
           codegen.parameters, codegen.body);
     });
   }
@@ -271,7 +273,7 @@
     int constant(HInstruction instruction) {
       if (instruction is HConstant && instruction.isConstantInteger()) {
         IntConstantValue constant = instruction.constant;
-        return constant.intValue;
+        return constant.intValue.toInt();
       }
       return null;
     }
diff --git a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
index ac8576f..e5b0003 100644
--- a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
+++ b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
@@ -660,16 +660,16 @@
     if (!instruction.isConstantInteger()) return false;
     HConstant rightConstant = instruction;
     IntConstantValue intConstant = rightConstant.constant;
-    int count = intConstant.intValue;
-    return count != 0;
+    BigInt count = intConstant.intValue;
+    return count != BigInt.zero;
   }
 
   bool isTwoOrGreater(HInstruction instruction) {
     if (!instruction.isConstantInteger()) return false;
     HConstant rightConstant = instruction;
     IntConstantValue intConstant = rightConstant.constant;
-    int count = intConstant.intValue;
-    return count >= 2;
+    BigInt count = intConstant.intValue;
+    return count >= BigInt.two;
   }
 
   bool hasUint31Result(HInstruction instruction, ClosedWorld closedWorld) {
@@ -750,7 +750,9 @@
     if (instruction.isConstantInteger()) {
       HConstant rightConstant = instruction;
       IntConstantValue intConstant = rightConstant.constant;
-      int value = intConstant.intValue;
+      int value = intConstant.intValue.toInt();
+      assert(intConstant.intValue ==
+          new BigInt.from(intConstant.intValue.toInt()));
       return value >= low && value <= high;
     }
     // TODO(sra): Integrate with the bit-width analysis in codegen.dart.
diff --git a/pkg/compiler/lib/src/ssa/kernel_impact.dart b/pkg/compiler/lib/src/ssa/kernel_impact.dart
index 28185e0..8e731b7 100644
--- a/pkg/compiler/lib/src/ssa/kernel_impact.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart
@@ -235,8 +235,8 @@
 
   @override
   void visitIntLiteral(ir.IntLiteral literal) {
-    impactBuilder
-        .registerConstantLiteral(new IntConstantExpression(literal.value));
+    impactBuilder.registerConstantLiteral(
+        new IntConstantExpression(new BigInt.from(literal.value)));
   }
 
   @override
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index 7d6720a..04c906f 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -16,6 +16,7 @@
 import '../js_backend/js_backend.dart';
 import '../native/native.dart' as native;
 import '../types/abstract_value_domain.dart';
+import '../types/masks.dart' show TypeMask;
 import '../universe/selector.dart' show Selector;
 import '../universe/side_effects.dart' show SideEffects;
 import '../util/util.dart';
@@ -207,9 +208,13 @@
   HBasicBlock exit;
   HThis thisInstruction;
 
-  /// `true` if a sync*/async/async* method is split into an entry and a body
-  /// and this graph is for the entry, which should not be rewritten.
-  bool isGeneratorEntry = false;
+  /// `true` if this graph should be transformed by a sync*/async/async*
+  /// rewrite.
+  bool needsAsyncRewrite = false;
+
+  /// If this function requires an async rewrite, this is the element type of
+  /// the generator.
+  DartType asyncElementType;
 
   /// Receiver parameter, set for methods using interceptor calling convention.
   HParameterValue explicitReceiverParameter;
@@ -291,7 +296,8 @@
   }
 
   HConstant addConstantInt(int i, ClosedWorld closedWorld) {
-    return addConstant(closedWorld.constantSystem.createInt(i), closedWorld);
+    return addConstant(
+        closedWorld.constantSystem.createIntFromInt(i), closedWorld);
   }
 
   HConstant addConstantDouble(double d, ClosedWorld closedWorld) {
@@ -3164,6 +3170,42 @@
         receiverTypeCheckSelector == other.receiverTypeCheckSelector;
   }
 
+  bool isRedundant(ClosedWorld closedWorld) {
+    AbstractValueDomain abstractValueDomain = closedWorld.abstractValueDomain;
+    DartType type = typeExpression;
+    if (type != null) {
+      if (type.isMalformed) {
+        // Malformed types are treated as dynamic statically, but should
+        // throw a type error at runtime.
+        return false;
+      }
+      if (type.isTypeVariable) {
+        return false;
+      }
+      if (type.isFutureOr) {
+        // `null` always passes type conversion.
+        if (checkedInput.isNull(abstractValueDomain)) return true;
+        // TODO(johnniwinther): Optimize FutureOr type conversions.
+        return false;
+      }
+      if (!type.treatAsRaw) {
+        // `null` always passes type conversion.
+        if (checkedInput.isNull(abstractValueDomain)) return true;
+        return false;
+      }
+      if (type.isFunctionType) {
+        // `null` always passes type conversion.
+        if (checkedInput.isNull(abstractValueDomain)) return true;
+        // TODO(johnniwinther): Optimize function type conversions.
+        return false;
+      }
+    }
+    // Type is refined from `dynamic`, so it might become non-redundant.
+    if (abstractValueDomain.containsAll(checkedType)) return false;
+    TypeMask inputType = checkedInput.instructionType;
+    return inputType.isInMask(checkedType, closedWorld);
+  }
+
   String toString() => 'HTypeConversion(type=$typeExpression, kind=$kind, '
       '${hasTypeRepresentation ? 'representation=$typeRepresentation, ' : ''}'
       'checkedInput=$checkedInput)';
@@ -3205,6 +3247,13 @@
     return knownType == other.knownType &&
         instructionType == other.instructionType;
   }
+
+  bool isRedundant(ClosedWorld closedWorld) {
+    AbstractValueDomain abstractValueDomain = closedWorld.abstractValueDomain;
+    if (abstractValueDomain.containsAll(knownType)) return false;
+    TypeMask inputType = checkedInput.instructionType;
+    return inputType.isInMask(knownType, closedWorld);
+  }
 }
 
 class HRangeConversion extends HCheck {
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index f521421..0b25f85 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -925,54 +925,11 @@
   }
 
   HInstruction visitTypeConversion(HTypeConversion node) {
-    DartType type = node.typeExpression;
-    if (type != null) {
-      if (type.isMalformed) {
-        // Malformed types are treated as dynamic statically, but should
-        // throw a type error at runtime.
-        return node;
-      }
-      if (type.isTypeVariable) {
-        return node;
-      }
-      if (type.isFutureOr) {
-        HInstruction input = node.checkedInput;
-        // `null` always passes type conversion.
-        if (input.isNull(_abstractValueDomain)) return input;
-        // TODO(johnniwinther): Optimize FutureOr type conversions.
-        return node;
-      }
-      if (!type.treatAsRaw) {
-        HInstruction input = node.checkedInput;
-        // `null` always passes type conversion.
-        if (input.isNull(_abstractValueDomain)) return input;
-        // TODO(sra): We can statically check [input] if it is a constructor.
-        // TODO(sra): We can statically check [input] if it is load from a field
-        // of the same ground type, or load from a field of a parameterized type
-        // with the same receiver.
-        return node;
-      }
-      if (type.isFunctionType) {
-        HInstruction input = node.checkedInput;
-        // `null` always passes type conversion.
-        if (input.isNull(_abstractValueDomain)) return input;
-        // TODO(johnniwinther): Optimize function type conversions.
-        // TODO(sra): We can statically check [input] if it is a closure getter.
-        return node;
-      }
-    }
-    return removeIfCheckAlwaysSucceeds(node, node.checkedType);
+    return node.isRedundant(_closedWorld) ? node.checkedInput : node;
   }
 
   HInstruction visitTypeKnown(HTypeKnown node) {
-    return removeIfCheckAlwaysSucceeds(node, node.knownType);
-  }
-
-  HInstruction removeIfCheckAlwaysSucceeds(HCheck node, TypeMask checkedType) {
-    if (checkedType.containsAll(_closedWorld)) return node;
-    HInstruction input = node.checkedInput;
-    TypeMask inputType = input.instructionType;
-    return inputType.isInMask(checkedType, _closedWorld) ? input : node;
+    return node.isRedundant(_closedWorld) ? node.checkedInput : node;
   }
 
   FieldEntity findConcreteFieldForDynamicAccess(
@@ -1048,7 +1005,7 @@
       List<ConstantValue> entries = list.entries;
       HConstant indexInstruction = node.index;
       IntConstantValue indexConstant = indexInstruction.constant;
-      int index = indexConstant.intValue;
+      int index = indexConstant.intValue.toInt();
       if (index >= 0 && index < entries.length) {
         return _graph.addConstant(entries[index], _closedWorld);
       }
@@ -2029,20 +1986,20 @@
           switchRange.upper is IntValue) {
         IntValue lowerValue = switchRange.lower;
         IntValue upperValue = switchRange.upper;
-        int lower = lowerValue.value;
-        int upper = upperValue.value;
-        Set<int> liveLabels = new Set<int>();
+        BigInt lower = lowerValue.value;
+        BigInt upper = upperValue.value;
+        Set<BigInt> liveLabels = new Set<BigInt>();
         for (int pos = 1; pos < node.inputs.length; pos++) {
           HConstant input = node.inputs[pos];
           if (!input.isConstantInteger()) continue;
           IntConstantValue constant = input.constant;
-          int label = constant.intValue;
+          BigInt label = constant.intValue;
           if (!liveLabels.contains(label) && label <= upper && label >= lower) {
             markBlockLive(node.block.successors[pos - 1]);
             liveLabels.add(label);
           }
         }
-        if (liveLabels.length != upper - lower + 1) {
+        if (new BigInt.from(liveLabels.length) != upper - lower + BigInt.one) {
           markBlockLive(node.defaultTarget);
         }
         return;
diff --git a/pkg/compiler/lib/src/ssa/ssa.dart b/pkg/compiler/lib/src/ssa/ssa.dart
index def9ec7..f757a85 100644
--- a/pkg/compiler/lib/src/ssa/ssa.dart
+++ b/pkg/compiler/lib/src/ssa/ssa.dart
@@ -7,8 +7,7 @@
 import '../common/codegen.dart' show CodegenWorkItem, CodegenRegistry;
 import '../common/tasks.dart' show CompilerTask, Measurer;
 import '../constants/values.dart';
-import '../elements/entities.dart'
-    show FieldEntity, FunctionEntity, MemberEntity;
+import '../elements/entities.dart' show FieldEntity, MemberEntity;
 import '../io/source_information.dart';
 import '../js/js.dart' as js;
 import '../js_backend/backend.dart' show JavaScriptBackend, FunctionCompiler;
@@ -45,7 +44,7 @@
     optimizer.optimize(work, graph, closedWorld);
     MemberEntity element = work.element;
     js.Expression result = generator.generateCode(work, graph, closedWorld);
-    if (element is FunctionEntity && !graph.isGeneratorEntry) {
+    if (graph.needsAsyncRewrite) {
       SourceInformationBuilder sourceInformationBuilder =
           backend.sourceInformationStrategy.createBuilderForContext(element);
       result = backend.rewriteAsync(
@@ -54,6 +53,7 @@
           work.registry,
           element,
           result,
+          graph.asyncElementType,
           sourceInformationBuilder.buildAsyncBody(),
           sourceInformationBuilder.buildAsyncExit());
     }
diff --git a/pkg/compiler/lib/src/ssa/type_builder.dart b/pkg/compiler/lib/src/ssa/type_builder.dart
index 81268b8..6e4c5bb 100644
--- a/pkg/compiler/lib/src/ssa/type_builder.dart
+++ b/pkg/compiler/lib/src/ssa/type_builder.dart
@@ -72,6 +72,9 @@
     // a similar operation on `registry`; otherwise, this one might not be
     // needed.
     builder.registry?.registerTypeUse(new TypeUse.isCheck(type));
+    if (other is HTypeConversion && other.isRedundant(builder.closedWorld)) {
+      return original;
+    }
     return other;
   }
 
@@ -79,6 +82,9 @@
     if (type == null) return original;
     HInstruction trusted = _trustType(original, type);
     if (trusted == original) return original;
+    if (trusted is HTypeKnown && trusted.isRedundant(builder.closedWorld)) {
+      return original;
+    }
     builder.add(trusted);
     return trusted;
   }
diff --git a/pkg/compiler/lib/src/ssa/value_range_analyzer.dart b/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
index 97b75ff..71f4e24 100644
--- a/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
+++ b/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
@@ -16,11 +16,11 @@
   IntValue intOne;
 
   ValueRangeInfo(this.constantSystem) {
-    intZero = newIntValue(0);
-    intOne = newIntValue(1);
+    intZero = newIntValue(BigInt.zero);
+    intOne = newIntValue(BigInt.one);
   }
 
-  Value newIntValue(int value) {
+  Value newIntValue(BigInt value) {
     return new IntValue(value, this);
   }
 
@@ -128,7 +128,7 @@
  * An [IntValue] contains a constant integer value.
  */
 class IntValue extends Value {
-  final int value;
+  final BigInt value;
 
   const IntValue(this.value, info) : super(info);
 
@@ -187,9 +187,9 @@
   int get hashCode => throw new UnsupportedError('IntValue.hashCode');
 
   String toString() => 'IntValue $value';
-  bool get isNegative => value < 0;
-  bool get isPositive => value >= 0;
-  bool get isZero => value == 0;
+  bool get isNegative => value < BigInt.zero;
+  bool get isPositive => value >= BigInt.zero;
+  bool get isZero => value == BigInt.zero;
 }
 
 /**
@@ -694,11 +694,13 @@
     if (constantNum.isPositiveInfinity || constantNum.isNegativeInfinity) {
       return info.newUnboundRange();
     }
-    if (constantNum.isMinusZero) constantNum = new IntConstantValue(0);
+    if (constantNum.isMinusZero) {
+      constantNum = new IntConstantValue(BigInt.zero);
+    }
 
-    int intValue = constantNum is IntConstantValue
+    BigInt intValue = constantNum is IntConstantValue
         ? constantNum.intValue
-        : constantNum.doubleValue.toInt();
+        : new BigInt.from(constantNum.doubleValue.toInt());
     Value value = info.newIntValue(intValue);
     return info.newNormalizedRange(value, value);
   }
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index b2b01e9..f8a4624 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -7,9 +7,9 @@
 import 'dart:io';
 
 import 'package:args/args.dart';
+import 'package:build_integration/file_system/multi_root.dart';
 import 'package:front_end/src/api_prototype/standard_file_system.dart';
 import 'package:front_end/src/api_unstable/ddc.dart' as fe;
-import 'package:front_end/src/multi_root_file_system.dart';
 import 'package:kernel/kernel.dart';
 import 'package:path/path.dart' as path;
 import 'package:source_maps/source_maps.dart';
diff --git a/pkg/dev_compiler/tool/ddb b/pkg/dev_compiler/tool/ddb
index 493b103..a9faea8 100755
--- a/pkg/dev_compiler/tool/ddb
+++ b/pkg/dev_compiler/tool/ddb
@@ -18,6 +18,10 @@
 import 'package:args/args.dart' show ArgParser;
 import 'package:path/path.dart' as path;
 
+// TODO(vsm): Remove this once we stop ignoring.  It's off here, but
+// configurable for manual testing.
+const ignoreWhitelistedErrors = false;
+
 void main(List<String> args) {
   // Parse flags.
   var parser = new ArgParser()
@@ -139,7 +143,7 @@
         function(sdk, app) {
     'use strict';
     sdk._debugger.registerDevtoolsFormatter();
-    sdk.dart.ignoreWhitelistedErrors(false);
+    sdk.dart.ignoreWhitelistedErrors($ignoreWhitelistedErrors);
     sdk._isolate_helper.startRootIsolate(() => {}, []);
     app.$basename.main();
   });
@@ -162,7 +166,7 @@
     }
     let sdk = require(\"dart_sdk\");
     let main = require(\"./$basename\").$basename.main;
-    sdk.dart.ignoreWhitelistedErrors(false);
+    sdk.dart.ignoreWhitelistedErrors($ignoreWhitelistedErrors);
     try {
       sdk._isolate_helper.startRootIsolate(main, []);
     } catch(e) {
@@ -186,7 +190,7 @@
     import { dart, _isolate_helper } from '$sdkJsPath/dart_sdk.js';
     import { $basename } from '$basename.js';
     let main = $basename.main;
-    dart.ignoreWhitelistedErrors(false);
+    dart.ignoreWhitelistedErrors($ignoreWhitelistedErrors);
     try {
       _isolate_helper.startRootIsolate(() => {}, []);
       main();
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
index a6b3b01..b0b39e3 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
@@ -51,7 +51,7 @@
       null, new Symbol('<Unexpected Null Value>'), null, null, null);
 }
 
-castError(obj, expectedType, [bool typeError = undefined]) {
+castError(obj, expectedType, [@js_helper.notNull bool isImplicit = false]) {
   var actualType = getReifiedType(obj);
   var message = _castErrorMessage(actualType, expectedType);
   if (JS('!', 'dart.__ignoreAllErrors')) {
@@ -59,9 +59,8 @@
     return obj;
   }
   if (JS('!', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
-  var error = JS<bool>('!', '#', typeError)
-      ? new TypeErrorImpl(message)
-      : new CastErrorImpl(message);
+  var error =
+      isImplicit ? new TypeErrorImpl(message) : new CastErrorImpl(message);
   throw error;
 }
 
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 b8b88e2..0723a7b 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
@@ -425,8 +425,7 @@
 
     if (!!$isSubtype(type, $Iterable) && !!$isSubtype(actual, $Iterable) ||
         !!$isSubtype(type, $Future) && !!$isSubtype(actual, $Future) ||
-        !!$isSubtype(type, $Map) && !!$isSubtype(actual, $Map) ||
-        !!$isSubtype(type, $Stream) && !!$isSubtype(actual, $Stream)) {
+        !!$isSubtype(type, $Map) && !!$isSubtype(actual, $Map)) {
       console.warn('Ignoring cast fail from ' + $typeName(actual) +
                    ' to ' + $typeName(type));
       return true;
@@ -444,7 +443,7 @@
 }
 
 @JSExportName('as')
-cast(obj, type, bool isExplicit) {
+cast(obj, type, @js_helper.notNull bool isImplicit) {
   if (obj == null) return obj;
   var actual = getReifiedType(obj);
   var result = isSubtype(actual, type);
@@ -454,13 +453,13 @@
       'dart.__ignoreWhitelistedErrors && #(#, #)',
       result,
       result,
-      isExplicit,
+      isImplicit,
       _ignoreTypeFailure,
       actual,
       type)) {
     return obj;
   }
-  return castError(obj, type, isExplicit);
+  return castError(obj, type, isImplicit);
 }
 
 bool test(bool obj) {
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 fd62cd8..15b4326 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
@@ -23,6 +23,7 @@
         PrivateSymbol,
         ReifyFunctionTypes,
         NoReifyGeneric;
+import 'dart:_js_helper' as js_helper show notNull;
 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 c7a40c5..2d0df1b 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
@@ -427,7 +427,7 @@
         }))()''');
 
   @JSExportName('as')
-  as_T(obj, [bool typeError]) {
+  as_T(obj, [@js_helper.notNull bool isImplicit = false]) {
     if (obj == null) return obj;
     if (JS('bool', 'typeof # == "function"', obj)) {
       var actual = JS('', '#[#]', obj, _runtimeType);
@@ -436,12 +436,14 @@
       if (actual == null) return obj;
       var result = isSubtype(actual, this);
       if (result == true) return obj;
-      if (result == null && JS('bool', 'dart.__ignoreWhitelistedErrors')) {
+      if (result == null &&
+          isImplicit &&
+          JS<bool>('!', 'dart.__ignoreWhitelistedErrors')) {
         _logIgnoredCast(actual, this);
         return obj;
       }
     }
-    return castError(obj, this, typeError);
+    return castError(obj, this, isImplicit);
   }
 
   @JSExportName('_check')
diff --git a/pkg/front_end/lib/src/byte_store/crc32.dart b/pkg/front_end/lib/src/byte_store/crc32.dart
new file mode 100644
index 0000000..457712e
--- /dev/null
+++ b/pkg/front_end/lib/src/byte_store/crc32.dart
@@ -0,0 +1,288 @@
+// 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.
+
+const List<int> _CRC32_TABLE = const [
+  0x00000000,
+  0x77073096,
+  0xEE0E612C,
+  0x990951BA,
+  0x076DC419,
+  0x706AF48F,
+  0xE963A535,
+  0x9E6495A3,
+  0x0EDB8832,
+  0x79DCB8A4,
+  0xE0D5E91E,
+  0x97D2D988,
+  0x09B64C2B,
+  0x7EB17CBD,
+  0xE7B82D07,
+  0x90BF1D91,
+  0x1DB71064,
+  0x6AB020F2,
+  0xF3B97148,
+  0x84BE41DE,
+  0x1ADAD47D,
+  0x6DDDE4EB,
+  0xF4D4B551,
+  0x83D385C7,
+  0x136C9856,
+  0x646BA8C0,
+  0xFD62F97A,
+  0x8A65C9EC,
+  0x14015C4F,
+  0x63066CD9,
+  0xFA0F3D63,
+  0x8D080DF5,
+  0x3B6E20C8,
+  0x4C69105E,
+  0xD56041E4,
+  0xA2677172,
+  0x3C03E4D1,
+  0x4B04D447,
+  0xD20D85FD,
+  0xA50AB56B,
+  0x35B5A8FA,
+  0x42B2986C,
+  0xDBBBC9D6,
+  0xACBCF940,
+  0x32D86CE3,
+  0x45DF5C75,
+  0xDCD60DCF,
+  0xABD13D59,
+  0x26D930AC,
+  0x51DE003A,
+  0xC8D75180,
+  0xBFD06116,
+  0x21B4F4B5,
+  0x56B3C423,
+  0xCFBA9599,
+  0xB8BDA50F,
+  0x2802B89E,
+  0x5F058808,
+  0xC60CD9B2,
+  0xB10BE924,
+  0x2F6F7C87,
+  0x58684C11,
+  0xC1611DAB,
+  0xB6662D3D,
+  0x76DC4190,
+  0x01DB7106,
+  0x98D220BC,
+  0xEFD5102A,
+  0x71B18589,
+  0x06B6B51F,
+  0x9FBFE4A5,
+  0xE8B8D433,
+  0x7807C9A2,
+  0x0F00F934,
+  0x9609A88E,
+  0xE10E9818,
+  0x7F6A0DBB,
+  0x086D3D2D,
+  0x91646C97,
+  0xE6635C01,
+  0x6B6B51F4,
+  0x1C6C6162,
+  0x856530D8,
+  0xF262004E,
+  0x6C0695ED,
+  0x1B01A57B,
+  0x8208F4C1,
+  0xF50FC457,
+  0x65B0D9C6,
+  0x12B7E950,
+  0x8BBEB8EA,
+  0xFCB9887C,
+  0x62DD1DDF,
+  0x15DA2D49,
+  0x8CD37CF3,
+  0xFBD44C65,
+  0x4DB26158,
+  0x3AB551CE,
+  0xA3BC0074,
+  0xD4BB30E2,
+  0x4ADFA541,
+  0x3DD895D7,
+  0xA4D1C46D,
+  0xD3D6F4FB,
+  0x4369E96A,
+  0x346ED9FC,
+  0xAD678846,
+  0xDA60B8D0,
+  0x44042D73,
+  0x33031DE5,
+  0xAA0A4C5F,
+  0xDD0D7CC9,
+  0x5005713C,
+  0x270241AA,
+  0xBE0B1010,
+  0xC90C2086,
+  0x5768B525,
+  0x206F85B3,
+  0xB966D409,
+  0xCE61E49F,
+  0x5EDEF90E,
+  0x29D9C998,
+  0xB0D09822,
+  0xC7D7A8B4,
+  0x59B33D17,
+  0x2EB40D81,
+  0xB7BD5C3B,
+  0xC0BA6CAD,
+  0xEDB88320,
+  0x9ABFB3B6,
+  0x03B6E20C,
+  0x74B1D29A,
+  0xEAD54739,
+  0x9DD277AF,
+  0x04DB2615,
+  0x73DC1683,
+  0xE3630B12,
+  0x94643B84,
+  0x0D6D6A3E,
+  0x7A6A5AA8,
+  0xE40ECF0B,
+  0x9309FF9D,
+  0x0A00AE27,
+  0x7D079EB1,
+  0xF00F9344,
+  0x8708A3D2,
+  0x1E01F268,
+  0x6906C2FE,
+  0xF762575D,
+  0x806567CB,
+  0x196C3671,
+  0x6E6B06E7,
+  0xFED41B76,
+  0x89D32BE0,
+  0x10DA7A5A,
+  0x67DD4ACC,
+  0xF9B9DF6F,
+  0x8EBEEFF9,
+  0x17B7BE43,
+  0x60B08ED5,
+  0xD6D6A3E8,
+  0xA1D1937E,
+  0x38D8C2C4,
+  0x4FDFF252,
+  0xD1BB67F1,
+  0xA6BC5767,
+  0x3FB506DD,
+  0x48B2364B,
+  0xD80D2BDA,
+  0xAF0A1B4C,
+  0x36034AF6,
+  0x41047A60,
+  0xDF60EFC3,
+  0xA867DF55,
+  0x316E8EEF,
+  0x4669BE79,
+  0xCB61B38C,
+  0xBC66831A,
+  0x256FD2A0,
+  0x5268E236,
+  0xCC0C7795,
+  0xBB0B4703,
+  0x220216B9,
+  0x5505262F,
+  0xC5BA3BBE,
+  0xB2BD0B28,
+  0x2BB45A92,
+  0x5CB36A04,
+  0xC2D7FFA7,
+  0xB5D0CF31,
+  0x2CD99E8B,
+  0x5BDEAE1D,
+  0x9B64C2B0,
+  0xEC63F226,
+  0x756AA39C,
+  0x026D930A,
+  0x9C0906A9,
+  0xEB0E363F,
+  0x72076785,
+  0x05005713,
+  0x95BF4A82,
+  0xE2B87A14,
+  0x7BB12BAE,
+  0x0CB61B38,
+  0x92D28E9B,
+  0xE5D5BE0D,
+  0x7CDCEFB7,
+  0x0BDBDF21,
+  0x86D3D2D4,
+  0xF1D4E242,
+  0x68DDB3F8,
+  0x1FDA836E,
+  0x81BE16CD,
+  0xF6B9265B,
+  0x6FB077E1,
+  0x18B74777,
+  0x88085AE6,
+  0xFF0F6A70,
+  0x66063BCA,
+  0x11010B5C,
+  0x8F659EFF,
+  0xF862AE69,
+  0x616BFFD3,
+  0x166CCF45,
+  0xA00AE278,
+  0xD70DD2EE,
+  0x4E048354,
+  0x3903B3C2,
+  0xA7672661,
+  0xD06016F7,
+  0x4969474D,
+  0x3E6E77DB,
+  0xAED16A4A,
+  0xD9D65ADC,
+  0x40DF0B66,
+  0x37D83BF0,
+  0xA9BCAE53,
+  0xDEBB9EC5,
+  0x47B2CF7F,
+  0x30B5FFE9,
+  0xBDBDF21C,
+  0xCABAC28A,
+  0x53B39330,
+  0x24B4A3A6,
+  0xBAD03605,
+  0xCDD70693,
+  0x54DE5729,
+  0x23D967BF,
+  0xB3667A2E,
+  0xC4614AB8,
+  0x5D681B02,
+  0x2A6F2B94,
+  0xB40BBE37,
+  0xC30C8EA1,
+  0x5A05DF1B,
+  0x2D02EF8D
+];
+
+/**
+ * Get the CRC-32 checksum of the given array. You can append bytes to an
+ * already computed crc by specifying the previous [crc] value.
+ */
+int getCrc32(List<int> array, [int crc = 0]) {
+  int len = array.length;
+  crc = crc ^ 0xffffffff;
+  int ip = 0;
+  while (len >= 8) {
+    crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+    crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+    crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+    crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+    crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+    crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+    crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+    crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+    len -= 8;
+  }
+  if (len > 0)
+    do {
+      crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+    } while (--len > 0);
+  return crc ^ 0xffffffff;
+}
diff --git a/pkg/front_end/lib/src/byte_store/file_byte_store.dart b/pkg/front_end/lib/src/byte_store/file_byte_store.dart
index 8ce63de..9a9bc29 100644
--- a/pkg/front_end/lib/src/byte_store/file_byte_store.dart
+++ b/pkg/front_end/lib/src/byte_store/file_byte_store.dart
@@ -5,8 +5,10 @@
 import 'dart:async';
 import 'dart:io';
 import 'dart:isolate';
+import 'dart:typed_data';
 
 import 'package:front_end/src/byte_store/byte_store.dart';
+import 'package:front_end/src/byte_store/crc32.dart';
 import 'package:path/path.dart';
 
 /**
@@ -144,6 +146,7 @@
 class FileByteStore implements ByteStore {
   final String _cachePath;
   final String _tempName;
+  final FileByteStoreValidator _validator = new FileByteStoreValidator();
 
   /**
    * If the same cache path is used from more than one isolate of the same
@@ -155,7 +158,9 @@
   @override
   List<int> get(String key) {
     try {
-      return _getFileForKey(key).readAsBytesSync();
+      File file = _getFileForKey(key);
+      List<int> rawBytes = file.readAsBytesSync();
+      return _validator.getData(rawBytes);
     } catch (_) {
       return null;
     }
@@ -164,6 +169,7 @@
   @override
   void put(String key, List<int> bytes) {
     try {
+      bytes = _validator.wrapData(bytes);
       File tempFile = _getFileForKey(_tempName);
       tempFile.writeAsBytesSync(bytes);
       File file = _getFileForKey(key);
@@ -175,3 +181,75 @@
     return new File(join(_cachePath, key));
   }
 }
+
+/**
+ * Generally speaking, we cannot guarantee that any data written into a
+ * file will stay the same - there is always a chance of a hardware problem,
+ * file system problem, truncated data, etc.
+ *
+ * So, we need to embed some validation into data itself.
+ * This class append the version and the checksum to data.
+ */
+class FileByteStoreValidator {
+  static const List<int> _VERSION = const [0x01, 0x00, 0x00, 0x00];
+
+  /**
+   * If the [rawBytes] have the valid version and checksum, extract and
+   * return the data from it.  Otherwise return `null`.
+   */
+  List<int> getData(List<int> rawBytes) {
+    // There must be at least the version and the checksum in the raw bytes.
+    if (rawBytes.length < 8) {
+      return null;
+    }
+    int len = rawBytes.length - 8;
+
+    // Check the version.
+    if (rawBytes[len + 0] != _VERSION[0] ||
+        rawBytes[len + 1] != _VERSION[1] ||
+        rawBytes[len + 2] != _VERSION[2] ||
+        rawBytes[len + 3] != _VERSION[3]) {
+      return null;
+    }
+
+    // Check the CRC32 of the data.
+    List<int> data = rawBytes.sublist(0, len);
+    int crc = getCrc32(data);
+    if (rawBytes[len + 4] != crc & 0xFF ||
+        rawBytes[len + 5] != (crc >> 8) & 0xFF ||
+        rawBytes[len + 6] != (crc >> 16) & 0xFF ||
+        rawBytes[len + 7] != (crc >> 24) & 0xFF) {
+      return null;
+    }
+
+    // OK, the data is probably valid.
+    return data;
+  }
+
+  /**
+   * Return bytes that include the given [data] plus the current version and
+   * the checksum of the [data].
+   */
+  List<int> wrapData(List<int> data) {
+    int len = data.length;
+    var bytes = new Uint8List(len + 8);
+
+    // Put the data.
+    bytes.setRange(0, len, data);
+
+    // Put the version.
+    bytes[len + 0] = _VERSION[0];
+    bytes[len + 1] = _VERSION[1];
+    bytes[len + 2] = _VERSION[2];
+    bytes[len + 3] = _VERSION[3];
+
+    // Put the CRC32 of the data.
+    int crc = getCrc32(data);
+    bytes[len + 4] = crc & 0xFF;
+    bytes[len + 5] = (crc >> 8) & 0xFF;
+    bytes[len + 6] = (crc >> 16) & 0xFF;
+    bytes[len + 7] = (crc >> 24) & 0xFF;
+
+    return bytes;
+  }
+}
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 e65d55b..e1d7ba7 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -1026,30 +1026,6 @@
     tip: r"""Try removing the 'const' keyword.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-        Message Function(String name)>
-    templateConstructorHasNoSuchNamedParameter =
-    const Template<Message Function(String name)>(
-        messageTemplate:
-            r"""Constructor has no named parameter with the name '#name'.""",
-        withArguments: _withArgumentsConstructorHasNoSuchNamedParameter);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)>
-    codeConstructorHasNoSuchNamedParameter =
-    const Code<Message Function(String name)>(
-        "ConstructorHasNoSuchNamedParameter",
-        templateConstructorHasNoSuchNamedParameter,
-        severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsConstructorHasNoSuchNamedParameter(String name) {
-  return new Message(codeConstructorHasNoSuchNamedParameter,
-      message: """Constructor has no named parameter with the name '$name'.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateConstructorNotFound =
     const Template<Message Function(String name)>(
         messageTemplate: r"""Couldn't find constructor '#name'.""",
@@ -2559,27 +2535,6 @@
         r"""Can't assign to this, so it can't be used in a for-in loop.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-        Message Function(String name)> templateFunctionHasNoSuchNamedParameter =
-    const Template<Message Function(String name)>(
-        messageTemplate:
-            r"""Function has no named parameter with the name '#name'.""",
-        withArguments: _withArgumentsFunctionHasNoSuchNamedParameter);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeFunctionHasNoSuchNamedParameter =
-    const Code<Message Function(String name)>("FunctionHasNoSuchNamedParameter",
-        templateFunctionHasNoSuchNamedParameter,
-        severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsFunctionHasNoSuchNamedParameter(String name) {
-  return new Message(codeFunctionHasNoSuchNamedParameter,
-      message: """Function has no named parameter with the name '$name'.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeFunctionTypeDefaultValue = messageFunctionTypeDefaultValue;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3874,27 +3829,6 @@
     message: r"""An annotation (metadata) can't use type arguments.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-        Message Function(String name)> templateMethodHasNoSuchNamedParameter =
-    const Template<Message Function(String name)>(
-        messageTemplate:
-            r"""Method has no named parameter with the name '#name'.""",
-        withArguments: _withArgumentsMethodHasNoSuchNamedParameter);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeMethodHasNoSuchNamedParameter =
-    const Code<Message Function(String name)>(
-        "MethodHasNoSuchNamedParameter", templateMethodHasNoSuchNamedParameter,
-        severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsMethodHasNoSuchNamedParameter(String name) {
-  return new Message(codeMethodHasNoSuchNamedParameter,
-      message: """Method has no named parameter with the name '$name'.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateMethodNotFound =
     const Template<Message Function(String name)>(
         messageTemplate: r"""Method not found: '#name'.""",
@@ -4265,6 +4199,25 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)> templateNoSuchNamedParameter =
+    const Template<Message Function(String name)>(
+        messageTemplate: r"""No named parameter with the name '#name'.""",
+        withArguments: _withArgumentsNoSuchNamedParameter);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeNoSuchNamedParameter =
+    const Code<Message Function(String name)>(
+        "NoSuchNamedParameter", templateNoSuchNamedParameter,
+        severity: Severity.errorLegacyWarning);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsNoSuchNamedParameter(String name) {
+  return new Message(codeNoSuchNamedParameter,
+      message: """No named parameter with the name '$name'.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeNoUnnamedConstructorInObject =
     messageNoUnnamedConstructorInObject;
 
@@ -5626,24 +5579,23 @@
     Message Function(
         int count,
         int
-            count2)> templateTooFewArgumentsToConstructor = const Template<
+            count2)> templateTooFewArguments = const Template<
         Message Function(int count, int count2)>(
     messageTemplate:
-        r"""Too few positional arguments to constructor: #count required, #count2 given.""",
-    withArguments: _withArgumentsTooFewArgumentsToConstructor);
+        r"""Too few positional arguments: #count required, #count2 given.""",
+    withArguments: _withArgumentsTooFewArguments);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(int count, int count2)>
-    codeTooFewArgumentsToConstructor =
+const Code<Message Function(int count, int count2)> codeTooFewArguments =
     const Code<Message Function(int count, int count2)>(
-        "TooFewArgumentsToConstructor", templateTooFewArgumentsToConstructor,
+        "TooFewArguments", templateTooFewArguments,
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsTooFewArgumentsToConstructor(int count, int count2) {
-  return new Message(codeTooFewArgumentsToConstructor,
+Message _withArgumentsTooFewArguments(int count, int count2) {
+  return new Message(codeTooFewArguments,
       message:
-          """Too few positional arguments to constructor: $count required, $count2 given.""",
+          """Too few positional arguments: $count required, $count2 given.""",
       arguments: {'count': count, 'count2': count2});
 }
 
@@ -5652,128 +5604,23 @@
     Message Function(
         int count,
         int
-            count2)> templateTooFewArgumentsToFunction = const Template<
+            count2)> templateTooManyArguments = const Template<
         Message Function(int count, int count2)>(
     messageTemplate:
-        r"""Too few positional arguments to function: #count required, #count2 given.""",
-    withArguments: _withArgumentsTooFewArgumentsToFunction);
+        r"""Too many positional arguments: #count allowed, #count2 given.""",
+    withArguments: _withArgumentsTooManyArguments);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(int count, int count2)>
-    codeTooFewArgumentsToFunction =
+const Code<Message Function(int count, int count2)> codeTooManyArguments =
     const Code<Message Function(int count, int count2)>(
-        "TooFewArgumentsToFunction", templateTooFewArgumentsToFunction,
+        "TooManyArguments", templateTooManyArguments,
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsTooFewArgumentsToFunction(int count, int count2) {
-  return new Message(codeTooFewArgumentsToFunction,
+Message _withArgumentsTooManyArguments(int count, int count2) {
+  return new Message(codeTooManyArguments,
       message:
-          """Too few positional arguments to function: $count required, $count2 given.""",
-      arguments: {'count': count, 'count2': count2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-    Message Function(
-        int count,
-        int
-            count2)> templateTooFewArgumentsToMethod = const Template<
-        Message Function(int count, int count2)>(
-    messageTemplate:
-        r"""Too few positional arguments to method: #count required, #count2 given.""",
-    withArguments: _withArgumentsTooFewArgumentsToMethod);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(int count, int count2)>
-    codeTooFewArgumentsToMethod =
-    const Code<Message Function(int count, int count2)>(
-        "TooFewArgumentsToMethod", templateTooFewArgumentsToMethod,
-        severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsTooFewArgumentsToMethod(int count, int count2) {
-  return new Message(codeTooFewArgumentsToMethod,
-      message:
-          """Too few positional arguments to method: $count required, $count2 given.""",
-      arguments: {'count': count, 'count2': count2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-    Message Function(
-        int count,
-        int
-            count2)> templateTooManyArgumentsToConstructor = const Template<
-        Message Function(int count, int count2)>(
-    messageTemplate:
-        r"""Too many positional arguments to constructor: #count allowed, #count2 given.""",
-    withArguments: _withArgumentsTooManyArgumentsToConstructor);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(int count, int count2)>
-    codeTooManyArgumentsToConstructor =
-    const Code<Message Function(int count, int count2)>(
-        "TooManyArgumentsToConstructor", templateTooManyArgumentsToConstructor,
-        severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsTooManyArgumentsToConstructor(int count, int count2) {
-  return new Message(codeTooManyArgumentsToConstructor,
-      message:
-          """Too many positional arguments to constructor: $count allowed, $count2 given.""",
-      arguments: {'count': count, 'count2': count2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-    Message Function(
-        int count,
-        int
-            count2)> templateTooManyArgumentsToFunction = const Template<
-        Message Function(int count, int count2)>(
-    messageTemplate:
-        r"""Too many positional arguments to function: #count allowed, #count2 given.""",
-    withArguments: _withArgumentsTooManyArgumentsToFunction);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(int count, int count2)>
-    codeTooManyArgumentsToFunction =
-    const Code<Message Function(int count, int count2)>(
-        "TooManyArgumentsToFunction", templateTooManyArgumentsToFunction,
-        severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsTooManyArgumentsToFunction(int count, int count2) {
-  return new Message(codeTooManyArgumentsToFunction,
-      message:
-          """Too many positional arguments to function: $count allowed, $count2 given.""",
-      arguments: {'count': count, 'count2': count2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-    Message Function(
-        int count,
-        int
-            count2)> templateTooManyArgumentsToMethod = const Template<
-        Message Function(int count, int count2)>(
-    messageTemplate:
-        r"""Too many positional arguments to method: #count allowed, #count2 given.""",
-    withArguments: _withArgumentsTooManyArgumentsToMethod);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(int count, int count2)>
-    codeTooManyArgumentsToMethod =
-    const Code<Message Function(int count, int count2)>(
-        "TooManyArgumentsToMethod", templateTooManyArgumentsToMethod,
-        severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsTooManyArgumentsToMethod(int count, int count2) {
-  return new Message(codeTooManyArgumentsToMethod,
-      message:
-          """Too many positional arguments to method: $count allowed, $count2 given.""",
+          """Too many positional arguments: $count allowed, $count2 given.""",
       arguments: {'count': count, 'count2': count2});
 }
 
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 66003ca..abcc818 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -84,31 +84,29 @@
 
 import 'expression_generator.dart'
     show
-        BuilderHelper,
-        CalleeDesignation,
         DeferredAccessGenerator,
         ErroneousExpressionGenerator,
-        FastaAccessor,
-        FunctionTypeAccessor,
-        GeneratorImpl,
-        IncompleteError,
-        IncompletePropertyAccessor,
-        IncompleteSend,
+        Generator,
+        IncompleteErrorGenerator,
+        IncompletePropertyAccessGenerator,
+        IncompleteSendGenerator,
         IndexedAccessGenerator,
         LargeIntAccessGenerator,
         LoadLibraryGenerator,
-        ParenthesizedExpression,
+        ParenthesizedExpressionGenerator,
         ReadOnlyAccessGenerator,
-        SendAccessor,
+        SendAccessGenerator,
         StaticAccessGenerator,
         SuperIndexedAccessGenerator,
         ThisAccessGenerator,
         ThisPropertyAccessGenerator,
-        TypeDeclarationAccessor,
-        UnresolvedAccessor,
+        TypeDeclarationAccessGenerator,
+        UnresolvedNameGenerator,
         VariableUseGenerator,
         buildIsNull;
 
+import 'expression_generator_helper.dart' show ExpressionGeneratorHelper;
+
 import 'redirecting_factory_body.dart'
     show
         RedirectingFactoryBody,
@@ -131,7 +129,7 @@
 
 abstract class BodyBuilder<Expression, Statement, Arguments>
     extends ScopeListener<JumpTarget>
-    implements BuilderHelper<Expression, Statement, Arguments> {
+    implements ExpressionGeneratorHelper<Expression, Statement, Arguments> {
   @override
   final KernelLibraryBuilder library;
 
@@ -274,7 +272,7 @@
 
   @override
   Expression toValue(Object node) {
-    if (node is FastaAccessor) {
+    if (node is Generator) {
       return toExpression(node.buildSimpleRead());
     } else if (node is Expression) {
       return node;
@@ -292,7 +290,7 @@
   }
 
   Expression toEffect(Object node) {
-    if (node is FastaAccessor) return toExpression(node.buildForEffect());
+    if (node is Generator) return toExpression(node.buildForEffect());
     return toValue(node);
   }
 
@@ -437,14 +435,14 @@
       var expression = pop();
       if (expression is Identifier) {
         Identifier identifier = expression;
-        expression = new UnresolvedAccessor(
+        expression = new UnresolvedNameGenerator(
             this, identifier.token, new Name(identifier.name, library.library));
       }
       if (name?.isNotEmpty ?? false) {
         Token period = periodBeforeName ?? beginToken.next;
-        FastaAccessor accessor = expression;
-        expression = accessor.buildPropertyAccess(
-            new IncompletePropertyAccessor(
+        Generator generator = expression;
+        expression = generator.buildPropertyAccess(
+            new IncompletePropertyAccessGenerator(
                 this, period.next, new Name(name, library.library)),
             period.next.offset,
             false);
@@ -620,7 +618,7 @@
     Initializer initializer;
     if (node is Initializer) {
       initializer = node;
-    } else if (node is FastaAccessor) {
+    } else if (node is Generator) {
       initializer = node.buildFieldInitializer(initializedFields);
     } else if (node is ConstructorInvocation) {
       initializer = buildSuperInitializer(
@@ -803,10 +801,7 @@
       Initializer initializer;
       Arguments arguments = forest.argumentsEmpty(noLocation);
       if (superTarget == null ||
-          checkArguments(
-                  new FunctionTypeAccessor.fromNode(superTarget.function),
-                  arguments,
-                  CalleeDesignation.Constructor,
+          checkArgumentsForFunction(superTarget.function, arguments,
                   builder.charOffset, const <TypeParameter>[]) !=
               null) {
         String superclass = classBuilder.supertype.fullNameForErrors;
@@ -909,7 +904,7 @@
   @override
   void handleParenthesizedExpression(Token token) {
     debugEvent("ParenthesizedExpression");
-    push(new ParenthesizedExpression(
+    push(new ParenthesizedExpressionGenerator(
         this, token.endGroup, toKernelExpression(popForValue())));
   }
 
@@ -928,9 +923,9 @@
     if (receiver is Identifier) {
       Name name = new Name(receiver.name, library.library);
       if (arguments == null) {
-        push(new IncompletePropertyAccessor(this, beginToken, name));
+        push(new IncompletePropertyAccessGenerator(this, beginToken, name));
       } else {
-        push(new SendAccessor(this, beginToken, name, arguments));
+        push(new SendAccessGenerator(this, beginToken, name, arguments));
       }
     } else if (arguments == null) {
       push(receiver);
@@ -941,7 +936,7 @@
 
   @override
   finishSend(Object receiver, Arguments arguments, int charOffset) {
-    if (receiver is FastaAccessor) {
+    if (receiver is Generator) {
       return receiver.doInvocation(charOffset, arguments);
     } else {
       return buildMethodInvocation(
@@ -1078,7 +1073,7 @@
   /// Handle `a?.b(...)`.
   void doIfNotNull(Token token) {
     var send = pop();
-    if (send is IncompleteSend) {
+    if (send is IncompleteSendGenerator) {
       push(send.withReceiver(pop(), token.charOffset, isNullAware: true));
     } else {
       pop();
@@ -1091,7 +1086,7 @@
 
   void doDotOrCascadeExpression(Token token) {
     var send = pop();
-    if (send is IncompleteSend) {
+    if (send is IncompleteSendGenerator) {
       Object receiver = optional(".", token) ? pop() : popForValue();
       push(send.withReceiver(receiver, token.charOffset));
     } else {
@@ -1370,7 +1365,7 @@
           classBuilder.origin.findStaticBuilder(name, charOffset, uri, library);
     }
     if (builder != null && member.isField && builder.isInstanceMember) {
-      return new IncompleteError(this, token,
+      return new IncompleteErrorGenerator(this, token,
           fasta.templateThisAccessInFieldInitializer.withArguments(name));
     }
     if (builder == null || (!isInstanceContext && builder.isInstanceMember)) {
@@ -1378,7 +1373,7 @@
       if (!isQualified && isInstanceContext) {
         assert(builder == null);
         if (constantContext != ConstantContext.none || member.isField) {
-          return new UnresolvedAccessor(this, token, n);
+          return new UnresolvedNameGenerator(this, token, n);
         }
         return new ThisPropertyAccessGenerator(this, token, n,
             lookupInstanceMember(n), lookupInstanceMember(n, isSetter: true));
@@ -1387,7 +1382,7 @@
           member?.name == "_getMainClosure") {
         return storeOffset(forest.literalNull(null), charOffset);
       } else {
-        return new UnresolvedAccessor(this, token, n);
+        return new UnresolvedNameGenerator(this, token, n);
       }
     } else if (builder.isTypeDeclaration) {
       if (constantContext != ConstantContext.none &&
@@ -1396,11 +1391,12 @@
         deprecated_addCompileTimeError(
             charOffset, "Not a constant expression.");
       }
-      TypeDeclarationAccessor accessor = new TypeDeclarationAccessor(
-          this, token, prefix, charOffset, builder, name);
+      TypeDeclarationAccessGenerator generator =
+          new TypeDeclarationAccessGenerator(
+              this, token, prefix, charOffset, builder, name);
       return (prefix?.deferred == true)
-          ? new DeferredAccessGenerator(this, token, prefix, accessor)
-          : accessor;
+          ? new DeferredAccessGenerator(this, token, prefix, generator)
+          : generator;
     } else if (builder.isLocal) {
       if (constantContext != ConstantContext.none &&
           !builder.isConst &&
@@ -1449,11 +1445,11 @@
       return new ThisPropertyAccessGenerator(this, token, n, getter, setter);
     } else if (builder.isRegularMethod) {
       assert(builder.isStatic || builder.isTopLevel);
-      StaticAccessGenerator accessor =
+      StaticAccessGenerator generator =
           new StaticAccessGenerator(this, token, builder.target, null);
       return (prefix?.deferred == true)
-          ? new DeferredAccessGenerator(this, token, prefix, accessor)
-          : accessor;
+          ? new DeferredAccessGenerator(this, token, prefix, generator)
+          : generator;
     } else if (builder is PrefixBuilder) {
       if (constantContext != ConstantContext.none && builder.deferred) {
         deprecated_addCompileTimeError(
@@ -1477,10 +1473,10 @@
       } else if (builder.isField && !builder.isFinal) {
         setter = builder;
       }
-      StaticAccessGenerator accessor =
+      StaticAccessGenerator generator =
           new StaticAccessGenerator.fromBuilder(this, builder, token, setter);
       if (constantContext != ConstantContext.none) {
-        Member readTarget = accessor.readTarget;
+        Member readTarget = generator.readTarget;
         if (!(readTarget is Field && readTarget.isConst ||
             // Static tear-offs are also compile time constants.
             readTarget is Procedure)) {
@@ -1489,8 +1485,8 @@
         }
       }
       return (prefix?.deferred == true)
-          ? new DeferredAccessGenerator(this, token, prefix, accessor)
-          : accessor;
+          ? new DeferredAccessGenerator(this, token, prefix, generator)
+          : generator;
     }
   }
 
@@ -1789,13 +1785,13 @@
   void handleAssignmentExpression(Token token) {
     debugEvent("AssignmentExpression");
     Expression value = popForValue();
-    var accessor = pop();
-    if (accessor is! FastaAccessor) {
+    var generator = pop();
+    if (generator is! Generator) {
       push(buildCompileTimeError(fasta.messageNotAnLvalue,
           offsetForToken(token), lengthForToken(token)));
     } else {
-      push(new DelayedAssignment(
-          this, token, accessor, toKernelExpression(value), token.stringValue));
+      push(new DelayedAssignment(this, token, generator,
+          toKernelExpression(value), token.stringValue));
     }
   }
 
@@ -1821,7 +1817,7 @@
   }
 
   List<VariableDeclaration> buildVariableDeclarations(variableOrExpression) {
-    if (variableOrExpression is FastaAccessor) {
+    if (variableOrExpression is Generator) {
       variableOrExpression = variableOrExpression.buildForEffect();
     }
     if (variableOrExpression is VariableDeclaration) {
@@ -2054,7 +2050,7 @@
         return;
       }
     }
-    if (name is FastaAccessor) {
+    if (name is Generator) {
       push(name.buildTypeWithBuiltArguments(arguments));
     } else if (name is TypeBuilder) {
       push(name.build(library));
@@ -2324,14 +2320,11 @@
       optional = pop();
       count--;
     }
-    FormalParameters<Arguments> formals = new FormalParameters(
-        popList(
-                count,
-                new List<VariableDeclaration>.filled(count, null,
-                    growable: true)) ??
-            <VariableDeclaration>[],
-        optional,
-        beginToken.charOffset);
+    List<VariableDeclaration> variables =
+        new List<VariableDeclaration>.filled(count, null, growable: true);
+    popList(count, variables);
+    FormalParameters<Arguments> formals =
+        new FormalParameters(variables, optional, beginToken.charOffset);
     constantContext = pop();
     push(formals);
     if ((inCatchClause || functionNestingLevel != 0) &&
@@ -2484,24 +2477,26 @@
   @override
   void handleUnaryPrefixAssignmentExpression(Token token) {
     debugEvent("UnaryPrefixAssignmentExpression");
-    var accessor = pop();
-    if (accessor is FastaAccessor) {
-      push(accessor.buildPrefixIncrement(incrementOperator(token),
+    var generator = pop();
+    if (generator is Generator) {
+      push(generator.buildPrefixIncrement(incrementOperator(token),
           offset: token.charOffset));
     } else {
-      push(wrapInCompileTimeError(toValue(accessor), fasta.messageNotAnLvalue));
+      push(
+          wrapInCompileTimeError(toValue(generator), fasta.messageNotAnLvalue));
     }
   }
 
   @override
   void handleUnaryPostfixAssignmentExpression(Token token) {
     debugEvent("UnaryPostfixAssignmentExpression");
-    var accessor = pop();
-    if (accessor is FastaAccessor) {
+    var generator = pop();
+    if (generator is Generator) {
       push(new DelayedPostfixIncrement<Arguments>(
-          this, token, accessor, incrementOperator(token), null));
+          this, token, generator, incrementOperator(token), null));
     } else {
-      push(wrapInCompileTimeError(toValue(accessor), fasta.messageNotAnLvalue));
+      push(
+          wrapInCompileTimeError(toValue(generator), fasta.messageNotAnLvalue));
     }
   }
 
@@ -2542,7 +2537,7 @@
   /// But the parser can't tell this from type c) above.
   ///
   /// This method pops 2 (or 3 if `periodBeforeName != null`) values from the
-  /// stack and pushes 3 values: an accessor (the type in a constructor
+  /// stack and pushes 3 values: a generator (the type in a constructor
   /// reference, or an expression in metadata), a list of type arguments, and a
   /// name.
   void pushQualifiedReference(Token start, Token periodBeforeName) {
@@ -2558,13 +2553,13 @@
             prefix.exportScope, identifier.name, identifier.token,
             isQualified: true, prefix: prefix);
         identifier = null;
-      } else if (prefix is TypeDeclarationAccessor) {
+      } else if (prefix is TypeDeclarationAccessGenerator) {
         type = prefix;
-      } else if (prefix is FastaAccessor) {
+      } else if (prefix is Generator) {
         String name = suffix == null
             ? "${prefix.plainNameForRead}.${identifier.name}"
             : "${prefix.plainNameForRead}.${identifier.name}.$suffix";
-        type = new UnresolvedAccessor(
+        type = new UnresolvedNameGenerator(
             this, prefix.token, new Name(name, library.library));
       } else {
         unhandled("${prefix.runtimeType}", "pushQualifiedReference",
@@ -2599,15 +2594,8 @@
       assert(!target.enclosingClass.isAbstract);
       typeParameters = target.enclosingClass.typeParameters;
     }
-    CalleeDesignation calleeKind = target is Constructor
-        ? CalleeDesignation.Constructor
-        : CalleeDesignation.Method;
-    LocatedMessage argMessage = checkArguments(
-        new FunctionTypeAccessor.fromNode(target.function),
-        arguments,
-        calleeKind,
-        charOffset,
-        typeParameters);
+    LocatedMessage argMessage = checkArgumentsForFunction(
+        target.function, arguments, charOffset, typeParameters);
     if (argMessage != null) {
       return throwNoSuchMethodError(
           storeOffset(forest.literalNull(null), charOffset),
@@ -2653,65 +2641,29 @@
   }
 
   @override
-  LocatedMessage checkArguments(FunctionTypeAccessor function,
-      Arguments arguments, CalleeDesignation calleeKind, int offset,
-      [List<TypeParameter> typeParameters]) {
+  LocatedMessage checkArgumentsForFunction(FunctionNode function,
+      Arguments arguments, int offset, List<TypeParameter> typeParameters) {
     if (forest.argumentsPositional(arguments).length <
         function.requiredParameterCount) {
-      Template<Message Function(int count, int count2)> template;
-      switch (calleeKind) {
-        case CalleeDesignation.Function:
-          template = fasta.templateTooFewArgumentsToFunction;
-          break;
-        case CalleeDesignation.Method:
-          template = fasta.templateTooFewArgumentsToMethod;
-          break;
-        case CalleeDesignation.Constructor:
-          template = fasta.templateTooFewArgumentsToConstructor;
-          break;
-      }
-      return template
+      return fasta.templateTooFewArguments
           .withArguments(function.requiredParameterCount,
               forest.argumentsPositional(arguments).length)
           .withLocation(uri, offset, noLength);
     }
     if (forest.argumentsPositional(arguments).length >
-        function.positionalParameterCount) {
-      Template<Message Function(int count, int count2)> template;
-      switch (calleeKind) {
-        case CalleeDesignation.Function:
-          template = fasta.templateTooManyArgumentsToFunction;
-          break;
-        case CalleeDesignation.Method:
-          template = fasta.templateTooManyArgumentsToMethod;
-          break;
-        case CalleeDesignation.Constructor:
-          template = fasta.templateTooManyArgumentsToConstructor;
-          break;
-      }
-      return template
-          .withArguments(function.positionalParameterCount,
+        function.positionalParameters.length) {
+      return fasta.templateTooManyArguments
+          .withArguments(function.positionalParameters.length,
               forest.argumentsPositional(arguments).length)
           .withLocation(uri, offset, noLength);
     }
     List named = forest.argumentsNamed(arguments);
     if (named.isNotEmpty) {
-      Set<String> names = function.namedParameterNames;
+      Set<String> names =
+          new Set.from(function.namedParameters.map((a) => a.name));
       for (NamedExpression argument in named) {
         if (!names.remove(argument.name)) {
-          Template<Message Function(String name)> template;
-          switch (calleeKind) {
-            case CalleeDesignation.Function:
-              template = fasta.templateFunctionHasNoSuchNamedParameter;
-              break;
-            case CalleeDesignation.Method:
-              template = fasta.templateMethodHasNoSuchNamedParameter;
-              break;
-            case CalleeDesignation.Constructor:
-              template = fasta.templateConstructorHasNoSuchNamedParameter;
-              break;
-          }
-          return template
+          return fasta.templateNoSuchNamedParameter
               .withArguments(argument.name)
               .withLocation(uri, argument.fileOffset, argument.name.length);
         }
@@ -2719,7 +2671,7 @@
     }
 
     List types = forest.argumentsTypeArguments(arguments);
-    if (typeParameters != null && typeParameters.length != types.length) {
+    if (typeParameters.length != types.length) {
       // TODO(paulberry): Report error in this case as well,
       // after https://github.com/dart-lang/sdk/issues/32130 is fixed.
       types.clear();
@@ -2732,6 +2684,39 @@
   }
 
   @override
+  LocatedMessage checkArgumentsForType(
+      FunctionType function, Arguments arguments, int offset) {
+    if (forest.argumentsPositional(arguments).length <
+        function.requiredParameterCount) {
+      return fasta.templateTooFewArguments
+          .withArguments(function.requiredParameterCount,
+              forest.argumentsPositional(arguments).length)
+          .withLocation(uri, offset, noLength);
+    }
+    if (forest.argumentsPositional(arguments).length >
+        function.positionalParameters.length) {
+      return fasta.templateTooManyArguments
+          .withArguments(function.positionalParameters.length,
+              forest.argumentsPositional(arguments).length)
+          .withLocation(uri, offset, noLength);
+    }
+    List named = forest.argumentsNamed(arguments);
+    if (named.isNotEmpty) {
+      Set<String> names =
+          new Set.from(function.namedParameters.map((a) => a.name));
+      for (NamedExpression argument in named) {
+        if (!names.remove(argument.name)) {
+          return fasta.templateNoSuchNamedParameter
+              .withArguments(argument.name)
+              .withLocation(uri, argument.fileOffset, argument.name.length);
+        }
+      }
+    }
+
+    return null;
+  }
+
+  @override
   void beginNewExpression(Token token) {
     debugEvent("beginNewExpression");
     super.push(constantContext);
@@ -2787,18 +2772,18 @@
     PrefixBuilder deferredPrefix;
     int checkOffset;
     if (type is DeferredAccessGenerator) {
-      DeferredAccessGenerator accessor = type;
-      type = accessor.accessor;
-      deferredPrefix = accessor.builder;
-      checkOffset = accessor.token.charOffset;
+      DeferredAccessGenerator generator = type;
+      type = generator.generator;
+      deferredPrefix = generator.builder;
+      checkOffset = generator.token.charOffset;
     }
 
-    if (type is TypeDeclarationAccessor) {
-      TypeDeclarationAccessor accessor = type;
-      if (accessor.prefix != null) {
+    if (type is TypeDeclarationAccessGenerator) {
+      TypeDeclarationAccessGenerator generator = type;
+      if (generator.prefix != null) {
         nameToken = nameToken.next.next;
       }
-      type = accessor.declaration;
+      type = generator.declaration;
     }
 
     ConstantContext savedConstantContext = pop();
@@ -2940,7 +2925,8 @@
     if (context.isScopeReference && isInstanceContext) {
       push(new ThisAccessGenerator(this, token, inInitializer));
     } else {
-      push(new IncompleteError(this, token, fasta.messageThisAsIdentifier));
+      push(new IncompleteErrorGenerator(
+          this, token, fasta.messageThisAsIdentifier));
     }
   }
 
@@ -2952,7 +2938,8 @@
       member.transformerFlags |= TransformerFlag.superCalls;
       push(new ThisAccessGenerator(this, token, inInitializer, isSuper: true));
     } else {
-      push(new IncompleteError(this, token, fasta.messageSuperAsIdentifier));
+      push(new IncompleteErrorGenerator(
+          this, token, fasta.messageSuperAsIdentifier));
     }
   }
 
@@ -3205,7 +3192,7 @@
         deprecated_addCompileTimeError(
             variable.fileOffset, "A for-in loop-variable can't be 'const'.");
       }
-    } else if (lvalue is FastaAccessor) {
+    } else if (lvalue is Generator) {
       /// We are in this case, where `lvalue` isn't a [VariableDeclaration]:
       ///
       ///     for (lvalue in expression) body
@@ -3261,7 +3248,8 @@
   @override
   void beginLabeledStatement(Token token, int labelCount) {
     debugEvent("beginLabeledStatement");
-    List<Label> labels = popList(labelCount);
+    List<Label> labels = popList(
+        labelCount, new List<Label>.filled(labelCount, null, growable: true));
     enterLocalScope(null, scope.createNestedLabelScope());
     LabelTarget target = new LabelTarget<Statement>(
         member, functionNestingLevel, token.charOffset);
@@ -3277,20 +3265,22 @@
     Statement statement = popStatement();
     LabelTarget target = pop();
     exitLocalScope();
-    kernel.Statement kernelStatement = toKernelStatement(statement);
     if (target.breakTarget.hasUsers) {
-      if (kernelStatement is! LabeledStatement) {
-        kernelStatement = new ShadowLabeledStatement(kernelStatement);
+      if (statement is! LabeledStatement) {
+        statement = forest.syntheticLabeledStatement(statement);
       }
-      target.breakTarget.resolveBreaks(forest, kernelStatement);
+      target.breakTarget.resolveBreaks(forest, statement);
     }
+    // TODO(brianwilkerson): Figure out how to get the labels that are part of
+    // the statement.
+//    statement = forest.labeledStatement(labels, statement);
     if (target.continueTarget.hasUsers) {
-      if (kernelStatement is! LabeledStatement) {
-        kernelStatement = new ShadowLabeledStatement(kernelStatement);
+      if (statement is! LabeledStatement) {
+        statement = forest.syntheticLabeledStatement(statement);
       }
-      target.continueTarget.resolveContinues(forest, kernelStatement);
+      target.continueTarget.resolveContinues(forest, statement);
     }
-    push(kernelStatement);
+    push(statement);
   }
 
   @override
@@ -3352,48 +3342,10 @@
     Expression message = popForValueIfNotNull(commaToken);
     Expression condition = popForValue();
 
-    // Compute start and end offsets for the condition expression.
-    // This code is a temporary workaround because expressions don't carry
-    // their start and end offsets currently.
-    //
-    // The token that follows leftParenthesis is considered to be the
-    // first token of the condition.
-    // TODO(ahe): this really should be condition.fileOffset.
-    int startOffset = leftParenthesis.next.offset;
-    int endOffset;
-    {
-      // Search forward from leftParenthesis to find the last token of
-      // the condition - which is a token immediately followed by a commaToken,
-      // right parenthesis or a trailing comma.
-      Token conditionBoundary = commaToken ?? leftParenthesis.endGroup;
-      Token conditionLastToken = leftParenthesis;
-      while (!conditionLastToken.isEof) {
-        Token nextToken = conditionLastToken.next;
-        if (nextToken == conditionBoundary) {
-          break;
-        } else if (optional(',', nextToken) &&
-            nextToken.next == conditionBoundary) {
-          // The next token is trailing comma, which means current token is
-          // the last token of the condition.
-          break;
-        }
-        conditionLastToken = nextToken;
-      }
-      if (conditionLastToken.isEof) {
-        endOffset = startOffset = -1;
-      } else {
-        endOffset = conditionLastToken.offset + conditionLastToken.length;
-      }
-    }
-
-    AssertStatement statement = new ShadowAssertStatement(
-        toKernelExpression(condition),
-        conditionStartOffset: startOffset,
-        conditionEndOffset: endOffset,
-        message: toKernelExpression(message));
     switch (kind) {
       case Assert.Statement:
-        push(statement);
+        push(forest.assertStatement(assertKeyword, leftParenthesis, condition,
+            commaToken, message, semicolonToken));
         break;
 
       case Assert.Expression:
@@ -3404,7 +3356,8 @@
         break;
 
       case Assert.Initializer:
-        push(new ShadowAssertInitializer(statement));
+        push(forest.assertInitializer(
+            assertKeyword, leftParenthesis, condition, commaToken, message));
         break;
     }
   }
@@ -3560,11 +3513,12 @@
       bool hasTarget, Token breakKeyword, Token endToken) {
     debugEvent("BreakStatement");
     var target = breakTarget;
+    Identifier identifier;
     String name;
     if (hasTarget) {
-      Identifier identifier = pop();
+      identifier = pop();
       name = identifier.name;
-      target = scope.lookupLabel(identifier.name);
+      target = scope.lookupLabel(name);
     }
     if (target == null && name == null) {
       push(compileTimeErrorInLoopOrSwitch =
@@ -3582,8 +3536,8 @@
               "Can't break to '$name' in a different function.",
               breakKeyword.next.charOffset));
     } else {
-      BreakStatement statement = new ShadowBreakStatement(null)
-        ..fileOffset = breakKeyword.charOffset;
+      Statement statement =
+          forest.breakStatement(breakKeyword, identifier, endToken);
       target.addBreak(statement);
       push(statement);
     }
@@ -3594,9 +3548,10 @@
       bool hasTarget, Token continueKeyword, Token endToken) {
     debugEvent("ContinueStatement");
     var target = continueTarget;
+    Identifier identifier;
     String name;
     if (hasTarget) {
-      Identifier identifier = pop();
+      identifier = pop();
       name = identifier.name;
       target = scope.lookupLabel(identifier.name);
       if (target != null && target is! JumpTarget) {
@@ -3639,8 +3594,8 @@
               "Can't continue at '$name' in a different function.",
               continueKeyword.next.charOffset));
     } else {
-      BreakStatement statement = new ShadowBreakStatement(null)
-        ..fileOffset = continueKeyword.charOffset;
+      Statement statement =
+          forest.continueStatement(continueKeyword, identifier, endToken);
       target.addContinue(statement);
       push(statement);
     }
@@ -3686,7 +3641,7 @@
     List<Expression> annotations = pop();
     KernelTypeVariableBuilder variable;
     Object inScope = scopeLookup(scope, name.name, token);
-    if (inScope is TypeDeclarationAccessor) {
+    if (inScope is TypeDeclarationAccessGenerator) {
       variable = inScope.declaration;
     } else {
       // Something went wrong when pre-parsing the type variables.
@@ -4254,15 +4209,14 @@
   String toString() => "label($name)";
 }
 
-abstract class ContextAccessor<Arguments> extends FastaAccessor<Arguments>
-    with GeneratorImpl {
-  final BuilderHelper<dynamic, dynamic, Arguments> helper;
+abstract class ContextAwareGenerator<Arguments> extends Generator<Arguments> {
+  final Generator generator;
 
-  final FastaAccessor accessor;
-
-  final Token token;
-
-  ContextAccessor(this.helper, this.token, this.accessor);
+  ContextAwareGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.generator)
+      : super(helper, token);
 
   String get plainNameForRead {
     return unsupported("plainNameForRead", token.charOffset, helper.uri);
@@ -4321,14 +4275,18 @@
   }
 }
 
-class DelayedAssignment<Arguments> extends ContextAccessor<Arguments> {
+class DelayedAssignment<Arguments> extends ContextAwareGenerator<Arguments> {
   final kernel.Expression value;
 
   final String assignmentOperator;
 
-  DelayedAssignment(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, FastaAccessor accessor, this.value, this.assignmentOperator)
-      : super(helper, token, accessor);
+  DelayedAssignment(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      Generator generator,
+      this.value,
+      this.assignmentOperator)
+      : super(helper, token, generator);
 
   String get debugName => "DelayedAssignment";
 
@@ -4346,43 +4304,43 @@
           "Not a constant expression.", offsetForToken(token));
     }
     if (identical("=", assignmentOperator)) {
-      return accessor.buildAssignment(value, voidContext: voidContext);
+      return generator.buildAssignment(value, voidContext: voidContext);
     } else if (identical("+=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(plusName, value,
+      return generator.buildCompoundAssignment(plusName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else if (identical("-=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(minusName, value,
+      return generator.buildCompoundAssignment(minusName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else if (identical("*=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(multiplyName, value,
+      return generator.buildCompoundAssignment(multiplyName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else if (identical("%=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(percentName, value,
+      return generator.buildCompoundAssignment(percentName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else if (identical("&=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(ampersandName, value,
+      return generator.buildCompoundAssignment(ampersandName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else if (identical("/=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(divisionName, value,
+      return generator.buildCompoundAssignment(divisionName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else if (identical("<<=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(leftShiftName, value,
+      return generator.buildCompoundAssignment(leftShiftName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else if (identical(">>=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(rightShiftName, value,
+      return generator.buildCompoundAssignment(rightShiftName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else if (identical("??=", assignmentOperator)) {
-      return accessor.buildNullAwareAssignment(
+      return generator.buildNullAwareAssignment(
           value, const DynamicType(), offsetForToken(token),
           voidContext: voidContext);
     } else if (identical("^=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(caretName, value,
+      return generator.buildCompoundAssignment(caretName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else if (identical("|=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(barName, value,
+      return generator.buildCompoundAssignment(barName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else if (identical("~/=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(mustacheName, value,
+      return generator.buildCompoundAssignment(mustacheName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else {
       return unhandled(
@@ -4392,11 +4350,12 @@
 
   @override
   Initializer buildFieldInitializer(Map<String, int> initializedFields) {
-    if (!identical("=", assignmentOperator) || !accessor.isThisPropertyAccess) {
-      return accessor.buildFieldInitializer(initializedFields);
+    if (!identical("=", assignmentOperator) ||
+        !generator.isThisPropertyAccess) {
+      return generator.buildFieldInitializer(initializedFields);
     }
     return helper.buildFieldInitializer(
-        false, accessor.plainNameForRead, offsetForToken(token), value);
+        false, generator.plainNameForRead, offsetForToken(token), value);
   }
 
   @override
@@ -4408,30 +4367,31 @@
   }
 }
 
-class DelayedPostfixIncrement<Arguments> extends ContextAccessor<Arguments> {
+class DelayedPostfixIncrement<Arguments>
+    extends ContextAwareGenerator<Arguments> {
   final Name binaryOperator;
 
   final Procedure interfaceTarget;
 
   DelayedPostfixIncrement(
-      BuilderHelper<dynamic, dynamic, Arguments> helper,
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
       Token token,
-      FastaAccessor accessor,
+      Generator generator,
       this.binaryOperator,
       this.interfaceTarget)
-      : super(helper, token, accessor);
+      : super(helper, token, generator);
 
   String get debugName => "DelayedPostfixIncrement";
 
   kernel.Expression buildSimpleRead() {
-    return accessor.buildPostfixIncrement(binaryOperator,
+    return generator.buildPostfixIncrement(binaryOperator,
         offset: offsetForToken(token),
         voidContext: false,
         interfaceTarget: interfaceTarget);
   }
 
   kernel.Expression buildForEffect() {
-    return accessor.buildPostfixIncrement(binaryOperator,
+    return generator.buildPostfixIncrement(binaryOperator,
         offset: offsetForToken(token),
         voidContext: true,
         interfaceTarget: interfaceTarget);
@@ -4628,7 +4588,7 @@
   }
 
   Scope computeFormalParameterScope(Scope parent, Builder builder,
-      BuilderHelper<dynamic, dynamic, Arguments> helper) {
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper) {
     if (required.length == 0 && optional == null) return parent;
     Map<String, Builder> local = <String, Builder>{};
 
@@ -4684,7 +4644,7 @@
     return node.fullNameForErrors;
   } else if (node is ThisAccessGenerator) {
     return node.isSuper ? "super" : "this";
-  } else if (node is FastaAccessor) {
+  } else if (node is Generator) {
     return node.plainNameForRead;
   } else {
     return unhandled("${node.runtimeType}", "getNodeName", -1, null);
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index 291cf8a..b644d94 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -2,8 +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.
 
-/// A library to help transform compounds and null-aware accessors into
-/// let expressions.
+/// A library to help generate expression.
 library fasta.expression_generator;
 
 import '../../scanner/token.dart' show Token;
@@ -29,16 +28,16 @@
 
 import '../parser.dart' show lengthForToken, lengthOfSpan, offsetForToken;
 
-import '../problems.dart' show unhandled, unimplemented, unsupported;
+import '../problems.dart' show unhandled, unsupported;
 
-import '../scope.dart' show AccessErrorBuilder, ProblemBuilder, Scope;
-
-import '../type_inference/type_promotion.dart' show TypePromoter;
+import '../scope.dart' show AccessErrorBuilder;
 
 import 'body_builder.dart' show Identifier, noLocation;
 
 import 'constness.dart' show Constness;
 
+import 'expression_generator_helper.dart' show ExpressionGeneratorHelper;
+
 import 'forest.dart' show Forest;
 
 import 'kernel_builder.dart' show LoadLibraryBuilder, PrefixBuilder;
@@ -50,8 +49,6 @@
         Constructor,
         DartType,
         Field,
-        FunctionNode,
-        FunctionType,
         Initializer,
         InvalidType,
         Let,
@@ -72,7 +69,6 @@
         ShadowVariableAssignment,
         ShadowVariableDeclaration,
         ShadowVariableGet,
-        StaticGet,
         StaticSet,
         SuperMethodInvocation,
         SuperPropertySet,
@@ -94,44 +90,49 @@
         KernelClassBuilder,
         KernelFunctionTypeAliasBuilder,
         KernelInvalidTypeBuilder,
-        KernelPrefixBuilder,
         KernelTypeVariableBuilder,
-        LibraryBuilder,
         LoadLibraryBuilder,
         PrefixBuilder,
         TypeDeclarationBuilder;
 
-part 'expression_generator_impl.dart';
-
-/// An [Accessor] represents a subexpression for which we can't yet build a
-/// kernel [kernel.Expression] because we don't yet know the context in which
-/// it is used.
+/// A generator represents a subexpression for which we can't yet build an
+/// expression because we don't yet know the context in which it's used.
 ///
-/// Once the context is known, an [Accessor] can be converted into an
-/// [kernel.Expression] by calling a "build" method.
+/// Once the context is known, a generator can be converted into an expression
+/// by calling a `build` method.
 ///
 /// For example, when building a kernel representation for `a[x] = b`, after
 /// parsing `a[x]` but before parsing `= b`, we don't yet know whether to
-/// generate an invocation of `operator[]` or `operator[]=`, so we generate an
-/// [Accessor] object.  Later, after `= b` is parsed, [buildAssignment] will be
-/// called.
-// TODO(ahe): Move this into [Generator] when all uses have been updated.
-abstract class Accessor<Arguments> {
-  final BuilderHelper<dynamic, dynamic, Arguments> helper;
+/// generate an invocation of `operator[]` or `operator[]=`, so we create a
+/// [Generator] object.  Later, after `= b` is parsed, [buildAssignment] will
+/// be called.
+abstract class Generator<Arguments> {
+  final ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper;
   final Token token;
 
-  Accessor(this.helper, this.token);
+  Generator(this.helper, this.token);
 
+  // TODO(ahe): Change type arguments.
   Forest<kernel.Expression, kernel.Statement, Token, Arguments> get forest =>
       helper.forest;
 
-  /// Builds an [kernel.Expression] representing a read from the accessor.
+  String get plainNameForRead;
+
+  String get debugName;
+
+  Uri get uri => helper.uri;
+
+  String get plainNameForWrite => plainNameForRead;
+
+  bool get isInitializer => false;
+
+  /// Builds a [kernel.Expression] representing a read from the generator.
   kernel.Expression buildSimpleRead() {
     return _finish(_makeSimpleRead(), null);
   }
 
-  /// Builds an [kernel.Expression] representing an assignment with the
-  /// accessor on the LHS and [value] on the RHS.
+  /// Builds a [kernel.Expression] representing an assignment with the
+  /// generator on the LHS and [value] on the RHS.
   ///
   /// The returned expression evaluates to the assigned value, unless
   /// [voidContext] is true, in which case it may evaluate to anything.
@@ -142,8 +143,8 @@
         complexAssignment);
   }
 
-  /// Returns an [kernel.Expression] representing a null-aware assignment
-  /// (`??=`) with the accessor on the LHS and [value] on the RHS.
+  /// Returns a [kernel.Expression] representing a null-aware assignment
+  /// (`??=`) with the generator on the LHS and [value] on the RHS.
   ///
   /// The returned expression evaluates to the assigned value, unless
   /// [voidContext] is true, in which case it may evaluate to anything.
@@ -178,8 +179,8 @@
     return _finish(makeLet(tmp, nullAwareCombiner), complexAssignment);
   }
 
-  /// Returns an [kernel.Expression] representing a compound assignment
-  /// (e.g. `+=`) with the accessor on the LHS and [value] on the RHS.
+  /// Returns a [kernel.Expression] representing a compound assignment
+  /// (e.g. `+=`) with the generator on the LHS and [value] on the RHS.
   kernel.Expression buildCompoundAssignment(
       Name binaryOperator, kernel.Expression value,
       {int offset: TreeNode.noOffset,
@@ -196,8 +197,8 @@
         complexAssignment);
   }
 
-  /// Returns an [kernel.Expression] representing a pre-increment or
-  /// pre-decrement of the accessor.
+  /// Returns a [kernel.Expression] representing a pre-increment or
+  /// pre-decrement of the generator.
   kernel.Expression buildPrefixIncrement(Name binaryOperator,
       {int offset: TreeNode.noOffset,
       bool voidContext: false,
@@ -210,8 +211,8 @@
         isPreIncDec: true);
   }
 
-  /// Returns an [kernel.Expression] representing a post-increment or
-  /// post-decrement of the accessor.
+  /// Returns a [kernel.Expression] representing a post-increment or
+  /// post-decrement of the generator.
   kernel.Expression buildPostfixIncrement(Name binaryOperator,
       {int offset: TreeNode.noOffset,
       bool voidContext: false,
@@ -258,40 +259,113 @@
     }
   }
 
-  /// Returns an [kernel.Expression] representing a compile-time error.
+  /// Returns a [kernel.Expression] representing a compile-time error.
   ///
   /// At runtime, an exception will be thrown.
-  makeInvalidRead() {
-    return unhandled("compile-time error", "$runtimeType",
-        offsetForToken(token), helper.uri);
+  kernel.Expression makeInvalidRead() {
+    return buildThrowNoSuchMethodError(
+        forest.literalNull(token), forest.argumentsEmpty(noLocation),
+        isGetter: true);
   }
 
-  /// Returns an [kernel.Expression] representing a compile-time error wrapping
+  /// Returns a [kernel.Expression] representing a compile-time error wrapping
   /// [value].
   ///
   /// At runtime, [value] will be evaluated before throwing an exception.
-  makeInvalidWrite(kernel.Expression value) {
-    return unhandled("compile-time error", "$runtimeType",
-        offsetForToken(token), helper.uri);
+  kernel.Expression makeInvalidWrite(kernel.Expression value) {
+    return buildThrowNoSuchMethodError(forest.literalNull(token),
+        forest.arguments(<kernel.Expression>[value], noLocation),
+        isSetter: true);
   }
 
   /// Creates a data structure for tracking the desugaring of a complex
   /// assignment expression whose right hand side is [rhs].
   ShadowComplexAssignment startComplexAssignment(kernel.Expression rhs) =>
       new ShadowIllegalAssignment(rhs);
-}
 
-// TODO(ahe): Merge classes [Accessor] and [FastaAccessor] into this.
-abstract class Generator<Arguments> = Accessor<Arguments>
-    with FastaAccessor<Arguments>;
+  T storeOffset<T>(T node, int offset) {
+    return helper.storeOffset(node, offset);
+  }
+
+  kernel.Expression buildForEffect() => buildSimpleRead();
+
+  Initializer buildFieldInitializer(Map<String, int> initializedFields) {
+    int offset = offsetForToken(token);
+    return helper.buildInvalidInitializer(
+        helper.buildCompileTimeError(
+            messageInvalidInitializer, offset, lengthForToken(token)),
+        offset);
+  }
+
+  /* kernel.Expression | Generator | Initializer */ doInvocation(
+      int offset, Arguments arguments);
+
+  /* kernel.Expression | Generator */ buildPropertyAccess(
+      IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
+    if (send is SendAccessGenerator) {
+      return helper.buildMethodInvocation(buildSimpleRead(), send.name,
+          send.arguments, offsetForToken(send.token),
+          isNullAware: isNullAware);
+    } else {
+      if (helper.constantContext != ConstantContext.none &&
+          send.name != lengthName) {
+        helper.deprecated_addCompileTimeError(
+            offsetForToken(token), "Not a constant expression.");
+      }
+      return PropertyAccessGenerator.make(helper, send.token, buildSimpleRead(),
+          send.name, null, null, isNullAware);
+    }
+  }
+
+  DartType buildTypeWithBuiltArguments(List<DartType> arguments,
+      {bool nonInstanceAccessIsError: false}) {
+    helper.addProblem(templateNotAType.withArguments(token.lexeme),
+        offsetForToken(token), lengthForToken(token));
+    return const InvalidType();
+  }
+
+  /* kernel.Expression | Generator */ buildThrowNoSuchMethodError(
+      kernel.Expression receiver, Arguments arguments,
+      {bool isSuper: false,
+      bool isGetter: false,
+      bool isSetter: false,
+      bool isStatic: false,
+      String name,
+      int offset,
+      LocatedMessage argMessage}) {
+    return helper.throwNoSuchMethodError(receiver, name ?? plainNameForWrite,
+        arguments, offset ?? offsetForToken(this.token),
+        isGetter: isGetter,
+        isSetter: isSetter,
+        isSuper: isSuper,
+        isStatic: isStatic,
+        argMessage: argMessage);
+  }
+
+  bool get isThisPropertyAccess => false;
+
+  void printOn(StringSink sink);
+
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    buffer.write(debugName);
+    buffer.write("(offset: ");
+    buffer.write("${offsetForToken(token)}");
+    printOn(buffer);
+    buffer.write(")");
+    return "$buffer";
+  }
+}
 
 class VariableUseGenerator<Arguments> extends Generator<Arguments> {
   final VariableDeclaration variable;
 
   final DartType promotedType;
 
-  VariableUseGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, this.variable,
+  VariableUseGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.variable,
       [this.promotedType])
       : super(helper, token);
 
@@ -353,7 +427,7 @@
   VariableDeclaration _receiverVariable;
 
   PropertyAccessGenerator.internal(
-      BuilderHelper<dynamic, dynamic, Arguments> helper,
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
       Token token,
       this.receiver,
       this.name,
@@ -361,8 +435,8 @@
       this.setter)
       : super(helper, token);
 
-  static FastaAccessor<Arguments> make<Arguments>(
-      BuilderHelper<dynamic, dynamic, Arguments> helper,
+  static Generator<Arguments> make<Arguments>(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
       Token token,
       kernel.Expression receiver,
       Name name,
@@ -457,8 +531,12 @@
 
   final Member setter;
 
-  ThisPropertyAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, this.name, this.getter, this.setter)
+  ThisPropertyAccessGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.name,
+      this.getter,
+      this.setter)
       : super(helper, token);
 
   String get plainNameForRead => name.name;
@@ -534,7 +612,7 @@
   final DartType type;
 
   NullAwarePropertyAccessGenerator(
-      BuilderHelper<dynamic, dynamic, Arguments> helper,
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
       Token token,
       this.receiverExpression,
       this.name,
@@ -589,7 +667,7 @@
   }
 
   kernel.Expression doInvocation(int offset, Arguments arguments) {
-    return unimplemented("doInvocation", offset, uri);
+    return unsupported("doInvocation", offset, uri);
   }
 
   @override
@@ -622,7 +700,7 @@
   final Member setter;
 
   SuperPropertyAccessGenerator(
-      BuilderHelper<dynamic, dynamic, Arguments> helper,
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
       Token token,
       this.name,
       this.getter,
@@ -705,7 +783,7 @@
   VariableDeclaration indexVariable;
 
   IndexedAccessGenerator.internal(
-      BuilderHelper<dynamic, dynamic, Arguments> helper,
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
       Token token,
       this.receiver,
       this.index,
@@ -713,8 +791,8 @@
       this.setter)
       : super(helper, token);
 
-  static FastaAccessor<Arguments> make<Arguments>(
-      BuilderHelper<dynamic, dynamic, Arguments> helper,
+  static Generator<Arguments> make<Arguments>(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
       Token token,
       kernel.Expression receiver,
       kernel.Expression index,
@@ -867,8 +945,12 @@
 
   VariableDeclaration indexVariable;
 
-  ThisIndexedAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, this.index, this.getter, this.setter)
+  ThisIndexedAccessGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.index,
+      this.getter,
+      this.setter)
       : super(helper, token);
 
   String get plainNameForRead => "[]";
@@ -987,8 +1069,12 @@
 
   VariableDeclaration indexVariable;
 
-  SuperIndexedAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, this.index, this.getter, this.setter)
+  SuperIndexedAccessGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.index,
+      this.getter,
+      this.setter)
       : super(helper, token);
 
   String get plainNameForRead => "[]";
@@ -1119,13 +1205,16 @@
 
   final Member writeTarget;
 
-  StaticAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, this.readTarget, this.writeTarget)
+  StaticAccessGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.readTarget,
+      this.writeTarget)
       : assert(readTarget != null || writeTarget != null),
         super(helper, token);
 
   factory StaticAccessGenerator.fromBuilder(
-      BuilderHelper<dynamic, dynamic, Arguments> helper,
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
       Builder builder,
       Token token,
       Builder builderSetter) {
@@ -1215,8 +1304,10 @@
 class LoadLibraryGenerator<Arguments> extends Generator<Arguments> {
   final LoadLibraryBuilder builder;
 
-  LoadLibraryGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, this.builder)
+  LoadLibraryGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.builder)
       : super(helper, token);
 
   String get plainNameForRead => 'loadLibrary';
@@ -1256,10 +1347,13 @@
 class DeferredAccessGenerator<Arguments> extends Generator<Arguments> {
   final PrefixBuilder builder;
 
-  final FastaAccessor accessor;
+  final Generator generator;
 
-  DeferredAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, this.builder, this.accessor)
+  DeferredAccessGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.builder,
+      this.generator)
       : super(helper, token);
 
   String get plainNameForRead {
@@ -1271,27 +1365,27 @@
 
   kernel.Expression _makeSimpleRead() {
     return helper.wrapInDeferredCheck(
-        accessor._makeSimpleRead(), builder, token.charOffset);
+        generator._makeSimpleRead(), builder, token.charOffset);
   }
 
   kernel.Expression _makeRead(ShadowComplexAssignment complexAssignment) {
     return helper.wrapInDeferredCheck(
-        accessor._makeRead(complexAssignment), builder, token.charOffset);
+        generator._makeRead(complexAssignment), builder, token.charOffset);
   }
 
   kernel.Expression _makeWrite(kernel.Expression value, bool voidContext,
       ShadowComplexAssignment complexAssignment) {
     return helper.wrapInDeferredCheck(
-        accessor._makeWrite(value, voidContext, complexAssignment),
+        generator._makeWrite(value, voidContext, complexAssignment),
         builder,
         token.charOffset);
   }
 
   buildPropertyAccess(
-      IncompleteSend send, int operatorOffset, bool isNullAware) {
+      IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
     var propertyAccess =
-        accessor.buildPropertyAccess(send, operatorOffset, isNullAware);
-    if (propertyAccess is FastaAccessor) {
+        generator.buildPropertyAccess(send, operatorOffset, isNullAware);
+    if (propertyAccess is Generator) {
       return new DeferredAccessGenerator(
           helper, token, builder, propertyAccess);
     } else {
@@ -1305,7 +1399,7 @@
       {bool nonInstanceAccessIsError: false}) {
     helper.addProblem(
         templateDeferredTypeAnnotation.withArguments(
-            accessor.buildTypeWithBuiltArguments(arguments,
+            generator.buildTypeWithBuiltArguments(arguments,
                 nonInstanceAccessIsError: nonInstanceAccessIsError),
             builder.name),
         offsetForToken(token),
@@ -1315,15 +1409,15 @@
 
   kernel.Expression doInvocation(int offset, Arguments arguments) {
     return helper.wrapInDeferredCheck(
-        accessor.doInvocation(offset, arguments), builder, token.charOffset);
+        generator.doInvocation(offset, arguments), builder, token.charOffset);
   }
 
   @override
   void printOn(StringSink sink) {
     sink.write(", builder: ");
     sink.write(builder);
-    sink.write(", accessor: ");
-    sink.write(accessor);
+    sink.write(", generator: ");
+    sink.write(generator);
   }
 }
 
@@ -1334,8 +1428,11 @@
 
   VariableDeclaration value;
 
-  ReadOnlyAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, this.expression, this.plainNameForRead)
+  ReadOnlyAccessGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.expression,
+      this.plainNameForRead)
       : super(helper, token);
 
   String get debugName => "ReadOnlyAccessGenerator";
@@ -1378,7 +1475,8 @@
 
 class LargeIntAccessGenerator<Arguments> extends Generator<Arguments> {
   LargeIntAccessGenerator(
-      BuilderHelper<dynamic, dynamic, Arguments> helper, Token token)
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token)
       : super(helper, token);
 
   // TODO(ahe): This should probably be calling unhandled.
@@ -1429,7 +1527,7 @@
     implements Generator<Arguments> {
   /// Pass [arguments] that must be evaluated before throwing an error.  At
   /// most one of [isGetter] and [isSetter] should be true and they're passed
-  /// to [BuilderHelper.buildThrowNoSuchMethodError] if it is used.
+  /// to [ExpressionGeneratorHelper.buildThrowNoSuchMethodError] if it is used.
   kernel.Expression buildError(Arguments arguments,
       {bool isGetter: false, bool isSetter: false, int offset});
 
@@ -1455,7 +1553,7 @@
 
   @override
   buildPropertyAccess(
-      IncompleteSend send, int operatorOffset, bool isNullAware) {
+      IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
     return this;
   }
 
@@ -1545,8 +1643,10 @@
 
   final bool isSuper;
 
-  ThisAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, this.isInitializer,
+  ThisAccessGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.isInitializer,
       {this.isSuper: false})
       : super(helper, token);
 
@@ -1577,11 +1677,11 @@
   }
 
   buildPropertyAccess(
-      IncompleteSend send, int operatorOffset, bool isNullAware) {
+      IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
     Name name = send.name;
     Arguments arguments = send.arguments;
     int offset = offsetForToken(send.token);
-    if (isInitializer && send is SendAccessor) {
+    if (isInitializer && send is SendAccessGenerator) {
       if (isNullAware) {
         helper.deprecated_addCompileTimeError(
             operatorOffset, "Expected '.'\nTry removing '?'.");
@@ -1589,7 +1689,7 @@
       return buildConstructorInitializer(offset, name, arguments);
     }
     Member getter = helper.lookupInstanceMember(name, isSuper: isSuper);
-    if (send is SendAccessor) {
+    if (send is SendAccessGenerator) {
       // Notice that 'this' or 'super' can't be null. So we can ignore the
       // value of [isNullAware].
       if (getter == null) {
@@ -1630,11 +1730,8 @@
     Constructor constructor = helper.lookupConstructor(name, isSuper: isSuper);
     LocatedMessage argMessage;
     if (constructor != null) {
-      argMessage = helper.checkArguments(
-          new FunctionTypeAccessor.fromNode(constructor.function),
-          arguments,
-          CalleeDesignation.Constructor,
-          offset, <TypeParameter>[]);
+      argMessage = helper.checkArgumentsForFunction(
+          constructor.function, arguments, offset, <TypeParameter>[]);
     }
     if (constructor == null || argMessage != null) {
       return helper.buildInvalidInitializer(
@@ -1696,13 +1793,13 @@
 
   @override
   kernel.Expression _makeRead(ShadowComplexAssignment complexAssignment) {
-    return unimplemented("_makeRead", offsetForToken(token), uri);
+    return unsupported("_makeRead", offsetForToken(token), uri);
   }
 
   @override
   kernel.Expression _makeWrite(kernel.Expression value, bool voidContext,
       ShadowComplexAssignment complexAssignment) {
-    return unimplemented("_makeWrite", offsetForToken(token), uri);
+    return unsupported("_makeWrite", offsetForToken(token), uri);
   }
 
   @override
@@ -1714,6 +1811,478 @@
   }
 }
 
+abstract class IncompleteSendGenerator<Arguments> extends Generator<Arguments> {
+  final Name name;
+
+  IncompleteSendGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.name)
+      : super(helper, token);
+
+  withReceiver(Object receiver, int operatorOffset, {bool isNullAware});
+
+  Arguments get arguments => null;
+
+  @override
+  kernel.Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+    return unsupported("_makeRead", offsetForToken(token), uri);
+  }
+
+  @override
+  kernel.Expression _makeWrite(kernel.Expression value, bool voidContext,
+      ShadowComplexAssignment complexAssignment) {
+    return unsupported("_makeWrite", offsetForToken(token), uri);
+  }
+
+  @override
+  void printOn(StringSink sink) {
+    sink.write(", name: ");
+    sink.write(name.name);
+  }
+}
+
+class UnresolvedNameGenerator<Arguments> extends Generator<Arguments>
+    with ErroneousExpressionGenerator<Arguments> {
+  @override
+  final Name name;
+
+  UnresolvedNameGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.name)
+      : super(helper, token);
+
+  String get debugName => "UnresolvedNameGenerator";
+
+  kernel.Expression doInvocation(int charOffset, Arguments arguments) {
+    return buildError(arguments, offset: charOffset);
+  }
+
+  @override
+  DartType buildErroneousTypeNotAPrefix(Identifier suffix) {
+    helper.addProblem(
+        templateUnresolvedPrefixInTypeAnnotation.withArguments(
+            name.name, suffix.name),
+        offsetForToken(token),
+        lengthOfSpan(token, suffix.token));
+    return const InvalidType();
+  }
+
+  @override
+  kernel.Expression buildError(Arguments arguments,
+      {bool isGetter: false, bool isSetter: false, int offset}) {
+    offset ??= offsetForToken(this.token);
+    return helper.throwNoSuchMethodError(
+        storeOffset(forest.literalNull(null), offset),
+        plainNameForRead,
+        arguments,
+        offset,
+        isGetter: isGetter,
+        isSetter: isSetter);
+  }
+
+  @override
+  kernel.Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+    return unsupported("_makeRead", offsetForToken(token), uri);
+  }
+
+  @override
+  kernel.Expression _makeWrite(kernel.Expression value, bool voidContext,
+      ShadowComplexAssignment complexAssignment) {
+    return unsupported("_makeWrite", offsetForToken(token), uri);
+  }
+
+  @override
+  void printOn(StringSink sink) {
+    sink.write(", name: ");
+    sink.write(name.name);
+  }
+}
+
+class IncompleteErrorGenerator<Arguments>
+    extends IncompleteSendGenerator<Arguments>
+    with ErroneousExpressionGenerator<Arguments> {
+  final Message message;
+
+  IncompleteErrorGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.message)
+      : super(helper, token, null);
+
+  String get debugName => "IncompleteErrorGenerator";
+
+  @override
+  kernel.Expression buildError(Arguments arguments,
+      {bool isGetter: false, bool isSetter: false, int offset}) {
+    int length = noLength;
+    if (offset == null) {
+      offset = offsetForToken(token);
+      length = lengthForToken(token);
+    }
+    return helper.buildCompileTimeError(message, offset, length);
+  }
+
+  @override
+  DartType buildErroneousTypeNotAPrefix(Identifier suffix) {
+    helper.addProblem(
+        templateNotAPrefixInTypeAnnotation.withArguments(
+            token.lexeme, suffix.name),
+        offsetForToken(token),
+        lengthOfSpan(token, suffix.token));
+    return const InvalidType();
+  }
+
+  @override
+  doInvocation(int offset, Arguments arguments) => this;
+
+  @override
+  void printOn(StringSink sink) {
+    sink.write(", message: ");
+    sink.write(message.code.name);
+  }
+}
+
+class SendAccessGenerator<Arguments>
+    extends IncompleteSendGenerator<Arguments> {
+  @override
+  final Arguments arguments;
+
+  SendAccessGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      Name name,
+      this.arguments)
+      : super(helper, token, name) {
+    assert(arguments != null);
+  }
+
+  String get plainNameForRead => name.name;
+
+  String get debugName => "SendAccessGenerator";
+
+  kernel.Expression buildSimpleRead() {
+    return unsupported("buildSimpleRead", offsetForToken(token), uri);
+  }
+
+  kernel.Expression buildAssignment(kernel.Expression value,
+      {bool voidContext: false}) {
+    return unsupported("buildAssignment", offsetForToken(token), uri);
+  }
+
+  withReceiver(Object receiver, int operatorOffset, {bool isNullAware: false}) {
+    if (receiver is Generator) {
+      return receiver.buildPropertyAccess(this, operatorOffset, isNullAware);
+    }
+    if (receiver is PrefixBuilder) {
+      PrefixBuilder prefix = receiver;
+      if (isNullAware) {
+        helper.deprecated_addCompileTimeError(
+            offsetForToken(token),
+            "Library prefix '${prefix.name}' can't be used with null-aware "
+            "operator.\nTry removing '?'.");
+      }
+      receiver = helper.scopeLookup(prefix.exportScope, name.name, token,
+          isQualified: true, prefix: prefix);
+      return helper.finishSend(receiver, arguments, offsetForToken(token));
+    }
+    return helper.buildMethodInvocation(
+        helper.toValue(receiver), name, arguments, offsetForToken(token),
+        isNullAware: isNullAware);
+  }
+
+  kernel.Expression buildNullAwareAssignment(
+      kernel.Expression value, DartType type, int offset,
+      {bool voidContext: false}) {
+    return unsupported("buildNullAwareAssignment", offset, uri);
+  }
+
+  kernel.Expression buildCompoundAssignment(
+      Name binaryOperator, kernel.Expression value,
+      {int offset,
+      bool voidContext: false,
+      Procedure interfaceTarget,
+      bool isPreIncDec: false}) {
+    return unsupported(
+        "buildCompoundAssignment", offset ?? offsetForToken(token), uri);
+  }
+
+  kernel.Expression buildPrefixIncrement(Name binaryOperator,
+      {int offset, bool voidContext: false, Procedure interfaceTarget}) {
+    return unsupported(
+        "buildPrefixIncrement", offset ?? offsetForToken(token), uri);
+  }
+
+  kernel.Expression buildPostfixIncrement(Name binaryOperator,
+      {int offset, bool voidContext: false, Procedure interfaceTarget}) {
+    return unsupported(
+        "buildPostfixIncrement", offset ?? offsetForToken(token), uri);
+  }
+
+  kernel.Expression doInvocation(int offset, Arguments arguments) {
+    return unsupported("doInvocation", offset, uri);
+  }
+
+  @override
+  void printOn(StringSink sink) {
+    super.printOn(sink);
+    sink.write(", arguments: ");
+    var node = arguments;
+    if (node is kernel.Node) {
+      printNodeOn(node, sink);
+    } else {
+      sink.write(node);
+    }
+  }
+}
+
+class IncompletePropertyAccessGenerator<Arguments>
+    extends IncompleteSendGenerator<Arguments> {
+  IncompletePropertyAccessGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      Name name)
+      : super(helper, token, name);
+
+  String get plainNameForRead => name.name;
+
+  String get debugName => "IncompletePropertyAccessGenerator";
+
+  kernel.Expression buildSimpleRead() {
+    return unsupported("buildSimpleRead", offsetForToken(token), uri);
+  }
+
+  kernel.Expression buildAssignment(kernel.Expression value,
+      {bool voidContext: false}) {
+    return unsupported("buildAssignment", offsetForToken(token), uri);
+  }
+
+  withReceiver(Object receiver, int operatorOffset, {bool isNullAware: false}) {
+    if (receiver is Generator) {
+      return receiver.buildPropertyAccess(this, operatorOffset, isNullAware);
+    }
+    if (receiver is PrefixBuilder) {
+      PrefixBuilder prefix = receiver;
+      if (isNullAware) {
+        helper.deprecated_addCompileTimeError(
+            offsetForToken(token),
+            "Library prefix '${prefix.name}' can't be used with null-aware "
+            "operator.\nTry removing '?'.");
+      }
+      return helper.scopeLookup(prefix.exportScope, name.name, token,
+          isQualified: true, prefix: prefix);
+    }
+
+    return PropertyAccessGenerator.make(
+        helper, token, helper.toValue(receiver), name, null, null, isNullAware);
+  }
+
+  kernel.Expression buildNullAwareAssignment(
+      kernel.Expression value, DartType type, int offset,
+      {bool voidContext: false}) {
+    return unsupported("buildNullAwareAssignment", offset, uri);
+  }
+
+  kernel.Expression buildCompoundAssignment(
+      Name binaryOperator, kernel.Expression value,
+      {int offset,
+      bool voidContext: false,
+      Procedure interfaceTarget,
+      bool isPreIncDec: false}) {
+    return unsupported(
+        "buildCompoundAssignment", offset ?? offsetForToken(token), uri);
+  }
+
+  kernel.Expression buildPrefixIncrement(Name binaryOperator,
+      {int offset, bool voidContext: false, Procedure interfaceTarget}) {
+    return unsupported(
+        "buildPrefixIncrement", offset ?? offsetForToken(token), uri);
+  }
+
+  kernel.Expression buildPostfixIncrement(Name binaryOperator,
+      {int offset, bool voidContext: false, Procedure interfaceTarget}) {
+    return unsupported(
+        "buildPostfixIncrement", offset ?? offsetForToken(token), uri);
+  }
+
+  kernel.Expression doInvocation(int offset, Arguments arguments) {
+    return unsupported("doInvocation", offset, uri);
+  }
+}
+
+class ParenthesizedExpressionGenerator<Arguments>
+    extends ReadOnlyAccessGenerator<Arguments> {
+  ParenthesizedExpressionGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      kernel.Expression expression)
+      : super(helper, token, expression, null);
+
+  String get debugName => "ParenthesizedExpressionGenerator";
+
+  kernel.Expression makeInvalidWrite(kernel.Expression value) {
+    return helper.deprecated_buildCompileTimeError(
+        "Can't assign to a parenthesized expression.", offsetForToken(token));
+  }
+}
+
+class TypeDeclarationAccessGenerator<Arguments>
+    extends ReadOnlyAccessGenerator<Arguments> {
+  /// The import prefix preceding the [declaration] reference, or `null` if
+  /// the reference is not prefixed.
+  final PrefixBuilder prefix;
+
+  /// The offset at which the [declaration] is referenced by this generator,
+  /// or `-1` if the reference is implicit.
+  final int declarationReferenceOffset;
+
+  final TypeDeclarationBuilder declaration;
+
+  TypeDeclarationAccessGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.prefix,
+      this.declarationReferenceOffset,
+      this.declaration,
+      String plainNameForRead)
+      : super(helper, token, null, plainNameForRead);
+
+  String get debugName => "TypeDeclarationAccessGenerator";
+
+  kernel.Expression get expression {
+    if (super.expression == null) {
+      int offset = offsetForToken(token);
+      if (declaration is KernelInvalidTypeBuilder) {
+        KernelInvalidTypeBuilder declaration = this.declaration;
+        helper.addProblemErrorIfConst(
+            declaration.message.messageObject, offset, token.length);
+        super.expression =
+            new Throw(forest.literalString(declaration.message.message, token))
+              ..fileOffset = offset;
+      } else {
+        super.expression = forest.literalType(
+            buildTypeWithBuiltArguments(null, nonInstanceAccessIsError: true),
+            token);
+      }
+    }
+    return super.expression;
+  }
+
+  kernel.Expression makeInvalidWrite(kernel.Expression value) {
+    return buildThrowNoSuchMethodError(
+        forest.literalNull(token),
+        storeOffset(forest.arguments(<kernel.Expression>[value], null),
+            value.fileOffset),
+        isSetter: true);
+  }
+
+  @override
+  buildPropertyAccess(
+      IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
+    // `SomeType?.toString` is the same as `SomeType.toString`, not
+    // `(SomeType).toString`.
+    isNullAware = false;
+
+    Name name = send.name;
+    Arguments arguments = send.arguments;
+
+    if (declaration is KernelClassBuilder) {
+      KernelClassBuilder declaration = this.declaration;
+      Builder builder = declaration.findStaticBuilder(
+          name.name, offsetForToken(token), uri, helper.library);
+
+      Generator generator;
+      if (builder == null) {
+        // If we find a setter, [builder] is an [AccessErrorBuilder], not null.
+        if (send is IncompletePropertyAccessGenerator) {
+          generator = new UnresolvedNameGenerator(helper, send.token, name);
+        } else {
+          return helper.buildConstructorInvocation(declaration, send.token,
+              arguments, name.name, null, token.charOffset, Constness.implicit);
+        }
+      } else {
+        Builder setter;
+        if (builder.isSetter) {
+          setter = builder;
+        } else if (builder.isGetter) {
+          setter = declaration.findStaticBuilder(
+              name.name, offsetForToken(token), uri, helper.library,
+              isSetter: true);
+        } else if (builder.isField && !builder.isFinal) {
+          setter = builder;
+        }
+        generator = new StaticAccessGenerator.fromBuilder(
+            helper, builder, send.token, setter);
+      }
+
+      return arguments == null
+          ? generator
+          : generator.doInvocation(offsetForToken(send.token), arguments);
+    } else {
+      return super.buildPropertyAccess(send, operatorOffset, isNullAware);
+    }
+  }
+
+  @override
+  DartType buildTypeWithBuiltArguments(List<DartType> arguments,
+      {bool nonInstanceAccessIsError: false}) {
+    if (arguments != null) {
+      int expected = 0;
+      if (declaration is KernelClassBuilder) {
+        expected = declaration.target.typeParameters.length;
+      } else if (declaration is FunctionTypeAliasBuilder) {
+        expected = declaration.target.typeParameters.length;
+      } else if (declaration is KernelTypeVariableBuilder) {
+        // Type arguments on a type variable - error reported elsewhere.
+      } else if (declaration is BuiltinTypeBuilder) {
+        // Type arguments on a built-in type, for example, dynamic or void.
+        expected = 0;
+      } else {
+        return unhandled(
+            "${declaration.runtimeType}",
+            "TypeDeclarationAccessGenerator.buildType",
+            offsetForToken(token),
+            helper.uri);
+      }
+      if (arguments.length != expected) {
+        helper.warnTypeArgumentsMismatch(
+            declaration.name, expected, offsetForToken(token));
+        // We ignore the provided arguments, which will in turn return the
+        // raw type below.
+        // TODO(sigmund): change to use an InvalidType and include the raw type
+        // as a recovery node once the IR can represent it (Issue #29840).
+        arguments = null;
+      }
+    }
+
+    DartType type;
+    if (arguments == null) {
+      TypeDeclarationBuilder typeDeclaration = declaration;
+      if (typeDeclaration is KernelClassBuilder) {
+        type = typeDeclaration.buildType(helper.library, null);
+      } else if (typeDeclaration is KernelFunctionTypeAliasBuilder) {
+        type = typeDeclaration.buildType(helper.library, null);
+      }
+    }
+    if (type == null) {
+      type =
+          declaration.buildTypesWithBuiltArguments(helper.library, arguments);
+    }
+    if (type is TypeParameterType) {
+      return helper.validatedTypeVariableUse(
+          type, offsetForToken(token), nonInstanceAccessIsError);
+    }
+    return type;
+  }
+
+  @override
+  kernel.Expression doInvocation(int offset, Arguments arguments) {
+    return helper.buildConstructorInvocation(declaration, token, arguments, "",
+        null, token.charOffset, Constness.implicit);
+  }
+}
+
 kernel.Expression makeLet(
     VariableDeclaration variable, kernel.Expression body) {
   if (variable == null) return body;
@@ -1725,7 +2294,7 @@
     Name operator,
     Procedure interfaceTarget,
     kernel.Expression right,
-    BuilderHelper<dynamic, dynamic, Arguments> helper,
+    ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
     {int offset: TreeNode.noOffset}) {
   return new ShadowMethodInvocation(
       left,
@@ -1739,7 +2308,7 @@
 }
 
 kernel.Expression buildIsNull<Arguments>(kernel.Expression value, int offset,
-    BuilderHelper<dynamic, dynamic, Arguments> helper) {
+    ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper) {
   return makeBinary(value, equalsName, null,
       helper.storeOffset(helper.forest.literalNull(null), offset), helper,
       offset: offset);
@@ -1750,3 +2319,13 @@
   // or is fresh (hence needs a let binding).
   return new VariableDeclaration.forValue(value);
 }
+
+int adjustForImplicitCall(String name, int offset) {
+  // Normally the offset is at the start of the token, but in this case,
+  // because we insert a '.call', we want it at the end instead.
+  return offset + (name?.length ?? 0);
+}
+
+bool isFieldOrGetter(Member member) {
+  return member is Field || (member is Procedure && member.isGetter);
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
new file mode 100644
index 0000000..5af746c
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
@@ -0,0 +1,153 @@
+// 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.expression_generator_helper;
+
+import '../../scanner/token.dart' show Token;
+
+import '../constant_context.dart' show ConstantContext;
+
+import '../fasta_codes.dart' show LocatedMessage;
+
+import '../messages.dart' show Message;
+
+import '../scope.dart' show ProblemBuilder, Scope;
+
+import '../type_inference/type_promotion.dart' show TypePromoter;
+
+import 'constness.dart' show Constness;
+
+import 'forest.dart' show Forest;
+
+import 'kernel_builder.dart' show PrefixBuilder;
+
+import 'kernel_ast_api.dart'
+    show
+        Constructor,
+        DartType,
+        FunctionNode,
+        FunctionType,
+        Initializer,
+        Member,
+        Name,
+        Procedure,
+        StaticGet,
+        TypeParameter,
+        TypeParameterType;
+
+import 'kernel_builder.dart'
+    show
+        KernelPrefixBuilder,
+        LibraryBuilder,
+        PrefixBuilder,
+        TypeDeclarationBuilder;
+
+abstract class ExpressionGeneratorHelper<Expression, Statement, Arguments> {
+  LibraryBuilder get library;
+
+  Uri get uri;
+
+  TypePromoter get typePromoter;
+
+  int get functionNestingLevel;
+
+  ConstantContext get constantContext;
+
+  Forest<Expression, Statement, Token, Arguments> get forest;
+
+  Constructor lookupConstructor(Name name, {bool isSuper});
+
+  Expression toValue(node);
+
+  Member lookupInstanceMember(Name name, {bool isSetter, bool isSuper});
+
+  scopeLookup(Scope scope, String name, Token token,
+      {bool isQualified: false, PrefixBuilder prefix});
+
+  finishSend(Object receiver, Arguments arguments, int offset);
+
+  Expression buildCompileTimeError(Message message, int charOffset, int length,
+      {List<LocatedMessage> context});
+
+  Expression wrapInCompileTimeError(Expression expression, Message message);
+
+  Expression deprecated_buildCompileTimeError(String error, [int offset]);
+
+  Initializer buildInvalidInitializer(Expression expression, [int offset]);
+
+  Initializer buildFieldInitializer(
+      bool isSynthetic, String name, int offset, Expression expression);
+
+  Initializer buildSuperInitializer(
+      bool isSynthetic, Constructor constructor, Arguments arguments,
+      [int offset]);
+
+  Initializer buildRedirectingInitializer(
+      Constructor constructor, Arguments arguments,
+      [int charOffset = -1]);
+
+  Expression buildStaticInvocation(Procedure target, Arguments arguments,
+      {Constness constness, int charOffset, Member initialTarget});
+
+  Expression buildProblemExpression(
+      ProblemBuilder builder, int offset, int length);
+
+  Expression throwNoSuchMethodError(
+      Expression receiver, String name, Arguments arguments, int offset,
+      {Member candidate,
+      bool isSuper,
+      bool isGetter,
+      bool isSetter,
+      bool isStatic,
+      LocatedMessage argMessage});
+
+  LocatedMessage checkArgumentsForFunction(FunctionNode function,
+      Arguments arguments, int offset, List<TypeParameter> typeParameters);
+
+  LocatedMessage checkArgumentsForType(
+      FunctionType function, Arguments arguments, int offset);
+
+  StaticGet makeStaticGet(Member readTarget, Token token);
+
+  Expression wrapInDeferredCheck(
+      Expression expression, KernelPrefixBuilder prefix, int charOffset);
+
+  dynamic deprecated_addCompileTimeError(int charOffset, String message);
+
+  bool isIdentical(Member member);
+
+  Expression buildMethodInvocation(
+      Expression receiver, Name name, Arguments arguments, int offset,
+      {bool isConstantExpression,
+      bool isNullAware,
+      bool isImplicitCall,
+      bool isSuper,
+      Member interfaceTarget});
+
+  Expression buildConstructorInvocation(
+      TypeDeclarationBuilder type,
+      Token nameToken,
+      Arguments arguments,
+      String name,
+      List<DartType> typeArguments,
+      int charOffset,
+      Constness constness);
+
+  DartType validatedTypeVariableUse(
+      TypeParameterType type, int offset, bool nonInstanceAccessIsError);
+
+  void addProblem(Message message, int charOffset, int length);
+
+  void addProblemErrorIfConst(Message message, int charOffset, int length);
+
+  Message warnUnresolvedGet(Name name, int charOffset, {bool isSuper});
+
+  Message warnUnresolvedSet(Name name, int charOffset, {bool isSuper});
+
+  Message warnUnresolvedMethod(Name name, int charOffset, {bool isSuper});
+
+  void warnTypeArgumentsMismatch(String name, int expected, int charOffset);
+
+  T storeOffset<T>(T node, int offset);
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_impl.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_impl.dart
deleted file mode 100644
index 603841f..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator_impl.dart
+++ /dev/null
@@ -1,730 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of 'expression_generator.dart';
-
-abstract class BuilderHelper<Expression, Statement, Arguments> {
-  LibraryBuilder get library;
-
-  Uri get uri;
-
-  TypePromoter get typePromoter;
-
-  int get functionNestingLevel;
-
-  ConstantContext get constantContext;
-
-  Forest<Expression, Statement, Token, Arguments> get forest;
-
-  Constructor lookupConstructor(Name name, {bool isSuper});
-
-  Expression toValue(node);
-
-  Member lookupInstanceMember(Name name, {bool isSetter, bool isSuper});
-
-  scopeLookup(Scope scope, String name, Token token,
-      {bool isQualified: false, PrefixBuilder prefix});
-
-  finishSend(Object receiver, Arguments arguments, int offset);
-
-  Expression buildCompileTimeError(Message message, int charOffset, int length,
-      {List<LocatedMessage> context});
-
-  Expression wrapInCompileTimeError(Expression expression, Message message);
-
-  Expression deprecated_buildCompileTimeError(String error, [int offset]);
-
-  Initializer buildInvalidInitializer(Expression expression, [int offset]);
-
-  Initializer buildFieldInitializer(
-      bool isSynthetic, String name, int offset, Expression expression);
-
-  Initializer buildSuperInitializer(
-      bool isSynthetic, Constructor constructor, Arguments arguments,
-      [int offset]);
-
-  Initializer buildRedirectingInitializer(
-      Constructor constructor, Arguments arguments,
-      [int charOffset = -1]);
-
-  Expression buildStaticInvocation(Procedure target, Arguments arguments,
-      {Constness constness, int charOffset, Member initialTarget});
-
-  Expression buildProblemExpression(
-      ProblemBuilder builder, int offset, int length);
-
-  Expression throwNoSuchMethodError(
-      Expression receiver, String name, Arguments arguments, int offset,
-      {Member candidate,
-      bool isSuper,
-      bool isGetter,
-      bool isSetter,
-      bool isStatic,
-      LocatedMessage argMessage});
-
-  LocatedMessage checkArguments(FunctionTypeAccessor function,
-      Arguments arguments, CalleeDesignation calleeKind, int offset,
-      [List<TypeParameter> typeParameters]);
-
-  StaticGet makeStaticGet(Member readTarget, Token token);
-
-  Expression wrapInDeferredCheck(
-      Expression expression, KernelPrefixBuilder prefix, int charOffset);
-
-  dynamic deprecated_addCompileTimeError(int charOffset, String message);
-
-  bool isIdentical(Member member);
-
-  Expression buildMethodInvocation(
-      Expression receiver, Name name, Arguments arguments, int offset,
-      {bool isConstantExpression,
-      bool isNullAware,
-      bool isImplicitCall,
-      bool isSuper,
-      Member interfaceTarget});
-
-  Expression buildConstructorInvocation(
-      TypeDeclarationBuilder type,
-      Token nameToken,
-      Arguments arguments,
-      String name,
-      List<DartType> typeArguments,
-      int charOffset,
-      Constness constness);
-
-  DartType validatedTypeVariableUse(
-      TypeParameterType type, int offset, bool nonInstanceAccessIsError);
-
-  void addProblem(Message message, int charOffset, int length);
-
-  void addProblemErrorIfConst(Message message, int charOffset, int length);
-
-  Message warnUnresolvedGet(Name name, int charOffset, {bool isSuper});
-
-  Message warnUnresolvedSet(Name name, int charOffset, {bool isSuper});
-
-  Message warnUnresolvedMethod(Name name, int charOffset, {bool isSuper});
-
-  void warnTypeArgumentsMismatch(String name, int expected, int charOffset);
-
-  T storeOffset<T>(T node, int offset);
-}
-
-// The name used to refer to a call target kind
-enum CalleeDesignation { Function, Method, Constructor }
-
-// Abstraction over FunctionNode and FunctionType to access the
-// number and names of parameters.
-class FunctionTypeAccessor {
-  int requiredParameterCount;
-  int positionalParameterCount;
-
-  List _namedParameters;
-
-  Set<String> get namedParameterNames {
-    return new Set.from(_namedParameters.map((a) => a.name));
-  }
-
-  factory FunctionTypeAccessor.fromNode(FunctionNode node) {
-    return new FunctionTypeAccessor._(node.requiredParameterCount,
-        node.positionalParameters.length, node.namedParameters);
-  }
-
-  factory FunctionTypeAccessor.fromType(FunctionType type) {
-    return new FunctionTypeAccessor._(type.requiredParameterCount,
-        type.positionalParameters.length, type.namedParameters);
-  }
-
-  FunctionTypeAccessor._(this.requiredParameterCount,
-      this.positionalParameterCount, this._namedParameters);
-}
-
-// TODO(ahe): Merge this into [Generator] when all uses have been updated.
-abstract class FastaAccessor<Arguments> implements Accessor<Arguments> {
-  BuilderHelper<dynamic, dynamic, Arguments> get helper;
-
-  // TODO(ahe): Change type arguments.
-  Forest<kernel.Expression, kernel.Statement, Token, Arguments> get forest =>
-      helper.forest;
-
-  String get plainNameForRead;
-
-  String get debugName;
-
-  Uri get uri => helper.uri;
-
-  String get plainNameForWrite => plainNameForRead;
-
-  bool get isInitializer => false;
-
-  T storeOffset<T>(T node, int offset) {
-    return helper.storeOffset(node, offset);
-  }
-
-  kernel.Expression buildForEffect() => buildSimpleRead();
-
-  Initializer buildFieldInitializer(Map<String, int> initializedFields) {
-    int offset = offsetForToken(token);
-    return helper.buildInvalidInitializer(
-        helper.buildCompileTimeError(
-            messageInvalidInitializer, offset, lengthForToken(token)),
-        offset);
-  }
-
-  kernel.Expression makeInvalidRead() {
-    return buildThrowNoSuchMethodError(
-        forest.literalNull(token), forest.argumentsEmpty(noLocation),
-        isGetter: true);
-  }
-
-  kernel.Expression makeInvalidWrite(kernel.Expression value) {
-    return buildThrowNoSuchMethodError(forest.literalNull(token),
-        forest.arguments(<kernel.Expression>[value], noLocation),
-        isSetter: true);
-  }
-
-  /* kernel.Expression | FastaAccessor | Initializer */ doInvocation(
-      int offset, Arguments arguments);
-
-  /* kernel.Expression | FastaAccessor */ buildPropertyAccess(
-      IncompleteSend send, int operatorOffset, bool isNullAware) {
-    if (send is SendAccessor) {
-      return helper.buildMethodInvocation(buildSimpleRead(), send.name,
-          send.arguments, offsetForToken(send.token),
-          isNullAware: isNullAware);
-    } else {
-      if (helper.constantContext != ConstantContext.none &&
-          send.name != lengthName) {
-        helper.deprecated_addCompileTimeError(
-            offsetForToken(token), "Not a constant expression.");
-      }
-      return PropertyAccessGenerator.make(helper, send.token, buildSimpleRead(),
-          send.name, null, null, isNullAware);
-    }
-  }
-
-  DartType buildTypeWithBuiltArguments(List<DartType> arguments,
-      {bool nonInstanceAccessIsError: false}) {
-    helper.addProblem(templateNotAType.withArguments(token.lexeme),
-        offsetForToken(token), lengthForToken(token));
-    return const InvalidType();
-  }
-
-  /* kernel.Expression | FastaAccessor */ buildThrowNoSuchMethodError(
-      kernel.Expression receiver, Arguments arguments,
-      {bool isSuper: false,
-      bool isGetter: false,
-      bool isSetter: false,
-      bool isStatic: false,
-      String name,
-      int offset,
-      LocatedMessage argMessage}) {
-    return helper.throwNoSuchMethodError(receiver, name ?? plainNameForWrite,
-        arguments, offset ?? offsetForToken(this.token),
-        isGetter: isGetter,
-        isSetter: isSetter,
-        isSuper: isSuper,
-        isStatic: isStatic,
-        argMessage: argMessage);
-  }
-
-  bool get isThisPropertyAccess => false;
-
-  @override
-  ShadowComplexAssignment startComplexAssignment(kernel.Expression rhs) =>
-      new ShadowIllegalAssignment(rhs);
-
-  void printOn(StringSink sink);
-
-  String toString() {
-    StringBuffer buffer = new StringBuffer();
-    buffer.write(debugName);
-    buffer.write("(offset: ");
-    buffer.write("${offsetForToken(token)}");
-    printOn(buffer);
-    buffer.write(")");
-    return "$buffer";
-  }
-}
-
-abstract class GeneratorImpl {
-  Token get token;
-
-  Uri get uri;
-
-  kernel.Expression _finish(
-      kernel.Expression body, ShadowComplexAssignment complexAssignment) {
-    return unimplemented("_finish", offsetForToken(token), uri);
-  }
-
-  kernel.Expression _makeSimpleRead() {
-    return unimplemented("_makeSimpleRead", offsetForToken(token), uri);
-  }
-
-  kernel.Expression _makeSimpleWrite(kernel.Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
-    return unimplemented("_makeSimpleWrite", offsetForToken(token), uri);
-  }
-
-  kernel.Expression _makeRead(ShadowComplexAssignment complexAssignment) {
-    return unimplemented("_makeRead", offsetForToken(token), uri);
-  }
-
-  kernel.Expression _makeWrite(kernel.Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
-    return unimplemented("_makeWrite", offsetForToken(token), uri);
-  }
-}
-
-abstract class IncompleteSend<Arguments> extends FastaAccessor<Arguments>
-    with GeneratorImpl {
-  final BuilderHelper<dynamic, dynamic, Arguments> helper;
-
-  @override
-  final Token token;
-
-  final Name name;
-
-  IncompleteSend(this.helper, this.token, this.name);
-
-  withReceiver(Object receiver, int operatorOffset, {bool isNullAware});
-
-  Arguments get arguments => null;
-
-  @override
-  void printOn(StringSink sink) {
-    sink.write(", name: ");
-    sink.write(name.name);
-  }
-}
-
-class IncompleteError<Arguments> extends IncompleteSend<Arguments>
-    with ErroneousExpressionGenerator<Arguments> {
-  final Message message;
-
-  IncompleteError(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, this.message)
-      : super(helper, token, null);
-
-  String get debugName => "IncompleteError";
-
-  @override
-  kernel.Expression buildError(Arguments arguments,
-      {bool isGetter: false, bool isSetter: false, int offset}) {
-    int length = noLength;
-    if (offset == null) {
-      offset = offsetForToken(token);
-      length = lengthForToken(token);
-    }
-    return helper.buildCompileTimeError(message, offset, length);
-  }
-
-  @override
-  DartType buildErroneousTypeNotAPrefix(Identifier suffix) {
-    helper.addProblem(
-        templateNotAPrefixInTypeAnnotation.withArguments(
-            token.lexeme, suffix.name),
-        offsetForToken(token),
-        lengthOfSpan(token, suffix.token));
-    return const InvalidType();
-  }
-
-  @override
-  doInvocation(int offset, Arguments arguments) => this;
-
-  @override
-  void printOn(StringSink sink) {
-    sink.write(", message: ");
-    sink.write(message.code.name);
-  }
-}
-
-class SendAccessor<Arguments> extends IncompleteSend<Arguments> {
-  @override
-  final Arguments arguments;
-
-  SendAccessor(BuilderHelper<dynamic, dynamic, Arguments> helper, Token token,
-      Name name, this.arguments)
-      : super(helper, token, name) {
-    assert(arguments != null);
-  }
-
-  String get plainNameForRead => name.name;
-
-  String get debugName => "SendAccessor";
-
-  kernel.Expression buildSimpleRead() {
-    return unsupported("buildSimpleRead", offsetForToken(token), uri);
-  }
-
-  kernel.Expression buildAssignment(kernel.Expression value,
-      {bool voidContext: false}) {
-    return unsupported("buildAssignment", offsetForToken(token), uri);
-  }
-
-  withReceiver(Object receiver, int operatorOffset, {bool isNullAware: false}) {
-    if (receiver is FastaAccessor) {
-      return receiver.buildPropertyAccess(this, operatorOffset, isNullAware);
-    }
-    if (receiver is PrefixBuilder) {
-      PrefixBuilder prefix = receiver;
-      if (isNullAware) {
-        helper.deprecated_addCompileTimeError(
-            offsetForToken(token),
-            "Library prefix '${prefix.name}' can't be used with null-aware "
-            "operator.\nTry removing '?'.");
-      }
-      receiver = helper.scopeLookup(prefix.exportScope, name.name, token,
-          isQualified: true, prefix: prefix);
-      return helper.finishSend(receiver, arguments, offsetForToken(token));
-    }
-    return helper.buildMethodInvocation(
-        helper.toValue(receiver), name, arguments, offsetForToken(token),
-        isNullAware: isNullAware);
-  }
-
-  kernel.Expression buildNullAwareAssignment(
-      kernel.Expression value, DartType type, int offset,
-      {bool voidContext: false}) {
-    return unsupported("buildNullAwareAssignment", offset, uri);
-  }
-
-  kernel.Expression buildCompoundAssignment(
-      Name binaryOperator, kernel.Expression value,
-      {int offset,
-      bool voidContext: false,
-      Procedure interfaceTarget,
-      bool isPreIncDec: false}) {
-    return unsupported(
-        "buildCompoundAssignment", offset ?? offsetForToken(token), uri);
-  }
-
-  kernel.Expression buildPrefixIncrement(Name binaryOperator,
-      {int offset, bool voidContext: false, Procedure interfaceTarget}) {
-    return unsupported(
-        "buildPrefixIncrement", offset ?? offsetForToken(token), uri);
-  }
-
-  kernel.Expression buildPostfixIncrement(Name binaryOperator,
-      {int offset, bool voidContext: false, Procedure interfaceTarget}) {
-    return unsupported(
-        "buildPostfixIncrement", offset ?? offsetForToken(token), uri);
-  }
-
-  kernel.Expression doInvocation(int offset, Arguments arguments) {
-    return unsupported("doInvocation", offset, uri);
-  }
-
-  @override
-  void printOn(StringSink sink) {
-    super.printOn(sink);
-    sink.write(", arguments: ");
-    var node = arguments;
-    if (node is kernel.Node) {
-      printNodeOn(node, sink);
-    } else {
-      sink.write(node);
-    }
-  }
-}
-
-class IncompletePropertyAccessor<Arguments> extends IncompleteSend<Arguments> {
-  IncompletePropertyAccessor(
-      BuilderHelper<dynamic, dynamic, Arguments> helper, Token token, Name name)
-      : super(helper, token, name);
-
-  String get plainNameForRead => name.name;
-
-  String get debugName => "IncompletePropertyAccessor";
-
-  kernel.Expression buildSimpleRead() {
-    return unsupported("buildSimpleRead", offsetForToken(token), uri);
-  }
-
-  kernel.Expression buildAssignment(kernel.Expression value,
-      {bool voidContext: false}) {
-    return unsupported("buildAssignment", offsetForToken(token), uri);
-  }
-
-  withReceiver(Object receiver, int operatorOffset, {bool isNullAware: false}) {
-    if (receiver is FastaAccessor) {
-      return receiver.buildPropertyAccess(this, operatorOffset, isNullAware);
-    }
-    if (receiver is PrefixBuilder) {
-      PrefixBuilder prefix = receiver;
-      if (isNullAware) {
-        helper.deprecated_addCompileTimeError(
-            offsetForToken(token),
-            "Library prefix '${prefix.name}' can't be used with null-aware "
-            "operator.\nTry removing '?'.");
-      }
-      return helper.scopeLookup(prefix.exportScope, name.name, token,
-          isQualified: true, prefix: prefix);
-    }
-
-    return PropertyAccessGenerator.make(
-        helper, token, helper.toValue(receiver), name, null, null, isNullAware);
-  }
-
-  kernel.Expression buildNullAwareAssignment(
-      kernel.Expression value, DartType type, int offset,
-      {bool voidContext: false}) {
-    return unsupported("buildNullAwareAssignment", offset, uri);
-  }
-
-  kernel.Expression buildCompoundAssignment(
-      Name binaryOperator, kernel.Expression value,
-      {int offset,
-      bool voidContext: false,
-      Procedure interfaceTarget,
-      bool isPreIncDec: false}) {
-    return unsupported(
-        "buildCompoundAssignment", offset ?? offsetForToken(token), uri);
-  }
-
-  kernel.Expression buildPrefixIncrement(Name binaryOperator,
-      {int offset, bool voidContext: false, Procedure interfaceTarget}) {
-    return unsupported(
-        "buildPrefixIncrement", offset ?? offsetForToken(token), uri);
-  }
-
-  kernel.Expression buildPostfixIncrement(Name binaryOperator,
-      {int offset, bool voidContext: false, Procedure interfaceTarget}) {
-    return unsupported(
-        "buildPostfixIncrement", offset ?? offsetForToken(token), uri);
-  }
-
-  kernel.Expression doInvocation(int offset, Arguments arguments) {
-    return unsupported("doInvocation", offset, uri);
-  }
-}
-
-int adjustForImplicitCall(String name, int offset) {
-  // Normally the offset is at the start of the token, but in this case,
-  // because we insert a '.call', we want it at the end instead.
-  return offset + (name?.length ?? 0);
-}
-
-class ParenthesizedExpression<Arguments>
-    extends ReadOnlyAccessGenerator<Arguments> {
-  ParenthesizedExpression(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, kernel.Expression expression)
-      : super(helper, token, expression, null);
-
-  String get debugName => "ParenthesizedExpression";
-
-  kernel.Expression makeInvalidWrite(kernel.Expression value) {
-    return helper.deprecated_buildCompileTimeError(
-        "Can't assign to a parenthesized expression.", offsetForToken(token));
-  }
-}
-
-class TypeDeclarationAccessor<Arguments>
-    extends ReadOnlyAccessGenerator<Arguments> {
-  /// The import prefix preceding the [declaration] reference, or `null` if
-  /// the reference is not prefixed.
-  final PrefixBuilder prefix;
-
-  /// The offset at which the [declaration] is referenced by this accessor,
-  /// or `-1` if the reference is implicit.
-  final int declarationReferenceOffset;
-
-  final TypeDeclarationBuilder declaration;
-
-  TypeDeclarationAccessor(
-      BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token,
-      this.prefix,
-      this.declarationReferenceOffset,
-      this.declaration,
-      String plainNameForRead)
-      : super(helper, token, null, plainNameForRead);
-
-  String get debugName => "TypeDeclarationAccessor";
-
-  kernel.Expression get expression {
-    if (super.expression == null) {
-      int offset = offsetForToken(token);
-      if (declaration is KernelInvalidTypeBuilder) {
-        KernelInvalidTypeBuilder declaration = this.declaration;
-        helper.addProblemErrorIfConst(
-            declaration.message.messageObject, offset, token.length);
-        super.expression =
-            new Throw(forest.literalString(declaration.message.message, token))
-              ..fileOffset = offset;
-      } else {
-        super.expression = forest.literalType(
-            buildTypeWithBuiltArguments(null, nonInstanceAccessIsError: true),
-            token);
-      }
-    }
-    return super.expression;
-  }
-
-  kernel.Expression makeInvalidWrite(kernel.Expression value) {
-    return buildThrowNoSuchMethodError(
-        forest.literalNull(token),
-        storeOffset(forest.arguments(<kernel.Expression>[value], null),
-            value.fileOffset),
-        isSetter: true);
-  }
-
-  @override
-  buildPropertyAccess(
-      IncompleteSend send, int operatorOffset, bool isNullAware) {
-    // `SomeType?.toString` is the same as `SomeType.toString`, not
-    // `(SomeType).toString`.
-    isNullAware = false;
-
-    Name name = send.name;
-    Arguments arguments = send.arguments;
-
-    if (declaration is KernelClassBuilder) {
-      KernelClassBuilder declaration = this.declaration;
-      Builder builder = declaration.findStaticBuilder(
-          name.name, offsetForToken(token), uri, helper.library);
-
-      FastaAccessor accessor;
-      if (builder == null) {
-        // If we find a setter, [builder] is an [AccessErrorBuilder], not null.
-        if (send is IncompletePropertyAccessor) {
-          accessor = new UnresolvedAccessor(helper, send.token, name);
-        } else {
-          return helper.buildConstructorInvocation(declaration, send.token,
-              arguments, name.name, null, token.charOffset, Constness.implicit);
-        }
-      } else {
-        Builder setter;
-        if (builder.isSetter) {
-          setter = builder;
-        } else if (builder.isGetter) {
-          setter = declaration.findStaticBuilder(
-              name.name, offsetForToken(token), uri, helper.library,
-              isSetter: true);
-        } else if (builder.isField && !builder.isFinal) {
-          setter = builder;
-        }
-        accessor = new StaticAccessGenerator.fromBuilder(
-            helper, builder, send.token, setter);
-      }
-
-      return arguments == null
-          ? accessor
-          : accessor.doInvocation(offsetForToken(send.token), arguments);
-    } else {
-      return super.buildPropertyAccess(send, operatorOffset, isNullAware);
-    }
-  }
-
-  @override
-  DartType buildTypeWithBuiltArguments(List<DartType> arguments,
-      {bool nonInstanceAccessIsError: false}) {
-    if (arguments != null) {
-      int expected = 0;
-      if (declaration is KernelClassBuilder) {
-        expected = declaration.target.typeParameters.length;
-      } else if (declaration is FunctionTypeAliasBuilder) {
-        expected = declaration.target.typeParameters.length;
-      } else if (declaration is KernelTypeVariableBuilder) {
-        // Type arguments on a type variable - error reported elsewhere.
-      } else if (declaration is BuiltinTypeBuilder) {
-        // Type arguments on a built-in type, for example, dynamic or void.
-        expected = 0;
-      } else {
-        return unhandled(
-            "${declaration.runtimeType}",
-            "TypeDeclarationAccessor.buildType",
-            offsetForToken(token),
-            helper.uri);
-      }
-      if (arguments.length != expected) {
-        helper.warnTypeArgumentsMismatch(
-            declaration.name, expected, offsetForToken(token));
-        // We ignore the provided arguments, which will in turn return the
-        // raw type below.
-        // TODO(sigmund): change to use an InvalidType and include the raw type
-        // as a recovery node once the IR can represent it (Issue #29840).
-        arguments = null;
-      }
-    }
-
-    DartType type;
-    if (arguments == null) {
-      TypeDeclarationBuilder typeDeclaration = declaration;
-      if (typeDeclaration is KernelClassBuilder) {
-        type = typeDeclaration.buildType(helper.library, null);
-      } else if (typeDeclaration is KernelFunctionTypeAliasBuilder) {
-        type = typeDeclaration.buildType(helper.library, null);
-      }
-    }
-    if (type == null) {
-      type =
-          declaration.buildTypesWithBuiltArguments(helper.library, arguments);
-    }
-    if (type is TypeParameterType) {
-      return helper.validatedTypeVariableUse(
-          type, offsetForToken(token), nonInstanceAccessIsError);
-    }
-    return type;
-  }
-
-  @override
-  kernel.Expression doInvocation(int offset, Arguments arguments) {
-    return helper.buildConstructorInvocation(declaration, token, arguments, "",
-        null, token.charOffset, Constness.implicit);
-  }
-}
-
-class UnresolvedAccessor<Arguments> extends FastaAccessor<Arguments>
-    with GeneratorImpl, ErroneousExpressionGenerator<Arguments> {
-  @override
-  final Token token;
-
-  @override
-  final BuilderHelper<dynamic, dynamic, Arguments> helper;
-
-  @override
-  final Name name;
-
-  UnresolvedAccessor(this.helper, this.token, this.name);
-
-  String get debugName => "UnresolvedAccessor";
-
-  kernel.Expression doInvocation(int charOffset, Arguments arguments) {
-    return buildError(arguments, offset: charOffset);
-  }
-
-  @override
-  DartType buildErroneousTypeNotAPrefix(Identifier suffix) {
-    helper.addProblem(
-        templateUnresolvedPrefixInTypeAnnotation.withArguments(
-            name.name, suffix.name),
-        offsetForToken(token),
-        lengthOfSpan(token, suffix.token));
-    return const InvalidType();
-  }
-
-  @override
-  kernel.Expression buildError(Arguments arguments,
-      {bool isGetter: false, bool isSetter: false, int offset}) {
-    offset ??= offsetForToken(this.token);
-    return helper.throwNoSuchMethodError(
-        storeOffset(forest.literalNull(null), offset),
-        plainNameForRead,
-        arguments,
-        offset,
-        isGetter: isGetter,
-        isSetter: isSetter);
-  }
-
-  @override
-  void printOn(StringSink sink) {
-    sink.write(", name: ");
-    sink.write(name.name);
-  }
-}
-
-bool isFieldOrGetter(Member member) {
-  return member is Field || (member is Procedure && member.isGetter);
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
index 8f539a0..49330c6 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
@@ -9,6 +9,7 @@
 import 'package:kernel/ast.dart'
     show
         Arguments,
+        AssertInitializer,
         BreakStatement,
         Block,
         Catch,
@@ -30,7 +31,7 @@
         VariableDeclaration,
         setParents;
 
-import '../parser.dart' show offsetForToken;
+import '../parser.dart' show offsetForToken, optional;
 
 import '../problems.dart' show unsupported;
 
@@ -40,9 +41,12 @@
     show
         ShadowArguments,
         ShadowAsExpression,
+        ShadowAssertInitializer,
+        ShadowAssertStatement,
         ShadowAwaitExpression,
         ShadowBlock,
         ShadowBoolLiteral,
+        ShadowBreakStatement,
         ShadowCheckLibraryIsLoaded,
         ShadowConditionalExpression,
         ShadowDoStatement,
@@ -222,6 +226,59 @@
   }
 
   @override
+  AssertInitializer assertInitializer(
+      Token assertKeyword,
+      Token leftParenthesis,
+      Expression condition,
+      Token comma,
+      Expression message) {
+    return new ShadowAssertInitializer(assertStatement(
+        assertKeyword, leftParenthesis, condition, comma, message, null));
+  }
+
+  @override
+  Statement assertStatement(Token assertKeyword, Token leftParenthesis,
+      Expression condition, Token comma, Expression message, Token semicolon) {
+    // Compute start and end offsets for the condition expression.
+    // This code is a temporary workaround because expressions don't carry
+    // their start and end offsets currently.
+    //
+    // The token that follows leftParenthesis is considered to be the
+    // first token of the condition.
+    // TODO(ahe): this really should be condition.fileOffset.
+    int startOffset = leftParenthesis.next.offset;
+    int endOffset;
+    {
+      // Search forward from leftParenthesis to find the last token of
+      // the condition - which is a token immediately followed by a commaToken,
+      // right parenthesis or a trailing comma.
+      Token conditionBoundary = comma ?? leftParenthesis.endGroup;
+      Token conditionLastToken = leftParenthesis;
+      while (!conditionLastToken.isEof) {
+        Token nextToken = conditionLastToken.next;
+        if (nextToken == conditionBoundary) {
+          break;
+        } else if (optional(',', nextToken) &&
+            nextToken.next == conditionBoundary) {
+          // The next token is trailing comma, which means current token is
+          // the last token of the condition.
+          break;
+        }
+        conditionLastToken = nextToken;
+      }
+      if (conditionLastToken.isEof) {
+        endOffset = startOffset = -1;
+      } else {
+        endOffset = conditionLastToken.offset + conditionLastToken.length;
+      }
+    }
+    return new ShadowAssertStatement(condition,
+        conditionStartOffset: startOffset,
+        conditionEndOffset: endOffset,
+        message: message);
+  }
+
+  @override
   Expression awaitExpression(Expression operand, Token token) {
     return new ShadowAwaitExpression(operand)
       ..fileOffset = offsetForToken(token);
@@ -245,6 +302,11 @@
   }
 
   @override
+  Statement breakStatement(Token breakKeyword, Object label, Token semicolon) {
+    return new ShadowBreakStatement(null)..fileOffset = breakKeyword.charOffset;
+  }
+
+  @override
   Expression conditionalExpression(Expression condition, Token question,
       Expression thenExpression, Token colon, Expression elseExpression) {
     return new ShadowConditionalExpression(
@@ -253,6 +315,13 @@
   }
 
   @override
+  Statement continueStatement(
+      Token continueKeyword, Object label, Token semicolon) {
+    return new ShadowBreakStatement(null)
+      ..fileOffset = continueKeyword.charOffset;
+  }
+
+  @override
   Statement doStatement(Token doKeyword, Statement body, Token whileKeyword,
       Expression condition, Token semicolon) {
     return new ShadowDoStatement(body, condition)
@@ -291,7 +360,7 @@
   }
 
   @override
-  Object parenthesizedCondition(
+  Expression parenthesizedCondition(
       Token leftParenthesis, Expression expression, Token rightParenthesis) {
     return expression;
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index 99375a3..f7a8b61 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -9,6 +9,8 @@
 
 import 'body_builder.dart' show Identifier;
 
+export 'body_builder.dart' show Identifier, Operator;
+
 /// A tree factory.
 ///
 /// For now, the [Location] is always a token.
@@ -133,6 +135,20 @@
   Expression asExpression(
       Expression expression, covariant type, Location location);
 
+  /// Return a representation of an assert that appears in a constructor's
+  /// initializer list.
+  Object assertInitializer(Location assertKeyword, Location leftParenthesis,
+      Expression condition, Location comma, Expression message);
+
+  /// Return a representation of an assert that appears as a statement.
+  Statement assertStatement(
+      Location assertKeyword,
+      Location leftParenthesis,
+      Expression condition,
+      Location comma,
+      Expression message,
+      Location semicolon);
+
   Expression awaitExpression(Expression operand, Location location);
 
   /// Return a representation of a block of [statements] enclosed between the
@@ -140,6 +156,10 @@
   Statement block(
       Location openBrace, List<Statement> statements, Location closeBrace);
 
+  /// Return a representation of a break statement.
+  Statement breakStatement(
+      Location breakKeyword, Identifier label, Location semicolon);
+
   /// Return a representation of a conditional expression. The [condition] is
   /// the expression preceding the question mark. The [question] is the `?`. The
   /// [thenExpression] is the expression following the question mark. The
@@ -148,6 +168,10 @@
   Expression conditionalExpression(Expression condition, Location question,
       Expression thenExpression, Location colon, Expression elseExpression);
 
+  /// Return a representation of a continue statement.
+  Statement continueStatement(
+      Location continueKeyword, Identifier label, Location semicolon);
+
   /// Return a representation of a do statement.
   Statement doStatement(
       Location doKeyword,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
index fac004f..59c4740 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
@@ -67,7 +67,9 @@
 
 import 'body_builder.dart' show combineStatements;
 
-import 'expression_generator.dart' show BuilderHelper, makeLet;
+import 'expression_generator.dart' show makeLet;
+
+import 'expression_generator_helper.dart' show ExpressionGeneratorHelper;
 
 /// Indicates whether type inference involving conditional expressions should
 /// always use least upper bound.
@@ -2080,8 +2082,8 @@
     // with another, and we can only replace a node if it has a parent pointer.
     assert(expression.parent != null);
 
-    // For full (non-top level) inference, we need access to the BuilderHelper
-    // so that we can perform error recovery.
+    // For full (non-top level) inference, we need access to the
+    // ExpressionGeneratorHelper so that we can perform error recovery.
     assert(isTopLevel || helper != null);
 
     // When doing top level inference, we skip subexpressions whose type isn't
@@ -2112,7 +2114,8 @@
   }
 
   @override
-  void inferInitializer(BuilderHelper helper, Initializer initializer) {
+  void inferInitializer(
+      ExpressionGeneratorHelper helper, Initializer initializer) {
     assert(initializer is ShadowInitializer);
     this.helper = helper;
     // Use polymorphic dispatch on [KernelInitializer] to perform whatever
@@ -2127,8 +2130,8 @@
 
   @override
   void inferStatement(Statement statement) {
-    // For full (non-top level) inference, we need access to the BuilderHelper
-    // so that we can perform error recovery.
+    // For full (non-top level) inference, we need access to the
+    // ExpressionGeneratorHelper so that we can perform error recovery.
     if (!isTopLevel) assert(helper != null);
 
     if (statement is ShadowStatement) {
diff --git a/pkg/front_end/lib/src/fasta/parser/class_member_parser.dart b/pkg/front_end/lib/src/fasta/parser/class_member_parser.dart
index fb9401b..27e7370 100644
--- a/pkg/front_end/lib/src/fasta/parser/class_member_parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/class_member_parser.dart
@@ -6,7 +6,7 @@
 
 import '../../scanner/token.dart' show Token;
 
-import 'assert.dart' show Assert;
+import 'error_delegation_listener.dart' show ErrorDelegationListener;
 
 import 'listener.dart' show Listener;
 
@@ -15,6 +15,8 @@
 /// Parser similar to [TopLevelParser] but also parses class members (excluding
 /// their bodies).
 class ClassMemberParser extends Parser {
+  Parser skipParser;
+
   ClassMemberParser(Listener listener) : super(listener);
 
   @override
@@ -27,13 +29,17 @@
     return token.next;
   }
 
-  @override
-  Token parseAssert(Token token, Assert kind) {
-    if (kind == Assert.Statement) {
-      return super.parseAssert(token, kind);
-    } else {
-      return skipExpression(token);
-    }
+  Token skipExpression(Token token) {
+    // TODO(askesc): We listen to errors occurring during expression parsing,
+    // since the parser may rewrite the token stream such that the error is
+    // not triggered during the second parse.
+    // When the parser supports not doing token stream rewriting, use that
+    // feature together with a no-op listener instead.
+    skipParser ??= new Parser(new ErrorDelegationListener(listener));
+    skipParser.mayParseFunctionExpressions = mayParseFunctionExpressions;
+    skipParser.asyncState = asyncState;
+    skipParser.loopState = loopState;
+    return skipParser.parseExpression(token);
   }
 
   // This method is overridden for two reasons:
diff --git a/pkg/front_end/lib/src/fasta/parser/error_delegation_listener.dart b/pkg/front_end/lib/src/fasta/parser/error_delegation_listener.dart
new file mode 100644
index 0000000..99a7671
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/parser/error_delegation_listener.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 '../../scanner/token.dart' show Token;
+
+import '../fasta_codes.dart' show Message;
+
+import 'listener.dart' show Listener;
+
+/// A listener which forwards error reports to another listener but ignores
+/// all other events.
+class ErrorDelegationListener extends Listener {
+  Listener delegate;
+
+  ErrorDelegationListener(this.delegate);
+
+  Token handleUnrecoverableError(Token token, Message message) {
+    return delegate.handleUnrecoverableError(token, message);
+  }
+
+  void handleRecoverableError(
+      Message message, Token startToken, Token endToken) {
+    return delegate.handleRecoverableError(message, startToken, endToken);
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/parser/identifier_context.dart b/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
index 962bded..a4075e1 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
@@ -35,23 +35,21 @@
 
   /// Identifier is one of the shown/hidden names in an import/export
   /// combinator.
-  static const combinator = const IdentifierContext('combinator');
+  static const combinator = const CombinatorIdentifierContext();
 
   /// Identifier is the start of a name in an annotation that precedes a
   /// declaration (i.e. it appears directly after an `@`).
-  static const metadataReference =
-      const IdentifierContext('metadataReference', isScopeReference: true);
+  static const metadataReference = const MetadataReferenceIdentifierContext();
 
   /// Identifier is part of a name in an annotation that precedes a declaration,
   /// but it's not the first identifier in the name.
   static const metadataContinuation =
-      const IdentifierContext('metadataContinuation', isContinuation: true);
+      const MetadataReferenceIdentifierContext.continuation();
 
   /// Identifier is part of a name in an annotation that precedes a declaration,
   /// but it appears after type parameters (e.g. `foo` in `@X<Y>.foo()`).
-  static const metadataContinuationAfterTypeArguments = const IdentifierContext(
-      'metadataContinuationAfterTypeArguments',
-      isContinuation: true);
+  static const metadataContinuationAfterTypeArguments =
+      const MetadataReferenceIdentifierContext.continuationAfterTypeArguments();
 
   /// Identifier is the name being declared by a typedef declaration.
   static const typedefDeclaration = const TypedefDeclarationIdentifierContext();
@@ -77,15 +75,12 @@
 
   /// Identifier is the start of a library name referenced by a `part of`
   /// directive (e.g. `foo` in the directive `part of foo;`).
-  static const partName =
-      const IdentifierContext('partName', inLibraryOrPartOfDeclaration: true);
+  static const partName = const LibraryIdentifierContext.partName();
 
   /// Identifier is part of a library name referenced by a `part of` directive,
   /// but it's not the first identifier in the name.
-  static const partNameContinuation = const IdentifierContext(
-      'partNameContinuation',
-      inLibraryOrPartOfDeclaration: true,
-      isContinuation: true);
+  static const partNameContinuation =
+      const LibraryIdentifierContext.partNameContinuation();
 
   /// Identifier is the type name being declared by an enum declaration.
   static const enumDeclaration = const EnumDeclarationIdentifierContext();
diff --git a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
index a5d808f..2beb97c 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
@@ -52,6 +52,44 @@
   }
 }
 
+/// See [IdentifierContext.combinator].
+class CombinatorIdentifierContext extends IdentifierContext {
+  const CombinatorIdentifierContext() : super('combinator');
+
+  @override
+  Token ensureIdentifier(Token token, Parser parser) {
+    Token identifier = token.next;
+    assert(identifier.kind != IDENTIFIER_TOKEN);
+    const followingValues = const [';', ',', 'if', 'as', 'show', 'hide'];
+
+    if (identifier.isIdentifier) {
+      if (!looksLikeStartOfNextTopLevelDeclaration(identifier) ||
+          isOneOfOrEof(identifier.next, followingValues)) {
+        return identifier;
+      }
+      // Although this is a valid identifier name, the import declaration
+      // is invalid and this looks like the start of the next declaration.
+      // In this situation, fall through to insert a synthetic identifier.
+    }
+
+    // Recovery
+    if (isOneOfOrEof(identifier, followingValues) ||
+        looksLikeStartOfNextTopLevelDeclaration(identifier)) {
+      identifier = parser.insertSyntheticIdentifier(token, this,
+          message: fasta.templateExpectedIdentifier.withArguments(identifier));
+    } else {
+      parser.reportRecoverableErrorWithToken(
+          identifier, fasta.templateExpectedIdentifier);
+      if (!identifier.isKeywordOrIdentifier) {
+        // When in doubt, consume the token to ensure we make progress
+        // but insert a synthetic identifier to satisfy listeners.
+        identifier = parser.rewriter.insertSyntheticIdentifier(identifier);
+      }
+    }
+    return identifier;
+  }
+}
+
 /// See [IdentifierContext.dottedName].
 class DottedNameIdentifierContext extends IdentifierContext {
   const DottedNameIdentifierContext() : super('dottedName');
@@ -334,7 +372,10 @@
   }
 }
 
-/// See [IdentifierContext.libraryName].
+/// See [IdentifierContext.libraryName],
+/// and [IdentifierContext.libraryNameContinuation]
+/// and [IdentifierContext.partName],
+/// and [IdentifierContext.partNameContinuation].
 class LibraryIdentifierContext extends IdentifierContext {
   const LibraryIdentifierContext()
       : super('libraryName', inLibraryOrPartOfDeclaration: true);
@@ -343,6 +384,13 @@
       : super('libraryNameContinuation',
             inLibraryOrPartOfDeclaration: true, isContinuation: true);
 
+  const LibraryIdentifierContext.partName()
+      : super('partName', inLibraryOrPartOfDeclaration: true);
+
+  const LibraryIdentifierContext.partNameContinuation()
+      : super('partNameContinuation',
+            inLibraryOrPartOfDeclaration: true, isContinuation: true);
+
   @override
   Token ensureIdentifier(Token token, Parser parser) {
     Token identifier = token.next;
@@ -410,6 +458,47 @@
   }
 }
 
+/// See [IdentifierContext.metadataReference]
+/// and [IdentifierContext.metadataContinuation]
+/// and [IdentifierContext.metadataContinuationAfterTypeArguments].
+class MetadataReferenceIdentifierContext extends IdentifierContext {
+  const MetadataReferenceIdentifierContext()
+      : super('metadataReference', isScopeReference: true);
+
+  const MetadataReferenceIdentifierContext.continuation()
+      : super('metadataContinuation', isContinuation: true);
+
+  const MetadataReferenceIdentifierContext.continuationAfterTypeArguments()
+      : super('metadataContinuationAfterTypeArguments', isContinuation: true);
+
+  @override
+  Token ensureIdentifier(Token token, Parser parser) {
+    Token identifier = token.next;
+    assert(identifier.kind != IDENTIFIER_TOKEN);
+    if (identifier.isIdentifier) {
+      return identifier;
+    }
+
+    // Recovery
+    if (isOneOfOrEof(identifier, const ['{', '}', '(', ')', ']']) ||
+        looksLikeStartOfNextTopLevelDeclaration(identifier) ||
+        looksLikeStartOfNextClassMember(identifier) ||
+        looksLikeStartOfNextStatement(identifier)) {
+      identifier = parser.insertSyntheticIdentifier(token, this,
+          message: fasta.templateExpectedIdentifier.withArguments(identifier));
+    } else {
+      parser.reportRecoverableErrorWithToken(
+          identifier, fasta.templateExpectedIdentifier);
+      if (!identifier.isKeywordOrIdentifier) {
+        // When in doubt, consume the token to ensure we make progress
+        // but insert a synthetic identifier to satisfy listeners.
+        identifier = parser.rewriter.insertSyntheticIdentifier(identifier);
+      }
+    }
+    return identifier;
+  }
+}
+
 /// See [IdentifierContext.methodDeclaration],
 /// and [IdentifierContext.methodDeclarationContinuation],
 /// and [IdentifierContext.operatorName].
@@ -655,5 +744,4 @@
 
 bool looksLikeStartOfNextTopLevelDeclaration(Token token) =>
     token.isTopLevelKeyword ||
-    isOneOfOrEof(
-        token, const ['class', 'const', 'get', 'final', 'set', 'var', 'void']);
+    isOneOfOrEof(token, const ['const', 'get', 'final', 'set', 'var', 'void']);
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index d0777a2..fc82a91 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -3990,71 +3990,6 @@
     return token;
   }
 
-  Token skipExpression(Token token) {
-    while (true) {
-      Token next = token.next;
-      final kind = next.kind;
-      final value = next.stringValue;
-      if ((identical(kind, EOF_TOKEN)) ||
-          (identical(value, ';')) ||
-          (identical(value, ',')) ||
-          (identical(value, '}')) ||
-          (identical(value, ')')) ||
-          (identical(value, ']'))) {
-        break;
-      }
-      if (identical(value, '=') ||
-          identical(value, '?') ||
-          identical(value, ':') ||
-          identical(value, '??')) {
-        var nextValue = next.next.stringValue;
-        if (identical(nextValue, 'const')) {
-          token = next;
-          next = token.next;
-          nextValue = next.next.stringValue;
-        }
-        if (identical(nextValue, '{')) {
-          // Handle cases like this:
-          // class Foo {
-          //   var map;
-          //   Foo() : map = {};
-          //   Foo.x() : map = true ? {} : {};
-          // }
-          token = next.next.endGroup ?? next;
-          next = token.next;
-          continue;
-        }
-        if (identical(nextValue, '<')) {
-          // Handle cases like this:
-          // class Foo {
-          //   var map;
-          //   Foo() : map = <String, Foo>{};
-          //   Foo.x() : map = true ? <String, Foo>{} : <String, Foo>{};
-          // }
-          token = next.next.endGroup ?? next;
-          next = token.next;
-          if (identical(next.stringValue, '{')) {
-            token = next.endGroup ?? next;
-            next = token.next;
-          }
-          continue;
-        }
-      }
-      if (!mayParseFunctionExpressions && identical(value, '{')) {
-        break;
-      }
-      if (next is BeginToken) {
-        token = next.endGroup ?? next;
-      } else {
-        if (next is ErrorToken) {
-          reportErrorToken(next, false);
-        }
-        token = next;
-      }
-    }
-    return token;
-  }
-
   int expressionDepth = 0;
   Token parseExpression(Token token) {
     if (expressionDepth++ > 500) {
@@ -5674,7 +5609,7 @@
       if (identical(value, 'on')) {
         // 'on' type catchPart?
         onKeyword = token;
-        lastConsumed = parseType(token);
+        lastConsumed = computeType(token, true).ensureTypeNotVoid(token, this);
         token = lastConsumed.next;
         value = token.stringValue;
       }
@@ -6135,8 +6070,10 @@
       // TODO(danrubel): Provide a more specific error message for extra ';'.
       reportRecoverableErrorWithToken(next, fasta.templateExpectedClassMember);
       listener.handleInvalidMember(next);
-      // Ensure we make progress.
-      token = next;
+      if (!identical(value, '}')) {
+        // Ensure we make progress.
+        token = next;
+      }
     } else {
       token = parseFields(beforeStart, externalToken, staticToken,
           covariantToken, varFinalOrConst, beforeType, typeInfo, token, false);
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 5cf8451..71ae91c 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -26,7 +26,8 @@
 
 import '../kernel/kernel_body_builder.dart' show KernelBodyBuilder;
 
-import '../parser.dart' show IdentifierContext, MemberKind, Parser, optional;
+import '../parser.dart'
+    show Assert, IdentifierContext, MemberKind, Parser, optional;
 
 import '../problems.dart' show internalProblem, unexpected;
 
@@ -588,6 +589,13 @@
   }
 
   @override
+  void endAssert(Token assertKeyword, Assert kind, Token leftParenthesis,
+      Token commaToken, Token semicolonToken) {
+    debugEvent("Assert");
+    // Do nothing
+  }
+
+  @override
   void beginClassBody(Token token) {
     debugEvent("beginClassBody");
     String name = pop();
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 195f710..1a2fa07 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -54,7 +54,7 @@
         operatorRequiredArgumentCount;
 
 import '../parser.dart'
-    show FormalParameterKind, IdentifierContext, MemberKind, optional;
+    show Assert, FormalParameterKind, IdentifierContext, MemberKind, optional;
 
 import '../problems.dart' show unhandled;
 
@@ -902,6 +902,13 @@
   }
 
   @override
+  void endAssert(Token assertKeyword, Assert kind, Token leftParenthesis,
+      Token commaToken, Token semicolonToken) {
+    debugEvent("Assert");
+    // Do nothing
+  }
+
+  @override
   void endEnum(Token enumKeyword, Token leftBrace, int count) {
     String documentationComment = getDocumentationComment(enumKeyword);
     List constantNamesAndOffsets = popList(count * 3);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index eaa54e0..9237dcd 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -62,8 +62,10 @@
 
 import '../fasta_codes.dart';
 
-import '../kernel/expression_generator.dart'
-    show BuilderHelper, CalleeDesignation, FunctionTypeAccessor, buildIsNull;
+import '../kernel/expression_generator.dart' show buildIsNull;
+
+import '../kernel/expression_generator_helper.dart'
+    show ExpressionGeneratorHelper;
 
 import '../kernel/kernel_shadow_ast.dart'
     show
@@ -322,18 +324,20 @@
   Uri get uri;
 
   /// Performs full type inference on the given field initializer.
-  void inferFieldInitializer(
-      BuilderHelper helper, DartType declaredType, Expression initializer);
+  void inferFieldInitializer(ExpressionGeneratorHelper helper,
+      DartType declaredType, Expression initializer);
 
   /// Performs type inference on the given function body.
-  void inferFunctionBody(BuilderHelper helper, DartType returnType,
+  void inferFunctionBody(ExpressionGeneratorHelper helper, DartType returnType,
       AsyncMarker asyncMarker, Statement body);
 
   /// Performs type inference on the given constructor initializer.
-  void inferInitializer(BuilderHelper helper, Initializer initializer);
+  void inferInitializer(
+      ExpressionGeneratorHelper helper, Initializer initializer);
 
   /// Performs type inference on the given metadata annotations.
-  void inferMetadata(BuilderHelper helper, List<Expression> annotations);
+  void inferMetadata(
+      ExpressionGeneratorHelper helper, List<Expression> annotations);
 
   /// Performs type inference on the given metadata annotations keeping the
   /// existing helper if possible.
@@ -341,8 +345,8 @@
 
   /// Performs type inference on the given function parameter initializer
   /// expression.
-  void inferParameterInitializer(
-      BuilderHelper helper, Expression initializer, DartType declaredType);
+  void inferParameterInitializer(ExpressionGeneratorHelper helper,
+      Expression initializer, DartType declaredType);
 }
 
 /// Implementation of [TypeInferrer] which doesn't do any type inference.
@@ -362,25 +366,27 @@
   Uri get uri => null;
 
   @override
-  void inferFieldInitializer(
-      BuilderHelper helper, DartType declaredType, Expression initializer) {}
+  void inferFieldInitializer(ExpressionGeneratorHelper helper,
+      DartType declaredType, Expression initializer) {}
 
   @override
-  void inferFunctionBody(BuilderHelper helper, DartType returnType,
+  void inferFunctionBody(ExpressionGeneratorHelper helper, DartType returnType,
       AsyncMarker asyncMarker, Statement body) {}
 
   @override
-  void inferInitializer(BuilderHelper helper, Initializer initializer) {}
+  void inferInitializer(
+      ExpressionGeneratorHelper helper, Initializer initializer) {}
 
   @override
-  void inferMetadata(BuilderHelper helper, List<Expression> annotations) {}
+  void inferMetadata(
+      ExpressionGeneratorHelper helper, List<Expression> annotations) {}
 
   @override
   void inferMetadataKeepingHelper(List<Expression> annotations) {}
 
   @override
-  void inferParameterInitializer(
-      BuilderHelper helper, Expression initializer, DartType declaredType) {}
+  void inferParameterInitializer(ExpressionGeneratorHelper helper,
+      Expression initializer, DartType declaredType) {}
 }
 
 /// Derived class containing generic implementations of [TypeInferrer].
@@ -418,7 +424,7 @@
 
   final SourceLibraryBuilder library;
 
-  BuilderHelper helper;
+  ExpressionGeneratorHelper helper;
 
   /// Context information for the current closure, or `null` if we are not
   /// inside a closure.
@@ -924,8 +930,8 @@
       Expression expression, DartType typeContext, bool typeNeeded);
 
   @override
-  void inferFieldInitializer(
-      BuilderHelper helper, DartType declaredType, Expression initializer) {
+  void inferFieldInitializer(ExpressionGeneratorHelper helper,
+      DartType declaredType, Expression initializer) {
     assert(closureContext == null);
     this.helper = helper;
     var actualType = inferExpression(
@@ -944,7 +950,7 @@
   DartType inferFieldTopLevel(ShadowField field, bool typeNeeded);
 
   @override
-  void inferFunctionBody(BuilderHelper helper, DartType returnType,
+  void inferFunctionBody(ExpressionGeneratorHelper helper, DartType returnType,
       AsyncMarker asyncMarker, Statement body) {
     assert(closureContext == null);
     this.helper = helper;
@@ -1057,14 +1063,8 @@
       arguments.types.addAll(inferredTypes);
     }
     if (typeChecksNeeded && !identical(calleeType, unknownFunction)) {
-      CalleeDesignation calleeKind = receiverType is FunctionType
-          ? CalleeDesignation.Function
-          : CalleeDesignation.Method;
-      LocatedMessage argMessage = helper.checkArguments(
-          new FunctionTypeAccessor.fromType(calleeType),
-          arguments,
-          calleeKind,
-          offset);
+      LocatedMessage argMessage =
+          helper.checkArgumentsForType(calleeType, arguments, offset);
       if (argMessage != null) {
         helper.addProblem(
             argMessage.messageObject, argMessage.charOffset, argMessage.length);
@@ -1243,7 +1243,8 @@
   }
 
   @override
-  void inferMetadata(BuilderHelper helper, List<Expression> annotations) {
+  void inferMetadata(
+      ExpressionGeneratorHelper helper, List<Expression> annotations) {
     if (annotations != null) {
       this.helper = helper;
       inferMetadataKeepingHelper(annotations);
@@ -1325,8 +1326,8 @@
   }
 
   @override
-  void inferParameterInitializer(
-      BuilderHelper helper, Expression initializer, DartType declaredType) {
+  void inferParameterInitializer(ExpressionGeneratorHelper helper,
+      Expression initializer, DartType declaredType) {
     assert(closureContext == null);
     this.helper = helper;
     assert(declaredType != null);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
index 6554d8e..0297c47 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
@@ -267,7 +267,22 @@
         downwardsInferPhase: formalTypes == null);
   }
 
-  /// Use the given [constraints] to substitute for type variables..
+  bool hasOmittedBound(TypeParameter parameter) {
+    // If the bound was omitted by the programmer, the Kernel representation for
+    // the parameter will look similar to the following:
+    //
+    //     T extends Object = dynamic
+    //
+    // Note that it's not possible to receive [Object] as [TypeParameter.bound]
+    // and `dynamic` as [TypeParameter.defaultType] from the front end in any
+    // other way.
+    DartType bound = parameter.bound;
+    return bound is InterfaceType &&
+        identical(bound.classNode, coreTypes.objectClass) &&
+        parameter.defaultType is DynamicType;
+  }
+
+  /// Use the given [constraints] to substitute for type variables.
   ///
   /// [typeParametersToInfer] is the set of type parameters that should be
   /// substituted for.  [inferredTypes] should be a list of the same length.
@@ -293,7 +308,7 @@
 
       var typeParamBound = typeParam.bound;
       DartType extendsConstraint;
-      if (!_isObjectOrDynamic(typeParamBound)) {
+      if (!hasOmittedBound(typeParam)) {
         extendsConstraint = Substitution
             .fromPairs(typeParametersToInfer, inferredTypes)
             .substituteType(typeParamBound);
@@ -326,7 +341,7 @@
 
       var inferred = inferredTypes[i];
       bool success = typeSatisfiesConstraint(inferred, constraint);
-      if (success && !_isObjectOrDynamic(typeParamBound)) {
+      if (success && !hasOmittedBound(typeParam)) {
         // If everything else succeeded, check the `extends` constraint.
         var extendsConstraint = typeParamBound;
         success = isSubtypeOf(inferred, extendsConstraint);
@@ -666,11 +681,6 @@
     return hierarchy.getClassicLeastUpperBound(type1, type2);
   }
 
-  bool _isObjectOrDynamic(DartType type) =>
-      type is DynamicType ||
-      (type is InterfaceType &&
-          identical(type.classNode, coreTypes.objectClass));
-
   DartType _typeParameterLeastUpperBound(DartType type1, DartType type2) {
     // This currently just implements a simple least upper bound to
     // handle some common cases.  It also avoids some termination issues
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index d6a7570..02eedd8 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -83,8 +83,6 @@
 ConstEvalNonConstantLiteral/dart2jsCode: Fail
 ConstEvalNonConstantLiteral/example: Fail
 ConstFieldWithoutInitializer/example: Fail
-ConstructorHasNoSuchNamedParameter/analyzerCode: Fail
-ConstructorHasNoSuchNamedParameter/example: Fail
 ConstructorNotFound/analyzerCode: Fail
 ConstructorNotFound/example: Fail
 ContinueOutsideOfLoop/script1: Fail
@@ -195,8 +193,6 @@
 ForInLoopExactlyOneVariable/statement: Fail # Fasta reports too many errors.
 ForInLoopNotAssignable/analyzerCode: Fail # The analyzer reports a different error.
 ForInLoopNotAssignable/statement: Fail
-FunctionHasNoSuchNamedParameter/analyzerCode: Fail
-FunctionHasNoSuchNamedParameter/example: Fail
 FunctionTypeDefaultValue/example: Fail
 FunctionTypedParameterVar/script1: Fail
 GeneratorReturnsValue/example: Fail
@@ -258,8 +254,6 @@
 MemberWithSameNameAsClass/example: Fail
 MetadataTypeArguments/analyzerCode: Fail
 MetadataTypeArguments/example: Fail
-MethodHasNoSuchNamedParameter/analyzerCode: Fail
-MethodHasNoSuchNamedParameter/example: Fail
 MethodNotFound/analyzerCode: Fail
 MethodNotFound/example: Fail
 MissingAssignableSelector/script1: Fail
@@ -280,6 +274,8 @@
 NamedFunctionExpression/example: Fail
 NativeClauseShouldBeAnnotation/example: Fail
 NoFormals/example: Fail
+NoSuchNamedParameter/analyzerCode: Fail
+NoSuchNamedParameter/example: Fail
 NoUnnamedConstructorInObject/analyzerCode: Fail
 NoUnnamedConstructorInObject/example: Fail
 NonAsciiIdentifier/expression: Fail
@@ -388,18 +384,10 @@
 ThisAccessInFieldInitializer/example: Fail
 ThisAsIdentifier/analyzerCode: Fail
 ThisAsIdentifier/example: Fail
-TooFewArgumentsToConstructor/analyzerCode: Fail
-TooFewArgumentsToConstructor/example: Fail
-TooFewArgumentsToFunction/analyzerCode: Fail
-TooFewArgumentsToFunction/example: Fail
-TooFewArgumentsToMethod/analyzerCode: Fail
-TooFewArgumentsToMethod/example: Fail
-TooManyArgumentsToConstructor/analyzerCode: Fail
-TooManyArgumentsToConstructor/example: Fail
-TooManyArgumentsToFunction/analyzerCode: Fail
-TooManyArgumentsToFunction/example: Fail
-TooManyArgumentsToMethod/analyzerCode: Fail
-TooManyArgumentsToMethod/example: Fail
+TooFewArguments/analyzerCode: Fail
+TooFewArguments/example: Fail
+TooManyArguments/analyzerCode: Fail
+TooManyArguments/example: Fail
 TopLevelOperator/script1: Fail
 TopLevelOperator/script2: Fail
 TopLevelOperator/script3: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index acbe910..1e8e061 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -1065,40 +1065,16 @@
   template: "The class '#name' has a constructor that takes no arguments."
   severity: CONTEXT
 
-TooFewArgumentsToFunction:
-  template: "Too few positional arguments to function: #count required, #count2 given."
+TooFewArguments:
+  template: "Too few positional arguments: #count required, #count2 given."
   severity: ERROR_LEGACY_WARNING
 
-TooFewArgumentsToMethod:
-  template: "Too few positional arguments to method: #count required, #count2 given."
+TooManyArguments:
+  template: "Too many positional arguments: #count allowed, #count2 given."
   severity: ERROR_LEGACY_WARNING
 
-TooFewArgumentsToConstructor:
-  template: "Too few positional arguments to constructor: #count required, #count2 given."
-  severity: ERROR_LEGACY_WARNING
-
-TooManyArgumentsToFunction:
-  template: "Too many positional arguments to function: #count allowed, #count2 given."
-  severity: ERROR_LEGACY_WARNING
-
-TooManyArgumentsToMethod:
-  template: "Too many positional arguments to method: #count allowed, #count2 given."
-  severity: ERROR_LEGACY_WARNING
-
-TooManyArgumentsToConstructor:
-  template: "Too many positional arguments to constructor: #count allowed, #count2 given."
-  severity: ERROR_LEGACY_WARNING
-
-FunctionHasNoSuchNamedParameter:
-  template: "Function has no named parameter with the name '#name'."
-  severity: ERROR_LEGACY_WARNING
-
-MethodHasNoSuchNamedParameter:
-  template: "Method has no named parameter with the name '#name'."
-  severity: ERROR_LEGACY_WARNING
-
-ConstructorHasNoSuchNamedParameter:
-  template: "Constructor has no named parameter with the name '#name'."
+NoSuchNamedParameter:
+  template: "No named parameter with the name '#name'."
   severity: ERROR_LEGACY_WARNING
 
 AbstractClassInstantiation:
diff --git a/pkg/front_end/test/fasta/generator_to_string_test.dart b/pkg/front_end/test/fasta/generator_to_string_test.dart
index de65fd9..e228c60 100644
--- a/pkg/front_end/test/fasta/generator_to_string_test.dart
+++ b/pkg/front_end/test/fasta/generator_to_string_test.dart
@@ -47,25 +47,25 @@
 import 'package:front_end/src/fasta/kernel/expression_generator.dart'
     show
         DeferredAccessGenerator,
-        FastaAccessor,
-        IncompleteError,
-        IncompletePropertyAccessor,
+        Generator,
+        IncompleteErrorGenerator,
+        IncompletePropertyAccessGenerator,
         IndexedAccessGenerator,
         LargeIntAccessGenerator,
         LoadLibraryGenerator,
         NullAwarePropertyAccessGenerator,
-        ParenthesizedExpression,
+        ParenthesizedExpressionGenerator,
         PropertyAccessGenerator,
         ReadOnlyAccessGenerator,
-        SendAccessor,
+        SendAccessGenerator,
         StaticAccessGenerator,
         SuperIndexedAccessGenerator,
         SuperPropertyAccessGenerator,
         ThisAccessGenerator,
         ThisIndexedAccessGenerator,
         ThisPropertyAccessGenerator,
-        TypeDeclarationAccessor,
-        UnresolvedAccessor,
+        TypeDeclarationAccessGenerator,
+        UnresolvedNameGenerator,
         VariableUseGenerator;
 
 import 'package:front_end/src/fasta/kernel/body_builder.dart'
@@ -76,7 +76,7 @@
 
 import 'package:front_end/src/fasta/scanner.dart' show Token, scanString;
 
-void check(String expected, FastaAccessor<Arguments> generator) {
+void check(String expected, Generator<Arguments> generator) {
   Expect.stringEquals(expected, "$generator");
 }
 
@@ -123,7 +123,7 @@
     KernelBodyBuilder helper = new KernelBodyBuilder(
         libraryBuilder, null, null, null, null, null, null, false, uri, null);
 
-    FastaAccessor accessor =
+    Generator generator =
         new ThisAccessGenerator<Arguments>(helper, token, false);
 
     Library library = new Library(uri);
@@ -137,12 +137,12 @@
         "DelayedAssignment(offset: 4, value: expression,"
         " assignmentOperator: +=)",
         new DelayedAssignment<Arguments>(
-            helper, token, accessor, expression, assignmentOperator));
+            helper, token, generator, expression, assignmentOperator));
     check(
         "DelayedPostfixIncrement(offset: 4, binaryOperator: +,"
         " interfaceTarget: $uri::#class1::myInterfaceTarget)",
         new DelayedPostfixIncrement<Arguments>(
-            helper, token, accessor, binaryOperator, interfaceTarget));
+            helper, token, generator, binaryOperator, interfaceTarget));
     check(
         "VariableUseGenerator(offset: 4, variable: dynamic #t1;\n,"
         " promotedType: void)",
@@ -197,19 +197,19 @@
     check(
         "ThisAccessGenerator(offset: 4, isInitializer: false, isSuper: false)",
         new ThisAccessGenerator<Arguments>(helper, token, false));
-    check("IncompleteError(offset: 4, message: Unspecified)",
-        new IncompleteError<Arguments>(helper, token, message));
-    check("SendAccessor(offset: 4, name: bar, arguments: (\"arg\"))",
-        new SendAccessor<Arguments>(helper, token, name, arguments));
-    check("IncompletePropertyAccessor(offset: 4, name: bar)",
-        new IncompletePropertyAccessor<Arguments>(helper, token, name));
+    check("IncompleteErrorGenerator(offset: 4, message: Unspecified)",
+        new IncompleteErrorGenerator<Arguments>(helper, token, message));
+    check("SendAccessGenerator(offset: 4, name: bar, arguments: (\"arg\"))",
+        new SendAccessGenerator<Arguments>(helper, token, name, arguments));
+    check("IncompletePropertyAccessGenerator(offset: 4, name: bar)",
+        new IncompletePropertyAccessGenerator<Arguments>(helper, token, name));
     check(
         "DeferredAccessGenerator(offset: 4, "
         "builder: Instance of 'PrefixBuilder',"
-        " accessor: ThisAccessGenerator(offset: 4, isInitializer: false,"
+        " generator: ThisAccessGenerator(offset: 4, isInitializer: false,"
         " isSuper: false))",
         new DeferredAccessGenerator<Arguments>(
-            helper, token, prefixBuilder, accessor));
+            helper, token, prefixBuilder, generator));
     check(
         "ReadOnlyAccessGenerator(offset: 4, expression: expression,"
         " plainNameForRead: foo, value: null)",
@@ -218,15 +218,16 @@
     check("LargeIntAccessGenerator(offset: 4, lexeme: myToken)",
         new LargeIntAccessGenerator<Arguments>(helper, token));
     check(
-        "ParenthesizedExpression(offset: 4, expression: expression,"
+        "ParenthesizedExpressionGenerator(offset: 4, expression: expression,"
         " plainNameForRead: null, value: null)",
-        new ParenthesizedExpression<Arguments>(helper, token, expression));
+        new ParenthesizedExpressionGenerator<Arguments>(
+            helper, token, expression));
     check(
-        "TypeDeclarationAccessor(offset: 4, expression: T,"
+        "TypeDeclarationAccessGenerator(offset: 4, expression: T,"
         " plainNameForRead: foo, value: null)",
-        new TypeDeclarationAccessor<Arguments>(
+        new TypeDeclarationAccessGenerator<Arguments>(
             helper, token, prefixBuilder, -1, declaration, "foo"));
-    check("UnresolvedAccessor(offset: 4, name: bar)",
-        new UnresolvedAccessor<Arguments>(helper, token, name));
+    check("UnresolvedNameGenerator(offset: 4, name: bar)",
+        new UnresolvedNameGenerator<Arguments>(helper, token, name));
   });
 }
diff --git a/pkg/front_end/test/src/byte_store/crc32_test.dart b/pkg/front_end/test/src/byte_store/crc32_test.dart
new file mode 100644
index 0000000..0119bb8
--- /dev/null
+++ b/pkg/front_end/test/src/byte_store/crc32_test.dart
@@ -0,0 +1,38 @@
+// 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:convert';
+
+import 'package:front_end/src/byte_store/crc32.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(Crc32Test);
+  });
+}
+
+@reflectiveTest
+class Crc32Test {
+  test_bytes_0() {
+    expect(getCrc32([]), 0x00000000);
+  }
+
+  test_bytes_1() {
+    expect(getCrc32([0x00]), 0xD202EF8D);
+  }
+
+  test_bytes_2() {
+    expect(getCrc32([0x01]), 0xA505DF1B);
+  }
+
+  test_bytes_3() {
+    expect(getCrc32([0x01, 0x02]), 0xB6CC4292);
+  }
+
+  test_string() {
+    expect(getCrc32(UTF8.encode('My very long test string.')), 0x88B8252E);
+  }
+}
diff --git a/pkg/front_end/test/src/byte_store/file_byte_store_test.dart b/pkg/front_end/test/src/byte_store/file_byte_store_test.dart
new file mode 100644
index 0000000..a2aa7ed
--- /dev/null
+++ b/pkg/front_end/test/src/byte_store/file_byte_store_test.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:front_end/src/byte_store/file_byte_store.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FileByteStoreValidatorTest);
+  });
+}
+
+@reflectiveTest
+class FileByteStoreValidatorTest {
+  final validator = new FileByteStoreValidator();
+
+  test_get_bad_notEnoughBytes() {
+    List<int> bytes = <int>[1, 2, 3];
+    List<int> data = validator.getData(bytes);
+    expect(data, isNull);
+  }
+
+  test_get_bad_notEnoughBytes_zero() {
+    List<int> bytes = <int>[];
+    List<int> data = validator.getData(bytes);
+    expect(data, isNull);
+  }
+
+  test_get_bad_wrongChecksum() {
+    List<int> data = <int>[1, 2, 3];
+    List<int> bytes = validator.wrapData(data);
+
+    // Damage the checksum.
+    expect(bytes[bytes.length - 1], isNot(42));
+    bytes[bytes.length - 1] = 42;
+
+    List<int> data2 = validator.getData(bytes);
+    expect(data2, isNull);
+  }
+
+  test_get_bad_wrongVersion() {
+    List<int> bytes = <int>[0xBA, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
+    List<int> data = validator.getData(bytes);
+    expect(data, isNull);
+  }
+
+  test_get_good() {
+    List<int> data = <int>[1, 2, 3];
+    List<int> bytes = validator.wrapData(data);
+    List<int> data2 = validator.getData(bytes);
+    expect(data2, hasLength(3));
+    expect(data2, data);
+  }
+
+  test_get_good_zeroBytesData() {
+    List<int> data = <int>[];
+    List<int> bytes = validator.wrapData(data);
+    List<int> data2 = validator.getData(bytes);
+    expect(data2, hasLength(0));
+    expect(data2, data);
+  }
+}
diff --git a/pkg/front_end/test/src/byte_store/protected_file_byte_store_test.dart b/pkg/front_end/test/src/byte_store/protected_file_byte_store_test.dart
index 6bb60d3..d117bf4 100644
--- a/pkg/front_end/test/src/byte_store/protected_file_byte_store_test.dart
+++ b/pkg/front_end/test/src/byte_store/protected_file_byte_store_test.dart
@@ -22,6 +22,8 @@
 
 @reflectiveTest
 class ProtectedFileByteStoreTest {
+  static const PADDING = 8;
+
   io.Directory cacheDirectory;
   String cachePath;
   ProtectedFileByteStore store;
@@ -167,7 +169,7 @@
     }
     includes.forEach((expectedKey, expectedLength) {
       expect(keyToLength, contains(expectedKey));
-      expect(keyToLength, containsPair(expectedKey, expectedLength));
+      expect(keyToLength, containsPair(expectedKey, expectedLength + PADDING));
     });
     for (var excludedKey in excludes) {
       expect(keyToLength.keys, isNot(contains(excludedKey)));
diff --git a/pkg/front_end/test/src/byte_store/test_all.dart b/pkg/front_end/test/src/byte_store/test_all.dart
index f702dcb..49fb3b4 100644
--- a/pkg/front_end/test/src/byte_store/test_all.dart
+++ b/pkg/front_end/test/src/byte_store/test_all.dart
@@ -6,6 +6,8 @@
 
 import 'byte_store_test.dart' as byte_store_test;
 import 'cache_test.dart' as cache_test;
+import 'crc32_test.dart' as crc32_test;
+import 'file_byte_store_test.dart' as file_byte_store_test;
 import 'protected_file_byte_store_test.dart' as protected_file_byte_store_test;
 
 /// Utility for manually running all tests.
@@ -13,6 +15,8 @@
   defineReflectiveSuite(() {
     byte_store_test.main();
     cache_test.main();
+    crc32_test.main();
+    file_byte_store_test.main();
     protected_file_byte_store_test.main();
   }, name: 'byte_store');
 }
diff --git a/pkg/front_end/testcases/ast_builder.status b/pkg/front_end/testcases/ast_builder.status
index cbb6e2d..1301285 100644
--- a/pkg/front_end/testcases/ast_builder.status
+++ b/pkg/front_end/testcases/ast_builder.status
@@ -46,7 +46,6 @@
 regress/issue_29941: Crash
 regress/issue_29943: Crash
 regress/issue_29983: Crash # 'package:analyzer/src/fasta/ast_builder.dart': Failed assertion: line 478 pos 12: 'star == null': is not true.
-regress/issue_31155: Crash # Issue 31155.
 regress/issue_31157: Crash
 regress/issue_31180: Crash
 regress/issue_31186: Crash
diff --git a/pkg/front_end/testcases/async_function.dart.direct.transformed.expect b/pkg/front_end/testcases/async_function.dart.direct.transformed.expect
index 6d5759c..86b5197 100644
--- a/pkg/front_end/testcases/async_function.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/async_function.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 
 static field core::List<core::String> stringList = <dynamic>["bar"];
 static method asyncString() → asy::Future<core::String> /* originally async */ {
-  final asy::Completer<core::String> :completer = asy::Completer::sync<core::String>();
+  final asy::Completer<core::String> :async_completer = asy::Completer::sync<core::String>();
   asy::FutureOr<core::String> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -19,20 +19,20 @@
         :return_value = "foo";
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method asyncString2() → asy::Future<core::String> /* originally async */ {
-  final asy::Completer<core::String> :completer = asy::Completer::sync<core::String>();
+  final asy::Completer<core::String> :async_completer = asy::Completer::sync<core::String>();
   asy::FutureOr<core::String> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -46,17 +46,17 @@
         :return_value = self::asyncString();
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method syncStarString() → core::Iterable<core::String> /* originally sync* */ {
   dynamic :await_jump_var = 0;
@@ -170,7 +170,7 @@
   return :controller.{asy::_AsyncStarStreamController::stream};
 }
 static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -185,15 +185,15 @@
         [yield] let dynamic #t2 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
         core::String str = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/await.dart.direct.transformed.expect b/pkg/front_end/testcases/await.dart.direct.transformed.expect
index 7a12084..c0f0f71 100644
--- a/pkg/front_end/testcases/await.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/await.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -19,15 +19,15 @@
         [yield] let dynamic #t1 = asy::_awaitHelper("Hello, World!", :async_op_then, :async_op_error, :async_op) in null;
         core::print(:result);
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/check_deferred_before_args2.dart.direct.transformed.expect b/pkg/front_end/testcases/check_deferred_before_args2.dart.direct.transformed.expect
index 8716818..b8cd3f73 100644
--- a/pkg/front_end/testcases/check_deferred_before_args2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_before_args2.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 
 static method main() → dynamic {}
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -21,15 +21,15 @@
         [yield] let dynamic #t2 = asy::_awaitHelper(LoadLibrary(lib), :async_op_then, :async_op_error, :async_op) in null;
         def::m(:result);
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect
index 342fff7..57fd263 100644
--- a/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 
 static method main() → dynamic {}
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -22,15 +22,15 @@
         [yield] let dynamic #t2 = asy::_awaitHelper(LoadLibrary(lib), :async_op_then, :async_op_error, :async_op) in null;
         def::m(:result);
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/compile.status b/pkg/front_end/testcases/compile.status
index 31b8193..1623e1d 100644
--- a/pkg/front_end/testcases/compile.status
+++ b/pkg/front_end/testcases/compile.status
@@ -102,7 +102,6 @@
 regress/issue_29976: RuntimeError # Issue 29976.
 regress/issue_29982: Fail # Issue 29982.
 regress/issue_30836: RuntimeError # Issue 30836.
-regress/issue_31155: Crash # Issue 31155.
 
 runtime_checks/implicit_downcast_constructor_initializer: RuntimeError # Test exercises strong mode semantics
 runtime_checks/implicit_downcast_do: RuntimeError # Test exercises strong mode semantics
diff --git a/pkg/front_end/testcases/future_or_test.dart.direct.transformed.expect b/pkg/front_end/testcases/future_or_test.dart.direct.transformed.expect
index dbae521..359d991 100644
--- a/pkg/front_end/testcases/future_or_test.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/future_or_test.dart.direct.transformed.expect
@@ -16,7 +16,7 @@
     : super core::Object::•()
     ;
   method bar() → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -30,17 +30,17 @@
           :return_value = this.{self::B::a}.foo();
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
 }
 class C extends core::Object {
@@ -49,7 +49,7 @@
     : super core::Object::•()
     ;
   method baz() → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -63,17 +63,17 @@
           :return_value = this.{self::C::b}.bar();
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/future_or_test.dart.strong.transformed.expect b/pkg/front_end/testcases/future_or_test.dart.strong.transformed.expect
index b18f9fb..fa7b7ac 100644
--- a/pkg/front_end/testcases/future_or_test.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/future_or_test.dart.strong.transformed.expect
@@ -16,7 +16,7 @@
     : super core::Object::•()
     ;
   method bar() → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -30,17 +30,17 @@
           :return_value = this.{self::B::a}.{self::A::foo}();
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
 }
 class C extends core::Object {
@@ -49,7 +49,7 @@
     : super core::Object::•()
     ;
   method baz() → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -63,17 +63,17 @@
           :return_value = this.{self::C::b}.{self::B::bar}() as{TypeError} asy::FutureOr<core::int>;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect
index 40299a9..839f1dd 100644
--- a/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect
@@ -9,7 +9,7 @@
     ;
 }
 static method test() → void /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -32,7 +32,7 @@
         asy::FutureOr<self::MyFuture> x8;
         self::MyFuture x9;
         function test0() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -46,20 +46,20 @@
                 :return_value = x0;
                 break #L2;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test1() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -73,20 +73,20 @@
                 :return_value = x1;
                 break #L3;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test2() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -100,20 +100,20 @@
                 :return_value = x2;
                 break #L4;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test3() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -127,20 +127,20 @@
                 :return_value = x3;
                 break #L5;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test4() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -154,20 +154,20 @@
                 :return_value = x4;
                 break #L6;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test5() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -181,20 +181,20 @@
                 :return_value = x5;
                 break #L7;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test6() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -208,20 +208,20 @@
                 :return_value = x6;
                 break #L8;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test7() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -235,20 +235,20 @@
                 :return_value = x7;
                 break #L9;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test8() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -262,20 +262,20 @@
                 :return_value = x8;
                 break #L10;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test9() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -289,17 +289,17 @@
                 :return_value = x9;
                 break #L11;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         [yield] let dynamic #t1 = asy::_awaitHelper(x0, :async_op_then, :async_op_error, :async_op) in null;
         dynamic y0 = :result;
@@ -322,16 +322,16 @@
         [yield] let dynamic #t10 = asy::_awaitHelper(x9, :async_op_then, :async_op_error, :async_op) in null;
         dynamic y9 = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect
index 2e07d8f..d0c0e68 100644
--- a/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
     ;
 }
 static method test() → void /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -32,7 +32,7 @@
         asy::FutureOr<self::MyFuture> x8;
         self::MyFuture x9;
         function test0() → asy::Future<core::int> /* originally async */ {
-          final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+          final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
           asy::FutureOr<core::int> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -46,20 +46,20 @@
                 :return_value = x0;
                 break #L2;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test1() → asy::Future<core::int> /* originally async */ {
-          final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+          final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
           asy::FutureOr<core::int> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -73,20 +73,20 @@
                 :return_value = x1;
                 break #L3;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test2() → asy::Future<asy::Future<core::int>> /* originally async */ {
-          final asy::Completer<asy::Future<core::int>> :completer = asy::Completer::sync<asy::Future<core::int>>();
+          final asy::Completer<asy::Future<core::int>> :async_completer = asy::Completer::sync<asy::Future<core::int>>();
           asy::FutureOr<asy::Future<core::int>> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -100,20 +100,20 @@
                 :return_value = x2;
                 break #L4;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test3() → asy::Future<asy::FutureOr<core::int>> /* originally async */ {
-          final asy::Completer<asy::FutureOr<core::int>> :completer = asy::Completer::sync<asy::FutureOr<core::int>>();
+          final asy::Completer<asy::FutureOr<core::int>> :async_completer = asy::Completer::sync<asy::FutureOr<core::int>>();
           asy::FutureOr<asy::FutureOr<core::int>> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -127,20 +127,20 @@
                 :return_value = x3;
                 break #L5;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test4() → asy::Future<self::MyFuture> /* originally async */ {
-          final asy::Completer<self::MyFuture> :completer = asy::Completer::sync<self::MyFuture>();
+          final asy::Completer<self::MyFuture> :async_completer = asy::Completer::sync<self::MyFuture>();
           asy::FutureOr<self::MyFuture> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -154,20 +154,20 @@
                 :return_value = x4;
                 break #L6;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test5() → asy::Future<core::int> /* originally async */ {
-          final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+          final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
           asy::FutureOr<core::int> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -181,20 +181,20 @@
                 :return_value = x5;
                 break #L7;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test6() → asy::Future<asy::Future<core::int>> /* originally async */ {
-          final asy::Completer<asy::Future<core::int>> :completer = asy::Completer::sync<asy::Future<core::int>>();
+          final asy::Completer<asy::Future<core::int>> :async_completer = asy::Completer::sync<asy::Future<core::int>>();
           asy::FutureOr<asy::Future<core::int>> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -208,20 +208,20 @@
                 :return_value = x6;
                 break #L8;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test7() → asy::Future<asy::FutureOr<core::int>> /* originally async */ {
-          final asy::Completer<asy::FutureOr<core::int>> :completer = asy::Completer::sync<asy::FutureOr<core::int>>();
+          final asy::Completer<asy::FutureOr<core::int>> :async_completer = asy::Completer::sync<asy::FutureOr<core::int>>();
           asy::FutureOr<asy::FutureOr<core::int>> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -235,20 +235,20 @@
                 :return_value = x7;
                 break #L9;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test8() → asy::Future<self::MyFuture> /* originally async */ {
-          final asy::Completer<self::MyFuture> :completer = asy::Completer::sync<self::MyFuture>();
+          final asy::Completer<self::MyFuture> :async_completer = asy::Completer::sync<self::MyFuture>();
           asy::FutureOr<self::MyFuture> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -262,20 +262,20 @@
                 :return_value = x8;
                 break #L10;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test9() → asy::Future<core::int> /* originally async */ {
-          final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+          final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
           asy::FutureOr<core::int> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -289,17 +289,17 @@
                 :return_value = x9;
                 break #L11;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         [yield] let dynamic #t1 = asy::_awaitHelper(x0, :async_op_then, :async_op_error, :async_op) in null;
         core::int y0 = :result;
@@ -322,16 +322,16 @@
         [yield] let dynamic #t10 = asy::_awaitHelper(x9, :async_op_then, :async_op_error, :async_op) in null;
         core::int y9 = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.direct.transformed.expect
index a111519..cdfa0e5 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
 static field asy::Future<core::int> futureInt = null;
 static field dynamic f = () → dynamic => self::futureInt;
 static field dynamic g = () → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -20,17 +20,17 @@
         :return_value = self::futureInt;
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 };
 static method main() → dynamic {
   self::f;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect
index a6aca80..e35517f 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 static field asy::Future<core::int> futureInt = null;
 static field () → asy::Future<core::int> f = () → asy::Future<core::int> => self::futureInt;
 static field () → asy::Future<core::int> g = () → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -20,17 +20,17 @@
         :return_value = self::futureInt;
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 };
 static method main() → dynamic {
   self::f;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.direct.transformed.expect
index 4bf2eb0..92ac896 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:async" as asy;
 
 static field dynamic f = () → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -17,17 +17,17 @@
         :return_value = 0;
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 };
 static method main() → dynamic {
   self::f;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect
index 5af9546..d7fa5b6 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static field () → asy::Future<core::int> f = () → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -18,17 +18,17 @@
         :return_value = 0;
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 };
 static method main() → dynamic {
   self::f;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.direct.transformed.expect
index 7702de6..0483a9f 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
 static field asy::FutureOr<core::int> futureOrInt = null;
 static field dynamic f = () → dynamic => self::futureOrInt;
 static field dynamic g = () → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -20,17 +20,17 @@
         :return_value = self::futureOrInt;
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 };
 static method main() → dynamic {
   self::f;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect
index f49a5d2..5910611 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 static field asy::FutureOr<core::int> futureOrInt = null;
 static field () → asy::FutureOr<core::int> f = () → asy::FutureOr<core::int> => self::futureOrInt;
 static field () → asy::Future<core::int> g = () → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -20,17 +20,17 @@
         :return_value = self::futureOrInt;
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 };
 static method main() → dynamic {
   self::f;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.direct.transformed.expect
index ae1ed7a..cc66edb 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
 
 static method test() → dynamic {
   dynamic f = () → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -26,17 +26,17 @@
             break #L1;
           }
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   };
   asy::Future<core::num> g = f.call();
   asy::Future<core::int> h = f.call();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect
index 649f426..af00522 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 
 static method test() → dynamic {
   () → asy::Future<core::num> f = () → asy::Future<core::num> /* originally async */ {
-    final asy::Completer<core::num> :completer = asy::Completer::sync<core::num>();
+    final asy::Completer<core::num> :async_completer = asy::Completer::sync<core::num>();
     asy::FutureOr<core::num> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -26,17 +26,17 @@
             break #L1;
           }
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   };
   asy::Future<core::num> g = f.call();
   asy::Future<core::int> h = f.call() as{TypeError} asy::Future<core::int>;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.direct.transformed.expect
index 93b15b0..b16d670 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
 
 static method test() → dynamic {
   dynamic f = () → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -26,17 +26,17 @@
             break #L1;
           }
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   };
   asy::Future<core::num> g = f.call();
   asy::Future<core::int> h = f.call();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect
index 97e2f95..2087333 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 
 static method test() → dynamic {
   () → asy::Future<core::num> f = () → asy::Future<core::num> /* originally async */ {
-    final asy::Completer<core::num> :completer = asy::Completer::sync<core::num>();
+    final asy::Completer<core::num> :async_completer = asy::Completer::sync<core::num>();
     asy::FutureOr<core::num> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -26,17 +26,17 @@
             break #L1;
           }
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   };
   asy::Future<core::num> g = f.call();
   asy::Future<core::int> h = f.call() as{TypeError} asy::Future<core::int>;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.direct.transformed.expect
index 8c968ee..7c5e12b 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
 
 static method test() → dynamic {
   dynamic f = () → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -26,17 +26,17 @@
             break #L1;
           }
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   };
   asy::Future<core::num> g = f.call();
   asy::Future<core::int> h = f.call();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect
index 45d5637..08a88b2 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 
 static method test() → dynamic {
   () → asy::Future<core::num> f = () → asy::Future<core::num> /* originally async */ {
-    final asy::Completer<core::num> :completer = asy::Completer::sync<core::num>();
+    final asy::Completer<core::num> :async_completer = asy::Completer::sync<core::num>();
     asy::FutureOr<core::num> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -26,17 +26,17 @@
             break #L1;
           }
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   };
   asy::Future<core::num> g = f.call();
   asy::Future<core::int> h = f.call() as{TypeError} asy::Future<core::int>;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.direct.transformed.expect
index 04b9dad..642c44a 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -17,7 +17,7 @@
       #L1:
       {
         dynamic f = () → asy::Future<dynamic> /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -31,32 +31,32 @@
                 :return_value = null;
                 break #L2;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         };
         asy::Future<dynamic> y = f.call();
         asy::Future<core::String> z = f.call();
         [yield] let dynamic #t1 = asy::_awaitHelper(f.call(), :async_op_then, :async_op_error, :async_op) in null;
         core::String s = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect
index 1afc8d9..da3ad50 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -17,7 +17,7 @@
       #L1:
       {
         () → asy::Future<core::Null> f = () → asy::Future<core::Null> /* originally async */ {
-          final asy::Completer<core::Null> :completer = asy::Completer::sync<core::Null>();
+          final asy::Completer<core::Null> :async_completer = asy::Completer::sync<core::Null>();
           asy::FutureOr<core::Null> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -31,32 +31,32 @@
                 :return_value = null;
                 break #L2;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         };
         asy::Future<dynamic> y = f.call();
         asy::Future<core::String> z = f.call();
         [yield] let dynamic #t1 = asy::_awaitHelper(f.call(), :async_op_then, :async_op_error, :async_op) in null;
         core::String s = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.direct.transformed.expect
index e58820a..3254b80 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -54,15 +54,15 @@
         [yield] let dynamic #t1 = asy::_awaitHelper(f.call().first, :async_op_then, :async_op_error, :async_op) in null;
         core::String s = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect
index 1d67b45..20fe1a2 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -54,15 +54,15 @@
         [yield] let dynamic #t1 = asy::_awaitHelper(f.call().{asy::Stream::first}, :async_op_then, :async_op_error, :async_op) in null;
         core::String s = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.direct.transformed.expect
index 126c90b..48cd5f2 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method main() → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -22,15 +22,15 @@
         [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<dynamic>(<dynamic>[d]), :async_op_then, :async_op_error, :async_op) in null;
         core::List<core::int> l1 = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect
index c7716b6..498dfc2 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method main() → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -22,15 +22,15 @@
         [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::List<core::int>>(<core::int>[d as{TypeError} core::int]), :async_op_then, :async_op_error, :async_op) in null;
         core::List<core::int> l1 = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect
index 3ef1a43..8a0ba8a 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect
@@ -10,7 +10,7 @@
 static method F<T extends core::Object = dynamic>() → self::F::T
   return null;
 static method f() → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -139,20 +139,20 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -212,15 +212,15 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
index 7dee1bb..49348b8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
@@ -10,7 +10,7 @@
 static method F<T extends core::Object = dynamic>() → self::F::T
   return null;
 static method f() → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -139,20 +139,20 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -212,15 +212,15 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.direct.transformed.expect
index 67e28bf..c86a42f 100644
--- a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -67,16 +67,16 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect
index 3b987da..ab6f7a7 100644
--- a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -67,16 +67,16 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect
index 440a04c..39bf766 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<dynamic> f;
   asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int>(3));
   asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
     return asy::Future::value<core::int>(3);
   });
   asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect
index ab76573..7eaed28 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<dynamic> f;
   asy::Future<core::int> t1 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(3));
   asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> {
     return asy::Future::value<core::int>(3);
   });
   asy::Future<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect
index 8dd522c..4b7549d 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<dynamic> f;
   asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int>(3));
   asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
     return new self::MyFuture::value<core::int>(3);
   });
   asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect
index a5f1b36..90bcbbb 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<dynamic> f;
   asy::Future<core::int> t1 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>(3));
   asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> {
     return new self::MyFuture::value<core::int>(3);
   });
   asy::Future<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect
index 11ee82f..7c89606 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<dynamic> f;
   self::MyFuture<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int>(3));
   self::MyFuture<core::int> t6 = f.then((dynamic _) → dynamic {
     return asy::Future::value<core::int>(3);
   });
   self::MyFuture<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect
index 79dea19..ca483a5 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<dynamic> f;
   self::MyFuture<core::int> t1 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(3));
   self::MyFuture<core::int> t6 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> {
     return asy::Future::value<core::int>(3);
   });
   self::MyFuture<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect
index 2c1403c..746d72c 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<dynamic> f;
   self::MyFuture<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int>(3));
   self::MyFuture<core::int> t6 = f.then((dynamic _) → dynamic {
     return new self::MyFuture::value<core::int>(3);
   });
   self::MyFuture<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect
index d0224a3..21ecf5e 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<dynamic> f;
   self::MyFuture<core::int> t1 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>(3));
   self::MyFuture<core::int> t6 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> {
     return new self::MyFuture::value<core::int>(3);
   });
   self::MyFuture<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect
index c373616..f996ff9 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   asy::Future<dynamic> f;
   asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int>(3));
   asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
     return new self::MyFuture::value<core::int>(3);
   });
   asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect
index 4181e8a..b19d080 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   asy::Future<dynamic> f;
   asy::Future<core::int> t1 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t3 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t4 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>(3));
   asy::Future<core::int> t6 = f.{asy::Future::then}<core::int>((dynamic _) → self::MyFuture<core::int> {
     return new self::MyFuture::value<core::int>(3);
   });
   asy::Future<core::int> t7 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t8 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect
index 7ea34b6..dda0a4f 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   asy::Future<dynamic> f;
   asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int>(3));
   asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
     return asy::Future::value<core::int>(3);
   });
   asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect
index 5013ebe..8214748 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   asy::Future<dynamic> f;
   asy::Future<core::int> t1 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t3 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t4 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(3));
   asy::Future<core::int> t6 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> {
     return asy::Future::value<core::int>(3);
   });
   asy::Future<core::int> t7 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t8 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect
index ef09e80..ee8635c 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::bool> f;
   asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = :result ? 2 : asy::Future::value<core::int>(3);
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int>(3));
   asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect
index d37757e..4edac72 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::bool> f;
   asy::Future<core::int> t1 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = (:result ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
   asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect
index 633179c..0d47534 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::bool> f;
   asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = :result ? 2 : new self::MyFuture::value<core::int>(3);
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int>(3));
   asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect
index ce0b933..f44cce1 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::bool> f;
   asy::Future<core::int> t1 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = (:result ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
   asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect
index ef96253..1373697 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::bool> f;
   self::MyFuture<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = :result ? 2 : asy::Future::value<core::int>(3);
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int>(3));
   self::MyFuture<core::int> t6 = f.then((dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect
index cf77812..15d1ad2 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::bool> f;
   self::MyFuture<core::int> t1 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = (:result ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
   self::MyFuture<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect
index 8299fbb..f91e051 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::bool> f;
   self::MyFuture<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = :result ? 2 : new self::MyFuture::value<core::int>(3);
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int>(3));
   self::MyFuture<core::int> t6 = f.then((dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect
index e57873c..ea24809 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::bool> f;
   self::MyFuture<core::int> t1 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = (:result ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
   self::MyFuture<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect
index 4d49b6e..21cf312 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   asy::Future<core::bool> f;
   asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = :result ? 2 : new self::MyFuture::value<core::int>(3);
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int>(3));
   asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect
index 468ec31..e258784 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   asy::Future<core::bool> f;
   asy::Future<core::int> t1 = f.{asy::Future::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = (:result ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
   asy::Future<core::int> t6 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect
index ba9e600..1a49a72 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   asy::Future<core::bool> f;
   asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = :result ? 2 : asy::Future::value<core::int>(3);
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int>(3));
   asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect
index 792ef91..a172c81 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   asy::Future<core::bool> f;
   asy::Future<core::int> t1 = f.{asy::Future::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = (:result ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
   asy::Future<core::int> t6 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect
index e57d937..e67586a 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::int> f;
   asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -48,20 +48,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -77,17 +77,17 @@
           :return_value = let final dynamic #t4 = :result in #t4.==(null) ? asy::Future::value<core::int>(3) : #t4;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => let final dynamic #t5 = x in #t5.==(null) ? asy::Future::value<core::int>(3) : #t5);
   asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect
index 311f23d..871bcf6 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::int> f;
   asy::Future<core::int> t1 = f.{self::MyFuture::then}<core::int>((core::int x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -48,20 +48,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::int x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -77,17 +77,17 @@
           :return_value = (let final core::int #t4 = :result in #t4.==(null) ?{core::Object} asy::Future::value<core::int>(3) : #t4) as{TypeError} asy::FutureOr<core::int>;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::int x) → asy::FutureOr<core::int> => (let final core::int #t5 = x in #t5.==(null) ?{core::Object} asy::Future::value<core::int>(3) : #t5) as{TypeError} asy::FutureOr<core::int>);
   asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::int x) → asy::FutureOr<core::int> {
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect
index 9397ba5..41c4879 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect
@@ -22,7 +22,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withoutType("asStream", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -36,20 +36,20 @@
         :return_value = x ? 42 : asy::Future::value<dynamic>(42);
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -63,20 +63,20 @@
         :return_value = x ? 42 : asy::Future::value<dynamic>(42);
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -91,16 +91,16 @@
         :return_value = y;
         break #L3;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect
index 61d62cb..c5b890a 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect
@@ -22,7 +22,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withoutType("asStream", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -36,20 +36,20 @@
         :return_value = (x ?{core::Object} 42 : asy::Future::value<core::int>(42)) as{TypeError} asy::FutureOr<core::int>;
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -63,20 +63,20 @@
         :return_value = (x ?{core::Object} 42 : asy::Future::value<core::int>(42)) as{TypeError} asy::FutureOr<core::int>;
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -91,16 +91,16 @@
         :return_value = y as{TypeError} asy::FutureOr<core::int>;
         break #L3;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect
index f31e5ca..4d30bd8 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect
@@ -22,7 +22,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withoutType("asStream", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -36,20 +36,20 @@
         :return_value = x ? 42 : new self::MyFuture::value<dynamic>(42);
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -63,20 +63,20 @@
         :return_value = x ? 42 : new self::MyFuture::value<dynamic>(42);
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -91,16 +91,16 @@
         :return_value = y;
         break #L3;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect
index ab69947..3e881c5 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect
@@ -22,7 +22,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withoutType("asStream", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -36,20 +36,20 @@
         :return_value = (x ?{core::Object} 42 : new self::MyFuture::value<core::int>(42)) as{TypeError} asy::FutureOr<core::int>;
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -63,20 +63,20 @@
         :return_value = (x ?{core::Object} 42 : new self::MyFuture::value<core::int>(42)) as{TypeError} asy::FutureOr<core::int>;
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -91,16 +91,16 @@
         :return_value = y as{TypeError} asy::FutureOr<core::int>;
         break #L3;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect
index fab89fe..9c55b25 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect
@@ -25,7 +25,7 @@
 static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
 static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
 static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -39,20 +39,20 @@
         :return_value = <dynamic>[3];
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -66,16 +66,16 @@
         :return_value = asy::Future::value<dynamic>(<dynamic>[3]);
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
index c8a55a9..372634f 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
@@ -28,7 +28,7 @@
                                            ^" in let final core::String #t2 = "hi" in null));
 static field asy::Future<core::List<core::int>> t2 = self::f.{self::MyFuture::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
 static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -42,20 +42,20 @@
         :return_value = <core::int>[3];
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -69,16 +69,16 @@
         :return_value = asy::Future::value<core::List<core::int>>(<core::int>[3]);
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect
index b669441..8311768 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect
@@ -25,7 +25,7 @@
 static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
 static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
 static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -39,20 +39,20 @@
         :return_value = <dynamic>[3];
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -66,16 +66,16 @@
         :return_value = new self::MyFuture::value<dynamic>(<dynamic>[3]);
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect
index 9dfa187..c6eedda 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect
@@ -25,7 +25,7 @@
 static field asy::Future<core::int> t1 = self::f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>("hi"));
 static field asy::Future<core::List<core::int>> t2 = self::f.{self::MyFuture::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
 static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -39,20 +39,20 @@
         :return_value = <core::int>[3];
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -66,16 +66,16 @@
         :return_value = new self::MyFuture::value<core::List<core::int>>(<core::int>[3]);
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect
index 7e22485..d310fa8 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect
@@ -25,7 +25,7 @@
 static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
 static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
 static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -39,20 +39,20 @@
         :return_value = <dynamic>[3];
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -66,16 +66,16 @@
         :return_value = asy::Future::value<dynamic>(<dynamic>[3]);
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
index 55eb919..85c2fcd 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
@@ -28,7 +28,7 @@
                                            ^" in let final core::String #t2 = "hi" in null));
 static field asy::Future<core::List<core::int>> t2 = self::f.{asy::Future::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
 static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -42,20 +42,20 @@
         :return_value = <core::int>[3];
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -69,16 +69,16 @@
         :return_value = asy::Future::value<core::List<core::int>>(<core::int>[3]);
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect
index 7d02922..5b25967 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect
@@ -25,7 +25,7 @@
 static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
 static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
 static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -39,20 +39,20 @@
         :return_value = <dynamic>[3];
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -66,16 +66,16 @@
         :return_value = new self::MyFuture::value<dynamic>(<dynamic>[3]);
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect
index f9e32bb..39403ea 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect
@@ -25,7 +25,7 @@
 static field asy::Future<core::int> t1 = self::f.{asy::Future::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>("hi"));
 static field asy::Future<core::List<core::int>> t2 = self::f.{asy::Future::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
 static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -39,20 +39,20 @@
         :return_value = <core::int>[3];
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -66,16 +66,16 @@
         :return_value = new self::MyFuture::value<core::List<core::int>>(<core::int>[3]);
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect
index 4851f62..a702c69 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect
@@ -9,7 +9,7 @@
     ;
 }
 static method foo() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -26,16 +26,16 @@
         [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::wait<dynamic>(<dynamic>[f1, f2]), :async_op_then, :async_op_error, :async_op) in null;
         core::List<core::List<self::A>> merged = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect
index 17ee2b4..5491836 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
     ;
 }
 static method foo() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -26,16 +26,16 @@
         [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::wait<core::List<self::A>>(<asy::Future<core::List<self::A>>>[f1, f2]), :async_op_then, :async_op_error, :async_op) in null;
         core::List<core::List<self::A>> merged = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.transformed.expect
index 91cb8b0..767567e 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
 static method id<T extends core::Object = dynamic>(self::id::T x) → self::id::T
   return x;
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -22,16 +22,16 @@
         [yield] let dynamic #t1 = asy::_awaitHelper(self::id<dynamic>(f), :async_op_then, :async_op_error, :async_op) in null;
         core::String s = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect
index 92c8c6b..96f60cf 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 static method id<T extends core::Object = dynamic>(self::id::T x) → self::id::T
   return x;
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -22,16 +22,16 @@
         [yield] let dynamic #t1 = asy::_awaitHelper(self::id<asy::FutureOr<core::String>>(f), :async_op_then, :async_op_error, :async_op) in null;
         core::String s = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect
index 0747a44..9be5e89 100644
--- a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect
@@ -19,7 +19,7 @@
     ;
 }
 static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -41,15 +41,15 @@
         core::List<self::A> list = result;
         list = result2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect
index 6fc7a69..bb72272 100644
--- a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
     ;
 }
 static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -41,15 +41,15 @@
         core::List<self::A> list = result;
         list = result2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.direct.transformed.expect
index 95cdc12..7a13cb2 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.direct.transformed.expect
@@ -7,7 +7,7 @@
   function f0() → dynamic
     return 42;
   function f1() → dynamic /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -21,23 +21,23 @@
           :return_value = 42;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
   function f2() → dynamic {
     return 42;
   }
   function f3() → dynamic /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -51,17 +51,17 @@
           :return_value = 42;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
   function f4() → dynamic /* originally sync* */ {
     dynamic :await_jump_var = 0;
diff --git a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect
index 5e738e7..a090131 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
   function f0() → core::int
     return 42;
   function f1() → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -21,23 +21,23 @@
           :return_value = 42;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
   function f2() → core::int {
     return 42;
   }
   function f3() → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -51,17 +51,17 @@
           :return_value = 42;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
   function f4() → core::Iterable<core::int> /* originally sync* */ {
     dynamic :await_jump_var = 0;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect
index f8f99d3..9b911b8 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect
@@ -14,7 +14,7 @@
     : super core::Object::•()
     ;
   method foo(self::Bar::T t) → dynamic /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -51,17 +51,17 @@
               }
           }
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
 }
 class Baz<T extends core::Object = dynamic, E extends asy::Stream<self::Baz::T> = dynamic, S extends self::Baz::E = dynamic> extends core::Object {
@@ -69,7 +69,7 @@
     : super core::Object::•()
     ;
   method foo(self::Baz::S t) → dynamic /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -107,17 +107,17 @@
               }
           }
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
 }
 abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
@@ -125,7 +125,7 @@
     return null;
 }
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -294,16 +294,16 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
index 9b52d11..e515591 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
@@ -14,7 +14,7 @@
     : super core::Object::•()
     ;
   method foo(generic-covariant-impl self::Bar::T t) → dynamic /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -54,17 +54,17 @@
               }
           }
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
 }
 class Baz<T extends core::Object = dynamic, E extends asy::Stream<self::Baz::T> = asy::Stream<dynamic>, S extends self::Baz::E = asy::Stream<dynamic>> extends core::Object {
@@ -72,7 +72,7 @@
     : super core::Object::•()
     ;
   method foo(generic-covariant-impl self::Baz::S t) → dynamic /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -113,17 +113,17 @@
               }
           }
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
 }
 abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
@@ -131,7 +131,7 @@
     return null;
 }
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -312,16 +312,16 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.direct.transformed.expect
index 3af0dce..f151285 100644
--- a/pkg/front_end/testcases/inference/local_return_and_yield.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart.direct.transformed.expect
@@ -9,7 +9,7 @@
     return (dynamic x) → dynamic => x;
   }
   function b() → asy::Future<(core::int) → core::int> /* originally async */ {
-    final asy::Completer<(core::int) → core::int> :completer = asy::Completer::sync<(core::int) → core::int>();
+    final asy::Completer<(core::int) → core::int> :async_completer = asy::Completer::sync<(core::int) → core::int>();
     asy::FutureOr<(core::int) → core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -23,17 +23,17 @@
           :return_value = (dynamic x) → dynamic => x;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
   function c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
     dynamic :await_jump_var = 0;
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect
index 3710faf..2a29a2c 100644
--- a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
     return (core::int x) → core::int => x;
   }
   function b() → asy::Future<(core::int) → core::int> /* originally async */ {
-    final asy::Completer<(core::int) → core::int> :completer = asy::Completer::sync<(core::int) → core::int>();
+    final asy::Completer<(core::int) → core::int> :async_completer = asy::Completer::sync<(core::int) → core::int>();
     asy::FutureOr<(core::int) → core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -26,17 +26,17 @@
                                    ^" in let final (dynamic) → dynamic #t2 = (dynamic x) → dynamic => x in null;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
   function c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
     dynamic :await_jump_var = 0;
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.direct.transformed.expect
index 5ffcce0..129d552 100644
--- a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.direct.transformed.expect
@@ -8,7 +8,7 @@
   return (dynamic x) → dynamic => x;
 }
 static method b() → asy::Future<(core::int) → core::int> /* originally async */ {
-  final asy::Completer<(core::int) → core::int> :completer = asy::Completer::sync<(core::int) → core::int>();
+  final asy::Completer<(core::int) → core::int> :async_completer = asy::Completer::sync<(core::int) → core::int>();
   asy::FutureOr<(core::int) → core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -22,17 +22,17 @@
         :return_value = (dynamic x) → dynamic => x;
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
   dynamic :await_jump_var = 0;
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect
index 02edb72..cb53a52 100644
--- a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
   return (core::int x) → core::int => x;
 }
 static method b() → asy::Future<(core::int) → core::int> /* originally async */ {
-  final asy::Completer<(core::int) → core::int> :completer = asy::Completer::sync<(core::int) → core::int>();
+  final asy::Completer<(core::int) → core::int> :async_completer = asy::Completer::sync<(core::int) → core::int>();
   asy::FutureOr<(core::int) → core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -25,17 +25,17 @@
                                  ^" in let final (dynamic) → dynamic #t2 = (dynamic x) → dynamic => x in null;
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
   dynamic :await_jump_var = 0;
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.direct.transformed.expect
index 4381b61..2b3bdf6 100644
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -67,16 +67,16 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
index a61a3ed..bb9b75a 100644
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -82,16 +82,16 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect
index c6044b0..b82a06f 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect
@@ -16,7 +16,7 @@
 static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -133,16 +133,16 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
index e8c97af..c633524 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
@@ -16,7 +16,7 @@
 static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -139,16 +139,16 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.outline.expect b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.outline.expect
index 8c7b02d..8c3bb35 100644
--- a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.outline.expect
@@ -3,7 +3,8 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  const constructor •() → void
+  field dynamic x;
+  constructor •() → void
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/super.dart.strong.expect b/pkg/front_end/testcases/rasta/super.dart.strong.expect
index 5462697..a3c04bd 100644
--- a/pkg/front_end/testcases/rasta/super.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.strong.expect
@@ -423,13 +423,13 @@
     super.m -= 42;
           ^", "pkg/front_end/testcases/rasta/super.dart:248:15: Error: Superclass has no setter named 'm'.
     use(super.m -= 42);
-              ^", "pkg/front_end/testcases/rasta/super.dart:147:11: Error: Too many positional arguments to method: 0 allowed, 1 given.
+              ^", "pkg/front_end/testcases/rasta/super.dart:147:11: Error: Too many positional arguments: 0 allowed, 1 given.
     super.m(87);
-          ^", "pkg/front_end/testcases/rasta/super.dart:148:15: Error: Too many positional arguments to method: 0 allowed, 1 given.
+          ^", "pkg/front_end/testcases/rasta/super.dart:148:15: Error: Too many positional arguments: 0 allowed, 1 given.
     use(super.m(87));
-              ^", "pkg/front_end/testcases/rasta/super.dart:149:11: Error: Too many positional arguments to method: 0 allowed, 1 given.
+              ^", "pkg/front_end/testcases/rasta/super.dart:149:11: Error: Too many positional arguments: 0 allowed, 1 given.
     super.n(87);
-          ^", "pkg/front_end/testcases/rasta/super.dart:150:15: Error: Too many positional arguments to method: 0 allowed, 1 given.
+          ^", "pkg/front_end/testcases/rasta/super.dart:150:15: Error: Too many positional arguments: 0 allowed, 1 given.
     use(super.n(87));
               ^"]/* from null */;
 static method use(dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect
new file mode 100644
index 0000000..4776f6a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field dynamic f = core::Map<dynamic, dynamic>.<(self::A);
+  field dynamic B = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  operator >() → dynamic {}
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
+Try adding the keyword 'operator'.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
+Try adding a parameter list to the method declaration.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
+  var f = Map<A, B> {};
+                      ^"]/* from null */;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31155.dart.direct.transformed.expect
new file mode 100644
index 0000000..4776f6a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.direct.transformed.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field dynamic f = core::Map<dynamic, dynamic>.<(self::A);
+  field dynamic B = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  operator >() → dynamic {}
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
+Try adding the keyword 'operator'.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
+Try adding a parameter list to the method declaration.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
+  var f = Map<A, B> {};
+                      ^"]/* from null */;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect
index f0ee655..5b7edf4 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect
@@ -12,8 +12,11 @@
 }
 class C extends core::Object {
   field dynamic f;
+  field dynamic B;
   synthetic constructor •() → void
     ;
+  operator >() → dynamic
+    ;
 }
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
new file mode 100644
index 0000000..e088ade
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field dynamic f = let final dynamic #t1 = core::Map<dynamic, dynamic> in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The method '<' isn't defined for the class 'dart.core::Type'.
+Try correcting the name to the name of an existing method, or defining a method named '<'.
+  var f = Map<A, B> {};
+             ^";
+  field dynamic B = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  operator >() → dynamic {}
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
+Try adding the keyword 'operator'.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
+Try adding a parameter list to the method declaration.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
+  var f = Map<A, B> {};
+                      ^"]/* from null */;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
new file mode 100644
index 0000000..3e6b682
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field dynamic f = let final core::Type #t1 = core::Map<dynamic, dynamic> in let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The method '<' isn't defined for the class 'dart.core::Type'.
+Try correcting the name to the name of an existing method, or defining a method named '<'.
+  var f = Map<A, B> {};
+             ^";
+  field dynamic B = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  operator >() → dynamic {}
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
+Try adding the keyword 'operator'.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
+Try adding a parameter list to the method declaration.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
+  var f = Map<A, B> {};
+                      ^"]/* from null */;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart b/pkg/front_end/testcases/regress/issue_31171.dart
new file mode 100644
index 0000000..c7ffc48
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31171.dart
@@ -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.
+
+main() {}
+
+typedef T = 
+typedef F = Map<String, dynamic> Function();
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect
new file mode 100644
index 0000000..fa8d68a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef T = dynamic;
+typedef F = () → core::Map<core::String, dynamic>;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+typedef T = 
+          ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31171.dart.direct.transformed.expect
new file mode 100644
index 0000000..fa8d68a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.direct.transformed.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef T = dynamic;
+typedef F = () → core::Map<core::String, dynamic>;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+typedef T = 
+          ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31171.dart.outline.expect
new file mode 100644
index 0000000..b3a684f
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.outline.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef T = dynamic;
+typedef F = () → core::Map<core::String, dynamic>;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect
new file mode 100644
index 0000000..fa8d68a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef T = dynamic;
+typedef F = () → core::Map<core::String, dynamic>;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+typedef T = 
+          ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect
new file mode 100644
index 0000000..fa8d68a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef T = dynamic;
+typedef F = () → core::Map<core::String, dynamic>;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+typedef T = 
+          ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart b/pkg/front_end/testcases/regress/issue_31188.dart
new file mode 100644
index 0000000..197dfae
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31188.dart
@@ -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.
+
+main() {}
+
+type T = Map<A, B>
+
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect
new file mode 100644
index 0000000..c7b38c9
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field invalid-type T = core::Map<dynamic, dynamic>.<(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#A, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+static field invalid-type B;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
+type T = Map<A, B>
+                 ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+type T = Map<A, B>
+                 ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31188.dart.direct.transformed.expect
new file mode 100644
index 0000000..c7b38c9
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.direct.transformed.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field invalid-type T = core::Map<dynamic, dynamic>.<(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#A, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+static field invalid-type B;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
+type T = Map<A, B>
+                 ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+type T = Map<A, B>
+                 ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31188.dart.outline.expect
new file mode 100644
index 0000000..c8bd468
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.outline.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+
+static field invalid-type T;
+static field invalid-type B;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
new file mode 100644
index 0000000..86d47c4
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field invalid-type T = let final dynamic #t1 = core::Map<dynamic, dynamic> in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The method '<' isn't defined for the class 'dart.core::Type'.
+Try correcting the name to the name of an existing method, or defining a method named '<'.
+type T = Map<A, B>
+            ^";
+static field invalid-type B;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
+type T = Map<A, B>
+                 ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+type T = Map<A, B>
+                 ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: Type 'type' not found.
+type T = Map<A, B>
+^", "pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: 'type' isn't a type.
+type T = Map<A, B>
+^^^^", "pkg/front_end/testcases/regress/issue_31188.dart:7:14: Error: Getter not found: 'A'.
+type T = Map<A, B>
+             ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect
new file mode 100644
index 0000000..10e28a1
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field invalid-type T = let final core::Type #t1 = core::Map<dynamic, dynamic> in let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The method '<' isn't defined for the class 'dart.core::Type'.
+Try correcting the name to the name of an existing method, or defining a method named '<'.
+type T = Map<A, B>
+            ^";
+static field invalid-type B;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
+type T = Map<A, B>
+                 ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+type T = Map<A, B>
+                 ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: Type 'type' not found.
+type T = Map<A, B>
+^", "pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: 'type' isn't a type.
+type T = Map<A, B>
+^^^^", "pkg/front_end/testcases/regress/issue_31188.dart:7:14: Error: Getter not found: 'A'.
+type T = Map<A, B>
+             ^"]/* from null */;
+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
index be7bde0..1c01a1f 100644
--- a/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
@@ -17,9 +17,9 @@
   A.foo() : m = 2;
   ^", "pkg/front_end/testcases/regress/issue_31299.dart:11:7: Error: Conflicts with constructor 'A.foo'.
   int foo(int a, int b) => a + b * m;
-      ^", "pkg/front_end/testcases/regress/issue_31299.dart:18:7: Error: Too many positional arguments to constructor: 0 allowed, 2 given.
+      ^", "pkg/front_end/testcases/regress/issue_31299.dart:18:7: Error: Too many positional arguments: 0 allowed, 2 given.
   new A.foo(1, 2);
-      ^", "pkg/front_end/testcases/regress/issue_31299.dart:15:11: Error: Too few positional arguments to method: 2 required, 0 given.
+      ^", "pkg/front_end/testcases/regress/issue_31299.dart:15:11: Error: Too few positional arguments: 2 required, 0 given.
   new A().foo();
           ^"]/* from null */;
 static method test() → dynamic {
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index 3ee0f85..b0858b9 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -198,7 +198,6 @@
 regress/issue_29976: RuntimeError # Issue 29976.
 regress/issue_29982: Fail # Issue 29982.
 regress/issue_30836: RuntimeError # Issue 30836.
-regress/issue_31155: Crash # Issue 31155.
 regress/issue_31184: TypeCheckError
 regress/issue_31299: TypeCheckError
 
diff --git a/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect b/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
index 1f6b644..f5230259 100644
--- a/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
+++ b/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
@@ -357,9 +357,9 @@
     super.m -= 42;
           ^", "pkg/front_end/testcases/super_rasta_copy.dart:232:15: Error: Superclass has no setter named 'm'.
     use(super.m -= 42);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:139:11: Error: Too many positional arguments to method: 0 allowed, 1 given.
+              ^", "pkg/front_end/testcases/super_rasta_copy.dart:139:11: Error: Too many positional arguments: 0 allowed, 1 given.
     super.m(87);
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:140:15: Error: Too many positional arguments to method: 0 allowed, 1 given.
+          ^", "pkg/front_end/testcases/super_rasta_copy.dart:140:15: Error: Too many positional arguments: 0 allowed, 1 given.
     use(super.m(87));
               ^"]/* from null */;
 static method use(dynamic x) → dynamic {
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 7ff892f..afe96c6 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -5011,7 +5011,7 @@
   /// argument of a dynamic invocation of a generic function.
   DartType defaultType;
 
-  TypeParameter([this.name, this.bound]);
+  TypeParameter([this.name, this.bound, this.defaultType]);
 
   // Must match serialized bit positions.
   static const int FlagGenericCovariantImpl = 1 << 0;
@@ -5041,10 +5041,14 @@
 
   visitChildren(Visitor v) {
     bound.accept(v);
+    defaultType?.accept(v);
   }
 
   transformChildren(Transformer v) {
     bound = v.visitDartType(bound);
+    if (defaultType != null) {
+      defaultType = v.visitDartType(defaultType);
+    }
   }
 
   /// Returns a possibly synthesized name for this type parameter, consistent
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 0b8053d..b75a3a3 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -48,7 +48,7 @@
   int _byteOffset = 0;
   final List<String> _stringTable = <String>[];
   final List<Uri> _sourceUriTable = <Uri>[];
-  List<Constant> _constantTable;
+  Map<int, Constant> _constantTable = <int, Constant>{};
   List<CanonicalName> _linkTable;
   int _transformerFlags = 0;
   Library _currentLibrary;
@@ -175,9 +175,9 @@
 
   void readConstantTable() {
     final int length = readUInt();
-    _constantTable = new List<Constant>(length);
+    final int startOffset = byteOffset;
     for (int i = 0; i < length; i++) {
-      _constantTable[i] = readConstantTableEntry();
+      _constantTable[byteOffset - startOffset] = readConstantTableEntry();
     }
   }
 
@@ -252,8 +252,8 @@
   }
 
   Constant readConstantReference() {
-    final int index = readUInt();
-    Constant constant = _constantTable[index];
+    final int offset = readUInt();
+    Constant constant = _constantTable[offset];
     assert(constant != null);
     return constant;
   }
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 0329a1f..156d80b 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -31,6 +31,8 @@
 
   final BufferedSink _mainSink;
   final BufferedSink _metadataSink;
+  final BytesSink _constantsBytesSink;
+  BufferedSink _constantsSink;
   BufferedSink _sink;
 
   List<int> libraryOffsets;
@@ -54,8 +56,10 @@
   BinaryPrinter(Sink<List<int>> sink, {StringIndexer stringIndexer})
       : _mainSink = new BufferedSink(sink),
         _metadataSink = new BufferedSink(new BytesSink()),
+        _constantsBytesSink = new BytesSink(),
         stringIndexer = stringIndexer ?? new StringIndexer() {
-    _constantIndexer = new ConstantIndexer(this.stringIndexer);
+    _constantsSink = new BufferedSink(_constantsBytesSink);
+    _constantIndexer = new ConstantIndexer(this.stringIndexer, this);
     _sink = _mainSink;
   }
 
@@ -94,7 +98,7 @@
   }
 
   int getBufferOffset() {
-    return _sink.flushedLength + _sink.length;
+    return _sink.offset;
   }
 
   void writeStringTable(StringIndexer indexer) {
@@ -137,12 +141,15 @@
     _binaryOffsetForConstantTable = getBufferOffset();
 
     writeUInt30(indexer.entries.length);
-    for (final entry in indexer.entries) {
-      writeConstantTableEntry(entry);
-    }
+    assert(identical(_sink, _mainSink));
+    _constantsSink.flushAndDestroy();
+    writeBytes(_constantsBytesSink.builder.takeBytes());
   }
 
-  void writeConstantTableEntry(Constant constant) {
+  int writeConstantTableEntry(Constant constant) {
+    BufferedSink oldSink = _sink;
+    _sink = _constantsSink;
+    int initialOffset = _sink.offset;
     if (constant is NullConstant) {
       writeByte(ConstantTag.NullConstant);
     } else if (constant is BoolConstant) {
@@ -198,6 +205,8 @@
     } else {
       throw 'Unsupported constant $constant';
     }
+    _sink = oldSink;
+    return _constantsSink.offset - initialOffset;
   }
 
   void writeDartType(DartType type) {
@@ -2011,15 +2020,18 @@
   final StringIndexer stringIndexer;
 
   final List<Constant> entries = <Constant>[];
-  final Map<Constant, int> index = <Constant, int>{};
+  final Map<Constant, int> offsets = <Constant, int>{};
+  int nextOffset = 0;
 
-  ConstantIndexer(this.stringIndexer);
+  final BinaryPrinter _printer;
+
+  ConstantIndexer(this.stringIndexer, this._printer);
 
   int put(Constant constant) {
-    final int oldIndex = index[constant];
-    if (oldIndex != null) return oldIndex;
+    final int oldOffset = offsets[constant];
+    if (oldOffset != null) return oldOffset;
 
-    // Traverse DAG in post-order to ensure children have their id's assigned
+    // Traverse DAG in post-order to ensure children have their offsets assigned
     // before the parent.
     constant.visitChildren(this);
 
@@ -2034,16 +2046,17 @@
       }
     }
 
-    final int newIndex = entries.length;
+    final int newOffset = nextOffset;
     entries.add(constant);
-    return index[constant] = newIndex;
+    nextOffset += _printer.writeConstantTableEntry(constant);
+    return offsets[constant] = newOffset;
   }
 
   defaultConstantReference(Constant node) {
     put(node);
   }
 
-  int operator [](Constant node) => index[node];
+  int operator [](Constant node) => offsets[node];
 }
 
 class TypeParameterIndexer {
@@ -2117,6 +2130,8 @@
   Float64List _doubleBuffer = new Float64List(1);
   Uint8List _doubleBufferUint8;
 
+  int get offset => length + flushedLength;
+
   BufferedSink(this._sink);
 
   void addDouble(double d) {
diff --git a/pkg/kernel/lib/transformations/continuation.dart b/pkg/kernel/lib/transformations/continuation.dart
index 7cfea5e..d31f70a 100644
--- a/pkg/kernel/lib/transformations/continuation.dart
+++ b/pkg/kernel/lib/transformations/continuation.dart
@@ -969,8 +969,8 @@
     if (syncAsync) {
       final completerType = new InterfaceType(
           helper.asyncAwaitCompleterClass, completerTypeArguments);
-      // final Completer<T> :completer = new _AsyncAwaitCompleter<T>();
-      completerVariable = new VariableDeclaration(":completer",
+      // final Completer<T> :async_completer = new _AsyncAwaitCompleter<T>();
+      completerVariable = new VariableDeclaration(":async_completer",
           initializer: new ConstructorInvocation(
               helper.asyncAwaitCompleterConstructor,
               new Arguments([], types: completerTypeArguments))
@@ -980,8 +980,8 @@
     } else {
       final completerType =
           new InterfaceType(helper.completerClass, completerTypeArguments);
-      // final Completer<T> :completer = new Completer<T>.sync();
-      completerVariable = new VariableDeclaration(":completer",
+      // final Completer<T> :async_completer = new Completer<T>.sync();
+      completerVariable = new VariableDeclaration(":async_completer",
           initializer: new StaticInvocation(helper.completerConstructor,
               new Arguments([], types: completerTypeArguments))
             ..fileOffset = enclosingFunction.body?.fileOffset ?? -1,
@@ -996,7 +996,7 @@
     setupAsyncContinuations(statements);
 
     if (syncAsync) {
-      // :completer.start(:async_op);
+      // :async_completer.start(:async_op);
       var startStatement = new ExpressionStatement(new MethodInvocation(
           new VariableGet(completerVariable),
           new Name('start'),
@@ -1012,7 +1012,7 @@
         ..fileOffset = enclosingFunction.fileOffset);
       statements.add(newMicrotaskStatement);
     }
-    // return :completer.future;
+    // return :async_completer.future;
     var completerGet = new VariableGet(completerVariable);
     var returnStatement = new ReturnStatement(new PropertyGet(completerGet,
         new Name('future', helper.asyncLibrary), helper.completerFuture));
diff --git a/pkg/kernel/lib/type_algebra.dart b/pkg/kernel/lib/type_algebra.dart
index ad6017b..821f9d5 100644
--- a/pkg/kernel/lib/type_algebra.dart
+++ b/pkg/kernel/lib/type_algebra.dart
@@ -229,6 +229,12 @@
   }
   for (int i = 0; i < typeParameters.length; ++i) {
     freshParameters[i].bound = substitute(typeParameters[i].bound, map);
+
+    // [defaultType] is populated using instantiate-to-bound algorithm, so it
+    // shouldn't refer to type parameters from the same declaration.  However,
+    // if a transformation changes [defaultType], it may get such references,
+    // and the line below should invoke [substitute], like for [bound] above.
+    freshParameters[i].defaultType = typeParameters[i].defaultType;
   }
   return new FreshTypeParameters(freshParameters, Substitution.fromMap(map));
 }
diff --git a/pkg/pkg.status b/pkg/pkg.status
index a6d778d..70fb077 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -63,6 +63,7 @@
 analyzer_cli/test/*: SkipByDesign # Only meant to run on vm
 analyzer_plugin/test/*: SkipByDesign # Only meant to run on vm
 analyzer_plugin/tool/*: SkipByDesign # Only meant to run on vm
+build_integration/test/*: SkipByDesign # Only meant to run on vm, most use dart:mirrors and dart:io
 collection/test/equality_test/01: Fail # Issue 1533
 collection/test/equality_test/02: Fail # Issue 1533
 collection/test/equality_test/03: Fail # Issue 1533
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index 0590e39..ba848ff 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -262,7 +262,8 @@
 
   if (compiler == null) {
     port.send(new CompilationResult.errors(
-        ["No incremental compiler available for this isolate."]).toResponse());
+            ["No incremental compiler available for this isolate."], null)
+        .toResponse());
     return;
   }
 
@@ -274,14 +275,15 @@
         expression, definitions, typeDefinitions, libraryUri, klass, isStatic);
 
     if (procedure == null) {
-      port.send(new CompilationResult.errors(["Invalid scope."]).toResponse());
+      port.send(
+          new CompilationResult.errors(["Invalid scope."], null).toResponse());
       return;
     }
 
     if (compiler.errors.isNotEmpty) {
       // TODO(sigmund): the compiler prints errors to the console, so we
       // shouldn't print those messages again here.
-      result = new CompilationResult.errors(compiler.errors);
+      result = new CompilationResult.errors(compiler.errors, null);
     } else {
       result = new CompilationResult.ok(serializeProcedure(procedure));
     }
@@ -387,7 +389,8 @@
     Component component = await compiler.compile(script);
 
     if (compiler.errors.isNotEmpty) {
-      result = new CompilationResult.errors(compiler.errors);
+      result = new CompilationResult.errors(compiler.errors,
+          serializeComponent(component, filter: (lib) => !lib.isExternal));
     } else {
       // We serialize the component excluding vm_platform.dill because the VM has
       // these sources built-in. Everything loaded as a summary in
@@ -415,7 +418,7 @@
       inputFileUri,
       inputFileUri,
       null,
-      new CompilationResult.errors(<String>["unknown tag"]).payload
+      new CompilationResult.errors(<String>["unknown tag"], null).payload
     ]);
   }
 }
@@ -509,7 +512,8 @@
 
   factory CompilationResult.ok(Uint8List bytes) = _CompilationOk;
 
-  factory CompilationResult.errors(List<String> errors) = _CompilationError;
+  factory CompilationResult.errors(List<String> errors, Uint8List bytes) =
+      _CompilationError;
 
   factory CompilationResult.crash(Object exception, StackTrace stack) =
       _CompilationCrash;
@@ -545,9 +549,10 @@
 }
 
 class _CompilationError extends _CompilationFail {
+  final Uint8List bytes;
   final List<String> errors;
 
-  _CompilationError(this.errors);
+  _CompilationError(this.errors, this.bytes);
 
   @override
   Status get status => Status.error;
@@ -556,6 +561,8 @@
   String get errorString => errors.take(10).join('\n');
 
   String toString() => "_CompilationError(${errorString})";
+
+  List toResponse() => [status.index, payload, bytes];
 }
 
 class _CompilationCrash extends _CompilationFail {
diff --git a/pkg/vm/lib/bytecode/constant_pool.dart b/pkg/vm/lib/bytecode/constant_pool.dart
index 0b3cb58..287ed0a 100644
--- a/pkg/vm/lib/bytecode/constant_pool.dart
+++ b/pkg/vm/lib/bytecode/constant_pool.dart
@@ -63,8 +63,15 @@
   ConstantIndex argDesc;
 }
 
+enum InvocationKind {
+  method, // x.foo(...) or foo(...)
+  getter, // x.foo
+  setter  // x.foo = ...
+}
+
 type ConstantStaticICData extends ConstantPoolEntry {
   Byte tag = 8;
+  Byte invocationKind; // Index in InvocationKind enum.
   CanonicalNameReference target;
   ConstantIndex argDesc;
 }
@@ -468,13 +475,20 @@
   bool operator ==(other) => identical(this, other);
 }
 
+enum InvocationKind { method, getter, setter }
+
 class ConstantStaticICData extends ConstantPoolEntry {
+  final InvocationKind invocationKind;
   final Reference _reference;
   final int argDescConstantIndex;
 
-  ConstantStaticICData(Member member, int argDescConstantIndex)
-      : this.byReference(member.reference, argDescConstantIndex);
-  ConstantStaticICData.byReference(this._reference, this.argDescConstantIndex);
+  ConstantStaticICData(
+      InvocationKind invocationKind, Member member, int argDescConstantIndex)
+      : this.byReference(
+            invocationKind, member.reference, argDescConstantIndex);
+
+  ConstantStaticICData.byReference(
+      this.invocationKind, this._reference, this.argDescConstantIndex);
 
   Member get target => _reference.asMember;
 
@@ -483,17 +497,23 @@
 
   @override
   void writeValueToBinary(BinarySink sink) {
+    sink.writeByte(invocationKind.index);
     sink.writeCanonicalNameReference(getCanonicalNameOfMember(target));
     sink.writeUInt30(argDescConstantIndex);
   }
 
   ConstantStaticICData.readFromBinary(BinarySource source)
-      : _reference = source.readCanonicalNameReference().getReference(),
+      : invocationKind = InvocationKind.values[source.readByte()],
+        _reference = source.readCanonicalNameReference().getReference(),
         argDescConstantIndex = source.readUInt();
 
   @override
   String toString() =>
-      'StaticICData target \'$target\', arg-desc CP#$argDescConstantIndex';
+      'StaticICData ' +
+      (invocationKind == InvocationKind.getter
+          ? 'get '
+          : (invocationKind == InvocationKind.setter ? 'set ' : '')) +
+      'target \'$target\', arg-desc CP#$argDescConstantIndex';
 
   // ConstantStaticICData entries are created per call site and should not be
   // merged, so ConstantStaticICData class uses identity [hashCode] and
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 8d189b7..0bfd866 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -235,10 +235,15 @@
     asm.emitReturnTOS();
   }
 
-  void _genStaticCall(
-      Member target, ConstantArgDesc argDesc, int totalArgCount) {
+  void _genStaticCall(Member target, ConstantArgDesc argDesc, int totalArgCount,
+      {bool isGet: false, bool isSet: false}) {
+    assert(!isGet || !isSet);
     final argDescIndex = cp.add(argDesc);
-    final icdataIndex = cp.add(new ConstantStaticICData(target, argDescIndex));
+    final kind = isGet
+        ? InvocationKind.getter
+        : (isSet ? InvocationKind.setter : InvocationKind.method);
+    final icdataIndex =
+        cp.add(new ConstantStaticICData(kind, target, argDescIndex));
 
     asm.emitPushConstant(icdataIndex);
     asm.emitIndirectStaticCall(totalArgCount, argDescIndex);
@@ -470,7 +475,7 @@
 
   void end(Member node) {
     metadata.mapping[node] =
-        new BytecodeMetadata(asm.bytecode, asm.exceptionsTable, cp, closures);
+        new BytecodeMetadata(cp, asm.bytecode, asm.exceptionsTable, closures);
 
     if (isTraceEnabled) {
       print('Generated bytecode for $node');
@@ -848,7 +853,7 @@
     node.receiver.accept(this);
     final target = node.target;
     if (target is Field || (target is Procedure && target.isGetter)) {
-      _genStaticCall(target, new ConstantArgDesc(1), 1);
+      _genStaticCall(target, new ConstantArgDesc(1), 1, isGet: true);
     } else {
       throw new UnsupportedOperationError(
           'Unsupported DirectPropertyGet with ${target.runtimeType} $target');
@@ -1053,7 +1058,7 @@
           'Unsupported SuperPropertyGet without target');
     }
     if (target is Field || (target is Procedure && target.isGetter)) {
-      _genStaticCall(target, new ConstantArgDesc(1), 1);
+      _genStaticCall(target, new ConstantArgDesc(1), 1, isGet: true);
     } else {
       throw new UnsupportedOperationError(
           'Unsupported SuperPropertyGet with target ${target.runtimeType} $target');
@@ -1113,11 +1118,11 @@
             fieldIndex); // TODO(alexmarkov): do we really need this?
         asm.emitPushStatic(fieldIndex);
       } else {
-        _genStaticCall(target, new ConstantArgDesc(0), 0);
+        _genStaticCall(target, new ConstantArgDesc(0), 0, isGet: true);
       }
     } else if (target is Procedure) {
       if (target.isGetter) {
-        _genStaticCall(target, new ConstantArgDesc(0), 0);
+        _genStaticCall(target, new ConstantArgDesc(0), 0, isGet: true);
       } else {
         final tearOffIndex = cp.add(new ConstantTearOff(target));
         asm.emitPushConstant(tearOffIndex);
@@ -1152,7 +1157,7 @@
       int cpIndex = cp.add(new ConstantField(target));
       asm.emitStoreStaticTOS(cpIndex);
     } else {
-      _genStaticCall(target, new ConstantArgDesc(1), 1);
+      _genStaticCall(target, new ConstantArgDesc(1), 1, isSet: true);
       asm.emitDrop1();
     }
   }
diff --git a/pkg/vm/lib/frontend_server.dart b/pkg/vm/lib/frontend_server.dart
index c38213d..1c7c2f8 100644
--- a/pkg/vm/lib/frontend_server.dart
+++ b/pkg/vm/lib/frontend_server.dart
@@ -9,6 +9,7 @@
 import 'dart:io' hide FileSystemEntity;
 
 import 'package:args/args.dart';
+import 'package:build_integration/file_system/multi_root.dart';
 // front_end/src imports below that require lint `ignore_for_file`
 // are a temporary state of things until frontend team builds better api
 // that would replace api used below. This api was made private in
@@ -18,10 +19,7 @@
 import 'package:front_end/src/api_prototype/file_system.dart'
     show FileSystemEntity;
 import 'package:front_end/src/api_prototype/front_end.dart';
-// Use of multi_root_file_system.dart directly from front_end package is a
-// temporarily solution while we are looking for better home for that
-// functionality.
-import 'package:front_end/src/multi_root_file_system.dart';
+import 'package:front_end/src/fasta/kernel/utils.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/binary/ast_to_binary.dart';
 import 'package:kernel/binary/limited_ast_to_binary.dart';
@@ -123,7 +121,16 @@
 ${argParser.usage}
 ''';
 
-enum _State { READY_FOR_INSTRUCTION, RECOMPILE_LIST }
+enum _State {
+  READY_FOR_INSTRUCTION,
+  RECOMPILE_LIST,
+  COMPILE_EXPRESSION_EXPRESSION,
+  COMPILE_EXPRESSION_DEFS,
+  COMPILE_EXPRESSION_TYPEDEFS,
+  COMPILE_EXPRESSION_LIBRARY_URI,
+  COMPILE_EXPRESSION_KLASS,
+  COMPILE_EXPRESSION_IS_STATIC
+}
 
 /// Actions that every compiler should implement.
 abstract class CompilerInterface {
@@ -152,6 +159,26 @@
   /// Resets incremental compiler accept/reject status so that next time
   /// recompile is requested, complete kernel file is produced.
   void resetIncrementalCompiler();
+
+  /// Compiles [expression] with free variables listed in [definitions],
+  /// free type variables listed in [typedDefinitions]. "Free" means their
+  /// values are through evaluation API call, rather than coming from running
+  /// application.
+  /// If [klass] is not [null], expression is compiled in context of [klass]
+  /// class.
+  /// If [klass] is [null],expression is compiled at top-level of
+  /// [libraryUrl] library. If [klass] is not [null], [isStatic] determines
+  /// whether expression can refer to [this] or not.
+  Future<Null> compileExpression(
+      String expression,
+      List<String> definitions,
+      List<String> typeDefinitions,
+      String libraryUri,
+      String klass,
+      bool isStatic);
+
+  /// Communicates an error [msg] to the client.
+  void reportError(String msg);
 }
 
 abstract class ProgramTransformer {
@@ -207,7 +234,7 @@
     _kernelBinaryFilenameFull = _options['output-dill'] ?? '$filename.dill';
     _kernelBinaryFilenameIncremental = _options['output-incremental-dill'] ??
         (_options['output-dill'] != null
-            ? '${_options["output-dill"]}.incremental.dill'
+            ? '${_options['output-dill']}.incremental.dill'
             : '$filename.incremental.dill');
     _kernelBinaryFilename = _kernelBinaryFilenameFull;
     _initializeFromDill =
@@ -240,7 +267,7 @@
             break;
           case Severity.errorLegacyWarning:
           case Severity.context:
-            throw "Unexpected severity: $severity";
+            throw 'Unexpected severity: $severity';
         }
         if (printMessage) {
           _outputStream.writeln(message.formatted);
@@ -258,9 +285,9 @@
           options['filesystem-scheme'], rootUris, compilerOptions.fileSystem);
 
       if (_options['output-dill'] == null) {
-        print("When --filesystem-root is specified it is required to specify"
-            " --output-dill option that points to physical file system location"
-            " of a target dill file.");
+        print('When --filesystem-root is specified it is required to specify'
+            ' --output-dill option that points to physical file system location'
+            ' of a target dill file.');
         return false;
       }
     }
@@ -396,7 +423,37 @@
     _outputStream
         .writeln('$boundaryKey $_kernelBinaryFilename ${errors.length}');
     _kernelBinaryFilename = _kernelBinaryFilenameIncremental;
-    return null;
+  }
+
+  @override
+  Future<Null> compileExpression(
+      String expression,
+      List<String> definitions,
+      List<String> typeDefinitions,
+      String libraryUri,
+      String klass,
+      bool isStatic) async {
+    final String boundaryKey = new Uuid().generateV4();
+    _outputStream.writeln('result $boundaryKey');
+    Procedure procedure = await _generator.compileExpression(
+        expression, definitions, typeDefinitions, libraryUri, klass, isStatic);
+    if (procedure != null) {
+      final IOSink sink = new File(_kernelBinaryFilename).openWrite();
+      sink.add(serializeProcedure(procedure));
+      await sink.close();
+      _outputStream.writeln('$boundaryKey $_kernelBinaryFilename');
+      _kernelBinaryFilename = _kernelBinaryFilenameIncremental;
+    } else {
+      _outputStream.writeln(boundaryKey);
+    }
+  }
+
+  @override
+  void reportError(String msg) {
+    final String boundaryKey = new Uuid().generateV4();
+    _outputStream.writeln('result $boundaryKey');
+    _outputStream.writeln(msg);
+    _outputStream.writeln(boundaryKey);
   }
 
   @override
@@ -472,12 +529,24 @@
   await file.close();
 }
 
+class _CompileExpressionRequest {
+  String expression;
+  // Note that FE will reject a compileExpression command by returning a null
+  // procedure when defs or typeDefs include an illegal identifier.
+  List<String> defs = <String>[];
+  List<String> typeDefs = <String>[];
+  String library;
+  String klass;
+  bool isStatic;
+}
+
 /// Listens for the compilation commands on [input] stream.
 /// This supports "interactive" recompilation mode of execution.
 void listenAndCompile(CompilerInterface compiler, Stream<List<int>> input,
     ArgResults options, void quit(),
     {IncrementalCompiler generator}) {
   _State state = _State.READY_FOR_INSTRUCTION;
+  _CompileExpressionRequest compileExpressionRequest;
   String boundaryKey;
   String recompileFilename;
   input
@@ -488,6 +557,8 @@
       case _State.READY_FOR_INSTRUCTION:
         const String COMPILE_INSTRUCTION_SPACE = 'compile ';
         const String RECOMPILE_INSTRUCTION_SPACE = 'recompile ';
+        const String COMPILE_EXPRESSION_INSTRUCTION_SPACE =
+            'compile-expression ';
         if (string.startsWith(COMPILE_INSTRUCTION_SPACE)) {
           final String filename =
               string.substring(COMPILE_INSTRUCTION_SPACE.length);
@@ -505,6 +576,22 @@
             boundaryKey = remainder;
           }
           state = _State.RECOMPILE_LIST;
+        } else if (string.startsWith(COMPILE_EXPRESSION_INSTRUCTION_SPACE)) {
+          // 'compile-expression <boundarykey>
+          // expression
+          // definitions (one per line)
+          // ...
+          // <boundarykey>
+          // type-defintions (one per line)
+          // ...
+          // <boundarykey>
+          // <libraryUri: String>
+          // <klass: String>
+          // <isStatic: true|false>
+          compileExpressionRequest = new _CompileExpressionRequest();
+          boundaryKey =
+              string.substring(COMPILE_EXPRESSION_INSTRUCTION_SPACE.length);
+          state = _State.COMPILE_EXPRESSION_EXPRESSION;
         } else if (string == 'accept') {
           compiler.acceptLastDelta();
         } else if (string == 'reset') {
@@ -520,6 +607,48 @@
         } else
           compiler.invalidate(Uri.base.resolve(string));
         break;
+      case _State.COMPILE_EXPRESSION_EXPRESSION:
+        compileExpressionRequest.expression = string;
+        state = _State.COMPILE_EXPRESSION_DEFS;
+        break;
+      case _State.COMPILE_EXPRESSION_DEFS:
+        if (string == boundaryKey) {
+          state = _State.COMPILE_EXPRESSION_TYPEDEFS;
+        } else {
+          compileExpressionRequest.defs.add(string);
+        }
+        break;
+      case _State.COMPILE_EXPRESSION_TYPEDEFS:
+        if (string == boundaryKey) {
+          state = _State.COMPILE_EXPRESSION_LIBRARY_URI;
+        } else {
+          compileExpressionRequest.typeDefs.add(string);
+        }
+        break;
+      case _State.COMPILE_EXPRESSION_LIBRARY_URI:
+        compileExpressionRequest.library = string;
+        state = _State.COMPILE_EXPRESSION_KLASS;
+        break;
+      case _State.COMPILE_EXPRESSION_KLASS:
+        compileExpressionRequest.klass = string.isEmpty ? null : string;
+        state = _State.COMPILE_EXPRESSION_IS_STATIC;
+        break;
+      case _State.COMPILE_EXPRESSION_IS_STATIC:
+        if (string == 'true' || string == 'false') {
+          compileExpressionRequest.isStatic = string == 'true';
+          compiler.compileExpression(
+              compileExpressionRequest.expression,
+              compileExpressionRequest.defs,
+              compileExpressionRequest.typeDefs,
+              compileExpressionRequest.library,
+              compileExpressionRequest.klass,
+              compileExpressionRequest.isStatic);
+        } else {
+          compiler
+              .reportError('Got $string. Expected either "true" or "false"');
+        }
+        state = _State.READY_FOR_INSTRUCTION;
+        break;
     }
   });
 }
diff --git a/pkg/vm/lib/metadata/bytecode.dart b/pkg/vm/lib/metadata/bytecode.dart
index 3d5261f..0ba6b84 100644
--- a/pkg/vm/lib/metadata/bytecode.dart
+++ b/pkg/vm/lib/metadata/bytecode.dart
@@ -14,9 +14,9 @@
 /// In kernel binary, bytecode metadata is encoded as following:
 ///
 /// type BytecodeMetadata {
+///   ConstantPool constantPool
 ///   List<Byte> bytecodes
 ///   ExceptionsTable exceptionsTable
-///   ConstantPool constantPool
 ///   List<ClosureBytecode> closures
 /// }
 ///
@@ -33,14 +33,15 @@
 /// pkg/vm/lib/bytecode/constant_pool.dart.
 ///
 class BytecodeMetadata {
+  final ConstantPool constantPool;
   final List<int> bytecodes;
   final ExceptionsTable exceptionsTable;
-  final ConstantPool constantPool;
   final List<ClosureBytecode> closures;
 
   BytecodeMetadata(
-      this.bytecodes, this.exceptionsTable, this.constantPool, this.closures);
+      this.constantPool, this.bytecodes, this.exceptionsTable, this.closures);
 
+  // TODO(alexmarkov): Consider printing constant pool before bytecode.
   @override
   String toString() => "\n"
       "Bytecode {\n"
@@ -96,22 +97,22 @@
 
   @override
   void writeToBinary(BytecodeMetadata metadata, Node node, BinarySink sink) {
+    metadata.constantPool.writeToBinary(node, sink);
     sink.writeByteList(metadata.bytecodes);
     metadata.exceptionsTable.writeToBinary(sink);
-    metadata.constantPool.writeToBinary(node, sink);
     sink.writeUInt30(metadata.closures.length);
     metadata.closures.forEach((c) => c.writeToBinary(sink));
   }
 
   @override
   BytecodeMetadata readFromBinary(Node node, BinarySource source) {
-    final List<int> bytecodes = source.readByteList();
-    final exceptionsTable = new ExceptionsTable.readFromBinary(source);
     final ConstantPool constantPool =
         new ConstantPool.readFromBinary(node, source);
+    final List<int> bytecodes = source.readByteList();
+    final exceptionsTable = new ExceptionsTable.readFromBinary(source);
     final List<ClosureBytecode> closures = new List<ClosureBytecode>.generate(
         source.readUInt(), (_) => new ClosureBytecode.readFromBinary(source));
     return new BytecodeMetadata(
-        bytecodes, exceptionsTable, constantPool, closures);
+        constantPool, bytecodes, exceptionsTable, closures);
   }
 }
diff --git a/pkg/vm/pubspec.yaml b/pkg/vm/pubspec.yaml
index 66ed423..c6632f8 100644
--- a/pkg/vm/pubspec.yaml
+++ b/pkg/vm/pubspec.yaml
@@ -6,6 +6,7 @@
 environment:
   sdk: ">=1.8.0 <2.0.0"
 dependencies:
+  build_integration: 0.0.1
   front_end: 0.1.0-alpha.6
   kernel: 0.3.0-alpha.3
 dev_dependencies:
diff --git a/pkg/vm/test/frontend_server_test.dart b/pkg/vm/test/frontend_server_test.dart
index 7ea07d4..ba2cf03 100644
--- a/pkg/vm/test/frontend_server_test.dart
+++ b/pkg/vm/test/frontend_server_test.dart
@@ -470,6 +470,115 @@
       tempDir.delete(recursive: true);
     });
 
+    test('compile expression', () async {
+      var file = new File('${tempDir.path}/foo.dart')..createSync();
+      file.writeAsStringSync("main() {}\n");
+      var dillFile = new File('${tempDir.path}/app.dill');
+      expect(dillFile.existsSync(), equals(false));
+      final List<String> args = <String>[
+        '--sdk-root=${sdkRoot.toFilePath()}',
+        '--strong',
+        '--incremental',
+        '--platform=${platformKernel.path}',
+        '--output-dill=${dillFile.path}'
+      ];
+
+      final StreamController<List<int>> streamController =
+          new StreamController<List<int>>();
+      final StreamController<List<int>> stdoutStreamController =
+          new StreamController<List<int>>();
+      final IOSink ioSink = new IOSink(stdoutStreamController.sink);
+      StreamController<String> receivedResults = new StreamController<String>();
+
+      String boundaryKey;
+      stdoutStreamController.stream
+          .transform(utf8.decoder)
+          .transform(const LineSplitter())
+          .listen((String s) {
+        const String RESULT_OUTPUT_SPACE = 'result ';
+        if (boundaryKey == null) {
+          if (s.startsWith(RESULT_OUTPUT_SPACE)) {
+            boundaryKey = s.substring(RESULT_OUTPUT_SPACE.length);
+          }
+        } else {
+          if (s.startsWith(boundaryKey)) {
+            receivedResults.add(s.length > boundaryKey.length
+                ? s.substring(boundaryKey.length + 1)
+                : null);
+            boundaryKey = null;
+          }
+        }
+      });
+
+      int exitcode =
+          await starter(args, input: streamController.stream, output: ioSink);
+      expect(exitcode, equals(0));
+      streamController.add('compile ${file.path}\n'.codeUnits);
+      int count = 0;
+      Completer<bool> allDone = new Completer<bool>();
+      receivedResults.stream.listen((String outputFilenameAndErrorCount) {
+        if (count == 0) {
+          // First request is to 'compile', which results in full kernel file.
+          int delim = outputFilenameAndErrorCount.lastIndexOf(' ');
+          expect(delim > 0, equals(true));
+          String outputFilename =
+              outputFilenameAndErrorCount.substring(0, delim);
+          int errorsCount = int
+              .parse(outputFilenameAndErrorCount.substring(delim + 1).trim());
+
+          expect(dillFile.existsSync(), equals(true));
+          expect(outputFilename, dillFile.path);
+          expect(errorsCount, equals(0));
+          streamController.add('accept\n'.codeUnits);
+
+          // 'compile-expression <boundarykey>
+          // expression
+          // definitions (one per line)
+          // ...
+          // <boundarykey>
+          // type-defintions (one per line)
+          // ...
+          // <boundarykey>
+          // <libraryUri: String>
+          // <klass: String>
+          // <isStatic: true|false>
+          streamController.add(
+              'compile-expression abc\n2+2\nabc\nabc\n${file.uri}\n\n\n'
+                  .codeUnits);
+          count += 1;
+        } else if (count == 1) {
+          // Previous request should have failed because isStatic was blank
+          expect(outputFilenameAndErrorCount, isNull);
+
+          streamController.add(
+              'compile-expression abc\n2+2\nabc\nabc\n${file.uri}\n\nfalse\n'
+                  .codeUnits);
+          count += 1;
+        } else if (count == 2) {
+          // Second request is to 'compile-expression', which results in
+          // kernel file with a function that wraps compiled expression.
+          expect(outputFilenameAndErrorCount, isNotNull);
+          File outputFile = new File(outputFilenameAndErrorCount);
+          expect(outputFile.existsSync(), equals(true));
+          expect(outputFile.lengthSync(), isPositive);
+
+          streamController.add('compile foo.bar\n'.codeUnits);
+          count += 1;
+        } else {
+          expect(count, 3);
+          // Third request is to 'compile' non-existent file, that should fail.
+          int delim = outputFilenameAndErrorCount.lastIndexOf(' ');
+          expect(delim > 0, equals(true));
+          int errorsCount = int
+              .parse(outputFilenameAndErrorCount.substring(delim + 1).trim());
+          expect(errorsCount, greaterThan(0));
+          allDone.complete(true);
+        }
+      });
+
+      expect(await allDone.future, true);
+    });
+
     test('recompile request keeps incremental output dill filename', () async {
       var file = new File('${tempDir.path}/foo.dart')..createSync();
       file.writeAsStringSync("main() {}\n");
diff --git a/pkg/vm/testcases/bytecode/boostrapping.dart.expect b/pkg/vm/testcases/bytecode/boostrapping.dart.expect
index ba4d29e..f84988b 100644
--- a/pkg/vm/testcases/bytecode/boostrapping.dart.expect
+++ b/pkg/vm/testcases/bytecode/boostrapping.dart.expect
@@ -200,7 +200,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 0, num-type-args 0, names []
-  [1] = StaticICData target '#lib::_NamespaceImpl::_namespace', arg-desc CP#0
+  [1] = StaticICData get target '#lib::_NamespaceImpl::_namespace', arg-desc CP#0
   [2] = ArgDesc num-args 1, num-type-args 0, names []
   [3] = StaticICData target '#lib::_NamespaceImpl::_getPointer', arg-desc CP#2
   [4] = Null
@@ -259,7 +259,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 0, num-type-args 0, names []
-  [1] = StaticICData target '#lib::_NamespaceImpl::_namespace', arg-desc CP#0
+  [1] = StaticICData get target '#lib::_NamespaceImpl::_namespace', arg-desc CP#0
   [2] = Null
 }
 ]  static get _namespace() → self::_Namespace
@@ -276,7 +276,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 0, num-type-args 0, names []
-  [1] = StaticICData target '#lib::_NamespaceImpl::_namespacePointer', arg-desc CP#0
+  [1] = StaticICData get target '#lib::_NamespaceImpl::_namespacePointer', arg-desc CP#0
   [2] = Null
 }
 ]  static get _namespacePointer() → core::int
@@ -714,7 +714,7 @@
   [9] = ArgDesc num-args 1, num-type-args 0, names []
   [10] = StaticICData target 'dart.core::Uri::parse', arg-desc CP#9
   [11] = ArgDesc num-args 0, num-type-args 0, names []
-  [12] = StaticICData target 'dart.core::Uri::base', arg-desc CP#11
+  [12] = StaticICData get target 'dart.core::Uri::base', arg-desc CP#11
   [13] = Null
   [14] = StaticICData target 'dart.core::_Uri::file', arg-desc CP#9
   [15] = ICData target-name 'resolveUri', arg-desc CP#2
@@ -744,7 +744,7 @@
 ConstantPool {
   [0] = TearOff #lib::_scriptUri
   [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData target '#lib::VMLibraryHooks::platformScript', arg-desc CP#1
+  [2] = StaticICData set target '#lib::VMLibraryHooks::platformScript', arg-desc CP#1
   [3] = Null
 }
 ]static method _setupHooks() → dynamic {
diff --git a/pkg/vm/testcases/bytecode/literals.dart.expect b/pkg/vm/testcases/bytecode/literals.dart.expect
index 07727bf..1d49cf2 100644
--- a/pkg/vm/testcases/bytecode/literals.dart.expect
+++ b/pkg/vm/testcases/bytecode/literals.dart.expect
@@ -125,7 +125,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target '#lib::A::_name', arg-desc CP#0
+  [1] = StaticICData get target '#lib::A::_name', arg-desc CP#0
   [2] = Null
 }
 ]  method toString() → core::String
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 76e73d7..dd01633 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -187,7 +187,7 @@
 }
 
 static bool SnapshotKindAllowedFromKernel() {
-  return IsSnapshottingForPrecompilation() || (snapshot_kind == kCore);
+  return snapshot_kind != kScript;
 }
 
 // clang-format off
@@ -1454,30 +1454,43 @@
   Dart_Handle result = Dart_SetEnvironmentCallback(EnvironmentCallback);
   CHECK_RESULT(result);
 
-  if (IsSnapshottingForPrecompilation()) {
-    // The root library has to be set to generate AOT snapshots.
-    // If the input dill file has a root library, then Dart_LoadScript will
-    // ignore this dummy uri and set the root library to the one reported in
-    // the dill file. Since dill files are not dart script files,
-    // trying to resolve the root library URI based on the dill file name
-    // would not help.
-    //
-    // If the input dill file does not have a root library, then
-    // Dart_LoadScript will error.
-    Dart_Handle library =
-        Dart_LoadScriptFromKernel(kernel_buffer, kernel_buffer_size);
-    if (Dart_IsError(library)) {
-      Log::PrintErr("Unable to load root library from the input dill file.\n");
-      return kErrorExitCode;
+  switch (snapshot_kind) {
+    case kAppAOTBlobs:
+    case kAppAOTAssembly: {
+      // The root library has to be set to generate AOT snapshots.
+      // If the input dill file has a root library, then Dart_LoadScript will
+      // ignore this dummy uri and set the root library to the one reported in
+      // the dill file. Since dill files are not dart script files,
+      // trying to resolve the root library URI based on the dill file name
+      // would not help.
+      //
+      // If the input dill file does not have a root library, then
+      // Dart_LoadScript will error.
+      Dart_Handle library =
+          Dart_LoadScriptFromKernel(kernel_buffer, kernel_buffer_size);
+      if (Dart_IsError(library)) {
+        Log::PrintErr(
+            "Unable to load root library from the input dill file.\n");
+        return kErrorExitCode;
+      }
+
+      CreateAndWritePrecompiledSnapshot(entry_points);
+
+      CreateAndWriteDependenciesFile();
+
+      CleanupEntryPointsCollection(entry_points);
+
+      break;
     }
-
-    CreateAndWritePrecompiledSnapshot(entry_points);
-
-    CreateAndWriteDependenciesFile();
-
-    CleanupEntryPointsCollection(entry_points);
-  } else {
-    CreateAndWriteCoreSnapshot();
+    case kCore:
+      CreateAndWriteCoreSnapshot();
+      break;
+    case kCoreJIT:
+      LoadCompilationTrace();
+      CreateAndWriteCoreJITSnapshot();
+      break;
+    default:
+      UNREACHABLE();
   }
 
   Dart_ExitScope();
diff --git a/runtime/observatory/lib/src/elements/allocation_profile.dart b/runtime/observatory/lib/src/elements/allocation_profile.dart
index c7bdf82..5fb89b4 100644
--- a/runtime/observatory/lib/src/elements/allocation_profile.dart
+++ b/runtime/observatory/lib/src/elements/allocation_profile.dart
@@ -315,7 +315,7 @@
     }
   }
 
-  static Element _createCollectionLine() => new DivElement()
+  static HtmlElement _createCollectionLine() => new DivElement()
     ..classes = ['collection-item']
     ..children = [
       new SpanElement()
diff --git a/runtime/observatory/lib/src/elements/class_tree.dart b/runtime/observatory/lib/src/elements/class_tree.dart
index a187f24..2a74a06 100644
--- a/runtime/observatory/lib/src/elements/class_tree.dart
+++ b/runtime/observatory/lib/src/elements/class_tree.dart
@@ -143,7 +143,7 @@
           });
   }
 
-  static Element _create(toggle) {
+  static HtmlElement _create(toggle) {
     return new DivElement()
       ..classes = ['class-tree-item']
       ..children = [
diff --git a/runtime/observatory/lib/src/elements/heap_snapshot.dart b/runtime/observatory/lib/src/elements/heap_snapshot.dart
index bedcfdb..59296ec 100644
--- a/runtime/observatory/lib/src/elements/heap_snapshot.dart
+++ b/runtime/observatory/lib/src/elements/heap_snapshot.dart
@@ -326,7 +326,7 @@
     return report;
   }
 
-  static Element _createDominator(toggle) {
+  static HtmlElement _createDominator(toggle) {
     return new DivElement()
       ..classes = ['tree-item']
       ..children = [
@@ -344,7 +344,7 @@
       ];
   }
 
-  static Element _createMergedDominator(toggle) {
+  static HtmlElement _createMergedDominator(toggle) {
     return new DivElement()
       ..classes = ['tree-item']
       ..children = [
@@ -362,7 +362,7 @@
       ];
   }
 
-  static Element _createGroup(toggle) {
+  static HtmlElement _createGroup(toggle) {
     return new DivElement()
       ..classes = ['tree-item']
       ..children = [
@@ -380,7 +380,7 @@
       ];
   }
 
-  static Element _createOwnershipClass(toggle) {
+  static HtmlElement _createOwnershipClass(toggle) {
     return new DivElement()
       ..classes = ['tree-item']
       ..children = [
@@ -397,7 +397,7 @@
   static const int kMaxChildren = 100;
   static const int kMinRetainedSize = 4096;
 
-  static _getChildrenDominator(M.HeapSnapshotDominatorNode node) {
+  static Iterable _getChildrenDominator(M.HeapSnapshotDominatorNode node) {
     final list = node.children.toList();
     list.sort((a, b) => b.retainedSize - a.retainedSize);
     return list
@@ -405,7 +405,8 @@
         .take(kMaxChildren);
   }
 
-  static _getChildrenMergedDominator(M.HeapSnapshotMergedDominatorNode node) {
+  static Iterable _getChildrenMergedDominator(
+      M.HeapSnapshotMergedDominatorNode node) {
     final list = node.children.toList();
     list.sort((a, b) => b.retainedSize - a.retainedSize);
     return list
@@ -413,7 +414,7 @@
         .take(kMaxChildren);
   }
 
-  static _getChildrenGroup(item) {
+  static Iterable _getChildrenGroup(item) {
     if (item is M.HeapSnapshotClassReferences) {
       if (item.inbounds.isNotEmpty || item.outbounds.isNotEmpty) {
         return [item.inbounds, item.outbounds];
@@ -424,7 +425,7 @@
     return const [];
   }
 
-  static _getChildrenOwnershipClass(item) {
+  static Iterable _getChildrenOwnershipClass(item) {
     return const [];
   }
 
diff --git a/runtime/observatory/lib/src/elements/instance_ref.dart b/runtime/observatory/lib/src/elements/instance_ref.dart
index 45737fa..748acbe 100644
--- a/runtime/observatory/lib/src/elements/instance_ref.dart
+++ b/runtime/observatory/lib/src/elements/instance_ref.dart
@@ -272,7 +272,7 @@
       case M.InstanceKind.list:
         var index = 0;
         return _loadedInstance.elements
-            .map((element) => new DivElement()
+            .map<Element>((element) => new DivElement()
               ..children = [
                 new SpanElement()..text = '[ ${index++} ] : ',
                 anyRef(_isolate, element, _objects, queue: _r.queue)
@@ -281,7 +281,7 @@
               ..addAll(_createShowMoreButton());
       case M.InstanceKind.map:
         return _loadedInstance.associations
-            .map((association) => new DivElement()
+            .map<Element>((association) => new DivElement()
               ..children = [
                 new SpanElement()..text = '[ ',
                 anyRef(_isolate, association.key, _objects, queue: _r.queue),
@@ -306,7 +306,7 @@
       case M.InstanceKind.float64x2List:
         var index = 0;
         return _loadedInstance.typedElements
-            .map((e) => new DivElement()..text = '[ ${index++} ] : $e')
+            .map<Element>((e) => new DivElement()..text = '[ ${index++} ] : $e')
             .toList()
               ..addAll(_createShowMoreButton());
       case M.InstanceKind.mirrorReference:
diff --git a/runtime/observatory/lib/src/elements/memory/snapshot.dart b/runtime/observatory/lib/src/elements/memory/snapshot.dart
index 67be83a..fd91ebc 100644
--- a/runtime/observatory/lib/src/elements/memory/snapshot.dart
+++ b/runtime/observatory/lib/src/elements/memory/snapshot.dart
@@ -165,7 +165,7 @@
     ];
   }
 
-  static Element _createDominator(toggle) {
+  static HtmlElement _createDominator(toggle) {
     return new DivElement()
       ..classes = ['tree-item']
       ..children = [
@@ -186,7 +186,7 @@
   static const int kMaxChildren = 100;
   static const int kMinRetainedSize = 4096;
 
-  static _getChildrenDominator(M.HeapSnapshotDominatorNode node) {
+  static Iterable _getChildrenDominator(M.HeapSnapshotDominatorNode node) {
     final list = node.children.toList();
     list.sort((a, b) => b.retainedSize - a.retainedSize);
     return list
diff --git a/runtime/observatory/lib/src/models/repositories/notification.dart b/runtime/observatory/lib/src/models/repositories/notification.dart
index 816bf04..c9c7824 100644
--- a/runtime/observatory/lib/src/models/repositories/notification.dart
+++ b/runtime/observatory/lib/src/models/repositories/notification.dart
@@ -11,6 +11,6 @@
 abstract class NotificationRepository {
   Stream<NotificationChangeEvent> get onChange;
   Iterable<Notification> list();
-  void delete(Notification);
+  void delete(Notification notification);
   void deleteAll();
 }
diff --git a/runtime/observatory/lib/src/models/repositories/target.dart b/runtime/observatory/lib/src/models/repositories/target.dart
index eb364e9..2c2db92 100644
--- a/runtime/observatory/lib/src/models/repositories/target.dart
+++ b/runtime/observatory/lib/src/models/repositories/target.dart
@@ -13,9 +13,9 @@
 
   Target get current;
   Iterable<Target> list();
-  void add(String);
-  void setCurrent(Target);
-  void delete(Target);
+  void add(String address);
+  void setCurrent(Target t);
+  void delete(Target o);
   Target find(String networkAddress);
   bool isConnectedVMTarget(Target target);
 }
diff --git a/runtime/observatory/lib/src/repositories/flag.dart b/runtime/observatory/lib/src/repositories/flag.dart
index b1b5349..0a080d2 100644
--- a/runtime/observatory/lib/src/repositories/flag.dart
+++ b/runtime/observatory/lib/src/repositories/flag.dart
@@ -26,7 +26,7 @@
     return flags.map(_toFlag);
   }
 
-  static _toFlag(Map map) {
+  static Flag _toFlag(Map map) {
     return new Flag(
         map['name'], map['comment'], map['modified'], map['valueAsString']);
   }
diff --git a/runtime/observatory/lib/src/repositories/target.dart b/runtime/observatory/lib/src/repositories/target.dart
index 0b5dc15..35d0dde 100644
--- a/runtime/observatory/lib/src/repositories/target.dart
+++ b/runtime/observatory/lib/src/repositories/target.dart
@@ -4,7 +4,7 @@
 
 part of repositories;
 
-typedef bool IsConnectedVMTargetDelegate(Target);
+typedef bool IsConnectedVMTargetDelegate(M.Target target);
 
 class TargetChangeEvent implements M.TargetChangeEvent {
   final TargetRepository repository;
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index 1fa79a6..26ff6ab 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -460,6 +460,7 @@
   int get tokenPos;
   Future<int> getLine();
   Future<int> getColumn();
+  Future<String> toUserString();
 }
 
 /// A [SourceLocation] represents a location or range in the source code.
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index 59485c1..3fb4084 100644
--- a/runtime/observatory/tests/service/get_version_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_version_rpc_test.dart
@@ -13,7 +13,7 @@
     var result = await vm.invokeRpcNoUpgrade('getVersion', {});
     expect(result['type'], equals('Version'));
     expect(result['major'], equals(3));
-    expect(result['minor'], equals(7));
+    expect(result['minor'], equals(8));
     expect(result['_privateMajor'], equals(0));
     expect(result['_privateMinor'], equals(0));
   },
diff --git a/runtime/observatory/tests/service/kill_paused_test.dart b/runtime/observatory/tests/service/kill_paused_test.dart
new file mode 100644
index 0000000..c0f5c91
--- /dev/null
+++ b/runtime/observatory/tests/service/kill_paused_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// VMOptions=--error_on_bad_type --error_on_bad_override
+
+import 'package:observatory/service_common.dart';
+import 'package:unittest/unittest.dart';
+
+import 'test_helper.dart';
+import 'dart:developer';
+import 'service_test_common.dart';
+
+testMain() async {
+  debugger(); // Stop here.
+  print('1');
+  while (true) {}
+}
+
+var tests = <IsolateTest>[
+  // Stopped at 'debugger' statement.
+  hasStoppedAtBreakpoint,
+  // Kill the app
+  (Isolate isolate) async {
+    Map<String, dynamic> params = <String, dynamic>{};
+    ServiceObject result = await isolate.invokeRpc('kill', params);
+    expect(result.type, equals('Success'));
+  }
+];
+
+main(args) async => runIsolateTests(args, tests, testeeConcurrent: testMain);
diff --git a/runtime/observatory/tests/service/kill_running_test.dart b/runtime/observatory/tests/service/kill_running_test.dart
new file mode 100644
index 0000000..15e8b9c
--- /dev/null
+++ b/runtime/observatory/tests/service/kill_running_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// VMOptions=--error_on_bad_type --error_on_bad_override
+
+import 'package:observatory/service_common.dart';
+import 'package:unittest/unittest.dart';
+
+import 'test_helper.dart';
+import 'service_test_common.dart';
+
+testMain() async {
+  print('1');
+  while (true) {}
+}
+
+var tests = <IsolateTest>[
+  // Stopped at 'debugger' statement.
+  isolateIsRunning,
+  // Kill the app
+  (Isolate isolate) async {
+    Map<String, dynamic> params = <String, dynamic>{};
+    ServiceObject result = await isolate.invokeRpc('kill', params);
+    expect(result.type, equals('Success'));
+  }
+];
+
+main(args) async => runIsolateTests(args, tests, testeeConcurrent: testMain);
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index 8003fb4..d93a63c 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -15,7 +15,6 @@
 evaluate_activation_test/instance: RuntimeError
 evaluate_activation_test/scope: RuntimeError
 evaluate_in_sync_star_activation_test: RuntimeError
-pause_on_unhandled_async_exceptions_test: RuntimeError #  --pause-isolates-on-unhandled-exceptions doesn't currently work. Issue #29056
 step_through_arithmetic_test: RuntimeError # probably constant evaluator pre-evaluating e.g. 1+2
 unused_changes_in_last_reload_test: RuntimeError
 
@@ -31,7 +30,6 @@
 
 [ $arch == simdbc64 && $compiler == dartk ]
 get_cpu_profile_timeline_rpc_test: Pass, RuntimeError # http://dartbug.com/31794
-pause_on_unhandled_async_exceptions_test: RuntimeError, Timeout # Issue 31765
 
 [ $arch == simdbc64 && $compiler == dartk && $mode == debug ]
 eval_test: Pass, Slow
@@ -108,7 +106,7 @@
 
 [ $compiler == dartk && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
 add_breakpoint_rpc_kernel_test: RuntimeError # Issue #33087
-async_generator_breakpoint_test: Pass, RuntimeError
+async_generator_breakpoint_test: Pass, RuntimeError, Crash # dartbug.com/33175 for the crash
 bad_reload_test: Skip # Times out on sim architectures, also RuntimeError.
 break_on_activation_test: RuntimeError # Issue #33087
 complex_reload_test: Skip # Times out on sim architectures, also RuntimeError.
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index d07500e..2cf1c6e 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -185,10 +185,6 @@
 [ $compiler == dartk && $runtime == vm && $system == macos ]
 cc/IsolateReload_LibraryLookup: Fail, Crash
 
-[ $compiler == dartk && $runtime == vm && $strong ]
-cc/IsolateReload_LibraryHide: Crash
-cc/IsolateReload_LibraryShow: Crash
-
 [ $compiler == dartk && $system == linux ]
 cc/IsolateReload_LibraryLookup: Fail, Crash
 
@@ -204,8 +200,6 @@
 [ $compiler == dartk && $strong ]
 cc/DartGeneratedArrayLiteralMessages: Crash # Issue 32190
 cc/FullSnapshot1: Crash # Issue 32190
-cc/IsolateReload_LibraryImportAdded: Crash # Issue 32190
-cc/IsolateReload_LibraryImportRemoved: Fail # Issue 32190
 cc/IsolateReload_LibraryLookup: Fail, Crash # Issue 32190
 cc/MismatchedSnapshotKinds: Fail, Crash, OK # Script snapshots not supported in Dart 2
 cc/ScriptSnapshot1: Fail, Crash, OK # Script snapshots not supported in Dart 2
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index 66f0543..39858e9 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -386,6 +386,11 @@
   UNREACHABLE();
 }
 
+void ConstantPropagator::VisitMakeTemp(MakeTempInstr* instr) {
+  // Instruction is eliminated when translating to SSA.
+  UNREACHABLE();
+}
+
 void ConstantPropagator::VisitStoreLocal(StoreLocalInstr* instr) {
   // Instruction is eliminated when translating to SSA.
   UNREACHABLE();
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index 4aedb3c..c4740e2 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -1167,8 +1167,8 @@
     // 2a. Handle uses:
     // Update the expression stack renaming environment for each use by
     // removing the renamed value.
-    // For each use of a LoadLocal, StoreLocal, DropTemps or Constant: Replace
-    // it with the renamed value.
+    // For each use of a LoadLocal, StoreLocal, MakeTemp, DropTemps or Constant:
+    // replace it with the renamed value.
     for (intptr_t i = current->InputCount() - 1; i >= 0; --i) {
       Value* v = current->InputAt(i);
       // Update expression stack.
@@ -1177,8 +1177,10 @@
       Definition* reaching_defn = env->RemoveLast();
       Definition* input_defn = v->definition();
       if (input_defn != reaching_defn) {
+        // Note: constants can only be replaced with other constants.
         ASSERT(input_defn->IsLoadLocal() || input_defn->IsStoreLocal() ||
-               input_defn->IsDropTemps() || input_defn->IsConstant());
+               input_defn->IsDropTemps() || input_defn->IsMakeTemp() ||
+               (input_defn->IsConstant() && reaching_defn->IsConstant()));
         // Assert we are not referencing nulls in the initial environment.
         ASSERT(reaching_defn->ssa_temp_index() != -1);
         v->set_definition(reaching_defn);
@@ -1192,103 +1194,120 @@
       env->RemoveLast();
     }
 
-    // 2b. Handle LoadLocal, StoreLocal, DropTemps and Constant.
-    Definition* definition = current->AsDefinition();
-    if (definition != NULL) {
-      LoadLocalInstr* load = definition->AsLoadLocal();
-      StoreLocalInstr* store = definition->AsStoreLocal();
-      DropTempsInstr* drop = definition->AsDropTemps();
-      ConstantInstr* constant = definition->AsConstant();
-      if ((load != NULL) || (store != NULL) || (drop != NULL) ||
-          (constant != NULL)) {
-        Definition* result = NULL;
-        if (store != NULL) {
-          // Update renaming environment.
-          intptr_t index = store->local().BitIndexIn(num_direct_parameters_);
-          result = store->value()->definition();
+    // 2b. Handle LoadLocal/StoreLocal/MakeTemp/DropTemps/Constant and
+    // PushArgument specially. Other definitions are just pushed
+    // to the environment directly.
+    Definition* result = NULL;
+    switch (current->tag()) {
+      case Instruction::kLoadLocal: {
+        LoadLocalInstr* load = current->Cast<LoadLocalInstr>();
+        // The graph construction ensures we do not have an unused LoadLocal
+        // computation.
+        ASSERT(load->HasTemp());
+        const intptr_t index = load->local().BitIndexIn(num_direct_parameters_);
+        result = (*env)[index];
 
-          if (!FLAG_prune_dead_locals ||
-              variable_liveness->IsStoreAlive(block_entry, store)) {
-            (*env)[index] = result;
-          } else {
-            (*env)[index] = constant_dead();
-          }
-        } else if (load != NULL) {
-          // The graph construction ensures we do not have an unused LoadLocal
-          // computation.
-          ASSERT(definition->HasTemp());
-          intptr_t index = load->local().BitIndexIn(num_direct_parameters_);
-          result = (*env)[index];
+        PhiInstr* phi = result->AsPhi();
+        if ((phi != NULL) && !phi->is_alive()) {
+          phi->mark_alive();
+          live_phis->Add(phi);
+        }
 
-          PhiInstr* phi = result->AsPhi();
-          if ((phi != NULL) && !phi->is_alive()) {
-            phi->mark_alive();
-            live_phis->Add(phi);
-          }
+        if (FLAG_prune_dead_locals &&
+            variable_liveness->IsLastLoad(block_entry, load)) {
+          (*env)[index] = constant_dead();
+        }
 
-          if (FLAG_prune_dead_locals &&
-              variable_liveness->IsLastLoad(block_entry, load)) {
-            (*env)[index] = constant_dead();
-          }
+        // Record captured parameters so that they can be skipped when
+        // emitting sync code inside optimized try-blocks.
+        if (load->local().is_captured_parameter()) {
+          captured_parameters_->Add(index);
+        }
 
-          // Record captured parameters so that they can be skipped when
-          // emitting sync code inside optimized try-blocks.
-          if (load->local().is_captured_parameter()) {
-            intptr_t index = load->local().BitIndexIn(num_direct_parameters_);
-            captured_parameters_->Add(index);
-          }
-
-          if ((phi != NULL) && isolate()->strong() &&
-              FLAG_use_strong_mode_types) {
-            // Assign type to Phi if it doesn't have a type yet.
-            // For a Phi to appear in the local variable it either was placed
-            // there as incoming value by renaming or it was stored there by
-            // StoreLocal which took this Phi from another local via LoadLocal,
-            // to which this reasoning applies recursively.
-            // This means that we are guaranteed to process LoadLocal for a
-            // matching variable first.
-            if (!phi->HasType()) {
-              ASSERT((index < phi->block()->phis()->length()) &&
-                     ((*phi->block()->phis())[index] == phi));
-              phi->UpdateType(
-                  CompileType::FromAbstractType(load->local().type()));
-            }
-          }
-        } else if (drop != NULL) {
-          // Drop temps from the environment.
-          for (intptr_t j = 0; j < drop->num_temps(); j++) {
-            env->RemoveLast();
-          }
-          if (drop->value() != NULL) {
-            result = drop->value()->definition();
-          }
-          ASSERT((drop->value() != NULL) || !drop->HasTemp());
-        } else {
-          if (definition->HasTemp()) {
-            result = GetConstant(constant->value());
+        if ((phi != NULL) && isolate()->strong() &&
+            FLAG_use_strong_mode_types) {
+          // Assign type to Phi if it doesn't have a type yet.
+          // For a Phi to appear in the local variable it either was placed
+          // there as incoming value by renaming or it was stored there by
+          // StoreLocal which took this Phi from another local via LoadLocal,
+          // to which this reasoning applies recursively.
+          // This means that we are guaranteed to process LoadLocal for a
+          // matching variable first.
+          if (!phi->HasType()) {
+            ASSERT((index < phi->block()->phis()->length()) &&
+                   ((*phi->block()->phis())[index] == phi));
+            phi->UpdateType(
+                CompileType::FromAbstractType(load->local().type()));
           }
         }
-        // Update expression stack or remove from graph.
-        if (definition->HasTemp()) {
-          ASSERT(result != NULL);
-          env->Add(result);
-        }
-        it.RemoveCurrentFromGraph();
-      } else {
-        // Not a load, store, drop or constant.
-        if (definition->HasTemp()) {
-          // Assign fresh SSA temporary and update expression stack.
-          AllocateSSAIndexes(definition);
-          env->Add(definition);
-        }
+        break;
       }
+
+      case Instruction::kStoreLocal: {
+        StoreLocalInstr* store = current->Cast<StoreLocalInstr>();
+        const intptr_t index =
+            store->local().BitIndexIn(num_direct_parameters_);
+        result = store->value()->definition();
+
+        if (!FLAG_prune_dead_locals ||
+            variable_liveness->IsStoreAlive(block_entry, store)) {
+          (*env)[index] = result;
+        } else {
+          (*env)[index] = constant_dead();
+        }
+        break;
+      }
+
+      case Instruction::kDropTemps: {
+        // Drop temps from the environment.
+        DropTempsInstr* drop = current->Cast<DropTempsInstr>();
+        for (intptr_t j = 0; j < drop->num_temps(); j++) {
+          env->RemoveLast();
+        }
+        if (drop->value() != NULL) {
+          result = drop->value()->definition();
+        }
+        ASSERT((drop->value() != NULL) || !drop->HasTemp());
+        break;
+      }
+
+      case Instruction::kConstant: {
+        ConstantInstr* constant = current->Cast<ConstantInstr>();
+        if (constant->HasTemp()) {
+          result = GetConstant(constant->value());
+        }
+        break;
+      }
+
+      case Instruction::kMakeTemp: {
+        // Simply push a #null value to the expression stack.
+        result = constant_null_;
+        break;
+      }
+
+      case Instruction::kPushArgument:
+        env->Add(current->Cast<PushArgumentInstr>());
+        continue;
+
+      default:
+        // Other definitions directly go into the environment.
+        if (Definition* definition = current->AsDefinition()) {
+          if (definition->HasTemp()) {
+            // Assign fresh SSA temporary and update expression stack.
+            AllocateSSAIndexes(definition);
+            env->Add(definition);
+          }
+        }
+        continue;
     }
 
-    // 2c. Handle pushed argument.
-    PushArgumentInstr* push = current->AsPushArgument();
-    if (push != NULL) {
-      env->Add(push);
+    // Update expression stack and remove current instruction from the graph.
+    Definition* definition = current->Cast<Definition>();
+    if (definition->HasTemp()) {
+      ASSERT(result != NULL);
+      env->Add(result);
     }
+    it.RemoveCurrentFromGraph();
   }
 
   // 3. Process dominated blocks.
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 247a75b..ce25835a 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -3377,8 +3377,21 @@
   UNREACHABLE();
 }
 
+LocationSummary* MakeTempInstr::MakeLocationSummary(Zone* zone,
+                                                    bool optimizing) const {
+  ASSERT(!optimizing);
+  null_->InitializeLocationSummary(zone, optimizing);
+  return null_->locs();
+}
+
+void MakeTempInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  ASSERT(!compiler->is_optimizing());
+  null_->EmitNativeCode(compiler);
+}
+
 LocationSummary* DropTempsInstr::MakeLocationSummary(Zone* zone,
                                                      bool optimizing) const {
+  ASSERT(!optimizing);
   return (InputCount() == 1)
              ? LocationSummary::Make(zone, 1, Location::SameAsFirstInput(),
                                      LocationSummary::kNoCall)
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 875f806..4806355 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -488,6 +488,7 @@
   M(StaticCall)                                                                \
   M(LoadLocal)                                                                 \
   M(DropTemps)                                                                 \
+  M(MakeTemp)                                                                  \
   M(StoreLocal)                                                                \
   M(StrictCompare)                                                             \
   M(EqualityCompare)                                                           \
@@ -873,6 +874,11 @@
 #undef INSTRUCTION_TYPE_CHECK
 #undef DECLARE_INSTRUCTION_TYPE_CHECK
 
+  template <typename T>
+  T* Cast() {
+    return static_cast<T*>(this);
+  }
+
   // Returns structure describing location constraints required
   // to emit native code for this instruction.
   LocationSummary* locs() {
@@ -3898,6 +3904,51 @@
   DISALLOW_COPY_AND_ASSIGN(DropTempsInstr);
 };
 
+// This instruction is used to reserve a space on the expression stack
+// that later would be filled with StoreLocal. Reserved space would be
+// filled with a null value initially.
+//
+// Note: One must not use Constant(#null) to reserve expression stack space
+// because it would lead to an incorrectly compiled unoptimized code. Graph
+// builder would set Constant(#null) as an input definition to the instruction
+// that consumes this value from the expression stack - not knowing that
+// this value represents a placeholder - which might lead issues if instruction
+// has specialization for constant inputs (see https://dartbug.com/33195).
+class MakeTempInstr : public TemplateDefinition<0, NoThrow, Pure> {
+ public:
+  explicit MakeTempInstr(Zone* zone)
+      : null_(new (zone) ConstantInstr(Object::ZoneHandle())) {
+    // Note: We put ConstantInstr inside MakeTemp to simplify code generation:
+    // having ConstantInstr allows us to use Location::Contant(null_) as an
+    // output location for this instruction.
+  }
+
+  DECLARE_INSTRUCTION(MakeTemp)
+
+  virtual CompileType ComputeType() const { return CompileType::Dynamic(); }
+
+  virtual bool ComputeCanDeoptimize() const { return false; }
+
+  virtual bool HasUnknownSideEffects() const {
+    UNREACHABLE();  // Eliminated by SSA construction.
+    return false;
+  }
+
+  virtual bool MayThrow() const {
+    UNREACHABLE();
+    return false;
+  }
+
+  virtual TokenPosition token_pos() const { return TokenPosition::kTempMove; }
+
+  PRINT_OPERANDS_TO_SUPPORT
+
+ private:
+  ConstantInstr* null_;
+
+  DISALLOW_COPY_AND_ASSIGN(MakeTempInstr);
+};
+
 class StoreLocalInstr : public TemplateDefinition<1, NoThrow> {
  public:
   StoreLocalInstr(const LocalVariable& local,
diff --git a/runtime/vm/compiler/backend/il_printer.cc b/runtime/vm/compiler/backend/il_printer.cc
index e9815df..c77e7d6 100644
--- a/runtime/vm/compiler/backend/il_printer.cc
+++ b/runtime/vm/compiler/backend/il_printer.cc
@@ -447,6 +447,8 @@
   return Thread::Current()->zone()->MakeCopyOfString(buffer);
 }
 
+void MakeTempInstr::PrintOperandsTo(BufferFormatter* f) const {}
+
 void DropTempsInstr::PrintOperandsTo(BufferFormatter* f) const {
   f->Print("%" Pd "", num_temps());
   if (value() != NULL) {
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index b943afa..58bc7fa 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -914,8 +914,7 @@
 }
 
 #if defined(DART_USE_INTERPRETER)
-void BytecodeMetadataHelper::CopyBytecode(const Function& function) {
-  // TODO(regis): Avoid copying bytecode from mapped kernel binary.
+void BytecodeMetadataHelper::ReadMetadata(const Function& function) {
   const intptr_t node_offset = function.kernel_offset();
   const intptr_t md_offset = GetNextMetadataPayloadOffset(node_offset);
   if (md_offset < 0) {
@@ -925,14 +924,51 @@
   AlternativeReadingScope alt(&builder_->reader_, &H.metadata_payloads(),
                               md_offset);
 
-  // Read bytecode.
-  intptr_t bytecode_size = builder_->reader_.ReadUInt();
-  intptr_t bytecode_offset = builder_->reader_.offset();
-  uint8_t* bytecode_data = builder_->reader_.CopyDataIntoZone(
-      builder_->zone_, bytecode_offset, bytecode_size);
+  // Create object pool and read pool entries.
+  const intptr_t obj_count = builder_->reader_.ReadListLength();
+  const ObjectPool& pool =
+      ObjectPool::Handle(builder_->zone_, ObjectPool::New(obj_count));
+  ReadPoolEntries(function, function, pool, 0);
 
-  // This enum and the code below reading the constant pool from kernel must be
-  // kept in sync with pkg/vm/lib/bytecode/constant_pool.dart.
+  // Read bytecode and attach to function.
+  const Code& bytecode = Code::Handle(builder_->zone_, ReadBytecode(pool));
+  function.AttachBytecode(bytecode);
+
+  // Read exceptions table.
+  ReadExceptionsTable(bytecode);
+
+  if (FLAG_dump_kernel_bytecode) {
+    KernelBytecodeDisassembler::Disassemble(function);
+  }
+
+  // Read closures.
+  Function& closure = Function::Handle(builder_->zone_);
+  Code& closure_bytecode = Code::Handle(builder_->zone_);
+  intptr_t num_closures = builder_->ReadListLength();
+  for (intptr_t i = 0; i < num_closures; i++) {
+    intptr_t closure_index = builder_->ReadUInt();
+    ASSERT(closure_index < obj_count);
+    closure ^= pool.ObjectAt(closure_index);
+
+    // Read closure bytecode and attach to closure function.
+    closure_bytecode = ReadBytecode(pool);
+    closure.AttachBytecode(closure_bytecode);
+
+    // Read closure exceptions table.
+    ReadExceptionsTable(closure_bytecode);
+
+    if (FLAG_dump_kernel_bytecode) {
+      KernelBytecodeDisassembler::Disassemble(closure);
+    }
+  }
+}
+
+intptr_t BytecodeMetadataHelper::ReadPoolEntries(const Function& function,
+                                                 const Function& inner_function,
+                                                 const ObjectPool& pool,
+                                                 intptr_t from_index) {
+  // These enums and the code below reading the constant pool from kernel must
+  // be kept in sync with pkg/vm/lib/bytecode/constant_pool.dart.
   enum ConstantPoolTag {
     kInvalid,
     kNull,
@@ -954,19 +990,25 @@
     kInstance,
     kSymbol,
     kTypeArgumentsForInstanceAllocation,
+    kContextOffset,
+    kClosureFunction,
+    kEndClosureFunctionScope,
   };
 
-  // Read object pool.
-  builder_->reader_.set_offset(bytecode_offset + bytecode_size);
-  intptr_t obj_count = builder_->reader_.ReadListLength();
-  const ObjectPool& obj_pool =
-      ObjectPool::Handle(builder_->zone_, ObjectPool::New(obj_count));
+  enum InvocationKind {
+    method,  // x.foo(...) or foo(...)
+    getter,  // x.foo
+    setter   // x.foo = ...
+  };
+
   Object& obj = Object::Handle(builder_->zone_);
   Object& elem = Object::Handle(builder_->zone_);
   Array& array = Array::Handle(builder_->zone_);
   Field& field = Field::Handle(builder_->zone_);
+  Class& cls = Class::Handle(builder_->zone_);
   String& name = String::Handle(builder_->zone_);
-  for (intptr_t i = 0; i < obj_count; ++i) {
+  const intptr_t obj_count = pool.Length();
+  for (intptr_t i = from_index; i < obj_count; ++i) {
     const intptr_t tag = builder_->ReadTag();
     switch (tag) {
       case ConstantPoolTag::kInvalid:
@@ -1018,7 +1060,7 @@
         name = H.DartSymbolPlain(target).raw();
         intptr_t arg_desc_index = builder_->ReadUInt();
         ASSERT(arg_desc_index < i);
-        array ^= obj_pool.ObjectAt(arg_desc_index);
+        array ^= pool.ObjectAt(arg_desc_index);
         // TODO(regis): Should num_args_tested be explicitly provided?
         obj = ICData::New(function, name,
                           array,  // Arguments descriptor.
@@ -1029,18 +1071,34 @@
 #endif
       } break;
       case ConstantPoolTag::kStaticICData: {
+        InvocationKind kind = static_cast<InvocationKind>(builder_->ReadByte());
         NameIndex target = builder_->ReadCanonicalNameReference();
         if (H.IsConstructor(target)) {
           name = H.DartConstructorName(target).raw();
           elem = H.LookupConstructorByKernelConstructor(target);
+        } else if (H.IsField(target)) {
+          if (kind == InvocationKind::getter) {
+            name = H.DartGetterName(target).raw();
+          } else if (kind == InvocationKind::setter) {
+            name = H.DartSetterName(target).raw();
+          } else {
+            ASSERT(kind == InvocationKind::method);
+            UNIMPLEMENTED();  // TODO(regis): Revisit.
+          }
+          field = H.LookupFieldByKernelField(target);
+          cls = field.Owner();
+          elem = cls.LookupStaticFunction(name);
         } else {
+          if ((kind == InvocationKind::method) && H.IsGetter(target)) {
+            UNIMPLEMENTED();  // TODO(regis): Revisit.
+          }
           name = H.DartProcedureName(target).raw();
           elem = H.LookupStaticMethodByKernelProcedure(target);
         }
         ASSERT(elem.IsFunction());
         intptr_t arg_desc_index = builder_->ReadUInt();
         ASSERT(arg_desc_index < i);
-        array ^= obj_pool.ObjectAt(arg_desc_index);
+        array ^= pool.ObjectAt(arg_desc_index);
         obj = ICData::New(function, name,
                           array,  // Arguments descriptor.
                           Thread::kNoDeoptId, 0 /* num_args_tested */,
@@ -1067,11 +1125,9 @@
         ASSERT(obj.IsClass());
         break;
       case ConstantPoolTag::kTypeArgumentsFieldOffset:
-        obj =
+        cls =
             H.LookupClassByKernelClass(builder_->ReadCanonicalNameReference());
-        ASSERT(obj.IsClass());
-        obj = Smi::New(Class::Cast(obj).type_arguments_field_offset() /
-                       kWordSize);
+        obj = Smi::New(cls.type_arguments_field_offset() / kWordSize);
         break;
       case ConstantPoolTag::kTearOff:
         obj = H.LookupStaticMethodByKernelProcedure(
@@ -1101,20 +1157,19 @@
         for (intptr_t j = 0; j < length; j++) {
           intptr_t elem_index = builder_->ReadUInt();
           ASSERT(elem_index < i);
-          elem = obj_pool.ObjectAt(elem_index);
+          elem = pool.ObjectAt(elem_index);
           array.SetAt(j, elem);
         }
         obj = H.Canonicalize(Array::Cast(obj));
         ASSERT(!obj.IsNull());
       } break;
       case ConstantPoolTag::kInstance: {
-        obj =
+        cls =
             H.LookupClassByKernelClass(builder_->ReadCanonicalNameReference());
-        ASSERT(obj.IsClass());
-        obj = Instance::New(Class::Cast(obj), Heap::kOld);
+        obj = Instance::New(cls, Heap::kOld);
         intptr_t elem_index = builder_->ReadUInt();
         ASSERT(elem_index < i);
-        elem = obj_pool.ObjectAt(elem_index);
+        elem = pool.ObjectAt(elem_index);
         if (!elem.IsNull()) {
           ASSERT(elem.IsTypeArguments());
           Instance::Cast(obj).SetTypeArguments(TypeArguments::Cast(elem));
@@ -1126,7 +1181,7 @@
           field = H.LookupFieldByKernelField(field_name);
           intptr_t elem_index = builder_->ReadUInt();
           ASSERT(elem_index < i);
-          elem = obj_pool.ObjectAt(elem_index);
+          elem = pool.ObjectAt(elem_index);
           Instance::Cast(obj).SetField(field, elem);
         }
         obj = H.Canonicalize(Instance::Cast(obj));
@@ -1136,34 +1191,193 @@
         ASSERT(String::Cast(obj).IsSymbol());
         break;
       case kTypeArgumentsForInstanceAllocation: {
-        obj =
+        cls =
             H.LookupClassByKernelClass(builder_->ReadCanonicalNameReference());
-        ASSERT(obj.IsClass());
         intptr_t elem_index = builder_->ReadUInt();
         ASSERT(elem_index < i);
-        elem = obj_pool.ObjectAt(elem_index);
+        elem = pool.ObjectAt(elem_index);
         ASSERT(elem.IsNull() || elem.IsTypeArguments());
-        elem = Type::New(Class::Cast(obj), TypeArguments::Cast(elem),
-                         TokenPosition::kNoSource);
-        elem = ClassFinalizer::FinalizeType(Class::Cast(obj), Type::Cast(elem));
+        elem =
+            Type::New(cls, TypeArguments::Cast(elem), TokenPosition::kNoSource);
+        elem = ClassFinalizer::FinalizeType(cls, Type::Cast(elem));
         obj = Type::Cast(elem).arguments();
       } break;
+      case ConstantPoolTag::kContextOffset: {
+        intptr_t index = builder_->ReadUInt();
+        if (i == 0) {
+          obj = Smi::New(Context::parent_offset() / kWordSize);
+        } else {
+          obj = Smi::New(Context::variable_offset(index - 1) / kWordSize);
+        }
+      } break;
+      case ConstantPoolTag::kClosureFunction: {
+        name = H.DartSymbolPlain(builder_->ReadStringReference()).raw();
+        const Function& closure = Function::Handle(
+            builder_->zone_,
+            Function::NewClosureFunction(name, inner_function,
+                                         TokenPosition::kNoSource));
+
+        FunctionNodeHelper function_node_helper(builder_);
+        function_node_helper.ReadUntilExcluding(
+            FunctionNodeHelper::kTypeParameters);
+        builder_->LoadAndSetupTypeParameters(builder_->active_class(), closure,
+                                             builder_->ReadListLength(),
+                                             closure);
+        function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
+
+        // Scope remains opened until ConstantPoolTag::kEndClosureFunctionScope.
+        ActiveTypeParametersScope scope(
+            builder_->active_class(), &closure,
+            TypeArguments::Handle(builder_->zone_, closure.type_parameters()),
+            builder_->zone_);
+
+        function_node_helper.ReadUntilExcluding(
+            FunctionNodeHelper::kPositionalParameters);
+
+        intptr_t required_parameter_count =
+            function_node_helper.required_parameter_count_;
+        intptr_t total_parameter_count =
+            function_node_helper.total_parameter_count_;
+
+        intptr_t positional_parameter_count = builder_->ReadListLength();
+
+        intptr_t named_parameter_count =
+            total_parameter_count - positional_parameter_count;
+
+        const intptr_t extra_parameters = 1;
+        closure.set_num_fixed_parameters(extra_parameters +
+                                         required_parameter_count);
+        if (named_parameter_count > 0) {
+          closure.SetNumOptionalParameters(named_parameter_count, false);
+        } else {
+          closure.SetNumOptionalParameters(
+              positional_parameter_count - required_parameter_count, true);
+        }
+        intptr_t parameter_count = extra_parameters + total_parameter_count;
+        closure.set_parameter_types(Array::Handle(
+            builder_->zone_, Array::New(parameter_count, Heap::kOld)));
+        closure.set_parameter_names(Array::Handle(
+            builder_->zone_, Array::New(parameter_count, Heap::kOld)));
+
+        intptr_t pos = 0;
+        closure.SetParameterTypeAt(pos, AbstractType::dynamic_type());
+        closure.SetParameterNameAt(pos, Symbols::ClosureParameter());
+        pos++;
+
+        for (intptr_t j = 0; j < positional_parameter_count; ++j, ++pos) {
+          VariableDeclarationHelper helper(builder_);
+          helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
+          const AbstractType& type =
+              builder_->type_translator_.BuildVariableType();
+          Tag tag = builder_->ReadTag();  // read (first part of) initializer.
+          if (tag == kSomething) {
+            builder_->SkipExpression();  // read (actual) initializer.
+          }
+
+          closure.SetParameterTypeAt(pos, type);
+          closure.SetParameterNameAt(pos,
+                                     H.DartSymbolObfuscate(helper.name_index_));
+        }
+
+        intptr_t named_parameter_count_check = builder_->ReadListLength();
+        ASSERT(named_parameter_count_check == named_parameter_count);
+        for (intptr_t j = 0; j < named_parameter_count; ++j, ++pos) {
+          VariableDeclarationHelper helper(builder_);
+          helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
+          const AbstractType& type =
+              builder_->type_translator_.BuildVariableType();
+          Tag tag = builder_->ReadTag();  // read (first part of) initializer.
+          if (tag == kSomething) {
+            builder_->SkipExpression();  // read (actual) initializer.
+          }
+
+          closure.SetParameterTypeAt(pos, type);
+          closure.SetParameterNameAt(pos,
+                                     H.DartSymbolObfuscate(helper.name_index_));
+        }
+
+        function_node_helper.SetJustRead(FunctionNodeHelper::kNamedParameters);
+
+        const AbstractType& return_type =
+            builder_->type_translator_.BuildVariableType();
+        closure.set_result_type(return_type);
+        function_node_helper.SetJustRead(FunctionNodeHelper::kReturnType);
+        // The closure has no body.
+        function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd);
+
+        pool.SetTypeAt(i, ObjectPool::kTaggedObject);
+        pool.SetObjectAt(i, closure);
+
+        // Continue reading the constant pool entries inside the opened
+        // ActiveTypeParametersScope until the scope gets closed by a
+        // kEndClosureFunctionScope tag, in which case control returns here.
+        i = ReadPoolEntries(function, closure, pool, i + 1);
+        // Pool entry at index i has been set to null, because it was a
+        // kEndClosureFunctionScope.
+        ASSERT(pool.ObjectAt(i) == Object::null());
+        continue;
+      }
+      case ConstantPoolTag::kEndClosureFunctionScope: {
+        // Entry is not used and set to null.
+        obj = Object::null();
+        pool.SetTypeAt(i, ObjectPool::kTaggedObject);
+        pool.SetObjectAt(i, obj);
+        return i;  // The caller will close the scope.
+      } break;
       default:
         UNREACHABLE();
     }
-    obj_pool.SetTypeAt(i, ObjectPool::kTaggedObject);
-    obj_pool.SetObjectAt(i, obj);
+    pool.SetTypeAt(i, ObjectPool::kTaggedObject);
+    pool.SetObjectAt(i, obj);
   }
+  // Return the index of the last read pool entry.
+  return obj_count - 1;
+}
 
-  const Code& bytecode = Code::Handle(
-      builder_->zone_,
-      Code::FinalizeBytecode(reinterpret_cast<void*>(bytecode_data),
-                             bytecode_size, obj_pool));
-  function.AttachBytecode(bytecode);
+RawCode* BytecodeMetadataHelper::ReadBytecode(const ObjectPool& pool) {
+  // TODO(regis): Avoid copying bytecode from mapped kernel binary.
+  intptr_t size = builder_->reader_.ReadUInt();
+  intptr_t offset = builder_->reader_.offset();
+  uint8_t* data =
+      builder_->reader_.CopyDataIntoZone(builder_->zone_, offset, size);
+  builder_->reader_.set_offset(offset + size);
 
-  if (FLAG_dump_kernel_bytecode) {
-    KernelBytecodeDisassembler::Disassemble(function);
+  // Create and return code object.
+  return Code::FinalizeBytecode(reinterpret_cast<void*>(data), size, pool);
+}
+
+void BytecodeMetadataHelper::ReadExceptionsTable(const Code& bytecode) {
+  const ObjectPool& pool =
+      ObjectPool::Handle(builder_->zone_, bytecode.object_pool());
+  AbstractType& handled_type = AbstractType::Handle(builder_->zone_);
+
+  // Encoding of ExceptionsTable is described in
+  // pkg/vm/lib/bytecode/exceptions.dart.
+  intptr_t try_block_count = builder_->reader_.ReadListLength();
+  for (intptr_t i = 0; i < try_block_count; i++) {
+    intptr_t outer_try_index_plus1 = builder_->reader_.ReadUInt();
+    intptr_t outer_try_index = outer_try_index_plus1 - 1;
+    USE(outer_try_index);
+    intptr_t start_pc = builder_->reader_.ReadUInt();
+    USE(start_pc);
+    intptr_t end_pc = builder_->reader_.ReadUInt();
+    USE(end_pc);
+    intptr_t handler_pc = builder_->reader_.ReadUInt();
+    USE(handler_pc);
+    uint8_t flags = builder_->reader_.ReadByte();
+    // flagNeedsStackTrace = 1 << 0;
+    // flagIsSynthetic = 1 << 1;
+    USE(flags);
+
+    intptr_t type_count = builder_->reader_.ReadListLength();
+    for (intptr_t j = 0; j < type_count; j++) {
+      intptr_t type_index = builder_->reader_.ReadUInt();
+      ASSERT(type_index < pool.Length());
+      handled_type ^= pool.ObjectAt(type_index);
+    }
   }
+  // TODO(regis): Generate exception handlers (as well as pc descriptors)
+  // and store in bytecode: bytecode.set_exception_handlers(exception_handlers);
 }
 #endif  // defined(DART_USE_INTERPRETER)
 
@@ -1598,8 +1812,8 @@
     first_body_token_position_ = builder_->reader_.min_position();
   }
 
-  // Ensure that :await_jump_var, :await_ctx_var, :async_op and
-  // :async_stack_trace are captured.
+  // Ensure that :await_jump_var, :await_ctx_var, :async_op,
+  // :async_completer and :async_stack_trace are captured.
   if (function_node_helper.async_marker_ == FunctionNodeHelper::kSyncYielding) {
     {
       LocalVariable* temp = NULL;
@@ -1620,6 +1834,13 @@
         scope_->CaptureVariable(temp);
       }
     }
+    {
+      LocalVariable* temp =
+          scope_->LookupVariable(Symbols::AsyncCompleter(), true);
+      if (temp != NULL) {
+        scope_->CaptureVariable(temp);
+      }
+    }
     if (FLAG_causal_async_stacks) {
       LocalVariable* temp =
           scope_->LookupVariable(Symbols::AsyncStackTraceVar(), true);
@@ -3914,7 +4135,9 @@
 }
 
 void StreamingConstantEvaluator::EvaluateConstantExpression() {
-  result_ ^= H.constants().At(builder_->ReadUInt());
+  KernelConstantsMap constant_map(H.constants().raw());
+  result_ ^= constant_map.GetOrDie(builder_->ReadUInt());
+  ASSERT(constant_map.Release().raw() == H.constants().raw());
 }
 
 // This depends on being about to read the list of positionals on arguments.
@@ -5446,7 +5669,7 @@
   function_node_helper.ReadUntilExcluding(
       FunctionNodeHelper::kPositionalParameters);
 
-  body += NullConstant();
+  body += MakeTemp();
   LocalVariable* result = MakeTemporary();
 
   // Do "++argument_count" if any type arguments were passed.
@@ -5978,7 +6201,7 @@
         dispatch += Drop();
       }
       if (i == (yield_continuations().length() - 1)) {
-        // We reached the last possility, no need to build more ifs.
+        // We reached the last possibility, no need to build more ifs.
         // Continue to the last continuation.
         // Note: continuations start with nop DropTemps instruction
         // which acts like an anchor, so we need to skip it.
@@ -6162,7 +6385,7 @@
   // TODO(regis): Clean up this logic of when to compile.
   // If the bytecode was previously loaded, we really want to compile.
   if (!function.HasBytecode()) {
-    bytecode_metadata_helper_.CopyBytecode(function);
+    bytecode_metadata_helper_.ReadMetadata(function);
     if (function.HasBytecode()) {
       return NULL;
     }
@@ -7573,6 +7796,10 @@
   return flow_graph_builder_->DropTempsPreserveTop(num_temps_to_drop);
 }
 
+Fragment StreamingFlowGraphBuilder::MakeTemp() {
+  return flow_graph_builder_->MakeTemp();
+}
+
 Fragment StreamingFlowGraphBuilder::NullConstant() {
   return flow_graph_builder_->NullConstant();
 }
@@ -7844,7 +8071,7 @@
   const DirectCallMetadata direct_call =
       direct_call_metadata_helper_.GetDirectTargetForPropertySet(offset);
 
-  Fragment instructions(NullConstant());
+  Fragment instructions(MakeTemp());
   LocalVariable* variable = MakeTemporary();
 
   const TokenPosition position = ReadPosition();  // read position.
@@ -8062,7 +8289,7 @@
 
   Function& function = FindMatchingFunctionAnyArgs(klass, setter_name);
 
-  Fragment instructions(NullConstant());
+  Fragment instructions(MakeTemp());
   LocalVariable* value = MakeTemporary();  // this holds RHS value
 
   if (function.IsNull()) {
@@ -8172,7 +8399,7 @@
   const TokenPosition position = ReadPosition();  // read position.
   if (p != NULL) *p = position;
 
-  Fragment instructions(NullConstant());
+  Fragment instructions(MakeTemp());
   LocalVariable* value = MakeTemporary();
 
   instructions += BuildExpression();  // read receiver.
@@ -9411,8 +9638,12 @@
 Fragment StreamingFlowGraphBuilder::BuildConstantExpression(
     TokenPosition* position) {
   if (position != NULL) *position = TokenPosition::kNoSource;
-  const intptr_t constant_index = ReadUInt();
-  return Constant(Object::ZoneHandle(Z, H.constants().At(constant_index)));
+  const intptr_t constant_offset = ReadUInt();
+  KernelConstantsMap constant_map(H.constants().raw());
+  Fragment result =
+      Constant(Object::ZoneHandle(Z, constant_map.GetOrDie(constant_offset)));
+  ASSERT(constant_map.Release().raw() == H.constants().raw());
+  return result;
 }
 
 Fragment StreamingFlowGraphBuilder::BuildPartialTearoffInstantiation(
@@ -11076,9 +11307,13 @@
   temp_object_ = temp_class_.EnsureIsFinalized(H.thread());
   ASSERT(temp_object_.IsNull());
 
-  const Array& constants =
-      Array::Handle(Z, Array::New(number_of_constants, Heap::kOld));
+  KernelConstantsMap constants(
+      HashTables::New<KernelConstantsMap>(number_of_constants, Heap::kOld));
+
+  const intptr_t start_offset = builder_.ReaderOffset();
+
   for (intptr_t i = 0; i < number_of_constants; ++i) {
+    const intptr_t offset = builder_.ReaderOffset();
     const intptr_t constant_tag = builder_.ReadByte();
     switch (constant_tag) {
       case kNullConstant:
@@ -11115,9 +11350,9 @@
         temp_array_ = ImmutableArray::New(length, Heap::kOld);
         temp_array_.SetTypeArguments(temp_type_arguments_);
         for (intptr_t j = 0; j < length; ++j) {
-          const intptr_t entry_index = builder_.ReadUInt();
-          ASSERT(entry_index < i);  // We have a DAG!
-          temp_object_ = constants.At(entry_index);
+          const intptr_t entry_offset = builder_.ReadUInt();
+          ASSERT(entry_offset < offset);  // We have a DAG!
+          temp_object_ = constants.GetOrDie(entry_offset);
           temp_array_.SetAt(j, temp_object_);
         }
 
@@ -11154,9 +11389,9 @@
         for (intptr_t j = 0; j < number_of_fields; ++j) {
           temp_field_ =
               H.LookupFieldByKernelField(builder_.ReadCanonicalNameReference());
-          const intptr_t entry_index = builder_.ReadUInt();
-          ASSERT(entry_index < i);  // We have a DAG!
-          temp_object_ = constants.At(entry_index);
+          const intptr_t entry_offset = builder_.ReadUInt();
+          ASSERT(entry_offset < offset);  // We have a DAG!
+          temp_object_ = constants.GetOrDie(entry_offset);
           temp_instance_.SetField(temp_field_, temp_object_);
         }
 
@@ -11164,8 +11399,8 @@
         break;
       }
       case kPartialInstantiationConstant: {
-        const intptr_t entry_index = builder_.ReadUInt();
-        temp_object_ = constants.At(entry_index);
+        const intptr_t entry_offset = builder_.ReadUInt();
+        temp_object_ = constants.GetOrDie(entry_offset);
 
         // Happens if the tearoff was in the vmservice library and we have
         // [skip_vm_service_library] enabled.
@@ -11219,9 +11454,9 @@
       default:
         UNREACHABLE();
     }
-    constants.SetAt(i, temp_instance_);
+    constants.InsertNewOrGetValue(offset - start_offset, temp_instance_);
   }
-  return constants;
+  return Array::Handle(Z, constants.Release().raw());
 }
 
 void ConstantHelper::InstantiateTypeArguments(const Class& receiver_class,
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index a8b39a4..169f403 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -670,7 +670,16 @@
       : MetadataHelper(builder) {}
 
 #if defined(DART_USE_INTERPRETER)
-  void CopyBytecode(const Function& function);
+  void ReadMetadata(const Function& function);
+
+ private:
+  // Returns the index of the last read pool entry.
+  intptr_t ReadPoolEntries(const Function& function,
+                           const Function& inner_function,
+                           const ObjectPool& pool,
+                           intptr_t from_index);
+  RawCode* ReadBytecode(const ObjectPool& pool);
+  void ReadExceptionsTable(const Code& bytecode);
 #endif
 };
 
@@ -1446,6 +1455,7 @@
   // Drop given number of temps from the stack but preserve top of the stack.
   Fragment DropTempsPreserveTop(intptr_t num_temps_to_drop);
 
+  Fragment MakeTemp();
   Fragment NullConstant();
   JoinEntryInstr* BuildJoinEntry();
   JoinEntryInstr* BuildJoinEntry(intptr_t try_index);
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 6b5a9af..c8a1f61 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -2040,6 +2040,12 @@
   return Fragment(drop_temps);
 }
 
+Fragment BaseFlowGraphBuilder::MakeTemp() {
+  MakeTempInstr* make_temp = new (Z) MakeTempInstr(Z);
+  Push(make_temp);
+  return Fragment(make_temp);
+}
+
 void FlowGraphBuilder::InlineBailout(const char* reason) {
   bool is_inlining = exit_collector_ != NULL;
   if (is_inlining) {
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index a22d222..97e4aaa 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -580,6 +580,7 @@
   Fragment Drop();
   // Drop given number of temps from the stack but preserve top of the stack.
   Fragment DropTempsPreserveTop(intptr_t num_temps_to_drop);
+  Fragment MakeTemp();
 
   // Create a pseudo-local variable for a location on the expression stack.
   // Note: SSA construction currently does not support inserting Phi functions
diff --git a/runtime/vm/compiler_stats.h b/runtime/vm/compiler_stats.h
index 4a7d49f..1649f3a 100644
--- a/runtime/vm/compiler_stats.h
+++ b/runtime/vm/compiler_stats.h
@@ -78,7 +78,7 @@
   Timer graphcompiler_timer;   // Included in codegen_timer.
   Timer codefinalizer_timer;   // Included in codegen_timer.
 
-  ALIGN8 int64_t num_tokens_total;  // Isolate + VM isolate
+  ALIGN8 int64_t num_tokens_total;  // Isolate + VM isolate.
   ALIGN8 int64_t num_tokens_scanned;
   ALIGN8 int64_t num_tokens_consumed;
   ALIGN8 int64_t num_cached_consts;
diff --git a/runtime/vm/dart_api_impl.h b/runtime/vm/dart_api_impl.h
index 2541e0a..375fc6d 100644
--- a/runtime/vm/dart_api_impl.h
+++ b/runtime/vm/dart_api_impl.h
@@ -52,7 +52,7 @@
 #define CHECK_API_SCOPE(thread)                                                \
   do {                                                                         \
     Thread* tmpT = (thread);                                                   \
-    Isolate* tmpI = tmpT->isolate();                                           \
+    Isolate* tmpI = tmpT == NULL ? NULL : tmpT->isolate();                     \
     CHECK_ISOLATE(tmpI);                                                       \
     if (tmpT->api_top_scope() == NULL) {                                       \
       FATAL1(                                                                  \
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 559b954..00cc771 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -752,15 +752,26 @@
 }
 
 RawObject* ActivationFrame::GetAsyncCompleterAwaiter(const Object& completer) {
-  const Class& sync_completer_cls = Class::Handle(completer.clazz());
-  ASSERT(!sync_completer_cls.IsNull());
-  const Class& completer_cls = Class::Handle(sync_completer_cls.SuperClass());
-  const Field& future_field =
-      Field::Handle(completer_cls.LookupInstanceFieldAllowPrivate(
-          Symbols::CompleterFuture()));
-  ASSERT(!future_field.IsNull());
   Instance& future = Instance::Handle();
-  future ^= Instance::Cast(completer).GetField(future_field);
+  if (FLAG_sync_async) {
+    const Class& completer_cls = Class::Handle(completer.clazz());
+    ASSERT(!completer_cls.IsNull());
+    const Function& future_getter = Function::Handle(
+        completer_cls.LookupGetterFunction(Symbols::CompleterFuture()));
+    ASSERT(!future_getter.IsNull());
+    const Array& args = Array::Handle(Array::New(1));
+    args.SetAt(0, Instance::Cast(completer));
+    future ^= DartEntry::InvokeFunction(future_getter, args);
+  } else {
+    const Class& sync_completer_cls = Class::Handle(completer.clazz());
+    ASSERT(!sync_completer_cls.IsNull());
+    const Class& completer_cls = Class::Handle(sync_completer_cls.SuperClass());
+    const Field& future_field =
+        Field::Handle(completer_cls.LookupInstanceFieldAllowPrivate(
+            Symbols::CompleterFuture()));
+    ASSERT(!future_field.IsNull());
+    future ^= Instance::Cast(completer).GetField(future_field);
+  }
   if (future.IsNull()) {
     // The completer object may not be fully initialized yet.
     return Object::null();
@@ -855,11 +866,18 @@
 
 void ActivationFrame::ExtractTokenPositionFromAsyncClosure() {
   // Attempt to determine the token position from the async closure.
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  const Script& script = Script::Handle(zone, function().script());
+
   ASSERT(function_.IsAsyncGenClosure() || function_.IsAsyncClosure());
   // This should only be called on frames that aren't active on the stack.
   ASSERT(fp() == 0);
+
   const Array& await_to_token_map =
-      Array::Handle(code_.await_token_positions());
+      Array::Handle(zone, script.kind() == RawScript::kKernelTag
+                              ? script.yield_positions()
+                              : code_.await_token_positions());
   if (await_to_token_map.IsNull()) {
     // No mapping.
     return;
@@ -883,9 +901,15 @@
   if (await_jump_var < 0) {
     return;
   }
-  ASSERT(await_jump_var < await_to_token_map.Length());
+  intptr_t await_to_token_map_index =
+      script.kind() == RawScript::kKernelTag
+          ? await_jump_var - 1
+          :
+          // source script tokens array has first element duplicated
+          await_jump_var;
+  ASSERT(await_to_token_map_index < await_to_token_map.Length());
   const Object& token_pos =
-      Object::Handle(await_to_token_map.At(await_jump_var));
+      Object::Handle(await_to_token_map.At(await_to_token_map_index));
   if (token_pos.IsNull()) {
     return;
   }
@@ -2017,13 +2041,37 @@
   Array& deopt_frame = Array::Handle(zone);
   class StackTrace& async_stack_trace = StackTrace::Handle(zone);
   bool stack_has_async_function = false;
+
+  // Number of frames we are trying to skip that form "sync async" entry.
+  int skipSyncAsyncFramesCount = -1;
+  String& function_name = String::Handle(zone);
   for (StackFrame* frame = iterator.NextFrame(); frame != NULL;
        frame = iterator.NextFrame()) {
     ASSERT(frame->IsValid());
     if (FLAG_trace_debugger_stacktrace) {
-      OS::PrintErr("CollectStackTrace: visiting frame:\n\t%s\n",
+      OS::PrintErr("CollectAwaiterReturnStackTrace: visiting frame:\n\t%s\n",
                    frame->ToCString());
     }
+    if (skipSyncAsyncFramesCount >= 0) {
+      if (!frame->IsDartFrame()) {
+        break;
+      }
+      // Assume that the code we are looking for is not inlined.
+      code = frame->LookupDartCode();
+      function = code.function();
+      function_name ^= function.QualifiedScrubbedName();
+      if (skipSyncAsyncFramesCount == 2) {
+        if (!function_name.Equals(Symbols::_ClosureCall())) {
+          break;
+        }
+      } else if (skipSyncAsyncFramesCount == 1) {
+        if (!function_name.Equals(Symbols::_AsyncAwaitCompleterStart())) {
+          break;
+        }
+      }
+
+      skipSyncAsyncFramesCount--;
+    }
     if (frame->IsDartFrame()) {
       code = frame->LookupDartCode();
       if (code.is_optimized()) {
@@ -2035,8 +2083,10 @@
           function = it.function();
           if (FLAG_trace_debugger_stacktrace) {
             ASSERT(!function.IsNull());
-            OS::PrintErr("CollectStackTrace: visiting inlined function: %s\n",
-                         function.ToFullyQualifiedCString());
+            OS::PrintErr(
+                "CollectAwaiterReturnStackTrace: visiting inlined function: "
+                "%s\n",
+                function.ToFullyQualifiedCString());
           }
           intptr_t deopt_frame_offset = it.GetDeoptFpOffset();
           if (function.IsAsyncClosure() || function.IsAsyncGenClosure()) {
@@ -2072,7 +2122,16 @@
           // Grab the awaiter.
           async_activation ^= activation->GetAsyncAwaiter();
           async_stack_trace ^= activation->GetCausalStack();
-          break;
+          if (FLAG_sync_async) {
+            // async function might have been called synchronously, in which
+            // case we need to keep going down the stack.
+            // To determine how we are called we peek few more frames further
+            // expecting to see Closure_call followed by
+            // AsyncAwaitCompleter_start.
+            skipSyncAsyncFramesCount = 2;
+          } else {
+            break;
+          }
         } else {
           stack_trace->AddActivation(CollectDartFrame(
               isolate, frame->pc(), frame, code, Object::null_array(), 0));
diff --git a/runtime/vm/hash_table.h b/runtime/vm/hash_table.h
index 7045230..24ae04c 100644
--- a/runtime/vm/hash_table.h
+++ b/runtime/vm/hash_table.h
@@ -544,6 +544,12 @@
     }
     return (entry == -1) ? Object::null() : BaseIterTable::GetPayload(entry, 0);
   }
+  template <typename Key>
+  RawObject* GetOrDie(const Key& key) const {
+    intptr_t entry = BaseIterTable::FindKey(key);
+    if (entry == -1) UNREACHABLE();
+    return BaseIterTable::GetPayload(entry, 0);
+  }
   bool UpdateOrInsert(const Object& key, const Object& value) const {
     EnsureCapacity();
     intptr_t entry = -1;
diff --git a/runtime/vm/isolate_reload_test.cc b/runtime/vm/isolate_reload_test.cc
index 48f8763..71fbf0e 100644
--- a/runtime/vm/isolate_reload_test.cc
+++ b/runtime/vm/isolate_reload_test.cc
@@ -519,16 +519,16 @@
       "  return max(3, 4);\n"
       "}\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  EXPECT_ERROR(SimpleInvokeError(lib, "main"), "max");
-
   const char* kReloadScript =
       "import 'dart:math';\n"
       "main() {\n"
       "  return max(3, 4);\n"
       "}\n";
 
+  Dart_Handle lib = TestCase::LoadTestScriptWithErrors(kScript);
+  EXPECT_VALID(lib);
+  EXPECT_ERROR(SimpleInvokeError(lib, "main"), "max");
+
   lib = TestCase::ReloadTestScript(kReloadScript);
   EXPECT_VALID(lib);
   EXPECT_EQ(4, SimpleInvoke(lib, "main"));
@@ -551,8 +551,6 @@
       "}\n";
 
   lib = TestCase::ReloadTestScript(kReloadScript);
-  EXPECT_VALID(lib);
-
   EXPECT_ERROR(SimpleInvokeError(lib, "main"), "max");
 }
 
@@ -1036,7 +1034,7 @@
 
   // Dart_Handle result;
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScriptWithErrors(kScript);
   EXPECT_VALID(lib);
   EXPECT_ERROR(SimpleInvokeError(lib, "main"), "importedFunc");
 
@@ -1069,7 +1067,7 @@
       "  return importedIntFunc();\n"
       "}\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScriptWithErrors(kScript);
   EXPECT_VALID(lib);
 
   // Works.
@@ -1089,12 +1087,15 @@
       "}\n";
 
   lib = TestCase::ReloadTestScript(kReloadScript);
-  EXPECT_VALID(lib);
-
-  // Works.
-  EXPECT_STREQ("a", SimpleInvokeStr(lib, "main"));
-  // Results in an error.
-  EXPECT_ERROR(SimpleInvokeError(lib, "mainInt"), "importedIntFunc");
+  if (TestCase::UsingDartFrontend() && TestCase::UsingStrongMode()) {
+    EXPECT_ERROR(lib, "importedIntFunc");
+  } else {
+    EXPECT_VALID(lib);
+    // Works.
+    EXPECT_STREQ("a", SimpleInvokeStr(lib, "main"));
+    // Results in an error.
+    EXPECT_ERROR(SimpleInvokeError(lib, "mainInt"), "importedIntFunc");
+  }
 }
 
 // Verifies that we clear the ICs for the functions live on the stack in a way
@@ -1622,7 +1623,7 @@
   if (TestCase::UsingStrongMode()) {
     error =
         "file:///test-lib:8:12: Error: Too few positional"
-        " arguments to function: 1 required, 0 given.\n"
+        " arguments: 1 required, 0 given.\n"
         "  return f1();";
   } else if (TestCase::UsingDartFrontend()) {
     error =
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index c22b3f5..cc0b1e6c 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -583,10 +583,25 @@
   }
 
  private:
+  void LoadKernelFromResponse(Dart_CObject* response) {
+    ASSERT((response->type == Dart_CObject_kTypedData) ||
+           (response->type == Dart_CObject_kNull));
+
+    if (response->type == Dart_CObject_kNull) {
+      return;
+    }
+
+    ASSERT(response->value.as_typed_data.type == Dart_TypedData_kUint8);
+    result_.kernel_size = response->value.as_typed_data.length;
+    result_.kernel = static_cast<uint8_t*>(malloc(result_.kernel_size));
+    memmove(result_.kernel, response->value.as_typed_data.values,
+            result_.kernel_size);
+  }
+
   // Possible responses from the Kernel isolate:
   //
   //     [Ok, Uint8List KernelBinary]
-  //     [Error, String error]
+  //     [Error, String error, Uint8List KernelBinary]
   //     [Crash, String error]
   //
   void HandleResponseImpl(Dart_CObject* message) {
@@ -602,22 +617,11 @@
         message->value.as_array.values[0]->value.as_int32);
 
     if (result_.status == Dart_KernelCompilationStatus_Ok) {
-      ASSERT((response[1]->type == Dart_CObject_kTypedData) ||
-             (response[1]->type == Dart_CObject_kNull));
-
-      if (response[1]->type == Dart_CObject_kNull) {
-        ml.Notify();
-        return;
-      }
-
-      ASSERT(response[1]->value.as_typed_data.type == Dart_TypedData_kUint8);
-      result_.kernel_size = response[1]->value.as_typed_data.length;
-      result_.kernel = static_cast<uint8_t*>(malloc(result_.kernel_size));
-      memmove(result_.kernel, response[1]->value.as_typed_data.values,
-              result_.kernel_size);
+      LoadKernelFromResponse(response[1]);
     } else {
-      ASSERT(result_.status == Dart_KernelCompilationStatus_Crash ||
-             result_.status == Dart_KernelCompilationStatus_Error);
+      if (result_.status == Dart_KernelCompilationStatus_Error) {
+        LoadKernelFromResponse(response[2]);
+      }
       // This is an error.
       ASSERT(response[1]->type == Dart_CObject_kString);
       result_.error = strdup(response[1]->value.as_string);
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index abbc676..607c1e9 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -376,7 +376,8 @@
   return helper.ReadConstantTable();
 }
 
-void KernelLoader::AnnotateNativeProcedures(const Array& constant_table) {
+void KernelLoader::AnnotateNativeProcedures(const Array& constant_table_array) {
+  KernelConstantsMap constant_table(constant_table_array.raw());
   potential_natives_ = kernel_program_info_.potential_natives();
   const intptr_t length =
       !potential_natives_.IsNull() ? potential_natives_.Length() : 0;
@@ -407,8 +408,8 @@
 
           // We have a candiate.  Let's look if it's an instance of the
           // ExternalName class.
-          const intptr_t constant_table_index = builder_.ReadUInt();
-          constant ^= constant_table.At(constant_table_index);
+          const intptr_t constant_table_offset = builder_.ReadUInt();
+          constant ^= constant_table.GetOrDie(constant_table_offset);
           if (constant.clazz() == external_name_class_.raw()) {
             // We found the annotation, let's flag the function as native and
             // set the native name!
@@ -428,6 +429,7 @@
     potential_natives_ = GrowableObjectArray::null();
     kernel_program_info_.set_potential_natives(potential_natives_);
   }
+  ASSERT(constant_table.Release().raw() == constant_table_array.raw());
 }
 
 RawString* KernelLoader::DetectExternalName() {
@@ -469,12 +471,15 @@
   return result.raw();
 }
 
-void KernelLoader::LoadNativeExtensionLibraries(const Array& constant_table) {
+void KernelLoader::LoadNativeExtensionLibraries(
+    const Array& constant_table_array) {
   const intptr_t length = !potential_extension_libraries_.IsNull()
                               ? potential_extension_libraries_.Length()
                               : 0;
   if (length == 0) return;
 
+  KernelConstantsMap constant_table(constant_table_array.raw());
+
   // Obtain `dart:_internal::ExternalName.name`.
   EnsureExternalClassIsLookedUp();
 
@@ -499,7 +504,7 @@
         builder_.ReadByte();  // Skip the tag.
 
         const intptr_t constant_table_index = builder_.ReadUInt();
-        constant ^= constant_table.At(constant_table_index);
+        constant ^= constant_table.GetOrDie(constant_table_index);
         if (constant.clazz() == external_name_class_.raw()) {
           uri_path ^= constant.GetField(external_name_field_);
         }
@@ -534,6 +539,7 @@
     }
   }
   potential_extension_libraries_ = GrowableObjectArray::null();
+  ASSERT(constant_table.Release().raw() == constant_table_array.raw());
 }
 
 RawObject* KernelLoader::LoadProgram(bool process_pending_classes) {
@@ -1334,14 +1340,16 @@
           // Obtain `dart:_internal::ExternalName.name`.
           EnsureExternalClassIsLookedUp();
 
-          const Array& constant_table =
+          const Array& constant_table_array =
               Array::Handle(kernel_program_info_.constants());
+          KernelConstantsMap constant_table(constant_table_array.raw());
 
           // We have a candiate.  Let's look if it's an instance of the
           // ExternalName class.
           const intptr_t constant_table_index = builder_.ReadUInt();
           const Object& constant =
-              Object::Handle(constant_table.At(constant_table_index));
+              Object::Handle(constant_table.GetOrDie(constant_table_index));
+          ASSERT(constant_table.Release().raw() == constant_table_array.raw());
           if (constant.clazz() == external_name_class_.raw()) {
             const Instance& instance =
                 Instance::Handle(Instance::RawCast(constant.raw()));
@@ -1390,8 +1398,16 @@
   ASSERT(function_node_tag == kSomething);
   FunctionNodeHelper function_node_helper(&builder_);
   function_node_helper.ReadUntilIncluding(FunctionNodeHelper::kDartAsyncMarker);
+  // _AsyncAwaitCompleter.future should be made non-debuggable, otherwise
+  // stepping out of async methods will keep hitting breakpoint resulting in
+  // infinite loop.
+  bool isAsyncAwaitCompleterFuture =
+      Symbols::_AsyncAwaitCompleter().Equals(
+          String::Handle(owner.ScrubbedName())) &&
+      Symbols::CompleterGetFuture().Equals(String::Handle(function.name()));
   function.set_is_debuggable(function_node_helper.dart_async_marker_ ==
-                             FunctionNodeHelper::kSync);
+                                 FunctionNodeHelper::kSync &&
+                             !isAsyncAwaitCompleterFuture);
   switch (function_node_helper.dart_async_marker_) {
     case FunctionNodeHelper::kSyncStar:
       function.set_modifier(RawFunction::kSyncGen);
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 5056ab6..cf08ad6 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -3220,6 +3220,21 @@
   return true;
 }
 
+static const MethodParameter* kill_params[] = {
+    RUNNABLE_ISOLATE_PARAMETER,
+    NULL,
+};
+
+static bool Kill(Thread* thread, JSONStream* js) {
+  const String& msg =
+      String::Handle(String::New("isolate terminated by Kill service request"));
+  const UnwindError& error = UnwindError::Handle(UnwindError::New(msg));
+  error.set_is_user_initiated(true);
+  Thread::Current()->set_sticky_error(error);
+  PrintSuccess(js);
+  return true;
+}
+
 static const MethodParameter* pause_params[] = {
     RUNNABLE_ISOLATE_PARAMETER, NULL,
 };
@@ -4347,6 +4362,7 @@
     get_vm_timeline_params },
   { "_getVMTimelineFlags", GetVMTimelineFlags,
     get_vm_timeline_flags_params },
+  { "kill", Kill, kill_params },
   { "pause", Pause,
     pause_params },
   { "removeBreakpoint", RemoveBreakpoint,
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index cb81061..e084402 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -15,7 +15,7 @@
 namespace dart {
 
 #define SERVICE_PROTOCOL_MAJOR_VERSION 3
-#define SERVICE_PROTOCOL_MINOR_VERSION 7
+#define SERVICE_PROTOCOL_MINOR_VERSION 8
 
 class Array;
 class EmbedderServiceHandler;
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index bfbbe3f..cf548a5 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -1,8 +1,8 @@
-# Dart VM Service Protocol 3.7
+# Dart VM Service Protocol 3.8
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.7_ of the Dart VM Service Protocol. This
+This document describes of _version 3.8_ of the Dart VM Service Protocol. This
 protocol is used to communicate with a running Dart Virtual Machine.
 
 To use the Service Protocol, start the VM with the *--observe* flag.
@@ -24,74 +24,75 @@
 - [Versioning](#versioning)
 - [Private RPCs, Types, and Properties](#private-rpcs-types-and-properties)
 - [Public RPCs](#public-rpcs)
-	- [addBreakpoint](#addbreakpoint)
-	- [addBreakpointWithScriptUri](#addbreakpointwithscripturi)
-	- [addBreakpointAtEntry](#addbreakpointatentry)
-	- [evaluate](#evaluate)
-	- [evaluateInFrame](#evaluateinframe)
-	- [getFlagList](#getflaglist)
-	- [getIsolate](#getisolate)
-	- [getObject](#getobject)
-	- [getSourceReport](#getsourcereport)
-	- [getStack](#getstack)
-	- [getVersion](#getversion)
-	- [getVM](#getvm)
-	- [pause](#pause)
-	- [reloadSources](#reloadsources)
-	- [removeBreakpoint](#removebreakpoint)
-	- [resume](#resume)
-	- [setExceptionPauseMode](#setexceptionpausemode)
-	- [setFlag](#setflag)
-	- [setLibraryDebuggable](#setlibrarydebuggable)
-	- [setName](#setname)
-	- [setVMName](#setvmname)
-	- [streamCancel](#streamcancel)
-	- [streamListen](#streamlisten)
+  - [addBreakpoint](#addbreakpoint)
+  - [addBreakpointWithScriptUri](#addbreakpointwithscripturi)
+  - [addBreakpointAtEntry](#addbreakpointatentry)
+  - [evaluate](#evaluate)
+  - [evaluateInFrame](#evaluateinframe)
+  - [getFlagList](#getflaglist)
+  - [getIsolate](#getisolate)
+  - [getObject](#getobject)
+  - [getSourceReport](#getsourcereport)
+  - [getStack](#getstack)
+  - [getVersion](#getversion)
+  - [getVM](#getvm)
+  - [pause](#pause)
+  - [kill](#kill)
+  - [reloadSources](#reloadsources)
+  - [removeBreakpoint](#removebreakpoint)
+  - [resume](#resume)
+  - [setExceptionPauseMode](#setexceptionpausemode)
+  - [setFlag](#setflag)
+  - [setLibraryDebuggable](#setlibrarydebuggable)
+  - [setName](#setname)
+  - [setVMName](#setvmname)
+  - [streamCancel](#streamcancel)
+  - [streamListen](#streamlisten)
 - [Public Types](#public-types)
-	- [BoundField](#boundfield)
-	- [BoundVariable](#boundvariable)
-	- [Breakpoint](#breakpoint)
-	- [Class](#class)
-	- [ClassList](#classlist)
-	- [Code](#code)
-	- [CodeKind](#codekind)
-	- [Context](#context)
-	- [ContextElement](#contextelement)
-	- [Error](#error)
-	- [ErrorKind](#errorkind)
-	- [Event](#event)
-	- [EventKind](#eventkind)
-	- [ExtensionData](#extensiondata)
-	- [Field](#field)
-	- [Flag](#flag)
-	- [FlagList](#flaglist)
-	- [Frame](#frame)
-	- [Function](#function)
-	- [Instance](#instance)
-	- [Isolate](#isolate)
-	- [Library](#library)
-	- [LibraryDependency](#librarydependency)
-	- [MapAssociation](#mapassociation)
-	- [Message](#message)
-	- [Null](#null)
-	- [Object](#object)
-	- [ReloadReport](#reloadreport)
-	- [Response](#response)
-	- [Sentinel](#sentinel)
-	- [SentinelKind](#sentinelkind)
-	- [Script](#script)
-	- [SourceLocation](#sourcelocation)
-	- [SourceReport](#sourcereport)
-	- [SourceReportCoverage](#sourcereportcoverage)
-	- [SourceReportKind](#sourcereportkind)
-	- [SourceReportRange](#sourcereportrange)
-	- [Stack](#stack)
-	- [StepOption](#stepoption)
-	- [Success](#success)
-	- [TypeArguments](#typearguments)
-	- [UresolvedSourceLocation](#unresolvedsourcelocation)
-	- [Version](#version)
-	- [VM](#vm)
+  - [BoundField](#boundfield)
+  - [BoundVariable](#boundvariable)
+  - [Breakpoint](#breakpoint)
+  - [Class](#class)
+  - [ClassList](#classlist)
+  - [Code](#code)
+  - [CodeKind](#codekind)
+  - [Context](#context)
+  - [ContextElement](#contextelement)
+  - [Error](#error)
+  - [ErrorKind](#errorkind)
+  - [Event](#event)
+  - [EventKind](#eventkind)
+  - [ExtensionData](#extensiondata)
+  - [Field](#field)
+  - [Flag](#flag)
+  - [FlagList](#flaglist)
+  - [Frame](#frame)
+  - [Function](#function)
+  - [Instance](#instance)
+  - [Isolate](#isolate)
+  - [Library](#library)
+  - [LibraryDependency](#librarydependency)
+  - [MapAssociation](#mapassociation)
+  - [Message](#message)
+  - [Null](#null)
+  - [Object](#object)
+  - [ReloadReport](#reloadreport)
+  - [Response](#response)
+  - [Sentinel](#sentinel)
+  - [SentinelKind](#sentinelkind)
+  - [Script](#script)
+  - [SourceLocation](#sourcelocation)
+  - [SourceReport](#sourcereport)
+  - [SourceReportCoverage](#sourcereportcoverage)
+  - [SourceReportKind](#sourcereportkind)
+  - [SourceReportRange](#sourcereportrange)
+  - [Stack](#stack)
+  - [StepOption](#stepoption)
+  - [Success](#success)
+  - [TypeArguments](#typearguments)
+  - [UresolvedSourceLocation](#unresolvedsourcelocation)
+  - [Version](#version)
+  - [VM](#vm)
 - [Revision History](#revision-history)
 
 ## RPCs, Requests, and Responses
@@ -670,6 +671,18 @@
 
 See [Success](#success).
 
+### kill
+
+```
+Success kill(string isolateId)
+```
+
+The _kill_ RPC is used to kill an isolate as if by dart:isolate's `Isolate.kill(IMMEDIATE)`.
+
+The isolate is killed regardless of whether it is paused or running.
+
+See [Success](#success).
+
 ### reloadSources
 
 
diff --git a/runtime/vm/service/service_dev.md b/runtime/vm/service/service_dev.md
index a15efee..9426433 100644
--- a/runtime/vm/service/service_dev.md
+++ b/runtime/vm/service/service_dev.md
@@ -1,11 +1,8 @@
-Note: this dev version of the protocol contains not yet released functionality,
-and is subject to change.
-
-# Dart VM Service Protocol 3.8-dev
+# Dart VM Service Protocol 3.9-dev
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.8-dev_ of the Dart VM Service Protocol. This
+This document describes of _version 3.9-dev_ of the Dart VM Service Protocol. This
 protocol is used to communicate with a running Dart Virtual Machine.
 
 To use the Service Protocol, start the VM with the *--observe* flag.
@@ -27,74 +24,75 @@
 - [Versioning](#versioning)
 - [Private RPCs, Types, and Properties](#private-rpcs-types-and-properties)
 - [Public RPCs](#public-rpcs)
-	- [addBreakpoint](#addbreakpoint)
-	- [addBreakpointWithScriptUri](#addbreakpointwithscripturi)
-	- [addBreakpointAtEntry](#addbreakpointatentry)
-	- [evaluate](#evaluate)
-	- [evaluateInFrame](#evaluateinframe)
-	- [getFlagList](#getflaglist)
-	- [getIsolate](#getisolate)
-	- [getObject](#getobject)
-	- [getSourceReport](#getsourcereport)
-	- [getStack](#getstack)
-	- [getVersion](#getversion)
-	- [getVM](#getvm)
-	- [pause](#pause)
-	- [reloadSources](#reloadsources)
-	- [removeBreakpoint](#removebreakpoint)
-	- [resume](#resume)
-	- [setExceptionPauseMode](#setexceptionpausemode)
-	- [setFlag](#setflag)
-	- [setLibraryDebuggable](#setlibrarydebuggable)
-	- [setName](#setname)
-	- [setVMName](#setvmname)
-	- [streamCancel](#streamcancel)
-	- [streamListen](#streamlisten)
+  - [addBreakpoint](#addbreakpoint)
+  - [addBreakpointWithScriptUri](#addbreakpointwithscripturi)
+  - [addBreakpointAtEntry](#addbreakpointatentry)
+  - [evaluate](#evaluate)
+  - [evaluateInFrame](#evaluateinframe)
+  - [getFlagList](#getflaglist)
+  - [getIsolate](#getisolate)
+  - [getObject](#getobject)
+  - [getSourceReport](#getsourcereport)
+  - [getStack](#getstack)
+  - [getVersion](#getversion)
+  - [getVM](#getvm)
+  - [pause](#pause)
+  - [kill](#kill)
+  - [reloadSources](#reloadsources)
+  - [removeBreakpoint](#removebreakpoint)
+  - [resume](#resume)
+  - [setExceptionPauseMode](#setexceptionpausemode)
+  - [setFlag](#setflag)
+  - [setLibraryDebuggable](#setlibrarydebuggable)
+  - [setName](#setname)
+  - [setVMName](#setvmname)
+  - [streamCancel](#streamcancel)
+  - [streamListen](#streamlisten)
 - [Public Types](#public-types)
-	- [BoundField](#boundfield)
-	- [BoundVariable](#boundvariable)
-	- [Breakpoint](#breakpoint)
-	- [Class](#class)
-	- [ClassList](#classlist)
-	- [Code](#code)
-	- [CodeKind](#codekind)
-	- [Context](#context)
-	- [ContextElement](#contextelement)
-	- [Error](#error)
-	- [ErrorKind](#errorkind)
-	- [Event](#event)
-	- [EventKind](#eventkind)
-	- [ExtensionData](#extensiondata)
-	- [Field](#field)
-	- [Flag](#flag)
-	- [FlagList](#flaglist)
-	- [Frame](#frame)
-	- [Function](#function)
-	- [Instance](#instance)
-	- [Isolate](#isolate)
-	- [Library](#library)
-	- [LibraryDependency](#librarydependency)
-	- [MapAssociation](#mapassociation)
-	- [Message](#message)
-	- [Null](#null)
-	- [Object](#object)
-	- [ReloadReport](#reloadreport)
-	- [Response](#response)
-	- [Sentinel](#sentinel)
-	- [SentinelKind](#sentinelkind)
-	- [Script](#script)
-	- [SourceLocation](#sourcelocation)
-	- [SourceReport](#sourcereport)
-	- [SourceReportCoverage](#sourcereportcoverage)
-	- [SourceReportKind](#sourcereportkind)
-	- [SourceReportRange](#sourcereportrange)
-	- [Stack](#stack)
-	- [StepOption](#stepoption)
-	- [Success](#success)
-	- [TypeArguments](#typearguments)
-	- [UresolvedSourceLocation](#unresolvedsourcelocation)
-	- [Version](#version)
-	- [VM](#vm)
+  - [BoundField](#boundfield)
+  - [BoundVariable](#boundvariable)
+  - [Breakpoint](#breakpoint)
+  - [Class](#class)
+  - [ClassList](#classlist)
+  - [Code](#code)
+  - [CodeKind](#codekind)
+  - [Context](#context)
+  - [ContextElement](#contextelement)
+  - [Error](#error)
+  - [ErrorKind](#errorkind)
+  - [Event](#event)
+  - [EventKind](#eventkind)
+  - [ExtensionData](#extensiondata)
+  - [Field](#field)
+  - [Flag](#flag)
+  - [FlagList](#flaglist)
+  - [Frame](#frame)
+  - [Function](#function)
+  - [Instance](#instance)
+  - [Isolate](#isolate)
+  - [Library](#library)
+  - [LibraryDependency](#librarydependency)
+  - [MapAssociation](#mapassociation)
+  - [Message](#message)
+  - [Null](#null)
+  - [Object](#object)
+  - [ReloadReport](#reloadreport)
+  - [Response](#response)
+  - [Sentinel](#sentinel)
+  - [SentinelKind](#sentinelkind)
+  - [Script](#script)
+  - [SourceLocation](#sourcelocation)
+  - [SourceReport](#sourcereport)
+  - [SourceReportCoverage](#sourcereportcoverage)
+  - [SourceReportKind](#sourcereportkind)
+  - [SourceReportRange](#sourcereportrange)
+  - [Stack](#stack)
+  - [StepOption](#stepoption)
+  - [Success](#success)
+  - [TypeArguments](#typearguments)
+  - [UresolvedSourceLocation](#unresolvedsourcelocation)
+  - [Version](#version)
+  - [VM](#vm)
 - [Revision History](#revision-history)
 
 ## RPCs, Requests, and Responses
@@ -673,6 +671,18 @@
 
 See [Success](#success).
 
+### kill
+
+```
+Success kill(string isolateId)
+```
+
+The _kill_ RPC is used to kill an isolate as if by dart:isolate's `Isolate.kill(IMMEDIATE)`.
+
+The isolate is killed regardless of whether it is paused or running.
+
+See [Success](#success).
+
 ### reloadSources
 
 
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 576e903..fdd9ee4 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -150,8 +150,10 @@
   V(CompleterSyncConstructor, "Completer.sync")                                \
   V(_AsyncAwaitCompleter, "_AsyncAwaitCompleter")                              \
   V(_AsyncAwaitCompleterConstructor, "_AsyncAwaitCompleter.")                  \
+  V(_AsyncAwaitCompleterStart, "_AsyncAwaitCompleter.start")                   \
   V(_AsyncAwaitStart, "start")                                                 \
   V(CompleterFuture, "future")                                                 \
+  V(CompleterGetFuture, "get:future")                                          \
   V(StreamIterator, "StreamIterator")                                          \
   V(StreamIteratorConstructor, "StreamIterator.")                              \
   V(Native, "native")                                                          \
@@ -171,6 +173,7 @@
   V(PatchClass, "PatchClass")                                                  \
   V(Function, "Function")                                                      \
   V(_Closure, "_Closure")                                                      \
+  V(_ClosureCall, "_Closure.call")                                             \
   V(FunctionResult, "function result")                                         \
   V(FactoryResult, "factory result")                                           \
   V(ClosureData, "ClosureData")                                                \
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index 08becf9..bbf3561 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -232,7 +232,8 @@
                                          const char* source,
                                          const uint8_t** kernel_buffer,
                                          intptr_t* kernel_buffer_size,
-                                         bool incrementally) {
+                                         bool incrementally,
+                                         bool allow_compile_errors) {
   // clang-format off
   Dart_SourceFile sourcefiles[] = {
     {
@@ -244,7 +245,7 @@
   // clang-format on
   return CompileTestScriptWithDFE(
       url, sizeof(sourcefiles) / sizeof(Dart_SourceFile), sourcefiles,
-      kernel_buffer, kernel_buffer_size, incrementally);
+      kernel_buffer, kernel_buffer_size, incrementally, allow_compile_errors);
 }
 
 #if 0
@@ -253,7 +254,8 @@
                                          int sourcefiles_count,
                                          Dart_SourceFile sourcefiles[],
                                          void** kernel_pgm,
-                                         bool incrementally) {
+                                         bool incrementally,
+                                         bool allow_compile_errors) {
   Zone* zone = Thread::Current()->zone();
   Dart_KernelCompilationResult compilation_result = Dart_CompileSourcesToKernel(
       url, FLAG_strong ? platform_strong_dill : platform_dill,
@@ -265,13 +267,16 @@
 char* TestCase::ValidateCompilationResult(
     Zone* zone,
     Dart_KernelCompilationResult compilation_result,
-    void** kernel_pgm) {
-  if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
+    void** kernel_pgm,
+    bool allow_compile_errors) {
+  if (!allow_compile_errors &&
+      (compilation_result.status != Dart_KernelCompilationStatus_Ok)) {
     char* result =
         OS::SCreate(zone, "Compilation failed %s", compilation_result.error);
     free(compilation_result.error);
     return result;
   }
+
   const uint8_t* kernel_file = compilation_result.kernel;
   intptr_t kernel_length = compilation_result.kernel_size;
   if (kernel_file == NULL) {
@@ -282,6 +287,12 @@
   if (*kernel_pgm == NULL) {
     return OS::SCreate(zone, "Failed to read generated kernel binary");
   }
+  if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
+    char* result =
+        OS::SCreate(zone, "Compilation failed %s", compilation_result.error);
+    free(compilation_result.error);
+    return result;
+  }
   return NULL;
 }
 #endif
@@ -291,22 +302,25 @@
                                          Dart_SourceFile sourcefiles[],
                                          const uint8_t** kernel_buffer,
                                          intptr_t* kernel_buffer_size,
-                                         bool incrementally) {
+                                         bool incrementally,
+                                         bool allow_compile_errors) {
   Zone* zone = Thread::Current()->zone();
   Dart_KernelCompilationResult compilation_result = Dart_CompileSourcesToKernel(
       url, FLAG_strong ? platform_strong_dill : platform_dill,
       FLAG_strong ? platform_strong_dill_size : platform_dill_size,
       sourcefiles_count, sourcefiles, incrementally, NULL);
   return ValidateCompilationResult(zone, compilation_result, kernel_buffer,
-                                   kernel_buffer_size);
+                                   kernel_buffer_size, allow_compile_errors);
 }
 
 char* TestCase::ValidateCompilationResult(
     Zone* zone,
     Dart_KernelCompilationResult compilation_result,
     const uint8_t** kernel_buffer,
-    intptr_t* kernel_buffer_size) {
-  if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
+    intptr_t* kernel_buffer_size,
+    bool allow_compile_errors) {
+  if (!allow_compile_errors &&
+      (compilation_result.status != Dart_KernelCompilationStatus_Ok)) {
     char* result =
         OS::SCreate(zone, "Compilation failed %s", compilation_result.error);
     free(compilation_result.error);
@@ -459,10 +473,19 @@
   return num_test_libs + 1;
 }
 
+Dart_Handle TestCase::LoadTestScriptWithErrors(
+    const char* script,
+    Dart_NativeEntryResolver resolver,
+    const char* lib_url,
+    bool finalize_classes) {
+  return LoadTestScript(script, resolver, lib_url, finalize_classes, true);
+}
+
 Dart_Handle TestCase::LoadTestScript(const char* script,
                                      Dart_NativeEntryResolver resolver,
                                      const char* lib_url,
-                                     bool finalize_classes) {
+                                     bool finalize_classes,
+                                     bool allow_compile_errors) {
   if (FLAG_use_dart_frontend) {
 #ifndef PRODUCT
     if (strstr(script, IsolateReloadTestLibUri()) != NULL) {
@@ -472,8 +495,9 @@
 #endif  // ifndef PRODUCT
     Dart_SourceFile* sourcefiles = NULL;
     intptr_t num_sources = BuildSourceFilesArray(&sourcefiles, script);
-    Dart_Handle result = LoadTestScriptWithDFE(num_sources, sourcefiles,
-                                               resolver, finalize_classes);
+    Dart_Handle result =
+        LoadTestScriptWithDFE(num_sources, sourcefiles, resolver,
+                              finalize_classes, true, allow_compile_errors);
     delete[] sourcefiles;
     return result;
   } else {
@@ -495,7 +519,7 @@
     char* error = TestCase::CompileTestScriptWithDFE(
         sourcefiles[0].uri, sourcefiles_count, sourcefiles, &kernel_buffer,
         &kernel_buffer_size, true);
-    if (error != NULL) {
+    if ((kernel_buffer == NULL) && (error != NULL)) {
       return Dart_NewApiError(error);
     }
     Dart_Handle lib =
@@ -521,7 +545,8 @@
                                             Dart_SourceFile sourcefiles[],
                                             Dart_NativeEntryResolver resolver,
                                             bool finalize,
-                                            bool incrementally) {
+                                            bool incrementally,
+                                            bool allow_compile_errors) {
   // First script is the main script.
   Dart_Handle result = Dart_SetLibraryTagHandler(LibraryTagHandler);
   EXPECT_VALID(result);
@@ -529,8 +554,8 @@
   intptr_t kernel_buffer_size = 0;
   char* error = TestCase::CompileTestScriptWithDFE(
       sourcefiles[0].uri, sourcefiles_count, sourcefiles, &kernel_buffer,
-      &kernel_buffer_size, incrementally);
-  if (error != NULL) {
+      &kernel_buffer_size, incrementally, allow_compile_errors);
+  if ((kernel_buffer == NULL) && error != NULL) {
     return Dart_NewApiError(error);
   }
 
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index edb8b8e..d3f2870 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -318,17 +318,25 @@
                                         const char* source,
                                         const uint8_t** kernel_buffer,
                                         intptr_t* kernel_buffer_size,
-                                        bool incrementally = true);
+                                        bool incrementally = true,
+                                        bool allow_compile_errors = false);
   static char* CompileTestScriptWithDFE(const char* url,
                                         int sourcefiles_count,
                                         Dart_SourceFile sourcefiles[],
                                         const uint8_t** kernel_buffer,
                                         intptr_t* kernel_buffer_size,
-                                        bool incrementally = true);
+                                        bool incrementally = true,
+                                        bool allow_compile_errors = false);
   static Dart_Handle LoadTestScript(const char* script,
                                     Dart_NativeEntryResolver resolver,
                                     const char* lib_uri = USER_TEST_URI,
-                                    bool finalize = true);
+                                    bool finalize = true,
+                                    bool allow_compile_errors = false);
+  static Dart_Handle LoadTestScriptWithErrors(
+      const char* script,
+      Dart_NativeEntryResolver resolver = NULL,
+      const char* lib_uri = USER_TEST_URI,
+      bool finalize = true);
   static Dart_Handle LoadTestLibrary(const char* lib_uri,
                                      const char* script,
                                      Dart_NativeEntryResolver resolver = NULL);
@@ -337,7 +345,8 @@
       Dart_SourceFile sourcefiles[],
       Dart_NativeEntryResolver resolver = NULL,
       bool finalize = true,
-      bool incrementally = true);
+      bool incrementally = true,
+      bool allow_compile_errors = false);
   static Dart_Handle LoadCoreTestScript(const char* script,
                                         Dart_NativeEntryResolver resolver);
 
@@ -385,7 +394,8 @@
   static char* ValidateCompilationResult(Zone* zone,
                                          Dart_KernelCompilationResult result,
                                          const uint8_t** kernel_buffer,
-                                         intptr_t* kernel_buffer_size);
+                                         intptr_t* kernel_buffer_size,
+                                         bool allow_compile_errors);
 
   RunEntry* const run_;
 };
diff --git a/sdk/bin/dartanalyzer b/sdk/bin/dartanalyzer
index bad9306..49f4bcc 100755
--- a/sdk/bin/dartanalyzer
+++ b/sdk/bin/dartanalyzer
@@ -31,7 +31,7 @@
 
 case $0 in
   *_developer)
-    EXTRA_VM_OPTIONS+=('--checked')
+    EXTRA_VM_OPTIONS+=('--enable-asserts')
     ;;
 esac
 
@@ -47,4 +47,4 @@
 
 DEV_OPTIONS="--use-analysis-driver-memory-byte-store"
 
-exec "$DART" "--packages=$DART_ROOT/.packages" "${EXTRA_VM_OPTIONS[@]}" "$ANALYZER" "$DEV_OPTIONS" "$SDK_ARG" "$@"
+exec "$DART" "--preview-dart-2" "--packages=$DART_ROOT/.packages" "${EXTRA_VM_OPTIONS[@]}" "$ANALYZER" "$DEV_OPTIONS" "$SDK_ARG" "$@"
diff --git a/sdk/bin/dartanalyzer.bat b/sdk/bin/dartanalyzer.bat
index 464aaee..b4a1de2 100644
--- a/sdk/bin/dartanalyzer.bat
+++ b/sdk/bin/dartanalyzer.bat
@@ -24,7 +24,7 @@
 set EXTRA_VM_OPTIONS=
 
 if _%DARTANALYZER_DEVELOPER_MODE%_ == _1_ (
-  set EXTRA_VM_OPTIONS=%EXTRA_VM_OPTIONS% --checked
+  set EXTRA_VM_OPTIONS=%EXTRA_VM_OPTIONS% --enable_asserts
 )
 
 rem We allow extra vm options to be passed in through an environment variable.
@@ -40,7 +40,7 @@
 
 set ANALYZER=%DART_ROOT%\pkg\analyzer_cli\bin\analyzer.dart
 
-"%DART%" "--packages=%DART_ROOT%\.packages" %EXTRA_VM_OPTIONS% "%ANALYZER%" "%SDK_ARG%" %*
+"%DART%" "--preview-dart-2" "--packages=%DART_ROOT%\.packages" %EXTRA_VM_OPTIONS% "%ANALYZER%" "%SDK_ARG%" %*
 
 endlocal
 
diff --git a/sdk/bin/dartanalyzer_sdk b/sdk/bin/dartanalyzer_sdk
index 28f37ab..90d09de 100755
--- a/sdk/bin/dartanalyzer_sdk
+++ b/sdk/bin/dartanalyzer_sdk
@@ -28,4 +28,4 @@
 
 # We are running the snapshot in the built SDK.
 DART="$BIN_DIR/dart"
-exec "$DART" "$SNAPSHOT" "$SDK_ARG" "$@"
+exec "$DART" "--preview-dart-2" "$SNAPSHOT" "$SDK_ARG" "$@"
diff --git a/sdk/bin/dartanalyzer_sdk.bat b/sdk/bin/dartanalyzer_sdk.bat
index ab66885..82125f0 100644
--- a/sdk/bin/dartanalyzer_sdk.bat
+++ b/sdk/bin/dartanalyzer_sdk.bat
@@ -22,7 +22,7 @@
 
 set SDK_ARG=--dart-sdk=%SDK_DIR%
 
-"%DART%" "%SNAPSHOT%" "%SDK_ARG%" %*
+"%DART%" "--preview-dart-2" "%SNAPSHOT%" "%SDK_ARG%" %*
 
 endlocal
 
diff --git a/sdk/lib/_internal/js_runtime/lib/js_rti.dart b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
index 44df4af..d6be639 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
@@ -829,6 +829,20 @@
 bool checkSubtypeOfRuntimeType(o, t) {
   if (o == null) return isSupertypeOfNull(t);
   if (isTopType(t)) return true;
+  if (JS_GET_FLAG('STRONG_MODE') &&
+      JS('bool', 'typeof # == "object"', t) &&
+      isDartFutureOrType(t)) {
+    // `o is FutureOr<T>` is equivalent to
+    //
+    //     o is T || o is Future<T>
+    //
+    // T might be a function type, requiring extracting the closure's signature,
+    // so do the `o is T` check here and let the `Future` interface type test
+    // fall through to the `isSubtype` check at the end of this function.
+    var tTypeArgument = getFutureOrArgument(t);
+    if (checkSubtypeOfRuntimeType(o, tTypeArgument)) return true;
+  }
+
   // Get the runtime type information from the object here, because we may
   // overwrite o with the interceptor below.
   var rti = getRuntimeTypeInfo(o);
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 1f622c4..c440394 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -101,6 +101,46 @@
 HtmlDocument get document =>
     JS('returns:HtmlDocument;depends:none;effects:none;gvn:true', 'document');
 
+// Supoort to convert JS Promise to a Dart Future.
+Future<T> promiseToFuture<T>(thePromise) {
+  var completer = new Completer<T>();
+
+  var thenSuccessCode = (promiseValue) => completer.complete(promiseValue);
+  var thenErrorCode = (promiseError) => completer.completeError(promiseError);
+
+  JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1),
+      convertDartClosureToJS(thenErrorCode, 1));
+
+  return completer.future;
+}
+
+// Supoort to convert JS Promise to a Dart Future that returns a MapLike (Class with Map mixin).
+Future promiseToFutureMap(thePromise) {
+  var completer = new Completer();
+
+  var thenSuccessCode = (promiseValue) => completer.complete(promiseValue);
+  var thenErrorCode = (promiseError) => completer.completeError(promiseError);
+
+  JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1),
+      convertDartClosureToJS(thenErrorCode, 1));
+
+  return completer.future;
+}
+
+// Supoort to convert JS Promise to a Dart Future that returns a Dictionary as a Dart Map.
+Future<Map> promiseToFutureDictionary(thePromise) {
+  var completer = new Completer<Map>();
+
+  var thenSuccessCode = (promiseValue) =>
+      completer.complete(convertNativeToDart_Dictionary(promiseValue));
+  var thenErrorCode = (promiseError) => completer.completeError(promiseError);
+
+  JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1),
+      convertDartClosureToJS(thenErrorCode, 1));
+
+  return completer.future;
+}
+
 // Workaround for tags like <cite> that lack their own Element subclass --
 // Dart issue 1990.
 @Native("HTMLElement")
@@ -129,7 +169,6 @@
 @Experimental() // untriaged
 typedef void FontFaceSetForEachCallback(
     FontFace fontFace, FontFace fontFaceAgain, FontFaceSet set);
-
 // 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.
@@ -1810,12 +1849,15 @@
   @DomName('BackgroundFetchManager.get')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get(String id) native;
+  Future<BackgroundFetchRegistration> get(String id) =>
+      promiseToFuture<BackgroundFetchRegistration>(
+          JS("", "#.get(#)", this, id));
 
   @DomName('BackgroundFetchManager.getIds')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getIds() native;
+  Future<List<String>> getIds() =>
+      promiseToFuture<List<String>>(JS("", "#.getIds()", this));
 }
 // 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
@@ -1869,7 +1911,7 @@
   @DomName('BackgroundFetchRegistration.abort')
   @DocsEditable()
   @Experimental() // untriaged
-  Future abort() native;
+  Future<bool> abort() => promiseToFuture<bool>(JS("", "#.abort()", this));
 }
 // 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
@@ -1932,7 +1974,8 @@
   @DomName('BackgroundFetchedEvent.updateUI')
   @DocsEditable()
   @Experimental() // untriaged
-  Future updateUI(String title) native;
+  Future updateUI(String title) =>
+      promiseToFuture(JS("", "#.updateUI(#)", this, title));
 }
 // 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
@@ -1978,7 +2021,9 @@
   @DomName('BarcodeDetector.detect')
   @DocsEditable()
   @Experimental() // untriaged
-  Future detect(/*ImageBitmapSource*/ image) native;
+  Future<List<DetectedBarcode>> detect(/*ImageBitmapSource*/ image) =>
+      promiseToFuture<List<DetectedBarcode>>(
+          JS("", "#.detect(#)", this, image));
 }
 // 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
@@ -2090,7 +2135,7 @@
   @DomName('BeforeInstallPromptEvent.prompt')
   @DocsEditable()
   @Experimental() // untriaged
-  Future prompt() native;
+  Future prompt() => promiseToFuture(JS("", "#.prompt()", this));
 }
 // 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
@@ -2231,12 +2276,13 @@
   @DomName('BluetoothRemoteGATTDescriptor.readValue')
   @DocsEditable()
   @Experimental() // untriaged
-  Future readValue() native;
+  Future readValue() => promiseToFuture(JS("", "#.readValue()", this));
 
   @DomName('BluetoothRemoteGATTDescriptor.writeValue')
   @DocsEditable()
   @Experimental() // untriaged
-  Future writeValue(/*BufferSource*/ value) native;
+  Future writeValue(/*BufferSource*/ value) =>
+      promiseToFuture(JS("", "#.writeValue(#)", this, value));
 }
 // 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
@@ -2260,27 +2306,28 @@
   @DomName('Body.arrayBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  Future arrayBuffer() native;
+  Future arrayBuffer() => promiseToFuture(JS("", "#.arrayBuffer()", this));
 
   @DomName('Body.blob')
   @DocsEditable()
   @Experimental() // untriaged
-  Future blob() native;
+  Future<Blob> blob() => promiseToFuture<Blob>(JS("", "#.blob()", this));
 
   @DomName('Body.formData')
   @DocsEditable()
   @Experimental() // untriaged
-  Future formData() native;
+  Future<FormData> formData() =>
+      promiseToFuture<FormData>(JS("", "#.formData()", this));
 
   @DomName('Body.json')
   @DocsEditable()
   @Experimental() // untriaged
-  Future json() native;
+  Future json() => promiseToFuture(JS("", "#.json()", this));
 
   @DomName('Body.text')
   @DocsEditable()
   @Experimental() // untriaged
-  Future text() native;
+  Future<String> text() => promiseToFuture<String>(JS("", "#.text()", this));
 }
 // 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
@@ -2719,17 +2766,19 @@
   @DomName('CacheStorage.delete')
   @DocsEditable()
   @Experimental() // untriaged
-  Future delete(String cacheName) native;
+  Future delete(String cacheName) =>
+      promiseToFuture(JS("", "#.delete(#)", this, cacheName));
 
   @DomName('CacheStorage.has')
   @DocsEditable()
   @Experimental() // untriaged
-  Future has(String cacheName) native;
+  Future has(String cacheName) =>
+      promiseToFuture(JS("", "#.has(#)", this, cacheName));
 
   @DomName('CacheStorage.keys')
   @DocsEditable()
   @Experimental() // untriaged
-  Future keys() native;
+  Future keys() => promiseToFuture(JS("", "#.keys()", this));
 
   @DomName('CacheStorage.match')
   @DocsEditable()
@@ -2756,7 +2805,8 @@
   @DomName('CacheStorage.open')
   @DocsEditable()
   @Experimental() // untriaged
-  Future open(String cacheName) native;
+  Future open(String cacheName) =>
+      promiseToFuture(JS("", "#.open(#)", this, cacheName));
 }
 // 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
@@ -4031,12 +4081,12 @@
   @DomName('Clients.claim')
   @DocsEditable()
   @Experimental() // untriaged
-  Future claim() native;
+  Future claim() => promiseToFuture(JS("", "#.claim()", this));
 
   @DomName('Clients.get')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get(String id) native;
+  Future get(String id) => promiseToFuture(JS("", "#.get(#)", this, id));
 
   @DomName('Clients.matchAll')
   @DocsEditable()
@@ -4063,7 +4113,8 @@
   @DomName('Clients.openWindow')
   @DocsEditable()
   @Experimental() // untriaged
-  Future openWindow(String url) native;
+  Future<WindowClient> openWindow(String url) =>
+      promiseToFuture<WindowClient>(JS("", "#.openWindow(#)", this, url));
 }
 // 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
@@ -4457,17 +4508,20 @@
   @DomName('CredentialsContainer.preventSilentAccess')
   @DocsEditable()
   @Experimental() // untriaged
-  Future preventSilentAccess() native;
+  Future preventSilentAccess() =>
+      promiseToFuture(JS("", "#.preventSilentAccess()", this));
 
   @DomName('CredentialsContainer.requireUserMediation')
   @DocsEditable()
   @Experimental() // untriaged
-  Future requireUserMediation() native;
+  Future requireUserMediation() =>
+      promiseToFuture(JS("", "#.requireUserMediation()", this));
 
   @DomName('CredentialsContainer.store')
   @DocsEditable()
   @Experimental() // untriaged
-  Future store(Credential credential) native;
+  Future store(Credential credential) =>
+      promiseToFuture(JS("", "#.store(#)", this, credential));
 }
 // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -10270,7 +10324,8 @@
   @DomName('CustomElementRegistry.whenDefined')
   @DocsEditable()
   @Experimental() // untriaged
-  Future whenDefined(String name) native;
+  Future whenDefined(String name) =>
+      promiseToFuture(JS("", "#.whenDefined(#)", this, name));
 }
 // 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
@@ -19259,7 +19314,8 @@
   @DomName('FaceDetector.detect')
   @DocsEditable()
   @Experimental() // untriaged
-  Future detect(/*ImageBitmapSource*/ image) native;
+  Future<List<DetectedFace>> detect(/*ImageBitmapSource*/ image) =>
+      promiseToFuture<List<DetectedFace>>(JS("", "#.detect(#)", this, image));
 }
 // 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
@@ -20099,7 +20155,8 @@
   @DomName('FontFace.load')
   @DocsEditable()
   @Experimental() // untriaged
-  Future load() native;
+  Future<FontFace> load() =>
+      promiseToFuture<FontFace>(JS("", "#.load()", this));
 }
 // 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
@@ -23312,17 +23369,21 @@
   @DomName('ImageCapture.getPhotoCapabilities')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getPhotoCapabilities() native;
+  Future<PhotoCapabilities> getPhotoCapabilities() =>
+      promiseToFuture<PhotoCapabilities>(
+          JS("", "#.getPhotoCapabilities()", this));
 
   @DomName('ImageCapture.getPhotoSettings')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getPhotoSettings() native;
+  Future<Map> getPhotoSettings() =>
+      promiseToFutureDictionary(JS("", "#.getPhotoSettings()", this));
 
   @DomName('ImageCapture.grabFrame')
   @DocsEditable()
   @Experimental() // untriaged
-  Future grabFrame() native;
+  Future<ImageBitmap> grabFrame() =>
+      promiseToFuture<ImageBitmap>(JS("", "#.grabFrame()", this));
 
   @DomName('ImageCapture.setOptions')
   @DocsEditable()
@@ -23504,7 +23565,7 @@
   @DomName('HTMLImageElement.decode')
   @DocsEditable()
   @Experimental() // untriaged
-  Future decode() native;
+  Future decode() => promiseToFuture(JS("", "#.decode()", this));
 }
 // 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
@@ -25360,7 +25421,9 @@
   @DomName('MediaDevices.enumerateDevices')
   @DocsEditable()
   @Experimental() // untriaged
-  Future enumerateDevices() native;
+  Future<List<MediaDeviceInfo>> enumerateDevices() =>
+      promiseToFuture<List<MediaDeviceInfo>>(
+          JS("", "#.enumerateDevices()", this));
 
   @DomName('MediaDevices.getSupportedConstraints')
   @DocsEditable()
@@ -25615,17 +25678,19 @@
 
   @DomName('HTMLMediaElement.play')
   @DocsEditable()
-  Future play() native;
+  Future play() => promiseToFuture(JS("", "#.play()", this));
 
   @DomName('HTMLMediaElement.setMediaKeys')
   @DocsEditable()
   @Experimental() // untriaged
-  Future setMediaKeys(MediaKeys mediaKeys) native;
+  Future setMediaKeys(MediaKeys mediaKeys) =>
+      promiseToFuture(JS("", "#.setMediaKeys(#)", this, mediaKeys));
 
   @DomName('HTMLMediaElement.setSinkId')
   @DocsEditable()
   @Experimental() // untriaged
-  Future setSinkId(String sinkId) native;
+  Future setSinkId(String sinkId) =>
+      promiseToFuture(JS("", "#.setSinkId(#)", this, sinkId));
 }
 // 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
@@ -25785,22 +25850,25 @@
 
   @DomName('MediaKeySession.close')
   @DocsEditable()
-  Future close() native;
+  Future close() => promiseToFuture(JS("", "#.close()", this));
 
   @DomName('MediaKeySession.generateRequest')
   @DocsEditable()
   @Experimental() // untriaged
-  Future generateRequest(String initDataType, /*BufferSource*/ initData) native;
+  Future generateRequest(String initDataType, /*BufferSource*/ initData) =>
+      promiseToFuture(
+          JS("", "#.generateRequest(#, #)", this, initDataType, initData));
 
   @DomName('MediaKeySession.load')
   @DocsEditable()
   @Experimental() // untriaged
-  Future load(String sessionId) native;
+  Future load(String sessionId) =>
+      promiseToFuture(JS("", "#.load(#)", this, sessionId));
 
   @DomName('MediaKeySession.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  Future remove() native;
+  Future remove() => promiseToFuture(JS("", "#.remove()", this));
 
   @JSName('update')
   @DomName('MediaKeySession.update')
@@ -25863,7 +25931,8 @@
   @DomName('MediaKeySystemAccess.createMediaKeys')
   @DocsEditable()
   @Experimental() // untriaged
-  Future createMediaKeys() native;
+  Future createMediaKeys() =>
+      promiseToFuture(JS("", "#.createMediaKeys()", this));
 
   @DomName('MediaKeySystemAccess.getConfiguration')
   @DocsEditable()
@@ -25901,12 +25970,15 @@
   @DomName('MediaKeys.getStatusForPolicy')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getStatusForPolicy(MediaKeysPolicy policy) native;
+  Future getStatusForPolicy(MediaKeysPolicy policy) =>
+      promiseToFuture(JS("", "#.getStatusForPolicy(#)", this, policy));
 
   @DomName('MediaKeys.setServerCertificate')
   @DocsEditable()
   @Experimental() // untriaged
-  Future setServerCertificate(/*BufferSource*/ serverCertificate) native;
+  Future setServerCertificate(/*BufferSource*/ serverCertificate) =>
+      promiseToFuture(
+          JS("", "#.setServerCertificate(#)", this, serverCertificate));
 }
 // 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
@@ -27241,11 +27313,68 @@
 @DomName('MIDIInputMap')
 @Experimental() // untriaged
 @Native("MIDIInputMap")
-class MidiInputMap extends Interceptor {
+class MidiInputMap extends Interceptor with MapMixin<String, dynamic> {
   // To suppress missing implicit constructor warnings.
   factory MidiInputMap._() {
     throw new UnsupportedError("Not supported");
   }
+
+  Map _getItem(String key) =>
+      convertNativeToDart_Dictionary(JS('', '#.get(#)', this, key));
+
+  void addAll(Map<String, dynamic> other) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  bool containsValue(dynamic value) => values.any((e) => e == value);
+
+  bool containsKey(dynamic key) => _getItem(key) != null;
+
+  Map operator [](dynamic key) => _getItem(key);
+
+  void forEach(void f(String key, dynamic value)) {
+    var entries = JS('', '#.entries()', this);
+    while (true) {
+      var entry = JS('', '#.next()', entries);
+      if (JS('bool', '#.done', entry)) return;
+      f(JS('String', '#.value[0]', entry),
+          convertNativeToDart_Dictionary(JS('', '#.value[1]', entry)));
+    }
+  }
+
+  Iterable<String> get keys {
+    final keys = <String>[];
+    forEach((k, v) => keys.add(k));
+    return keys;
+  }
+
+  Iterable<Map> get values {
+    final values = <Map>[];
+    forEach((k, v) => values.add(v));
+    return values;
+  }
+
+  int get length => JS('int', '#.size', this);
+
+  bool get isEmpty => length == 0;
+
+  bool get isNotEmpty => !isEmpty;
+
+  void operator []=(String key, dynamic value) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  dynamic putIfAbsent(String key, dynamic ifAbsent()) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  String remove(dynamic key) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  void clear() {
+    throw new UnsupportedError("Not supported");
+  }
 }
 // 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
@@ -27307,11 +27436,68 @@
 @DomName('MIDIOutputMap')
 @Experimental() // untriaged
 @Native("MIDIOutputMap")
-class MidiOutputMap extends Interceptor {
+class MidiOutputMap extends Interceptor with MapMixin<String, dynamic> {
   // To suppress missing implicit constructor warnings.
   factory MidiOutputMap._() {
     throw new UnsupportedError("Not supported");
   }
+
+  Map _getItem(String key) =>
+      convertNativeToDart_Dictionary(JS('', '#.get(#)', this, key));
+
+  void addAll(Map<String, dynamic> other) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  bool containsValue(dynamic value) => values.any((e) => e == value);
+
+  bool containsKey(dynamic key) => _getItem(key) != null;
+
+  Map operator [](dynamic key) => _getItem(key);
+
+  void forEach(void f(String key, dynamic value)) {
+    var entries = JS('', '#.entries()', this);
+    while (true) {
+      var entry = JS('', '#.next()', entries);
+      if (JS('bool', '#.done', entry)) return;
+      f(JS('String', '#.value[0]', entry),
+          convertNativeToDart_Dictionary(JS('', '#.value[1]', entry)));
+    }
+  }
+
+  Iterable<String> get keys {
+    final keys = <String>[];
+    forEach((k, v) => keys.add(k));
+    return keys;
+  }
+
+  Iterable<Map> get values {
+    final values = <Map>[];
+    forEach((k, v) => values.add(v));
+    return values;
+  }
+
+  int get length => JS('int', '#.size', this);
+
+  bool get isEmpty => length == 0;
+
+  bool get isNotEmpty => !isEmpty;
+
+  void operator []=(String key, dynamic value) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  dynamic putIfAbsent(String key, dynamic ifAbsent()) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  String remove(dynamic key) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  void clear() {
+    throw new UnsupportedError("Not supported");
+  }
 }
 // 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
@@ -27361,12 +27547,12 @@
   @DomName('MIDIPort.close')
   @DocsEditable()
   @Experimental() // untriaged
-  Future close() native;
+  Future close() => promiseToFuture(JS("", "#.close()", this));
 
   @DomName('MIDIPort.open')
   @DocsEditable()
   @Experimental() // untriaged
-  Future open() native;
+  Future open() => promiseToFuture(JS("", "#.open()", this));
 }
 // 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
@@ -28057,17 +28243,18 @@
   @DomName('NavigationPreloadManager.disable')
   @DocsEditable()
   @Experimental() // untriaged
-  Future disable() native;
+  Future disable() => promiseToFuture(JS("", "#.disable()", this));
 
   @DomName('NavigationPreloadManager.enable')
   @DocsEditable()
   @Experimental() // untriaged
-  Future enable() native;
+  Future enable() => promiseToFuture(JS("", "#.enable()", this));
 
   @DomName('NavigationPreloadManager.getState')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getState() native;
+  Future<Map> getState() =>
+      promiseToFutureDictionary(JS("", "#.getState()", this));
 }
 // 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
@@ -28307,7 +28494,7 @@
   @DomName('Navigator.getBattery')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getBattery() native;
+  Future getBattery() => promiseToFuture(JS("", "#.getBattery()", this));
 
   @JSName('getGamepads')
   @DomName('Navigator.getGamepads')
@@ -28320,12 +28507,14 @@
   @DomName('Navigator.getInstalledRelatedApps')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getInstalledRelatedApps() native;
+  Future<RelatedApplication> getInstalledRelatedApps() =>
+      promiseToFuture<RelatedApplication>(
+          JS("", "#.getInstalledRelatedApps()", this));
 
   @DomName('Navigator.getVRDisplays')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getVRDisplays() native;
+  Future getVRDisplays() => promiseToFuture(JS("", "#.getVRDisplays()", this));
 
   @DomName('Navigator.registerProtocolHandler')
   @DocsEditable()
@@ -28380,7 +28569,9 @@
   @DocsEditable()
   @Experimental() // untriaged
   Future requestMediaKeySystemAccess(
-      String keySystem, List<Map> supportedConfigurations) native;
+          String keySystem, List<Map> supportedConfigurations) =>
+      promiseToFuture(JS("", "#.requestMediaKeySystemAccess(#, #)", this,
+          keySystem, supportedConfigurations));
 
   @DomName('Navigator.sendBeacon')
   @DocsEditable()
@@ -30139,7 +30330,7 @@
   @DomName('OffscreenCanvasRenderingContext2D.commit')
   @DocsEditable()
   @Experimental() // untriaged
-  Future commit() native;
+  Future commit() => promiseToFuture(JS("", "#.commit()", this));
 
   @DomName('OffscreenCanvasRenderingContext2D.createImageData')
   @DocsEditable()
@@ -31380,27 +31571,31 @@
   @DomName('PaymentInstruments.clear')
   @DocsEditable()
   @Experimental() // untriaged
-  Future clear() native;
+  Future clear() => promiseToFuture(JS("", "#.clear()", this));
 
   @DomName('PaymentInstruments.delete')
   @DocsEditable()
   @Experimental() // untriaged
-  Future delete(String instrumentKey) native;
+  Future<bool> delete(String instrumentKey) =>
+      promiseToFuture<bool>(JS("", "#.delete(#)", this, instrumentKey));
 
   @DomName('PaymentInstruments.get')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get(String instrumentKey) native;
+  Future<Map> get(String instrumentKey) =>
+      promiseToFutureDictionary(JS("", "#.get(#)", this, instrumentKey));
 
   @DomName('PaymentInstruments.has')
   @DocsEditable()
   @Experimental() // untriaged
-  Future has(String instrumentKey) native;
+  Future has(String instrumentKey) =>
+      promiseToFuture(JS("", "#.has(#)", this, instrumentKey));
 
   @DomName('PaymentInstruments.keys')
   @DocsEditable()
   @Experimental() // untriaged
-  Future keys() native;
+  Future<List<String>> keys() =>
+      promiseToFuture<List<String>>(JS("", "#.keys()", this));
 
   @DomName('PaymentInstruments.set')
   @DocsEditable()
@@ -31500,17 +31695,19 @@
   @DomName('PaymentRequest.abort')
   @DocsEditable()
   @Experimental() // untriaged
-  Future abort() native;
+  Future abort() => promiseToFuture(JS("", "#.abort()", this));
 
   @DomName('PaymentRequest.canMakePayment')
   @DocsEditable()
   @Experimental() // untriaged
-  Future canMakePayment() native;
+  Future<bool> canMakePayment() =>
+      promiseToFuture<bool>(JS("", "#.canMakePayment()", this));
 
   @DomName('PaymentRequest.show')
   @DocsEditable()
   @Experimental() // untriaged
-  Future show() native;
+  Future<PaymentResponse> show() =>
+      promiseToFuture<PaymentResponse>(JS("", "#.show()", this));
 }
 
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31577,7 +31774,8 @@
   @DomName('PaymentRequestEvent.openWindow')
   @DocsEditable()
   @Experimental() // untriaged
-  Future openWindow(String url) native;
+  Future<WindowClient> openWindow(String url) =>
+      promiseToFuture<WindowClient>(JS("", "#.openWindow(#)", this, url));
 
   @DomName('PaymentRequestEvent.respondWith')
   @DocsEditable()
@@ -31677,7 +31875,8 @@
   @DomName('PaymentResponse.complete')
   @DocsEditable()
   @Experimental() // untriaged
-  Future complete([String paymentResult]) native;
+  Future complete([String paymentResult]) =>
+      promiseToFuture(JS("", "#.complete(#)", this, paymentResult));
 }
 // 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
@@ -32347,7 +32546,9 @@
   @DomName('Permissions.requestAll')
   @DocsEditable()
   @Experimental() // untriaged
-  Future requestAll(List<Map> permissions) native;
+  Future<PermissionStatus> requestAll(List<Map> permissions) =>
+      promiseToFuture<PermissionStatus>(
+          JS("", "#.requestAll(#)", this, permissions));
 
   @DomName('Permissions.revoke')
   @DocsEditable()
@@ -32984,17 +33185,22 @@
   @DomName('PresentationRequest.getAvailability')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getAvailability() native;
+  Future<PresentationAvailability> getAvailability() =>
+      promiseToFuture<PresentationAvailability>(
+          JS("", "#.getAvailability()", this));
 
   @DomName('PresentationRequest.reconnect')
   @DocsEditable()
   @Experimental() // untriaged
-  Future reconnect(String id) native;
+  Future<PresentationConnection> reconnect(String id) =>
+      promiseToFuture<PresentationConnection>(
+          JS("", "#.reconnect(#)", this, id));
 
   @DomName('PresentationRequest.start')
   @DocsEditable()
   @Experimental() // untriaged
-  Future start() native;
+  Future<PresentationConnection> start() =>
+      promiseToFuture<PresentationConnection>(JS("", "#.start()", this));
 }
 // 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
@@ -33221,7 +33427,8 @@
   @DomName('PushManager.getSubscription')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getSubscription() native;
+  Future<PushSubscription> getSubscription() =>
+      promiseToFuture<PushSubscription>(JS("", "#.getSubscription()", this));
 
   @DomName('PushManager.permissionState')
   @DocsEditable()
@@ -33338,7 +33545,8 @@
   @DomName('PushSubscription.unsubscribe')
   @DocsEditable()
   @Experimental() // untriaged
-  Future unsubscribe() native;
+  Future<bool> unsubscribe() =>
+      promiseToFuture<bool>(JS("", "#.unsubscribe()", this));
 }
 // 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
@@ -33687,17 +33895,19 @@
   @DomName('RemotePlayback.cancelWatchAvailability')
   @DocsEditable()
   @Experimental() // untriaged
-  Future cancelWatchAvailability([int id]) native;
+  Future cancelWatchAvailability([int id]) =>
+      promiseToFuture(JS("", "#.cancelWatchAvailability(#)", this, id));
 
   @DomName('RemotePlayback.prompt')
   @DocsEditable()
   @Experimental() // untriaged
-  Future prompt() native;
+  Future prompt() => promiseToFuture(JS("", "#.prompt()", this));
 
   @DomName('RemotePlayback.watchAvailability')
   @DocsEditable()
   @Experimental() // untriaged
-  Future watchAvailability(RemotePlaybackAvailabilityCallback callback) native;
+  Future<int> watchAvailability(RemotePlaybackAvailabilityCallback callback) =>
+      promiseToFuture<int>(JS("", "#.watchAvailability(#)", this, callback));
 }
 // 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
@@ -34301,15 +34511,6 @@
     return completer.future;
   }
 
-  @DomName('RTCPeerConnection.getStats')
-  Future<RtcStatsResponse> getStats(MediaStreamTrack selector) {
-    var completer = new Completer<RtcStatsResponse>();
-    _getStats((value) {
-      completer.complete(value);
-    }, selector);
-    return completer.future;
-  }
-
   @DomName('RTCPeerConnection.generateCertificate')
   @DocsEditable()
   @Experimental() // untriaged
@@ -34422,8 +34623,10 @@
   @DomName('RTCPeerConnection.addIceCandidate')
   @DocsEditable()
   Future addIceCandidate(Object candidate,
-      [VoidCallback successCallback,
-      RtcPeerConnectionErrorCallback failureCallback]) native;
+          [VoidCallback successCallback,
+          RtcPeerConnectionErrorCallback failureCallback]) =>
+      promiseToFuture(JS("", "#.addIceCandidate(#, #, #)", this, candidate,
+          successCallback, failureCallback));
 
   @DomName('RTCPeerConnection.addStream')
   @DocsEditable()
@@ -34601,11 +34804,9 @@
   @Experimental() // untriaged
   List<RtcRtpSender> getSenders() native;
 
-  @JSName('getStats')
   @DomName('RTCPeerConnection.getStats')
   @DocsEditable()
-  Future _getStats(
-      [RtcStatsCallback successCallback, MediaStreamTrack selector]) native;
+  Future getStats() => promiseToFutureMap(JS("", "#.getStats()", this));
 
   @DomName('RTCPeerConnection.removeStream')
   @DocsEditable()
@@ -34876,11 +35077,68 @@
 // http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCStatsReport
 @Experimental()
 @Native("RTCStatsReport")
-class RtcStatsReport extends Interceptor {
+class RtcStatsReport extends Interceptor with MapMixin<String, dynamic> {
   // To suppress missing implicit constructor warnings.
   factory RtcStatsReport._() {
     throw new UnsupportedError("Not supported");
   }
+
+  Map _getItem(String key) =>
+      convertNativeToDart_Dictionary(JS('', '#.get(#)', this, key));
+
+  void addAll(Map<String, dynamic> other) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  bool containsValue(dynamic value) => values.any((e) => e == value);
+
+  bool containsKey(dynamic key) => _getItem(key) != null;
+
+  Map operator [](dynamic key) => _getItem(key);
+
+  void forEach(void f(String key, dynamic value)) {
+    var entries = JS('', '#.entries()', this);
+    while (true) {
+      var entry = JS('', '#.next()', entries);
+      if (JS('bool', '#.done', entry)) return;
+      f(JS('String', '#.value[0]', entry),
+          convertNativeToDart_Dictionary(JS('', '#.value[1]', entry)));
+    }
+  }
+
+  Iterable<String> get keys {
+    final keys = <String>[];
+    forEach((k, v) => keys.add(k));
+    return keys;
+  }
+
+  Iterable<Map> get values {
+    final values = <Map>[];
+    forEach((k, v) => values.add(v));
+    return values;
+  }
+
+  int get length => JS('int', '#.size', this);
+
+  bool get isEmpty => length == 0;
+
+  bool get isNotEmpty => !isEmpty;
+
+  void operator []=(String key, dynamic value) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  dynamic putIfAbsent(String key, dynamic ifAbsent()) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  String remove(dynamic key) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  void clear() {
+    throw new UnsupportedError("Not supported");
+  }
 }
 // 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
@@ -35043,7 +35301,8 @@
   @DomName('ScreenOrientation.lock')
   @DocsEditable()
   @Experimental() // untriaged
-  Future lock(String orientation) native;
+  Future lock(String orientation) =>
+      promiseToFuture(JS("", "#.lock(#)", this, orientation));
 
   @DomName('ScreenOrientation.unlock')
   @DocsEditable()
@@ -35771,12 +36030,16 @@
   @DomName('ServiceWorkerContainer.getRegistration')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getRegistration([String documentURL]) native;
+  Future<ServiceWorkerRegistration> getRegistration([String documentURL]) =>
+      promiseToFuture<ServiceWorkerRegistration>(
+          JS("", "#.getRegistration(#)", this, documentURL));
 
   @DomName('ServiceWorkerContainer.getRegistrations')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getRegistrations() native;
+  Future<List<ServiceWorkerRegistration>> getRegistrations() =>
+      promiseToFuture<List<ServiceWorkerRegistration>>(
+          JS("", "#.getRegistrations()", this));
 
   @DomName('ServiceWorkerContainer.register')
   @DocsEditable()
@@ -35862,7 +36125,7 @@
   @DomName('ServiceWorkerGlobalScope.skipWaiting')
   @DocsEditable()
   @Experimental() // untriaged
-  Future skipWaiting() native;
+  Future skipWaiting() => promiseToFuture(JS("", "#.skipWaiting()", this));
 
   @DomName('ServiceWorkerGlobalScope.onactivate')
   @DocsEditable()
@@ -35996,12 +36259,13 @@
   @DomName('ServiceWorkerRegistration.unregister')
   @DocsEditable()
   @Experimental() // untriaged
-  Future unregister() native;
+  Future<bool> unregister() =>
+      promiseToFuture<bool>(JS("", "#.unregister()", this));
 
   @DomName('ServiceWorkerRegistration.update')
   @DocsEditable()
   @Experimental() // untriaged
-  Future update() native;
+  Future update() => promiseToFuture(JS("", "#.update()", this));
 }
 // 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
@@ -37639,17 +37903,19 @@
   @DomName('StorageManager.estimate')
   @DocsEditable()
   @Experimental() // untriaged
-  Future estimate() native;
+  Future<Map> estimate() =>
+      promiseToFutureDictionary(JS("", "#.estimate()", this));
 
   @DomName('StorageManager.persist')
   @DocsEditable()
   @Experimental() // untriaged
-  Future persist() native;
+  Future<bool> persist() => promiseToFuture<bool>(JS("", "#.persist()", this));
 
   @DomName('StorageManager.persisted')
   @DocsEditable()
   @Experimental() // untriaged
-  Future persisted() native;
+  Future<bool> persisted() =>
+      promiseToFuture<bool>(JS("", "#.persisted()", this));
 }
 // 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
@@ -37892,12 +38158,14 @@
   @DomName('SyncManager.getTags')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getTags() native;
+  Future<List<String>> getTags() =>
+      promiseToFuture<List<String>>(JS("", "#.getTags()", this));
 
   @DomName('SyncManager.register')
   @DocsEditable()
   @Experimental() // untriaged
-  Future register(String tag) native;
+  Future register(String tag) =>
+      promiseToFuture(JS("", "#.register(#)", this, tag));
 }
 // 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
@@ -38591,7 +38859,8 @@
   @DomName('TextDetector.detect')
   @DocsEditable()
   @Experimental() // untriaged
-  Future detect(/*ImageBitmapSource*/ image) native;
+  Future<List<DetectedText>> detect(/*ImageBitmapSource*/ image) =>
+      promiseToFuture<List<DetectedText>>(JS("", "#.detect(#)", this, image));
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -39863,7 +40132,8 @@
   @DomName('UnderlyingSourceBase.cancel')
   @DocsEditable()
   @Experimental() // untriaged
-  Future cancel(Object reason) native;
+  Future cancel(Object reason) =>
+      promiseToFuture(JS("", "#.cancel(#)", this, reason));
 
   @DomName('UnderlyingSourceBase.notifyLockAcquired')
   @DocsEditable()
@@ -39878,12 +40148,13 @@
   @DomName('UnderlyingSourceBase.pull')
   @DocsEditable()
   @Experimental() // untriaged
-  Future pull() native;
+  Future pull() => promiseToFuture(JS("", "#.pull()", this));
 
   @DomName('UnderlyingSourceBase.start')
   @DocsEditable()
   @Experimental() // untriaged
-  Future start(Object stream) native;
+  Future start(Object stream) =>
+      promiseToFuture(JS("", "#.start(#)", this, stream));
 }
 // 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
@@ -40107,7 +40378,7 @@
   @DomName('VR.getDevices')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getDevices() native;
+  Future getDevices() => promiseToFuture(JS("", "#.getDevices()", this));
 }
 // 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
@@ -40281,7 +40552,7 @@
   @DomName('VRDisplay.exitPresent')
   @DocsEditable()
   @Experimental() // untriaged
-  Future exitPresent() native;
+  Future exitPresent() => promiseToFuture(JS("", "#.exitPresent()", this));
 
   @DomName('VRDisplay.getEyeParameters')
   @DocsEditable()
@@ -40306,7 +40577,8 @@
   @DomName('VRDisplay.requestPresent')
   @DocsEditable()
   @Experimental() // untriaged
-  Future requestPresent(List<Map> layers) native;
+  Future requestPresent(List<Map> layers) =>
+      promiseToFuture(JS("", "#.requestPresent(#)", this, layers));
 
   @DomName('VRDisplay.submitFrame')
   @DocsEditable()
@@ -40577,7 +40849,7 @@
   @DomName('VRSession.end')
   @DocsEditable()
   @Experimental() // untriaged
-  Future end() native;
+  Future end() => promiseToFuture(JS("", "#.end()", this));
 
   @DomName('VRSession.requestFrameOfReference')
   @DocsEditable()
@@ -43905,12 +44177,14 @@
   @DomName('WindowClient.focus')
   @DocsEditable()
   @Experimental() // untriaged
-  Future focus() native;
+  Future<WindowClient> focus() =>
+      promiseToFuture<WindowClient>(JS("", "#.focus()", this));
 
   @DomName('WindowClient.navigate')
   @DocsEditable()
   @Experimental() // untriaged
-  Future navigate(String url) native;
+  Future<WindowClient> navigate(String url) =>
+      promiseToFuture<WindowClient>(JS("", "#.navigate(#)", this, url));
 }
 // 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
@@ -44787,17 +45061,20 @@
   @DomName('BudgetService.getBudget')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getBudget() native;
+  Future<BudgetState> getBudget() =>
+      promiseToFuture<BudgetState>(JS("", "#.getBudget()", this));
 
   @DomName('BudgetService.getCost')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getCost(String operation) native;
+  Future<double> getCost(String operation) =>
+      promiseToFuture<double>(JS("", "#.getCost(#)", this, operation));
 
   @DomName('BudgetService.reserve')
   @DocsEditable()
   @Experimental() // untriaged
-  Future reserve(String operation) native;
+  Future<bool> reserve(String operation) =>
+      promiseToFuture<bool>(JS("", "#.reserve(#)", this, operation));
 }
 // 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
@@ -44842,22 +45119,26 @@
   @DomName('Clipboard.read')
   @DocsEditable()
   @Experimental() // untriaged
-  Future read() native;
+  Future<DataTransfer> read() =>
+      promiseToFuture<DataTransfer>(JS("", "#.read()", this));
 
   @DomName('Clipboard.readText')
   @DocsEditable()
   @Experimental() // untriaged
-  Future readText() native;
+  Future<String> readText() =>
+      promiseToFuture<String>(JS("", "#.readText()", this));
 
   @DomName('Clipboard.write')
   @DocsEditable()
   @Experimental() // untriaged
-  Future write(DataTransfer data) native;
+  Future write(DataTransfer data) =>
+      promiseToFuture(JS("", "#.write(#)", this, data));
 
   @DomName('Clipboard.writeText')
   @DocsEditable()
   @Experimental() // untriaged
-  Future writeText(String data) native;
+  Future writeText(String data) =>
+      promiseToFuture(JS("", "#.writeText(#)", this, data));
 }
 // 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
diff --git a/sdk/lib/internal/async_cast.dart b/sdk/lib/internal/async_cast.dart
index eb59a7d..eee09b9 100644
--- a/sdk/lib/internal/async_cast.dart
+++ b/sdk/lib/internal/async_cast.dart
@@ -32,7 +32,8 @@
   Future cancel() => _source.cancel();
 
   void onData(void handleData(T data)) {
-    _source.onData((S data) => handleData(data as T));
+    _source
+        .onData(handleData == null ? null : (S data) => handleData(data as T));
   }
 
   void onError(Function handleError) {
diff --git a/sdk/lib/svg/dart2js/svg_dart2js.dart b/sdk/lib/svg/dart2js/svg_dart2js.dart
index 16ba803..23c0a70 100644
--- a/sdk/lib/svg/dart2js/svg_dart2js.dart
+++ b/sdk/lib/svg/dart2js/svg_dart2js.dart
@@ -2683,7 +2683,7 @@
   @DomName('SVGImageElement.decode')
   @DocsEditable()
   @Experimental() // untriaged
-  Future decode() native;
+  Future decode() => promiseToFuture(JS("", "#.decode()", this));
 
   // From SVGURIReference
 
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index c927559..c12fe76 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -240,7 +240,7 @@
   @DomName('AudioContext.close')
   @DocsEditable()
   @Experimental() // untriaged
-  Future close() native;
+  Future close() => promiseToFuture(JS("", "#.close()", this));
 
   @DomName('AudioContext.getOutputTimestamp')
   @DocsEditable()
@@ -258,7 +258,7 @@
   @DomName('AudioContext.suspend')
   @DocsEditable()
   @Experimental() // untriaged
-  Future suspend() native;
+  Future suspend() => promiseToFuture(JS("", "#.suspend()", this));
 
   factory AudioContext() => JS('AudioContext',
       'new (window.AudioContext || window.webkitAudioContext)()');
@@ -534,11 +534,68 @@
 @DomName('AudioParamMap')
 @Experimental() // untriaged
 @Native("AudioParamMap")
-class AudioParamMap extends Interceptor {
+class AudioParamMap extends Interceptor with MapMixin<String, dynamic> {
   // To suppress missing implicit constructor warnings.
   factory AudioParamMap._() {
     throw new UnsupportedError("Not supported");
   }
+
+  Map _getItem(String key) =>
+      convertNativeToDart_Dictionary(JS('', '#.get(#)', this, key));
+
+  void addAll(Map<String, dynamic> other) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  bool containsValue(dynamic value) => values.any((e) => e == value);
+
+  bool containsKey(dynamic key) => _getItem(key) != null;
+
+  Map operator [](dynamic key) => _getItem(key);
+
+  void forEach(void f(String key, dynamic value)) {
+    var entries = JS('', '#.entries()', this);
+    while (true) {
+      var entry = JS('', '#.next()', entries);
+      if (JS('bool', '#.done', entry)) return;
+      f(JS('String', '#.value[0]', entry),
+          convertNativeToDart_Dictionary(JS('', '#.value[1]', entry)));
+    }
+  }
+
+  Iterable<String> get keys {
+    final keys = <String>[];
+    forEach((k, v) => keys.add(k));
+    return keys;
+  }
+
+  Iterable<Map> get values {
+    final values = <Map>[];
+    forEach((k, v) => values.add(v));
+    return values;
+  }
+
+  int get length => JS('int', '#.size', this);
+
+  bool get isEmpty => length == 0;
+
+  bool get isNotEmpty => !isEmpty;
+
+  void operator []=(String key, dynamic value) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  dynamic putIfAbsent(String key, dynamic ifAbsent()) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  String remove(dynamic key) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  void clear() {
+    throw new UnsupportedError("Not supported");
+  }
 }
 // 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
@@ -955,14 +1012,16 @@
   @DomName('BaseAudioContext.decodeAudioData')
   @DocsEditable()
   @Experimental() // untriaged
-  Future decodeAudioData(ByteBuffer audioData,
-      [DecodeSuccessCallback successCallback,
-      DecodeErrorCallback errorCallback]) native;
+  Future<AudioBuffer> decodeAudioData(ByteBuffer audioData,
+          [DecodeSuccessCallback successCallback,
+          DecodeErrorCallback errorCallback]) =>
+      promiseToFuture<AudioBuffer>(JS("", "#.decodeAudioData(#, #, #)", this,
+          audioData, successCallback, errorCallback));
 
   @DomName('BaseAudioContext.resume')
   @DocsEditable()
   @Experimental() // untriaged
-  Future resume() native;
+  Future resume() => promiseToFuture(JS("", "#.resume()", this));
 }
 // 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
@@ -1481,13 +1540,15 @@
   @DomName('OfflineAudioContext.startRendering')
   @DocsEditable()
   @Experimental() // untriaged
-  Future startRendering() native;
+  Future<AudioBuffer> startRendering() =>
+      promiseToFuture<AudioBuffer>(JS("", "#.startRendering()", this));
 
   @JSName('suspend')
   @DomName('OfflineAudioContext.suspend')
   @DocsEditable()
   @Experimental() // untriaged
-  Future suspendFor(num suspendTime) native;
+  Future suspendFor(num suspendTime) =>
+      promiseToFuture(JS("", "#.suspendFor(#)", this, suspendTime));
 }
 // 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
diff --git a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
index 657d0a8..b3d8ba3 100644
--- a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
+++ b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
@@ -1387,7 +1387,9 @@
   @DocsEditable()
   @Experimental() // untriaged
   Future getBufferSubDataAsync(int target, int srcByteOffset, TypedData dstData,
-      [int dstOffset, int length]) native;
+          [int dstOffset, int length]) =>
+      promiseToFuture(JS("", "#.getBufferSubDataAsync(#, #, #, #, #)", this,
+          target, srcByteOffset, dstData, dstOffset, length));
 }
 // 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
@@ -2895,7 +2897,7 @@
   @DomName('WebGLRenderingContext.commit')
   @DocsEditable()
   @Experimental() // untriaged
-  Future commit() native;
+  Future commit() => promiseToFuture(JS("", "#.commit()", this));
 
   @DomName('WebGLRenderingContext.compileShader')
   @DocsEditable()
@@ -6709,7 +6711,7 @@
   @DomName('WebGL2RenderingContext.commit')
   @DocsEditable()
   @Experimental() // untriaged
-  Future commit() native;
+  Future commit() => promiseToFuture(JS("", "#.commit()", this));
 
   @DomName('WebGL2RenderingContext.compileShader')
   @DocsEditable()
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index d758bc1..5efb0e9 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -160,6 +160,10 @@
 LibTest/core/List/sort_A01_t06: Slow, Pass # Slow tests that needs extra time to finish.
 LibTest/core/double/INFINITY_A01_t04: RuntimeError # Expected to fail because double.INFINITY is int.
 LibTest/core/double/NEGATIVE_INFINITY_A01_t04: RuntimeError # Expected to fail because double.NEGATIVE_INFINITY is int.
+LibTest/core/double/operator_addition_A01_t06: RuntimeError # Large integer literal. Not valid dart 2.
+LibTest/core/double/operator_addition_A01_t08: Crash # Large integer literal. Not valid dart 2.
+LibTest/core/double/operator_subtraction_A01_t06: RuntimeError # Large integer literal. Not valid dart 2.
+LibTest/core/double/operator_subtraction_A01_t09: Crash # Large integer literal. Not valid dart 2.
 LibTest/core/int/hashCode_A01_t01: RuntimeError, OK # co19 issue 308
 LibTest/core/int/isEven_A01_t01: RuntimeError, OK # co19 issue 277
 LibTest/core/int/isOdd_A01_t01: RuntimeError, OK # co19 issue 277
@@ -170,8 +174,13 @@
 LibTest/core/int/operator_OR_A01_t01: RuntimeError, OK # Requires bigints.
 LibTest/core/int/operator_XOR_A01_t01: RuntimeError, OK # Requires bigints.
 LibTest/core/int/operator_addition_A01_t01: RuntimeError, OK # co19 issue 200
+LibTest/core/int/operator_division_A01_t01: RuntimeError # Large integer literal. Not valid dart 2.
+LibTest/core/int/operator_multiplication_A01_t01: RuntimeError # Large integer literal. Not valid dart 2.
 LibTest/core/int/operator_remainder_A01_t01: RuntimeError, OK # Requires bigints.
+LibTest/core/int/operator_remainder_A01_t02: RuntimeError, OK # Requires bigints.
 LibTest/core/int/operator_right_shift_A01_t01: RuntimeError, OK # Expects negative result from bit-operation.
+LibTest/core/int/operator_subtraction_A01_t01: RuntimeError # Large integer literal. Not valid dart 2.
+LibTest/core/int/operator_truncating_division_A01_t01: RuntimeError # Large integer literal. Not valid dart 2.
 LibTest/core/int/toDouble_A01_t01: RuntimeError, OK # co19 issue 200
 LibTest/html/Element/addEventListener_A01_t04: Skip # https://github.com/dart-lang/sdk/issues/28873
 LibTest/html/Element/queryAll_A01_t01: RuntimeError # See issue 143
@@ -7076,6 +7085,7 @@
 Language/Classes/Constructors/Generative_Constructors/execution_t06: Crash
 Language/Classes/Constructors/Generative_Constructors/execution_t07: Crash
 Language/Classes/Constructors/Generative_Constructors/execution_t12: Crash
+Language/Classes/Constructors/Generative_Constructors/initializers_t12: Crash # Issue 33157
 Language/Classes/Constructors/Generative_Constructors/redirection_t03: Crash
 Language/Classes/Constructors/Generative_Constructors/redirection_t07: Crash
 Language/Classes/Constructors/Generative_Constructors/redirection_t08: Crash
diff --git a/tests/compiler/dart2js/codegen/number_output_test.dart b/tests/compiler/dart2js/codegen/number_output_test.dart
index a51bd7c..8bfe28e 100644
--- a/tests/compiler/dart2js/codegen/number_output_test.dart
+++ b/tests/compiler/dart2js/codegen/number_output_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions= --no_limit_ints_to_64_bits
 import 'dart:async';
 import 'package:expect/expect.dart';
 import 'package:compiler/compiler_new.dart';
@@ -14,7 +13,8 @@
   'main.dart': '''
         main() {
           print(12300000);
-          print(1234567890123456789012345);
+          // TODO(efortuna): Uncomment below when issue 33160 is fixed.
+          // print(0xffffffff00000000);
           print(double.maxFinite);
           print(-22230000);
         }'''
@@ -44,7 +44,9 @@
     Expect.isTrue(jsOutput.contains('12300000'));
     Expect.isTrue(jsOutput.contains('-22230000'));
   }
-  Expect.isTrue(jsOutput.contains('12345678901234568e8'));
+  // TODO(efortuna): Uncomment when issue 33160 is fixed.
+  //Expect.isTrue(jsOutput.contains('18446744069414584e3'));
+  //Expect.isFalse(jsOutput.contains('-4294967296'));
   Expect.isTrue(jsOutput.contains('17976931348623157e292'));
   Expect.isFalse(jsOutput.contains('1234567890123456789012345'));
   // The decimal expansion of double.maxFinite has 308 digits. We only check
diff --git a/tests/compiler/dart2js/codegen/value_range2_test.dart b/tests/compiler/dart2js/codegen/value_range2_test.dart
index be9df0f..774fd9a 100644
--- a/tests/compiler/dart2js/codegen/value_range2_test.dart
+++ b/tests/compiler/dart2js/codegen/value_range2_test.dart
@@ -8,7 +8,7 @@
 import "package:compiler/src/types/abstract_value_domain.dart";
 import "package:compiler/src/js_backend/constant_system_javascript.dart";
 
-ValueRangeInfo info = new ValueRangeInfo(const JavaScriptConstantSystem());
+ValueRangeInfo info = new ValueRangeInfo(JavaScriptConstantSystem.only);
 
 class AbstractValueDomainMock implements AbstractValueDomain {
   const AbstractValueDomainMock();
@@ -27,7 +27,7 @@
 Range createSingleRange(Value value) => info.newNormalizedRange(value, value);
 
 Range createSingleIntRange(int value) {
-  return createSingleRange(info.newIntValue(value));
+  return createSingleRange(info.newIntValue(new BigInt.from(value)));
 }
 
 Range createSingleInstructionRange() => createSingleRange(instructionValue);
@@ -35,16 +35,18 @@
 Range createSingleLengthRange() => createSingleRange(lengthValue);
 
 Range createIntRange(int lower, int upper) {
-  return info.newNormalizedRange(
-      info.newIntValue(lower), info.newIntValue(upper));
+  return info.newNormalizedRange(info.newIntValue(new BigInt.from(lower)),
+      info.newIntValue(new BigInt.from(upper)));
 }
 
 Range createLengthRange(int lower) {
-  return info.newNormalizedRange(info.newIntValue(lower), lengthValue);
+  return info.newNormalizedRange(
+      info.newIntValue(new BigInt.from(lower)), lengthValue);
 }
 
 Range createInstructionRange(int lower) {
-  return info.newNormalizedRange(info.newIntValue(lower), instructionValue);
+  return info.newNormalizedRange(
+      info.newIntValue(new BigInt.from(lower)), instructionValue);
 }
 
 Range instruction = createSingleInstructionRange();
@@ -60,8 +62,8 @@
 Range _0_instruction = createInstructionRange(0);
 
 checkAndRange(Range one, Range two, lower, upper) {
-  if (lower is num) lower = info.newIntValue(lower);
-  if (upper is num) upper = info.newIntValue(upper);
+  if (lower is num) lower = info.newIntValue(new BigInt.from(lower));
+  if (upper is num) upper = info.newIntValue(new BigInt.from(upper));
   Range range = info.newNormalizedRange(lower, upper);
   Expect.equals(range, one & two);
 }
@@ -89,12 +91,12 @@
   if (lower == null) {
     lower = buildBound(one.lower, two.upper);
   } else if (lower is num) {
-    lower = info.newIntValue(lower);
+    lower = info.newIntValue(new BigInt.from(lower));
   }
   if (upper == null) {
     upper = buildBound(one.upper, two.lower);
   } else if (upper is num) {
-    upper = info.newIntValue(upper);
+    upper = info.newIntValue(new BigInt.from(upper));
   }
 
   Expect.equals(info.newNormalizedRange(lower, upper), one - two);
@@ -106,14 +108,14 @@
   } else {
     Value low, up;
     if (arg1 is num) {
-      low = info.newIntValue(arg1);
+      low = info.newIntValue(new BigInt.from(arg1));
     } else if (arg1 == null) {
       low = info.newNegateValue(range.upper);
     } else {
       low = arg1;
     }
     if (arg2 is num) {
-      up = info.newIntValue(arg2);
+      up = info.newIntValue(new BigInt.from(arg2));
     } else if (arg2 == null) {
       up = info.newNegateValue(range.lower);
     } else {
diff --git a/tests/compiler/dart2js/model/constant_value_test.dart b/tests/compiler/dart2js/model/constant_value_test.dart
index 5d0aa37..05d5194 100644
--- a/tests/compiler/dart2js/model/constant_value_test.dart
+++ b/tests/compiler/dart2js/model/constant_value_test.dart
@@ -29,12 +29,12 @@
     FieldEntity field1 = env.elementEnvironment.lookupClassMember(C, 'field1');
     FieldEntity field2 = env.elementEnvironment.lookupClassMember(C, 'field2');
     ConstructedConstantValue value1 = new ConstructedConstantValue(C_raw, {
-      field1: new IntConstantValue(0),
-      field2: new IntConstantValue(1),
+      field1: new IntConstantValue(BigInt.zero),
+      field2: new IntConstantValue(BigInt.one),
     });
     ConstantValue value2 = new ConstructedConstantValue(C_raw, {
-      field2: new IntConstantValue(1),
-      field1: new IntConstantValue(0),
+      field2: new IntConstantValue(BigInt.one),
+      field1: new IntConstantValue(BigInt.zero),
     });
     Expect.equals(value1.hashCode, value2.hashCode, "Hashcode mismatch.");
     Expect.equals(value1, value2, "Value mismatch.");
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart
index 0ca8e55..13e5ecd 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart
@@ -10,6 +10,6 @@
 }
 
 @NoInline()
-test() async /*2:test*/ /*kernel.3:test*/ {
+test() async /*2:test*/ {
   /*4:test*/ throw '>ExceptionMarker<';
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
index cf570ba..49c7a18 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
@@ -10,12 +10,12 @@
 }
 
 @NoInline()
-test1() async /*3:test1*/ /*kernel.4:test1*/ {
+test1() async /*3:test1*/ {
   // This call is on the stack when the error is thrown.
   await /*5:test1*/ test2();
 }
 
 @NoInline()
-test2() async /*7:test2*/ /*kernel.8:test2*/ {
+test2() async /*7:test2*/ {
   /*9:test2*/ throw '>ExceptionMarker<';
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart
index a12eaa6..5889055 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart
@@ -12,7 +12,7 @@
   // TODO(johnniwinther): Investigate why kernel doesn't point to the body
   // start brace.
   // ignore: UNUSED_LOCAL_VARIABLE
-  var /*2:test*/ /*3:test*/ c = new /*4:test*/ Class();
+  var /*2:test*/ c = new /*4:test*/ Class();
 }
 
 class Class {
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
index eb5d5f0..7ea1cf9 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
@@ -9,7 +9,7 @@
 }
 
 @NoInline()
-test1() async /*2:test1*/ /*kernel.3:test1*/ {
+test1() async /*2:test1*/ {
   /*9:test1*/ test2();
 }
 
diff --git a/tests/compiler/dart2js_extra/21579_test.dart b/tests/compiler/dart2js_extra/21579_test.dart
index 94197cd..a7b3079 100644
--- a/tests/compiler/dart2js_extra/21579_test.dart
+++ b/tests/compiler/dart2js_extra/21579_test.dart
@@ -12,7 +12,7 @@
 
 main() {
   var a = new List.generate(100, (i) => i);
-  a.sort((a, b) => 1000000000000000000000 * a.compareTo(b));
+  a.sort((a, b) => 10000000000000 * a.compareTo(b));
   Expect.equals(0, a.first);
   Expect.equals(99, a.last);
 }
diff --git a/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart b/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart
index 094cd95..1a09423 100644
--- a/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart
+++ b/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart
@@ -6,8 +6,8 @@
 
 // Make sure we use JavaScript semantics when compiling compile-time constants.
 
-const x = 12345678901234567891;
-const y = 12345678901234567890;
+const x = 1234567890123456789;
+const y = 1234567890123456788;
 const z = x - y;
 
 const a = 1.0;
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 443fca5..e327d40 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -151,16 +151,27 @@
 big_integer_parsed_mul_div_vm_test: RuntimeError
 bit_twiddling_bigint_test: RuntimeError
 compare_to2_test: RuntimeError
+double_ceil_test: RuntimeError # Large integer literal. Not representable in JS.
+double_floor_test: RuntimeError # Large integer literal. Not representable in JS.
 double_parse_test/01: RuntimeError
+double_round_test: RuntimeError # Large integer literal. Not representable in JS.
+double_truncate_test: RuntimeError # Large integer literal. Not representable in JS.
 hash_set_test/01: RuntimeError
+int_ceil_to_double_test: RuntimeError # Large integer literal. Not representable in JS.
+int_floor_to_double_test: RuntimeError # Large integer literal. Not representable in JS.
+int_from_environment_test: RuntimeError # Large integer literal. Not representable in JS.
 int_modulo_arith_test/bignum: RuntimeError
 int_modulo_arith_test/modPow: RuntimeError
 int_parse_radix_test/01: RuntimeError
 int_parse_radix_test/02: RuntimeError
+int_round_to_double_test: RuntimeError # Large integer literal. Not representable in JS.
+int_truncate_to_double_test: RuntimeError # Large integer literal. Not representable in JS.
 integer_to_radix_string_test: RuntimeError
 integer_to_string_test/01: RuntimeError
 iterable_return_type_test/02: RuntimeError
 nan_infinity_test/01: RuntimeError
+num_parse_test/01: RuntimeError # Large integer literal. Not representable in JS.
+num_parse_test/none: RuntimeError # Large integer literal. Not representable in JS.
 regress_r21715_test: RuntimeError
 string_base_vm_test: RuntimeError
 symbol_reserved_word_test/03: RuntimeError
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index 6aac957..740c6c6 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -127,6 +127,7 @@
 int_parse_radix_bad_handler_test: Pass
 
 [ $compiler == dart2analyzer && !$strong ]
+regress_33166_test: StaticWarning # Not a Dart 1 test
 symbol_reserved_word_test/05: MissingCompileTimeError # Issue 30245
 
 [ $compiler != dart2analyzer && $compiler != dart2js && $compiler != dartdevc && $compiler != dartdevk ]
diff --git a/tests/corelib_2/regress_33166_test.dart b/tests/corelib_2/regress_33166_test.dart
new file mode 100644
index 0000000..03f0faf
--- /dev/null
+++ b/tests/corelib_2/regress_33166_test.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.
+
+import 'dart:async';
+import "package:expect/expect.dart";
+
+// Regression test for https://github.com/dart-lang/sdk/issues/33166
+void main() async {
+  var stream = new Stream.fromIterable([1, 2, 3]);
+  Expect.equals(await stream.cast<int>().drain().then((_) => 'Done'), 'Done');
+}
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index b9f01fd..e634a35 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -33,6 +33,7 @@
 override_field_test/02: Pass, Slow # TODO(kasperl): Please triage.
 
 [ $compiler == dart2js && $runtime == d8 && $fasta ]
+int_round_to_double_test: RuntimeError # Large integer literal. Not valid in dart2.
 regress_23408_test: RuntimeError
 
 [ $compiler == dart2js && $runtime != drt ]
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index 4579ab6..953e7a2 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -540,12 +540,7 @@
 async_await_test/03: RuntimeError
 async_await_test/none: RuntimeError
 async_star_cancel_while_paused_test: RuntimeError
-async_star_test/01: RuntimeError
 async_star_test/02: RuntimeError
-async_star_test/03: RuntimeError
-async_star_test/04: RuntimeError
-async_star_test/05: RuntimeError
-async_star_test/none: RuntimeError
 bad_override_test/03: MissingCompileTimeError
 bit_operations_test: RuntimeError
 branch_canonicalization_test: RuntimeError
@@ -904,12 +899,7 @@
 async_return_types_test/nestedFuture: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
 async_return_types_test/wrongReturnType: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
 async_star_cancel_while_paused_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_star_test/01: RuntimeError
 async_star_test/02: RuntimeError
-async_star_test/03: RuntimeError
-async_star_test/04: RuntimeError
-async_star_test/05: RuntimeError
-async_star_test/none: RuntimeError
 await_not_started_immediately_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 bad_override_test/01: MissingCompileTimeError
 bad_override_test/02: MissingCompileTimeError
@@ -1451,12 +1441,7 @@
 async_return_types_test/nestedFuture: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 async_return_types_test/wrongReturnType: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 async_star_cancel_while_paused_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_star_test/01: RuntimeError
 async_star_test/02: RuntimeError
-async_star_test/03: RuntimeError
-async_star_test/04: RuntimeError
-async_star_test/05: RuntimeError
-async_star_test/none: RuntimeError
 await_not_started_immediately_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 bad_override_test/01: MissingCompileTimeError
 bad_override_test/02: MissingCompileTimeError
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 90f3795..a376ae2 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -19,6 +19,7 @@
 async/schedule_microtask6_test: RuntimeError # global error handling is not supported. Issue 5958
 convert/base64_test/01: Fail, OK # Uses bit-wise operations to detect invalid values. Some large invalid values accepted by dart2js.
 convert/chunked_conversion_utf88_test: Slow, Pass
+convert/utf82_test: RuntimeError # Large integer literal. Not valid in dart2.
 convert/utf85_test: Slow, Pass
 developer/timeline_test: Skip # Not supported
 math/double_pow_test: RuntimeError
@@ -112,7 +113,7 @@
 mirrors/typevariable_mirror_metadata_test: RuntimeError # Issue 10905
 mirrors/variable_is_const_test/none: RuntimeError # Issue 14671
 profiler/metrics_num_test: Skip # Because of a int / double type test.
-typed_data/int32x4_bigint_test: RuntimeError # Issue 1533
+typed_data/int32x4_bigint_test: Pass
 typed_data/int64_list_load_store_test: RuntimeError # Issue 10275
 typed_data/typed_data_hierarchy_int64_test: RuntimeError # Issue 10275
 
diff --git a/tests/lib_2/html/interactive_media_test.dart b/tests/lib_2/html/interactive_media_test.dart
index 1ad71c0..25d43d4 100644
--- a/tests/lib_2/html/interactive_media_test.dart
+++ b/tests/lib_2/html/interactive_media_test.dart
@@ -6,14 +6,31 @@
 
 import 'dart:async';
 import 'dart:html';
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_individual_config.dart';
-import 'utils.dart';
 
-main() {
-  useHtmlIndividualConfiguration();
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:async_helper/async_helper.dart';
+
+// NOTE: To test enable chrome://flags/#enable-experimental-web-platform-features
+
+main() async {
+  useHtmlConfiguration();
 
   if (MediaStream.supported) {
+    test('getUserMedia audio', () async {
+      var mediaStream = await window.navigator.getUserMedia(audio: true);
+      expect(mediaStream, isNotNull);
+      expect(mediaStream is MediaStream, true);
+      var devices = window.navigator.mediaDevices;
+      var enumDevices = await devices.enumerateDevices();
+      expect(enumDevices.length > 1, true);
+      for (var device in enumDevices) {
+        var goodDevLabel = device.label.endsWith('Built-in Output') ||
+            device.label.endsWith('Built-in Microphone');
+        expect(goodDevLabel, true);
+      }
+    });
+
     test('getUserMedia', () {
       return window.navigator.getUserMedia(video: true).then((stream) {
         expect(stream, isNotNull);
diff --git a/tests/lib_2/html/storage_promise_test.dart b/tests/lib_2/html/storage_promise_test.dart
new file mode 100644
index 0000000..b1e1b13
--- /dev/null
+++ b/tests/lib_2/html/storage_promise_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library interactive_test;
+
+import 'dart:async';
+import 'dart:html';
+
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:async_helper/async_helper.dart';
+
+main() async {
+  useHtmlConfiguration();
+
+  bool thenEstimateBefore, thenEstimateAfter, thenEstimateDone = false;
+  Map thenEstimate;
+  test('Basic Promise Test', () async {
+    try {
+      thenEstimateBefore = true;
+      window.navigator.storage.estimate().then((value) {
+        thenEstimate = value;
+        thenEstimateDone = true;
+      });
+      thenEstimateAfter = true;
+    } catch (msg) {
+      fail("StorageManger failed: $msg");
+    }
+
+    Map estimate = await window.navigator.storage.estimate();
+
+    expect(thenEstimate['usage'] >= 0, true);
+    expect(thenEstimate['quota'] > 1, true);
+    expect(thenEstimate['usage'], estimate['usage']);
+    expect(thenEstimate['quota'], estimate['quota']);
+
+    expect(thenEstimateBefore, true);
+    expect(thenEstimateAfter, true);
+    expect(thenEstimateDone, true);
+  });
+}
diff --git a/tests/lib_2/lib_2.status b/tests/lib_2/lib_2.status
index 570bc93..35184e0 100644
--- a/tests/lib_2/lib_2.status
+++ b/tests/lib_2/lib_2.status
@@ -144,6 +144,9 @@
 mirrors/redirecting_factory_different_type_test/none: RuntimeError
 mirrors/reflected_type_generics_test/02: Fail, OK # Type check for a bounded type argument.
 
+[ $compiler == none && !$fasta ]
+mirrors/abstract_class_test: RuntimeError
+
 [ $runtime == chrome && $system == linux ]
 mirrors/native_class_test: Pass, Slow
 
diff --git a/tests/lib_2/lib_2_dart2js.status b/tests/lib_2/lib_2_dart2js.status
index 9177102..e49ac50 100644
--- a/tests/lib_2/lib_2_dart2js.status
+++ b/tests/lib_2/lib_2_dart2js.status
@@ -293,6 +293,7 @@
 html/shadow_dom_test: RuntimeError
 html/shadowroot_test: RuntimeError
 html/speechrecognition_test: RuntimeError
+html/storage_promise_test: RuntimeError
 html/storage_test: RuntimeError
 html/streams_test: RuntimeError
 html/svg_test: RuntimeError
@@ -341,7 +342,6 @@
 html/fontface_loaded_test: RuntimeError
 html/html_mock_test: RuntimeError # Issue 31038
 html/input_element_attributes_test: RuntimeError
-html/interactive_media_test: RuntimeError
 html/js_dart_functions_test: RuntimeError # does not implement Dart 2 implicit `.call` tearoff
 html/js_extend_class_test: RuntimeError
 
@@ -462,6 +462,7 @@
 html/file_sample_test: Skip # FileSystem not supported on Safari.
 html/fileapi_supported_throws_test: Skip # FileSystem not supported on Safari
 html/js_mock_test: RuntimeError # Issue 32286
+html/storage_promise_test: RuntimeError # Not supported on Safari
 html/xhr_test: RuntimeError
 
 [ $compiler == dart2js && $system == linux ]
@@ -789,6 +790,9 @@
 convert/streamed_conversion_json_utf8_encode_test: SkipSlow # Times out. Issue 22050
 convert/streamed_conversion_utf8_decode_test: SkipSlow # Times out. Issue 22050
 
+[ $compiler == dart2js && ($runtime != chrome || $system != macos) ]
+html/interactive_media_test: RuntimeError # # See NOTE in test on how to run.
+
 [ $compiler == dart2js && ($runtime == ff || $runtime == safari || $ie) ]
 html/custom/attribute_changed_callback_test/unsupported_on_polyfill: Fail # Polyfill does not support
 html/custom/entered_left_view_test/viewless_document: Fail # Polyfill does not handle this
diff --git a/tests/lib_2/lib_2_dartdevc.status b/tests/lib_2/lib_2_dartdevc.status
index c9e3342..e2910bb 100644
--- a/tests/lib_2/lib_2_dartdevc.status
+++ b/tests/lib_2/lib_2_dartdevc.status
@@ -26,7 +26,7 @@
 
 [ $system == linux && ($compiler == dartdevc || $compiler == dartdevk) ]
 html/interactive_geolocation_test: Skip # Requires allowing geo location.
-html/interactive_media_test: RuntimeError
+html/interactive_media_test: RuntimeError # # See NOTE in test on how to run.
 
 [ $system == macos && ($compiler == dartdevc || $compiler == dartdevk) ]
 html/client_rect_test: Pass, RuntimeError # Issue 31019
@@ -85,7 +85,7 @@
 html/element_classes_svg_test: RuntimeError # Issue 29922
 html/element_classes_test: RuntimeError # Issue 29922
 html/fontface_loaded_test: RuntimeError
-html/interactive_media_test: Skip # requests interactive permissions (camera, geolocation)
+html/interactive_media_test: RuntimeError # See NOTE in test on how to run and interactive permissions (camera, geolocation)
 html/isolates_test: RuntimeError # Issue 29922
 html/js_typed_interop_default_arg_test/default_value: MissingCompileTimeError # Issue 29922
 html/js_typed_interop_side_cast_exp_test/01: RuntimeError # Requires --experimental-trust-js-interop-type-annotations flag.
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index 65dbd6b..f015610 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -90,7 +90,6 @@
 isolate/spawn_function_custom_class_test: Pass, Crash, Timeout # Crashes with --no-enable-malloc-hooks vm option
 isolate/spawn_uri_nested_vm_test: Pass, Timeout
 isolate/static_function_test: Skip # Times out. Issue 31855. CompileTimeError. Issue 31402
-mirrors/abstract_class_test: RuntimeError
 mirrors/apply3_test: RuntimeError
 mirrors/class_declarations_test/01: RuntimeError # Issue 31402 (Invocation arguments)
 mirrors/class_declarations_test/none: RuntimeError # Issue 31402 (Invocation arguments)
diff --git a/tests/lib_2/mirrors/abstract_class_test.dart b/tests/lib_2/mirrors/abstract_class_test.dart
index b7dbaf0..8cd4fae 100644
--- a/tests/lib_2/mirrors/abstract_class_test.dart
+++ b/tests/lib_2/mirrors/abstract_class_test.dart
@@ -107,28 +107,28 @@
     // Mixin is abstract.
     Expect.isFalse(reflectClass(SubMA).isAbstract);
     Expect.isTrue(reflectClass(SubMA).superclass.isAbstract);
-    Expect.isFalse(reflectClass(SubMA).superclass.superclass.isAbstract);
+    Expect.isTrue(reflectClass(SubMA).superclass.superclass.isAbstract);
     Expect.isTrue(reflectClass(MA).isAbstract);
-    Expect.isFalse(reflectClass(MA).superclass.isAbstract);
+    Expect.isTrue(reflectClass(MA).superclass.isAbstract);
 
     // Mixin is concrete.
     Expect.isFalse(reflectClass(SubMA2).isAbstract);
     Expect.isTrue(reflectClass(SubMA2).superclass.isAbstract);
-    Expect.isFalse(reflectClass(SubMA2).superclass.superclass.isAbstract);
+    Expect.isTrue(reflectClass(SubMA2).superclass.superclass.isAbstract);
     Expect.isTrue(reflectClass(MA2).isAbstract);
-    Expect.isFalse(reflectClass(MA2).superclass.isAbstract);
+    Expect.isTrue(reflectClass(MA2).superclass.isAbstract);
   }
 
   // Application is concrete.
   {
     // Mixin is abstract.
     Expect.isFalse(reflectClass(ConcreteMA).isAbstract);
-    Expect.isFalse(reflectClass(ConcreteMA).superclass.isAbstract);
+    Expect.isTrue(reflectClass(ConcreteMA).superclass.isAbstract);
     Expect.isFalse(reflectClass(ConcreteMA).superclass.superclass.isAbstract);
 
     // Mixin is concrete.
     Expect.isFalse(reflectClass(ConcreteMA2).isAbstract);
-    Expect.isFalse(reflectClass(ConcreteMA2).superclass.isAbstract);
+    Expect.isTrue(reflectClass(ConcreteMA2).superclass.isAbstract);
     Expect.isFalse(reflectClass(ConcreteMA2).superclass.superclass.isAbstract);
   }
 }
diff --git a/tools/VERSION b/tools/VERSION
index b7ef033..717dac6 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 0
 PATCH 0
-PRERELEASE 56
+PRERELEASE 57
 PRERELEASE_PATCH 0
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 8695c4c..0f5f4a7 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -1,4 +1,7 @@
 {
+  "global": {
+    "chrome": "65"
+  },
   "filesets": {
     "analyzer": [
       "out/ReleaseX64/",
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index 92995fc..cf6254c 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -14628,6 +14628,9 @@
         "support_level": "untriaged"
       },
       "getStats": {},
+      "getStats2": {
+        "support_level": "untriaged"
+      },
       "getStreamById": {},
       "iceConnectionState": {},
       "iceGatheringState": {},
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index 6773b11..a713b78 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -133,6 +133,9 @@
 [DartSupplemental]
 interface RTCPeerConnection {
   [DartSuppress, RaisesException] void addIceCandidate(RTCIceCandidate candidate);
+  [DartSuppress] Promise<void> getStats(RTCStatsCallback successCallback, optional MediaStreamTrack? selector);
+  [DartSuppress] Promise<void> setLocalDescription(RTCSessionDescriptionInit description);
+  [DartSuppress] Promise<void> setRemoteDescription(RTCSessionDescriptionInit description);
 };
 
 // See implementation in tools/dom/templates for canvas and offscreenCanvas.
@@ -565,12 +568,6 @@
     [DartName=inch] readonly attribute double? in;
 };
 
-[DartSupplemental]
-interface RTCPeerConnection {
-    [DartSuppress] Promise<void> setLocalDescription(RTCSessionDescriptionInit description);
-    [DartSuppress] Promise<void> setRemoteDescription(RTCSessionDescriptionInit description);
-};
-
 [DartSuppress]
 interface DragEvent {};
 
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index cde90fb..d0cb493 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -187,7 +187,7 @@
   html_interface_renames[interface] = '_' + interface
 
 convert_to_future_members = monitored.Set(
-    'htmlrenamer.converted_to_future_members', [
+  'htmlrenamer.converted_to_future_members', [
   'DataTransferItem.getAsString',
   'DirectoryEntry.getDirectory',
   'DirectoryEntry.getFile',
@@ -425,7 +425,6 @@
   'Range.getClientRects',
   'RTCPeerConnection.createAnswer',
   'RTCPeerConnection.createOffer',
-  'RTCPeerConnection.getStats',
   'Screen.availHeight',
   'Screen.availLeft',
   'Screen.availTop',
diff --git a/tools/dom/scripts/idlnode.py b/tools/dom/scripts/idlnode.py
index a9b7fd7..b2e06d2 100644
--- a/tools/dom/scripts/idlnode.py
+++ b/tools/dom/scripts/idlnode.py
@@ -854,6 +854,13 @@
     if not (self._find_first(ast, 'Partial') is None):
       self.is_supplemental = True
       self.ext_attrs['DartSupplemental'] = None
+    self.isMaplike = False
+    self.isMaplike_ro = False
+    self.maplike_key_value = [None, None]
+    if ast is not None and ast.maplike is not None:
+       self.isMaplike = True
+       self.isMaplike_ro = ast.maplike.is_read_only
+       self.maplike_key_value = [IDLType(ast.maplike.key_type), IDLType(ast.maplike.value_type)]
 
     self.operations = self._convert_all(ast, 'Operation',
       lambda ast: IDLOperation(ast, self.doc_js_name))
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index e100908..036b320 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -666,6 +666,14 @@
              self._interface.id == 'CSSStyleDeclaration')):
             base_class = 'DartHtmlDomObject'
 
+    maplikeKeyType = ''
+    maplikeValueType = ''
+    if self._interface.isMaplike:
+        maplikeKeyType = self._type_registry.\
+            _TypeInfo(self._interface.maplike_key_value[0].id).dart_type()
+        maplikeValueType = 'dynamic'
+        mixins_str = " with MapMixin<%s, %s>" % (maplikeKeyType, maplikeValueType)
+
     implementation_members_emitter = implementation_emitter.Emit(
         self._backend.ImplementationTemplate(),
         LIBRARYNAME='dart.dom.%s' % self._library_name,
@@ -676,7 +684,9 @@
         IMPLEMENTS=implements_str,
         MIXINS=mixins_str,
         DOMNAME=self._interface.doc_js_name,
-        NATIVESPEC=native_spec)
+        NATIVESPEC=native_spec,
+        KEYTYPE=maplikeKeyType,
+        VALUETYPE=maplikeValueType)
     stream_getter_signatures_emitter = None
     element_stream_getters_emitter = None
     if type(implementation_members_emitter) == tuple:
@@ -753,6 +763,102 @@
 
 # ------------------------------------------------------------------------------
 
+''' TODO(terry): Current idl_parser (Chrome) doesn't keep the Promise type e.g.,
+                 Promise<T> in the AST so there is no way to pull this out.  Need
+                 to investigate getting the Chrome folks to fix.  However, they
+                 don't use this in the C++ code generation and don't have a need
+                 for this feature.  For now I have a table that maps to the
+                 parameterized Promise type.
+'''
+promise_attributes = monitored.Dict('systemhtml.promise_attr_type', {
+    "Animation.finished": {"type": "Animation"},
+    "Animation.ready": {"type": "Animation"},
+    "FontFace.loaded": {"type": "FontFace"},
+    "FontFaceSet.ready": {"type": "FontFaceSet"},
+    "PresentationReceiver.connectionList": {"type": "PresentationConnectionList"},
+    "ServiceWorkerContainer.ready": {"type": "ServiceWorkerRegistration"},
+})
+
+promise_operations = monitored.Dict('systemhtml.promise_oper_type', {
+  "Clipboard.read": { "type": "DataTransfer" },
+  "Clipboard.readText": { "type": "String" },
+  "FontFace.load": { "type": "FontFace"},
+  "FontFaceSet.load": { "type": "List<FontFace>" },
+  "OffscreenCanvas.load": { "type": "Blob" },
+  "BackgroundFetchManager.fetch": { "type": "BackgroundFetchRegistration" },
+  "BackgroundFetchManager.get": { "type": "BackgroundFetchRegistration" },
+  "BackgroundFetchManager.getIds": { "type": "List<String>" },
+  "BackgroundFetchRegistration.abort": { "type": "bool" },
+  "SyncManager.getTags": { "type": "List<String>" },
+  "BudgetService.getCost": { "type": "double" },
+  "BudgetService.getBudget": { "type": "BudgetState" },
+  "BudgetService.reserve": { "type": "bool" },
+  "Body.blob": { "type": "Blob" },
+  "Body.formData": { "type": "FormData" },
+  "Body.text": { "type": "String" },
+  "ImageCapture.getPhotoCapabilities": { "type": "PhotoCapabilities" },
+  "ImageCapture.getPhotoSettings": { "type": "dictionary" },
+  "ImageCapture.takePhoto": { "type": "Blob" },
+  "ImageCapture.grabFrame": { "type": "ImageBitmap" },
+  "Navigator.getInstalledRelatedApps": { "type": "RelatedApplication" },
+  "MediaCapabilities.decodingInfo": { "type": "MediaCapabilitiesInfo" },
+  "MediaCapabilities.encodingInfo": { "type": "MediaCapabilitiesInfo" },
+  "MediaDevices.enumerateDevices": { "type": "List<MediaDeviceInfo>" },
+  "MediaDevices.getUserMedia": { "type": "MediaStream" },
+  "MediaStreamTrack.applyConstraints": { "type": "MediaTrackConstraints" },
+  "ServiceWorkerRegistration.getNotifications": { "type": "List<Notification>" },
+  "PaymentInstruments.delete": { "type": "bool" },
+  "PaymentInstruments.get": { "type": "dictionary" },
+  "PaymentInstruments.keys": { "type": "List<String>" },
+  "PaymentInstrumentshas.": { "type": "bool" },
+  "PaymentRequest.show": { "type": "PaymentResponse" },
+  "PaymentRequest.canMakePayment": { "type": "bool" },
+  "PaymentRequestEvent.openWindow": { "type": "WindowClient" },
+  "RTCPeerConnection.createOffer": { "type": "RtcSessionDescription" },
+  "RTCPeerConnection.createAnswer": { "type": "RtcSessionDescription" },
+  "RTCPeerConnection.getStats": { "type": "dictionary", "maplike": "RTCStatsReport"},
+  "RTCPeerConnection.generateCertificate": { "type": "RtcCertificate" },
+  "Permissions.query": { "type": "PermissionStatus" },
+  "Permissions.request": { "type": "PermissionStatus" },
+  "Permissions.revoke": { "type": "PermissionStatus" },
+  "Permissions.requestAll": { "type": "PermissionStatus" },
+  "PresentationRequest.start": { "type": "PresentationConnection" },
+  "PresentationRequest.reconnect": { "type": "PresentationConnection" },
+  "PresentationRequest.getAvailability": { "type": "PresentationAvailability" },
+  "PushManager.subscribe": { "type": "PushSubscription" },
+  "PushManager.getSubscription": { "type": "PushSubscription" },
+  "PushSubscription.unsubscribe": { "type": "bool" },
+  "StorageManager.persisted": { "type": "bool" },
+  "StorageManager.persist": { "type": "bool" },
+  "StorageManager.estimate": { "type": "dictionary" },
+  "RemotePlayback.watchAvailability": { "type": "int" },
+  "Clients.matchAll": { "type": "List<Client>" },
+  "Clients.openWindow": { "type": "WindowClient" },
+  "NavigationPreloadManager.getState": { "type": "dictionary" },
+  "ServiceWorkerContainer.register": { "type": "ServiceWorkerRegistration" },
+  "ServiceWorkerContainer.getRegistration": { "type": "ServiceWorkerRegistration" },
+  "ServiceWorkerContainer.getRegistrations": { "type": "List<ServiceWorkerRegistration>" },
+  "ServiceWorkerGlobalScope.fetch": { "type": "Response" },
+  "ServiceWorkerRegistration.unregister": { "type": "bool" },
+  "WindowClient.focus": { "type": "WindowClient" },
+  "WindowClient.navigate": { "type": "WindowClient" },
+  "BarcodeDetector.detect": { "type": "List<DetectedBarcode>" },
+  "FaceDetector.detect": { "type": "List<DetectedFace>" },
+  "TextDetector.detect": { "type": "List<DetectedText>" },
+  "BaseAudioContext.decodeAudioData": { "type": "AudioBuffer" },
+  "OfflineAudioContext.startRendering": { "type": "AudioBuffer" },
+})
+
+def _GetPromiseOperationType(interface_operation):
+  if interface_operation in promise_operations:
+    return promise_operations[interface_operation]
+  return None
+
+def _GetPromiseAttributeType(interface_operation):
+  if interface_operation in promise_attributes:
+    return promise_attributes[interface_operation]
+  return None
+
 class Dart2JSBackend(HtmlDartGenerator):
   """Generates a dart2js class for the dart:html library from a DOM IDL
   interface.
@@ -792,8 +898,14 @@
   def ImplementationTemplate(self):
     template_file = ('impl_%s.darttemplate' %
                      self._interface.doc_js_name)
-    return (self._template_loader.TryLoad(template_file) or
-            self._template_loader.Load('dart2js_impl.darttemplate'))
+    template_file_content = self._template_loader.TryLoad(template_file)
+    if not(template_file_content):
+      if self._interface.isMaplike and self._interface.isMaplike_ro:
+          # TODO(terry): There are no mutable maplikes yet.
+          template_file_content = self._template_loader.Load('dart2js_maplike_impl.darttemplate')
+      else:
+        template_file_content = self._template_loader.Load('dart2js_impl.darttemplate')
+    return template_file_content
 
   def StartInterface(self, members_emitter):
     self._members_emitter = members_emitter
@@ -1150,13 +1262,61 @@
             resultType = 'Function'
     return resultType
 
+  def _zeroArgs(self, argsNames):
+    return 'JS("", "#.$NAME()", this)'
+
+  def _manyArgs(self, numberArgs, argsNames):
+    argsPound = "#" if numberArgs == 1 else ("#, " * numberArgs)[:-2]
+    return '    JS("", "#.$NAME(%s)", this, %s)' % (argsPound, argsNames)
+
+  def _promiseToFutureCode(self, argsNames):
+    numberArgs = argsNames.count(',') + 1
+    jsCall = self._zeroArgs(argsNames) if len(argsNames) == 0 else \
+        self._manyArgs(numberArgs, argsNames)
+
+    futureTemplate = [
+    '\n'
+    '  $RENAME$METADATA$MODIFIERS $TYPE $NAME($PARAMS) => $PROMISE_CALL(',
+    jsCall,
+    ');\n'
+    ]
+    return "".join(futureTemplate)
 
   def _AddDirectNativeOperation(self, info, html_name):
     force_optional = True if html_name.startswith('_') else False
-
     resultType = self._computeResultType(info.type_name)
 
-    self._members_emitter.Emit(
+    if info.type_name == 'Promise' and not(force_optional):
+      lookupOp = "%s.%s" % (self._interface.id, html_name)
+      promiseFound = _GetPromiseOperationType(lookupOp)
+      promiseType = 'Future'
+      promiseCall = 'promiseToFuture'
+      if promiseFound is not(None):
+        if 'maplike' in promiseFound:
+          promiseCall = 'promiseToFutureMap'
+          promiseType = 'Future'
+        elif promiseFound['type'] == 'dictionary':
+          # It's a dictionary so return as a Map.
+          promiseCall = 'promiseToFutureDictionary'
+          promiseType = 'Future<Map>'
+        else:
+          paramType = promiseFound['type']
+          promiseCall = 'promiseToFuture<%s>' % paramType
+          promiseType = 'Future<%s>' % paramType
+
+      argsNames = info.ParametersAsArgumentList()
+      codeTemplate = self._promiseToFutureCode(argsNames)
+      self._members_emitter.Emit(codeTemplate,
+        RENAME=self._RenamingAnnotation(info.declared_name, html_name),
+        METADATA=self._Metadata(info.type_name, info.declared_name,
+            self.SecureOutputType(info.type_name)),
+        MODIFIERS='static ' if info.IsStatic() else '',
+        TYPE=promiseType,
+        PROMISE_CALL=promiseCall,
+        NAME=html_name,
+        PARAMS=info.ParametersAsDeclaration(self._NarrowInputType, force_optional))
+    else:
+        self._members_emitter.Emit(
         '\n'
         '  $RENAME$METADATA$MODIFIERS$TYPE $NAME($PARAMS) native;\n',
         RENAME=self._RenamingAnnotation(info.declared_name, html_name),
diff --git a/tools/dom/templates/dart2js_maplike_impl.darttemplate b/tools/dom/templates/dart2js_maplike_impl.darttemplate
new file mode 100644
index 0000000..c2f8f91
--- /dev/null
+++ b/tools/dom/templates/dart2js_maplike_impl.darttemplate
@@ -0,0 +1,67 @@
+// 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.
+
+part of $LIBRARYNAME;
+
+@DocsEditable()
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$MIXINS$IMPLEMENTS {
+$!MEMBERS
+
+  Map _getItem($KEYTYPE key) =>
+      convertNativeToDart_Dictionary(JS('', '#.get(#)', this, key));
+
+  void addAll(Map<$KEYTYPE, $VALUETYPE> other) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  bool containsValue($VALUETYPE value) => values.any((e) => e == value);
+
+  bool containsKey($VALUETYPE key) => _getItem(key) != null;
+
+  Map operator []($VALUETYPE key) => _getItem(key);
+
+  void forEach(void f($KEYTYPE key, $VALUETYPE value)) {
+    var entries = JS('', '#.entries()', this);
+    while (true) {
+      var entry = JS('', '#.next()', entries);
+      if (JS('bool', '#.done', entry)) return;
+      f(JS('$KEYTYPE', '#.value[0]', entry),
+          convertNativeToDart_Dictionary(JS('', '#.value[1]', entry)));
+    }
+  }
+
+  Iterable<$KEYTYPE> get keys {
+    final keys = <$KEYTYPE>[];
+    forEach((k, v) => keys.add(k));
+    return keys;
+  }
+
+  Iterable<Map> get values {
+    final values = <Map>[];
+    forEach((k, v) => values.add(v));
+    return values;
+  }
+
+  int get length => JS('int', '#.size', this);
+
+  bool get isEmpty => length == 0;
+
+  bool get isNotEmpty => !isEmpty;
+
+  void operator []=($KEYTYPE key, $VALUETYPE value) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  dynamic putIfAbsent($KEYTYPE key, $VALUETYPE ifAbsent()) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  $KEYTYPE remove($VALUETYPE key) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  void clear() {
+    throw new UnsupportedError("Not supported");
+  }
+}
diff --git a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
index 2baac67..2f5c1e9 100644
--- a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
@@ -121,6 +121,45 @@
 HtmlDocument get document =>
     JS('returns:HtmlDocument;depends:none;effects:none;gvn:true', 'document');
 
+// Supoort to convert JS Promise to a Dart Future.
+Future<T> promiseToFuture<T>(thePromise) {
+  var completer = new Completer<T>();
+
+  var thenSuccessCode = (promiseValue) => completer.complete(promiseValue);
+  var thenErrorCode = (promiseError) => completer.completeError(promiseError);
+
+  JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1), convertDartClosureToJS(thenErrorCode, 1));
+
+  return completer.future;
+}
+
+// Supoort to convert JS Promise to a Dart Future that returns a MapLike (Class with Map mixin).
+Future promiseToFutureMap(thePromise) {
+  var completer = new Completer();
+
+  var thenSuccessCode = (promiseValue) => completer.complete(promiseValue);
+  var thenErrorCode = (promiseError) => completer.completeError(promiseError);
+
+  JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1),
+      convertDartClosureToJS(thenErrorCode, 1));
+
+  return completer.future;
+}
+
+// Supoort to convert JS Promise to a Dart Future that returns a Dictionary as a Dart Map.
+Future<Map> promiseToFutureDictionary(thePromise) {
+  var completer = new Completer<Map>();
+
+  var thenSuccessCode = (promiseValue) =>
+      completer.complete(convertNativeToDart_Dictionary(promiseValue));
+  var thenErrorCode = (promiseError) => completer.completeError(promiseError);
+
+  JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1),
+      convertDartClosureToJS(thenErrorCode, 1));
+
+  return completer.future;
+}
+
 // Workaround for tags like <cite> that lack their own Element subclass --
 // Dart issue 1990.
 @Native("HTMLElement")
@@ -147,4 +186,3 @@
 @Experimental() // untriaged
 typedef void FontFaceSetForEachCallback(
     FontFace fontFace, FontFace fontFaceAgain, FontFaceSet set);
-
diff --git a/tools/dom/templates/html/impl/impl_RTCPeerConnection.darttemplate b/tools/dom/templates/html/impl/impl_RTCPeerConnection.darttemplate
index ae468155..c1ed25a 100644
--- a/tools/dom/templates/html/impl/impl_RTCPeerConnection.darttemplate
+++ b/tools/dom/templates/html/impl/impl_RTCPeerConnection.darttemplate
@@ -50,13 +50,6 @@
     return completer.future;
   }
 
-  @DomName('RTCPeerConnection.getStats')
-  Future<RtcStatsResponse> getStats(MediaStreamTrack selector) {
-    var completer = new Completer<RtcStatsResponse>();
-    _getStats((value) { completer.complete(value); }, selector);
-    return completer.future;
-  }
-
   @DomName('RTCPeerConnection.generateCertificate')
   @DocsEditable()
   @Experimental() // untriaged
diff --git a/tools/testing/dart/pubspec.yaml b/tools/testing/dart/pubspec.yaml
index 0bcb25f..4ddbba8 100644
--- a/tools/testing/dart/pubspec.yaml
+++ b/tools/testing/dart/pubspec.yaml
@@ -4,3 +4,4 @@
 
 # This file is only here that so certain Dart editors recognize this is a Dart
 # project.
+name: testing_tools
diff --git a/utils/application_snapshot.gni b/utils/application_snapshot.gni
index 096b944..3630bee 100644
--- a/utils/application_snapshot.gni
+++ b/utils/application_snapshot.gni
@@ -15,6 +15,37 @@
   }
 }
 
+# Creates an app-jit snapshot for a Dart program based on a training run.
+#
+# Parameters:
+#  main_dart (required):
+#    The entrypoint to the Dart application.
+#
+#  training_args (required):
+#    Arguments to pass to the Dart application for the training run.
+#
+#  dart_version (optional):
+#    Must be 1 or 2. Defaults to 1.
+#
+#  vm_args (optional):
+#    Additional arguments to the Dart VM. Do not put --preview-dart-2 here.
+#    Instead set dart_version = 2.
+#
+#  name (optional):
+#    The name of the snapshot if different from the target name. The output
+#    will be in $root_gen_dir/$name.dart.snapshot.
+#
+#  extra_deps (optional):
+#    Any additional build dependencies.
+#
+#  extra_inputs (optional):
+#    Any extra build inputs.
+#
+#  dot_packages (optional):
+#    The .packages file for the app. Defaults to the $_dart_root/.packages.
+#
+#  output (optional):
+#    Overrides the full output path.
 template("application_snapshot") {
   assert(defined(invoker.main_dart), "Must specify 'main_dart'")
   assert(defined(invoker.training_args), "Must specify 'training_args'")
@@ -45,8 +76,25 @@
   if (defined(invoker.output)) {
     output = invoker.output
   }
+  dart_version = 1
+  if (defined(invoker.dart_version)) {
+    dart_version = invoker.dart_version
+  }
+  assert(dart_version == 1 || dart_version == 2,
+      "For $target_name, dart_version must be 1 or 2")
   dart_action(target_name) {
     deps = extra_deps
+
+    if (dart_version == 2) {
+      # HACK: When creating app-jit snapshots for Dart 2 apps, the standalone
+      # Dart VM binary requires the app-jit snapshot for the kernel service to
+      # be adjacent to it. This deps ensures that it is there, but a different
+      # approach will be needed when the kernel service itself switches to
+      # Dart 2 to avoid creating a circular dependence.
+      deps += [ "$_dart_root/utils/kernel-service:copy_kernel_service_snapshot"]
+      snapshot_vm_args += [ "--preview-dart-2" ]
+    }
+
     depfile = "$output.d"
 
     script = main_dart
diff --git a/utils/bazel/kernel_summary_worker.dart b/utils/bazel/kernel_summary_worker.dart
index c572e88..2b1246b 100644
--- a/utils/bazel/kernel_summary_worker.dart
+++ b/utils/bazel/kernel_summary_worker.dart
@@ -14,8 +14,8 @@
 
 import 'package:args/args.dart';
 import 'package:bazel_worker/bazel_worker.dart';
+import 'package:build_integration/file_system/multi_root.dart';
 import 'package:front_end/src/api_unstable/summary_worker.dart' as fe;
-import 'package:front_end/src/multi_root_file_system.dart';
 import 'package:kernel/ast.dart' show Component, Library;
 import 'package:kernel/target/targets.dart';
 
diff --git a/utils/dartanalyzer/BUILD.gn b/utils/dartanalyzer/BUILD.gn
index e41c7f6..ff06c7b 100644
--- a/utils/dartanalyzer/BUILD.gn
+++ b/utils/dartanalyzer/BUILD.gn
@@ -21,6 +21,7 @@
                              "list lines")
 
 application_snapshot("generate_dartanalyzer_snapshot") {
+  dart_version = 2
   main_dart = "../../pkg/analyzer_cli/bin/analyzer.dart"
   training_args = [
     "--dart-sdk=" + rebase_path("../../sdk"),
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index 0c5c4e2..6165c85 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -11,9 +11,7 @@
 sdk_dill = "$target_gen_dir/kernel/ddc_sdk.dill"
 
 application_snapshot("dartdevc") {
-  vm_args = [
-    "--preview-dart-2",
-  ]
+  dart_version = 2
 
   main_dart = "../../pkg/dev_compiler/bin/dartdevc.dart"
 
diff --git a/utils/pub/BUILD.gn b/utils/pub/BUILD.gn
index f34a69a..0adf27a 100644
--- a/utils/pub/BUILD.gn
+++ b/utils/pub/BUILD.gn
@@ -10,9 +10,7 @@
 }
 
 application_snapshot("pub2") {
+  dart_version = 2
   main_dart = "../../third_party/pkg/pub/bin/pub.dart"
   training_args = [ "--help" ]
-  vm_args = [
-    "--preview-dart-2",
-  ]
 }
