diff --git a/BUILD.gn b/BUILD.gn
index b2dc62f..6d24c82 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -80,7 +80,7 @@
 }
 
 group("create_sdk") {
-  deps = [
+  public_deps = [
     "sdk:create_sdk",
   ]
 }
diff --git a/CHANGELOG.md b/CHANGELOG.md
index de609346..83e13f6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,5 @@
+## 2.0.0-dev.50.0
+
 ## 2.0.0-dev.49.0
 
 ### Tool Changes
@@ -11,6 +13,28 @@
 
 ## 2.0.0-dev.48.0
 
+### Language
+
+#### Strong Mode
+
+### Core library changes
+
+### Dart VM
+
+### Tool Changes
+
+#### Pub
+
+#### Other Tools
+
+## 2.0.0-dev.49.0
+
+## 2.0.0-dev.47.0
+
+### Tool Changes
+
+## 2.0.0-dev.48.0
+
 ### Core library changes
 
 * `dart:core`
diff --git a/DEPS b/DEPS
index 4ba2514..163bf8d 100644
--- a/DEPS
+++ b/DEPS
@@ -98,7 +98,7 @@
   "intl_tag": "@0.15.2",
   "jinja2_rev": "@2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_tag": "@2.0.6",
-  "linter_tag": "@0.1.48",
+  "linter_tag": "@0.1.49",
   "logging_tag": "@0.11.3+1",
   "markdown_tag": "@1.1.1",
   "matcher_tag": "@0.12.1+4",
diff --git a/build/config/sysroot.gni b/build/config/sysroot.gni
index ddee618..b1acdf6 100644
--- a/build/config/sysroot.gni
+++ b/build/config/sysroot.gni
@@ -16,17 +16,17 @@
 
 if (is_linux && dart_use_wheezy_sysroot) {
   if (current_cpu == "x86") {
-    target_sysroot = rebase_path("//build/linux/debian_wheezy_i386-sysroot")
+    target_sysroot = rebase_path("//build/linux/debian_wheezy_i386-sysroot", root_build_dir)
   } else if (current_cpu == "x64") {
     if (is_asan || is_lsan || is_msan || is_tsan) {
-      target_sysroot = rebase_path("//build/linux/debian_jessie_amd64-sysroot")
+      target_sysroot = rebase_path("//build/linux/debian_jessie_amd64-sysroot", root_build_dir)
     } else {
-      target_sysroot = rebase_path("//build/linux/debian_wheezy_amd64-sysroot")
+      target_sysroot = rebase_path("//build/linux/debian_wheezy_amd64-sysroot", root_build_dir)
     }
   } else if (current_cpu == "arm") {
-    target_sysroot = rebase_path("//build/linux/debian_wheezy_arm-sysroot")
+    target_sysroot = rebase_path("//build/linux/debian_wheezy_arm-sysroot", root_build_dir)
   } else if (current_cpu == "arm64") {
-    target_sysroot = rebase_path("//build/linux/debian_jessie_arm64-sysroot")
+    target_sysroot = rebase_path("//build/linux/debian_jessie_arm64-sysroot", root_build_dir)
   } else {
     print("There is no Debian wheezy sysroot present for $current_cpu")
     assert(false)
@@ -38,13 +38,13 @@
 } else if (is_android) {
   import("//build/config/android/config.gni")
   if (current_cpu == "x86") {
-    sysroot = rebase_path("$android_ndk_root/$x86_android_sysroot_subdir")
+    sysroot = rebase_path("$android_ndk_root/$x86_android_sysroot_subdir", root_build_dir)
   } else if (current_cpu == "arm") {
-    sysroot = rebase_path("$android_ndk_root/$arm_android_sysroot_subdir")
+    sysroot = rebase_path("$android_ndk_root/$arm_android_sysroot_subdir", root_build_dir)
   } else if (current_cpu == "x64") {
-    sysroot = rebase_path("$android_ndk_root/$x86_64_android_sysroot_subdir")
+    sysroot = rebase_path("$android_ndk_root/$x86_64_android_sysroot_subdir", root_build_dir)
   } else if (current_cpu == "arm64") {
-    sysroot = rebase_path("$android_ndk_root/$arm64_android_sysroot_subdir")
+    sysroot = rebase_path("$android_ndk_root/$arm64_android_sysroot_subdir", root_build_dir)
   } else {
     sysroot = ""
   }
diff --git a/pkg/analysis_server/benchmark/perf/flutter_analyze_benchmark.dart b/pkg/analysis_server/benchmark/perf/flutter_analyze_benchmark.dart
index 620c032..90fab47 100644
--- a/pkg/analysis_server/benchmark/perf/flutter_analyze_benchmark.dart
+++ b/pkg/analysis_server/benchmark/perf/flutter_analyze_benchmark.dart
@@ -70,6 +70,9 @@
       deleteServerCache();
     }
 
+    final String dartSdkPath =
+        path.dirname(path.dirname(Platform.resolvedExecutable));
+
     final Stopwatch stopwatch = new Stopwatch()..start();
 
     await _runProcess(
@@ -78,6 +81,8 @@
         'packages/flutter_tools/bin/flutter_tools.dart',
         'analyze',
         '--flutter-repo',
+        '--dart-sdk',
+        dartSdkPath,
       ],
       cwd: flutterDir.path,
       failOnError: false,
diff --git a/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart b/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart
index 1265b6b..06bbf6b 100644
--- a/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart
+++ b/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart
@@ -2,10 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
-
-import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     show SourceChange;
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
@@ -17,11 +13,6 @@
  */
 class Assist {
   /**
-   * An empty list of assists.
-   */
-  static const List<Assist> EMPTY_LIST = const <Assist>[];
-
-  /**
    * A comparator that can be used to sort assists by their relevance. The most
    * relevant assists will be sorted before assists with a lower relevance.
    * Assists with the same relevance are sorted alphabetically.
@@ -53,42 +44,3 @@
     return 'Assist(kind=$kind, change=$change)';
   }
 }
-
-/**
- * An object used to provide context information for [AssistContributor]s.
- *
- * Clients may not extend, implement or mix-in this class.
- */
-abstract class AssistContext {
-  /**
-   * The analysis driver used to access analysis results.
-   */
-  AnalysisDriver get analysisDriver;
-
-  /**
-   * The length of the selection.
-   */
-  int get selectionLength;
-
-  /**
-   * The start of the selection.
-   */
-  int get selectionOffset;
-
-  /**
-   * The source to get assists in.
-   */
-  Source get source;
-}
-
-/**
- * An object used to produce assists for a specific location.
- *
- * Clients may implement this class when implementing plugins.
- */
-abstract class AssistContributor {
-  /**
-   * Completes with a list of assists for the given [context].
-   */
-  Future<List<Assist>> computeAssists(AssistContext context);
-}
diff --git a/pkg/analysis_server/lib/plugin/edit/assist/assist_dart.dart b/pkg/analysis_server/lib/plugin/edit/assist/assist_dart.dart
index 44198cd..6e7020e 100644
--- a/pkg/analysis_server/lib/plugin/edit/assist/assist_dart.dart
+++ b/pkg/analysis_server/lib/plugin/edit/assist/assist_dart.dart
@@ -2,18 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
-
-import 'package:analysis_server/plugin/edit/assist/assist_core.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/analysis/ast_provider_driver.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/dart/element/ast_provider.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 
 /**
- * An object used to provide context information for [DartAssistContributor]s.
+ * An object used to provide context information for Dart assist contributors.
  *
  * Clients may not extend, implement or mix-in this class.
  */
@@ -24,11 +18,6 @@
   AnalysisDriver get analysisDriver;
 
   /**
-   * The provider for parsed or resolved ASTs.
-   */
-  AstProvider get astProvider;
-
-  /**
    * The length of the selection.
    */
   int get selectionLength;
@@ -48,60 +37,3 @@
    */
   CompilationUnit get unit;
 }
-
-/**
- * An [AssistContributor] that can be used to contribute assists for Dart files.
- *
- * Clients may extend this class when implementing plugins.
- */
-abstract class DartAssistContributor implements AssistContributor {
-  @override
-  Future<List<Assist>> computeAssists(AssistContext context) async {
-    AnalysisDriver driver = context.analysisDriver;
-    Source source = context.source;
-    if (!AnalysisEngine.isDartFileName(source.fullName)) {
-      return Assist.EMPTY_LIST;
-    }
-    CompilationUnit unit = (await driver.getResult(source.fullName)).unit;
-    if (unit == null) {
-      return Assist.EMPTY_LIST;
-    }
-    DartAssistContext dartContext = new _DartAssistContextImpl(
-        new AstProviderForDriver(driver), context, unit);
-    return internalComputeAssists(dartContext);
-  }
-
-  /**
-   * Completes with a list of assists for the given [context].
-   */
-  Future<List<Assist>> internalComputeAssists(DartAssistContext context);
-}
-
-/**
- * The implementation of [DartAssistContext].
- *
- * Clients may not extend, implement or mix-in this class.
- */
-class _DartAssistContextImpl implements DartAssistContext {
-  @override
-  final AstProvider astProvider;
-
-  final AssistContext _context;
-
-  @override
-  final CompilationUnit unit;
-
-  _DartAssistContextImpl(this.astProvider, this._context, this.unit);
-
-  @override
-  AnalysisDriver get analysisDriver => _context.analysisDriver;
-
-  @override
-  int get selectionLength => _context.selectionLength;
-
-  @override
-  int get selectionOffset => _context.selectionOffset;
-
-  @override
-  Source get source => _context.source;
-}
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 9b4578e..1e6b8d0 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -49,7 +49,6 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
-import 'package:analyzer/plugin/resolver_provider.dart';
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/context/context_root.dart';
 import 'package:analyzer/src/dart/analysis/ast_provider_driver.dart';
@@ -63,6 +62,7 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
+import 'package:analyzer/src/plugin/resolver_provider.dart';
 import 'package:analyzer/src/source/pub_package_map_provider.dart';
 import 'package:analyzer/src/util/glob.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
@@ -294,7 +294,7 @@
    * The controller for [onAnalysisSetChanged].
    */
   StreamController _onAnalysisSetChangedController =
-      new StreamController.broadcast();
+      new StreamController.broadcast(sync: true);
 
   /**
    * This exists as a temporary stopgap for plugins, until the official plugin
@@ -774,7 +774,8 @@
    * This means that it is absolute and normalized.
    */
   bool isValidFilePath(String path) {
-    return resourceProvider.absolutePathContext.isValid(path);
+    return resourceProvider.pathContext.isAbsolute(path) &&
+        resourceProvider.pathContext.normalize(path) == path;
   }
 
   /**
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index a1ad9b6..e949c17 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -11,27 +11,27 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
-import 'package:analyzer/plugin/resolver_provider.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/context/context_root.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/java_io.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/plugin/resolver_provider.dart';
 import 'package:analyzer/src/pubspec/pubspec_validator.dart';
 import 'package:analyzer/src/source/package_map_provider.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/source/path_filter.dart';
 import 'package:analyzer/src/source/pub_package_map_provider.dart';
 import 'package:analyzer/src/source/sdk_ext.dart';
 import 'package:analyzer/src/task/options.dart';
-import 'package:analyzer/src/util/absolute_path.dart';
 import 'package:analyzer/src/util/glob.dart';
 import 'package:analyzer/src/util/yaml.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as protocol;
@@ -441,13 +441,6 @@
   final DartSdkManager sdkManager;
 
   /**
-   * The context used to work with absolute file system paths.
-   *
-   * TODO(scheglov) remove [pathContext].
-   */
-  AbsolutePathContext absolutePathContext;
-
-  /**
    * The context used to work with file system paths.
    */
   pathos.Context pathContext;
@@ -532,7 +525,6 @@
       this.analyzedFilesGlobs,
       this._instrumentationService,
       this.defaultContextOptions) {
-    absolutePathContext = resourceProvider.absolutePathContext;
     pathContext = resourceProvider.pathContext;
   }
 
@@ -953,7 +945,7 @@
       String path, ContextInfo info, Folder folder) {
     // Check to see if this is the .packages file for this context and if so,
     // update the context's source factory.
-    if (absolutePathContext.basename(path) == PACKAGE_SPEC_NAME) {
+    if (pathContext.basename(path) == PACKAGE_SPEC_NAME) {
       String contextRoot = info.folder.path;
       ContextBuilder builder =
           callbacks.createContextBuilder(info.folder, defaultContextOptions);
@@ -1052,8 +1044,7 @@
       callbacks.computingPackageMap(true);
       try {
         // Try .packages first.
-        if (absolutePathContext.basename(packagespecFile.path) ==
-            PACKAGE_SPEC_NAME) {
+        if (pathContext.basename(packagespecFile.path) == PACKAGE_SPEC_NAME) {
           Packages packages = _readPackagespec(packagespecFile);
           return new PackagesFileDisposition(packages);
         }
@@ -1384,7 +1375,7 @@
       case ChangeType.ADD:
         Resource resource = resourceProvider.getResource(path);
 
-        String directoryPath = absolutePathContext.dirname(path);
+        String directoryPath = pathContext.dirname(path);
 
         // Check to see if we need to create a new context.
         if (info.isTopLevel) {
@@ -1394,8 +1385,7 @@
             if (_isPubspec(path)) {
               // Check for a sibling .packages file.
               if (!resourceProvider
-                  .getFile(absolutePathContext.append(
-                      directoryPath, PACKAGE_SPEC_NAME))
+                  .getFile(pathContext.join(directoryPath, PACKAGE_SPEC_NAME))
                   .exists) {
                 _extractContext(info, resource);
                 return;
@@ -1404,8 +1394,7 @@
             if (_isPackagespec(path)) {
               // Check for a sibling pubspec.yaml file.
               if (!resourceProvider
-                  .getFile(
-                      absolutePathContext.append(directoryPath, PUBSPEC_NAME))
+                  .getFile(pathContext.join(directoryPath, PUBSPEC_NAME))
                   .exists) {
                 _extractContext(info, resource);
                 return;
@@ -1429,15 +1418,14 @@
         // Note that it's important to verify that there is NEITHER a .packages nor a
         // lingering pubspec.yaml before merging.
         if (!info.isTopLevel) {
-          String directoryPath = absolutePathContext.dirname(path);
+          String directoryPath = pathContext.dirname(path);
 
           // Only merge if this is the same directory described by our info object.
           if (info.folder.path == directoryPath) {
             if (_isPubspec(path)) {
               // Check for a sibling .packages file.
               if (!resourceProvider
-                  .getFile(absolutePathContext.append(
-                      directoryPath, PACKAGE_SPEC_NAME))
+                  .getFile(pathContext.join(directoryPath, PACKAGE_SPEC_NAME))
                   .exists) {
                 _mergeContext(info);
                 return;
@@ -1446,8 +1434,7 @@
             if (_isPackagespec(path)) {
               // Check for a sibling pubspec.yaml file.
               if (!resourceProvider
-                  .getFile(
-                      absolutePathContext.append(directoryPath, PUBSPEC_NAME))
+                  .getFile(pathContext.join(directoryPath, PUBSPEC_NAME))
                   .exists) {
                 _mergeContext(info);
                 return;
@@ -1479,16 +1466,14 @@
    * context root [root], contains a folder whose name starts with '.'.
    */
   bool _isContainedInDotFolder(String root, String path) {
-    String pathDir = absolutePathContext.dirname(path);
-    String suffixPath = absolutePathContext.suffix(root, pathDir);
-    if (suffixPath == null) {
-      return false;
-    }
-    for (String pathComponent in absolutePathContext.split(suffixPath)) {
-      if (pathComponent.startsWith('.') &&
-          pathComponent != '.' &&
-          pathComponent != '..') {
-        return true;
+    String pathDir = pathContext.dirname(path);
+    String rootPrefix = root + pathContext.separator;
+    if (pathDir.startsWith(rootPrefix)) {
+      String suffixPath = pathDir.substring(rootPrefix.length);
+      for (String pathComponent in pathContext.split(suffixPath)) {
+        if (pathComponent.startsWith('.')) {
+          return true;
+        }
       }
     }
     return false;
@@ -1504,7 +1489,7 @@
    */
   bool _isExcludedBy(List<String> excludedPaths, String path) {
     return excludedPaths.any((excludedPath) {
-      if (absolutePathContext.isWithin(excludedPath, path)) {
+      if (pathContext.isWithin(excludedPath, path)) {
         return true;
       }
       return path == excludedPath;
@@ -1516,19 +1501,19 @@
    * context root [root].
    */
   bool _isInTopLevelDocDir(String root, String path) {
-    String suffixPath = absolutePathContext.suffix(root, path);
-    if (suffixPath == null) {
-      return false;
+    String rootPrefix = root + pathContext.separator;
+    if (path.startsWith(rootPrefix)) {
+      String suffix = path.substring(rootPrefix.length);
+      return suffix == DOC_DIR_NAME ||
+          suffix.startsWith(DOC_DIR_NAME + pathContext.separator);
     }
-    return suffixPath == DOC_DIR_NAME ||
-        suffixPath.startsWith(DOC_DIR_NAME + absolutePathContext.separator);
+    return false;
   }
 
   bool _isPackagespec(String path) =>
-      absolutePathContext.basename(path) == PACKAGE_SPEC_NAME;
+      pathContext.basename(path) == PACKAGE_SPEC_NAME;
 
-  bool _isPubspec(String path) =>
-      absolutePathContext.basename(path) == PUBSPEC_NAME;
+  bool _isPubspec(String path) => pathContext.basename(path) == PUBSPEC_NAME;
 
   /**
    * Merges [info] context into its parent.
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 22b7f36..77fd41b 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -169,12 +169,7 @@
       CompilationUnitElement compilationUnitElement =
           resolutionMap.elementDeclaredByCompilationUnit(unit);
       DartAssistContext dartAssistContext = new _DartAssistContextForValues(
-          compilationUnitElement.source,
-          offset,
-          length,
-          driver,
-          new AstProviderForDriver(driver),
-          unit);
+          compilationUnitElement.source, offset, length, driver, unit);
       try {
         AssistProcessor processor = new AssistProcessor(dartAssistContext);
         List<Assist> assists = await processor.compute();
@@ -652,13 +647,10 @@
   final AnalysisDriver analysisDriver;
 
   @override
-  final AstProvider astProvider;
-
-  @override
   final CompilationUnit unit;
 
   _DartAssistContextForValues(this.source, this.selectionOffset,
-      this.selectionLength, this.analysisDriver, this.astProvider, this.unit);
+      this.selectionLength, this.analysisDriver, this.unit);
 }
 
 /**
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart b/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
index 5d050de..6a96170 100644
--- a/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
+++ b/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/context/context_root.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/util/absolute_path.dart';
 import 'package:front_end/src/base/source.dart';
 import 'package:path/src/context.dart';
 
@@ -99,10 +98,9 @@
    * [driver].
    */
   String _getSdkPath(AnalysisDriver driver) {
-    AbsolutePathContext context = resourceProvider.absolutePathContext;
     String sdkRoot = driver.sourceFactory.forUri('dart:core').fullName;
-    while (context.basename(sdkRoot) != 'lib') {
-      String parent = context.dirname(sdkRoot);
+    while (resourceProvider.pathContext.basename(sdkRoot) != 'lib') {
+      String parent = resourceProvider.pathContext.dirname(sdkRoot);
       if (parent == sdkRoot) {
         break;
       }
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 8ae5367..e111a67 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -17,11 +17,11 @@
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/instrumentation/file_instrumentation.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
-import 'package:analyzer/plugin/resolver_provider.dart';
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/plugin/resolver_provider.dart';
 import 'package:args/args.dart';
 import 'package:linter/src/rules.dart' as linter;
 import 'package:plugin/manager.dart';
diff --git a/pkg/analysis_server/lib/src/services/correction/assist.dart b/pkg/analysis_server/lib/src/services/correction/assist.dart
index 8902596..7767e39 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist.dart
@@ -2,37 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/plugin/edit/assist/assist_core.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 
 /**
- * The implementation of [AssistContext].
- */
-class AssistContextImpl implements AssistContext {
-  @override
-  final AnalysisDriver analysisDriver;
-
-  @override
-  final Source source;
-
-  @override
-  final int selectionOffset;
-
-  @override
-  final int selectionLength;
-
-  AssistContextImpl(this.analysisDriver, this.source, this.selectionOffset,
-      this.selectionLength);
-}
-
-/**
  * An enumeration of possible assist kinds.
  */
 class DartAssistKind {
-  static const ADD_PART_DIRECTIVE = const AssistKind(
-      'dart.assist.addPartDirective', 30, "Add 'part' directive");
   static const ADD_TYPE_ANNOTATION = const AssistKind(
       'dart.assist.addTypeAnnotation', 30, "Add type annotation");
   static const ASSIGN_TO_LOCAL_VARIABLE = const AssistKind(
@@ -87,8 +62,6 @@
       const AssistKind('dart.assist.encapsulateField', 30, "Encapsulate field");
   static const EXCHANGE_OPERANDS =
       const AssistKind('dart.assist.exchangeOperands', 30, "Exchange operands");
-  static const EXTRACT_CLASS = const AssistKind(
-      'dart.assist.extractClass', 30, "Extract class into file '{0}'");
   static const FLUTTER_CONVERT_TO_CHILDREN = const AssistKind(
       'dart.assist.flutter.convert.childToChildren',
       30,
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 d7b5b78..d9ae917 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -64,8 +64,6 @@
   CompilationUnitElement unitElement;
 
   LibraryElement unitLibraryElement;
-  String unitLibraryFile;
-  String unitLibraryFolder;
 
   int selectionOffset;
   int selectionLength;
@@ -93,8 +91,6 @@
     unitLibraryElement = resolutionMap
         .elementDeclaredByCompilationUnit(dartContext.unit)
         .library;
-    unitLibraryFile = unitLibraryElement.source.fullName;
-    unitLibraryFolder = dirname(unitLibraryFile);
     // selection
     selectionOffset = dartContext.selectionOffset;
     selectionLength = dartContext.selectionLength;
@@ -1237,17 +1233,39 @@
           }
         }
       }
-      // add accessors
-      String eol2 = eol + eol;
-      String typeNameCode = variableList.type != null
-          ? _getNodeText(variableList.type) + ' '
-          : '';
-      String getterCode = '$eol2  ${typeNameCode}get $name => _$name;';
-      String setterCode = '$eol2'
-          '  void set $name($typeNameCode$name) {$eol'
-          '    _$name = $name;$eol'
-          '  }';
-      builder.addSimpleInsertion(fieldDeclaration.end, getterCode + setterCode);
+
+      // Write getter and setter.
+      builder.addInsertion(fieldDeclaration.end, (builder) {
+        String docCode;
+        if (fieldDeclaration.documentationComment != null) {
+          docCode = utils.getNodeText(fieldDeclaration.documentationComment);
+        }
+
+        String typeCode = '';
+        if (variableList.type != null) {
+          typeCode = _getNodeText(variableList.type) + ' ';
+        }
+
+        // Write getter.
+        builder.writeln();
+        builder.writeln();
+        if (docCode != null) {
+          builder.write('  ');
+          builder.writeln(docCode);
+        }
+        builder.write('  ${typeCode}get $name => _$name;');
+
+        // Write setter.
+        builder.writeln();
+        builder.writeln();
+        if (docCode != null) {
+          builder.write('  ');
+          builder.writeln(docCode);
+        }
+        builder.writeln('  set $name($typeCode$name) {');
+        builder.writeln('    _$name = $name;');
+        builder.write('  }');
+      });
     });
     _addAssistFromBuilder(changeBuilder, DartAssistKind.ENCAPSULATE_FIELD);
   }
@@ -3132,21 +3150,6 @@
   }
 }
 
-/**
- * An [AssistContributor] that provides the default set of assists.
- */
-class DefaultAssistContributor extends DartAssistContributor {
-  @override
-  Future<List<Assist>> internalComputeAssists(DartAssistContext context) async {
-    try {
-      AssistProcessor processor = new AssistProcessor(context);
-      return processor.compute();
-    } on CancelCorrectionException {
-      return Assist.EMPTY_LIST;
-    }
-  }
-}
-
 class _SimpleIdentifierRecursiveAstVisitor extends RecursiveAstVisitor {
   final _SimpleIdentifierVisitor visitor;
 
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 3cdcf21..869f385 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -2393,7 +2393,7 @@
     final thisExpression = node is ThisExpression
         ? node
         : node.getAncestor((node) => node is ThisExpression);
-    final parent = thisExpression.parent;
+    final parent = thisExpression?.parent;
     if (parent is PropertyAccess) {
       DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index d138f3e..f64cecb 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -9,8 +9,8 @@
 import 'package:analysis_server/src/server/diagnostic_server.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
-import 'package:analyzer/plugin/resolver_provider.dart';
 import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/plugin/resolver_provider.dart';
 import 'package:analyzer/src/source/pub_package_map_provider.dart';
 
 /**
diff --git a/pkg/analysis_server/lib/src/status/diagnostics.dart b/pkg/analysis_server/lib/src/status/diagnostics.dart
index b3050c4..ac435fd 100644
--- a/pkg/analysis_server/lib/src/status/diagnostics.dart
+++ b/pkg/analysis_server/lib/src/status/diagnostics.dart
@@ -22,7 +22,6 @@
 import 'package:analysis_server/src/utilities/profiling.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/context/context_root.dart';
 import 'package:analyzer/src/context/source.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
@@ -35,6 +34,7 @@
 import 'package:analyzer/src/lint/linter.dart';
 import 'package:analyzer/src/lint/registry.dart';
 import 'package:analyzer/src/services/lint.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/source/sdk_ext.dart';
 import 'package:path/path.dart' as pathPackage;
 
diff --git a/pkg/analysis_server/lib/starter.dart b/pkg/analysis_server/lib/starter.dart
index cca06da..5059a59 100644
--- a/pkg/analysis_server/lib/starter.dart
+++ b/pkg/analysis_server/lib/starter.dart
@@ -5,7 +5,7 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/server/driver.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
-import 'package:analyzer/plugin/resolver_provider.dart';
+import 'package:analyzer/src/plugin/resolver_provider.dart';
 
 /**
  * An object that can be used to start an analysis server. This class exists so
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index 8e99e48..dccf6a6 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -9,14 +9,15 @@
 import 'package:analyzer/dart/element/visitor.dart';
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/context/context_root.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/engine.dart' as engine;
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:front_end/src/api_prototype/byte_store.dart';
 import 'package:front_end/src/base/performance_logger.dart';
diff --git a/pkg/analysis_server/lib/src/constants.dart b/pkg/analysis_server/test/constants.dart
similarity index 100%
rename from pkg/analysis_server/lib/src/constants.dart
rename to pkg/analysis_server/test/constants.dart
diff --git a/pkg/analysis_server/test/domain_completion_util.dart b/pkg/analysis_server/test/domain_completion_util.dart
index 0a6a543..996b070 100644
--- a/pkg/analysis_server/test/domain_completion_util.dart
+++ b/pkg/analysis_server/test/domain_completion_util.dart
@@ -7,13 +7,13 @@
 import 'package:analysis_server/protocol/protocol.dart';
 import 'package:analysis_server/protocol/protocol_constants.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
-import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/domain_completion.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
 
 import 'analysis_abstract.dart';
+import 'constants.dart';
 
 class AbstractCompletionDomainTest extends AbstractAnalysisTest {
   String completionId;
diff --git a/pkg/analysis_server/test/domain_server_test.dart b/pkg/analysis_server/test/domain_server_test.dart
index c4aeebd..06d1c3e 100644
--- a/pkg/analysis_server/test/domain_server_test.dart
+++ b/pkg/analysis_server/test/domain_server_test.dart
@@ -6,13 +6,13 @@
 import 'package:analysis_server/protocol/protocol_constants.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/domain_server.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:test/test.dart';
 
+import 'constants.dart';
 import 'mocks.dart';
 
 main() {
diff --git a/pkg/analysis_server/test/protocol_server_test.dart b/pkg/analysis_server/test/protocol_server_test.dart
index 0019aa2..421000a 100644
--- a/pkg/analysis_server/test/protocol_server_test.dart
+++ b/pkg/analysis_server/test/protocol_server_test.dart
@@ -4,7 +4,6 @@
 
 import 'dart:mirrors';
 
-import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/dart/ast/ast.dart' as engine;
@@ -17,6 +16,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'constants.dart';
 import 'mocks.dart';
 
 main() {
diff --git a/pkg/analysis_server/test/protocol_test.dart b/pkg/analysis_server/test/protocol_test.dart
index 7d7e995..af72494 100644
--- a/pkg/analysis_server/test/protocol_test.dart
+++ b/pkg/analysis_server/test/protocol_test.dart
@@ -6,11 +6,12 @@
 
 import 'package:analysis_server/protocol/protocol.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
-import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol/protocol_internal.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'constants.dart';
+
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NotificationTest);
diff --git a/pkg/analysis_server/test/services/correction/assist_test.dart b/pkg/analysis_server/test/services/correction/assist_test.dart
index cb974b3..6600839e 100644
--- a/pkg/analysis_server/test/services/correction/assist_test.dart
+++ b/pkg/analysis_server/test/services/correction/assist_test.dart
@@ -11,9 +11,7 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/analysis/ast_provider_driver.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/dart/element/ast_provider.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -2564,6 +2562,33 @@
     await assertNoAssistAt('test =', DartAssistKind.ENCAPSULATE_FIELD);
   }
 
+  test_encapsulateField_OK_documentation() async {
+    await resolveTestUnit('''
+class A {
+  /// AAA
+  /// BBB
+  int test;
+}
+''');
+    await assertHasAssistAt('test;', DartAssistKind.ENCAPSULATE_FIELD, '''
+class A {
+  /// AAA
+  /// BBB
+  int _test;
+
+  /// AAA
+  /// BBB
+  int get test => _test;
+
+  /// AAA
+  /// BBB
+  set test(int test) {
+    _test = test;
+  }
+}
+''');
+  }
+
   test_encapsulateField_OK_hasType() async {
     await resolveTestUnit('''
 class A {
@@ -2580,7 +2605,7 @@
 
   int get test => _test;
 
-  void set test(int test) {
+  set test(int test) {
     _test = test;
   }
   A(this._test);
@@ -2606,7 +2631,7 @@
 
   get test => _test;
 
-  void set test(test) {
+  set test(test) {
     _test = test;
   }
 }
@@ -5769,8 +5794,8 @@
     CompilationUnitElement testUnitElement =
         resolutionMap.elementDeclaredByCompilationUnit(testUnit);
     DartAssistContext assistContext;
-    assistContext = new _DartAssistContextForValues(testUnitElement.source,
-        offset, length, driver, new AstProviderForDriver(driver), testUnit);
+    assistContext = new _DartAssistContextForValues(
+        testUnitElement.source, offset, length, driver, testUnit);
     AssistProcessor processor = new AssistProcessor(assistContext);
     return await processor.compute();
   }
@@ -5809,11 +5834,8 @@
   final AnalysisDriver analysisDriver;
 
   @override
-  final AstProvider astProvider;
-
-  @override
   final CompilationUnit unit;
 
   _DartAssistContextForValues(this.source, this.selectionOffset,
-      this.selectionLength, this.analysisDriver, this.astProvider, this.unit);
+      this.selectionLength, this.analysisDriver, this.unit);
 }
diff --git a/pkg/analysis_server/test/services/correction/change_test.dart b/pkg/analysis_server/test/services/correction/change_test.dart
index 0dc019b..d11aabd 100644
--- a/pkg/analysis_server/test/services/correction/change_test.dart
+++ b/pkg/analysis_server/test/services/correction/change_test.dart
@@ -2,12 +2,13 @@
 // 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:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../constants.dart';
+
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ChangeTest);
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index 9903039..426ff09 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -12,13 +12,13 @@
 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/dart/analysis/ast_provider_driver.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/element/ast_provider.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     hide AnalysisError;
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
@@ -6901,6 +6901,17 @@
 ''');
   }
 
+  test_removeThisExpression_notAThisExpression() async {
+    String src = '''
+void foo() {
+  final /*LINT*/this.id;
+}
+''';
+    await findLint(src, LintNames.unnecessary_this);
+
+    await assertNoFix(DartFixKind.REMOVE_THIS_EXPRESSION);
+  }
+
   test_removeThisExpression_propertyAccess_oneCharacterOperator() async {
     String src = '''
 class A {
diff --git a/pkg/analysis_server/test/services/search/search_engine_test.dart b/pkg/analysis_server/test/services/search/search_engine_test.dart
index 1e93e6a..bfa202a 100644
--- a/pkg/analysis_server/test/services/search/search_engine_test.dart
+++ b/pkg/analysis_server/test/services/search/search_engine_test.dart
@@ -7,13 +7,13 @@
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analysis_server/src/services/search/search_engine_internal.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:front_end/src/api_prototype/byte_store.dart';
 import 'package:front_end/src/base/performance_logger.dart';
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 8b7669b..8c372a6 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
@@ -10,13 +10,13 @@
 import 'package:analysis_server/src/plugin/plugin_watcher.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/context/context_root.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:front_end/src/api_prototype/byte_store.dart';
 import 'package:front_end/src/base/performance_logger.dart';
diff --git a/pkg/analyzer/benchmark/errors_in_all_libraries.dart b/pkg/analyzer/benchmark/errors_in_all_libraries.dart
index d46edba..57b512b 100644
--- a/pkg/analyzer/benchmark/errors_in_all_libraries.dart
+++ b/pkg/analyzer/benchmark/errors_in_all_libraries.dart
@@ -11,14 +11,14 @@
 
 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/source/source_resource.dart';
 import 'package:path/path.dart' as p;
 
diff --git a/pkg/analyzer/example/resolver_driver.dart b/pkg/analyzer/example/resolver_driver.dart
index cf68857..6c972a8 100755
--- a/pkg/analyzer/example/resolver_driver.dart
+++ b/pkg/analyzer/example/resolver_driver.dart
@@ -8,15 +8,15 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/file_system/file_system.dart' hide File;
 import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/source/source_resource.dart';
 
 void main(List<String> args) {
diff --git a/pkg/analyzer/lib/analyzer.dart b/pkg/analyzer/lib/analyzer.dart
index 303cc88..ab46a8d 100644
--- a/pkg/analyzer/lib/analyzer.dart
+++ b/pkg/analyzer/lib/analyzer.dart
@@ -2,18 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer;
-
 import 'dart:io';
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
-import 'package:analyzer/file_system/file_system.dart' hide File;
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/src/dart/scanner/reader.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
 import 'package:analyzer/src/error.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/string_source.dart';
diff --git a/pkg/analyzer/lib/context/context_root.dart b/pkg/analyzer/lib/context/context_root.dart
new file mode 100644
index 0000000..7625503
--- /dev/null
+++ b/pkg/analyzer/lib/context/context_root.dart
@@ -0,0 +1,8 @@
+// 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.
+
+@deprecated
+library context.context_root;
+
+export 'package:analyzer/src/context/context_root.dart';
diff --git a/pkg/analyzer/lib/file_system/file_system.dart b/pkg/analyzer/lib/file_system/file_system.dart
index 687380f..89da122 100644
--- a/pkg/analyzer/lib/file_system/file_system.dart
+++ b/pkg/analyzer/lib/file_system/file_system.dart
@@ -2,15 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer.file_system.file_system;
-
 import 'dart:async';
 
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/util/absolute_path.dart';
 import 'package:path/path.dart';
 import 'package:watcher/watcher.dart';
 
+export 'package:analyzer/src/file_system/file_system.dart';
+
 /**
  * [File]s are leaf [Resource]s which contain data.
  */
@@ -226,11 +225,6 @@
  */
 abstract class ResourceProvider {
   /**
-   * Get the absolute path context used by this resource provider.
-   */
-  AbsolutePathContext get absolutePathContext;
-
-  /**
    * Get the path context used by this resource provider.
    */
   Context get pathContext;
@@ -271,41 +265,3 @@
    */
   Folder getStateLocation(String pluginId);
 }
-
-/**
- * A [UriResolver] for [Resource]s.
- */
-class ResourceUriResolver extends UriResolver {
-  /**
-   * The name of the `file` scheme.
-   */
-  static final String FILE_SCHEME = "file";
-
-  final ResourceProvider _provider;
-
-  ResourceUriResolver(this._provider);
-
-  ResourceProvider get provider => _provider;
-
-  @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
-    if (!isFileUri(uri)) {
-      return null;
-    }
-    String path = _provider.pathContext.fromUri(uri);
-    Resource resource = _provider.getResource(path);
-    if (resource is File) {
-      return resource.createSource(actualUri ?? uri);
-    }
-    return null;
-  }
-
-  @override
-  Uri restoreAbsolute(Source source) =>
-      _provider.pathContext.toUri(source.fullName);
-
-  /**
-   * Return `true` if the given [uri] is a `file` URI.
-   */
-  static bool isFileUri(Uri uri) => uri.scheme == FILE_SCHEME;
-}
diff --git a/pkg/analyzer/lib/file_system/memory_file_system.dart b/pkg/analyzer/lib/file_system/memory_file_system.dart
index 4c05644..0c5c8b6 100644
--- a/pkg/analyzer/lib/file_system/memory_file_system.dart
+++ b/pkg/analyzer/lib/file_system/memory_file_system.dart
@@ -12,7 +12,6 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/source/source_resource.dart';
-import 'package:analyzer/src/util/absolute_path.dart';
 import 'package:path/path.dart' as pathos;
 import 'package:watcher/watcher.dart';
 
@@ -31,9 +30,6 @@
 
   final pathos.Context _pathContext;
 
-  @override
-  final AbsolutePathContext absolutePathContext;
-
   MemoryResourceProvider(
       {pathos.Context context, @deprecated bool isWindows: false})
       : _pathContext = (context ??= pathos.style == pathos.Style.windows
@@ -41,9 +37,7 @@
             // the drive inserted by MemoryResourceProvider.convertPath
             // so that packages are mapped to the correct drive
             ? new pathos.Context(current: 'C:\\')
-            : pathos.context),
-        absolutePathContext =
-            new AbsolutePathContext(context.style == pathos.Style.windows);
+            : pathos.context);
 
   @override
   pathos.Context get pathContext => _pathContext;
diff --git a/pkg/analyzer/lib/file_system/physical_file_system.dart b/pkg/analyzer/lib/file_system/physical_file_system.dart
index a5d2a99..db86404 100644
--- a/pkg/analyzer/lib/file_system/physical_file_system.dart
+++ b/pkg/analyzer/lib/file_system/physical_file_system.dart
@@ -11,11 +11,28 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/source/source_resource.dart';
-import 'package:analyzer/src/util/absolute_path.dart';
 import 'package:path/path.dart';
 import 'package:watcher/watcher.dart';
 
 /**
+ * The name of the directory containing plugin specific subfolders used to
+ * store data across sessions.
+ */
+const String _SERVER_DIR = ".dartServer";
+
+/**
+ * Returns the path to the user's home directory.
+ */
+String _getStandardStateLocation() {
+  final home = io.Platform.isWindows
+      ? io.Platform.environment['LOCALAPPDATA']
+      : io.Platform.environment['HOME'];
+  return home != null && io.FileSystemEntity.isDirectorySync(home)
+      ? join(home, _SERVER_DIR)
+      : null;
+}
+
+/**
  * Return modification times for every file path in [paths].
  *
  * If a path is `null`, the modification time is also `null`.
@@ -39,28 +56,10 @@
 }
 
 /**
- * The name of the directory containing plugin specific subfolders used to
- * store data across sessions.
- */
-const String _SERVER_DIR = ".dartServer";
-
-/**
- * Returns the path to the user's home directory.
- */
-String _getStandardStateLocation() {
-  final home = io.Platform.isWindows
-      ? io.Platform.environment['LOCALAPPDATA']
-      : io.Platform.environment['HOME'];
-  return home != null && io.FileSystemEntity.isDirectorySync(home)
-      ? join(home, _SERVER_DIR)
-      : null;
-}
-
-/**
  * A `dart:io` based implementation of [ResourceProvider].
  */
 class PhysicalResourceProvider implements ResourceProvider {
-  static final FileReadMode NORMALIZE_EOL_ALWAYS =
+  static final String Function(String) NORMALIZE_EOL_ALWAYS =
       (String string) => string.replaceAll(new RegExp('\r\n?'), '\n');
 
   static final PhysicalResourceProvider INSTANCE =
@@ -71,11 +70,8 @@
    */
   final String _stateLocation;
 
-  @override
-  final AbsolutePathContext absolutePathContext =
-      new AbsolutePathContext(io.Platform.isWindows);
-
-  PhysicalResourceProvider(FileReadMode fileReadMode, {String stateLocation})
+  PhysicalResourceProvider(String Function(String) fileReadMode,
+      {String stateLocation})
       : _stateLocation = stateLocation ?? _getStandardStateLocation() {
     if (fileReadMode != null) {
       FileBasedSource.fileReadMode = fileReadMode;
@@ -256,7 +252,7 @@
 
   @override
   bool contains(String path) {
-    return absolutePathContext.isWithin(this.path, path);
+    return pathContext.isWithin(this.path, path);
   }
 
   @override
@@ -345,9 +341,6 @@
 
   _PhysicalResource(this._entry);
 
-  AbsolutePathContext get absolutePathContext =>
-      PhysicalResourceProvider.INSTANCE.absolutePathContext;
-
   @override
   bool get exists => _entry.existsSync();
 
@@ -356,7 +349,7 @@
 
   @override
   Folder get parent {
-    String parentPath = absolutePathContext.dirname(path);
+    String parentPath = pathContext.dirname(path);
     if (parentPath == path) {
       return null;
     }
@@ -372,7 +365,7 @@
   Context get pathContext => io.Platform.isWindows ? windows : posix;
 
   @override
-  String get shortName => absolutePathContext.basename(path);
+  String get shortName => pathContext.basename(path);
 
   @override
   bool operator ==(other) {
diff --git a/pkg/analyzer/lib/plugin/resolver_provider.dart b/pkg/analyzer/lib/plugin/resolver_provider.dart
index 33bb366..3c22554 100644
--- a/pkg/analyzer/lib/plugin/resolver_provider.dart
+++ b/pkg/analyzer/lib/plugin/resolver_provider.dart
@@ -2,14 +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.
 
+@deprecated
 library analyzer.plugin.resolver_provider;
 
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/generated/source.dart';
-
-/**
- * A function that will return a [UriResolver] that can be used to resolve a
- * specific kind of URI within the analysis context rooted at the given
- * [folder].
- */
-typedef UriResolver ResolverProvider(Folder folder);
+export 'package:analyzer/src/plugin/resolver_provider.dart';
diff --git a/pkg/analyzer/lib/source/line_info.dart b/pkg/analyzer/lib/source/line_info.dart
index 38ac611..47661a2 100644
--- a/pkg/analyzer/lib/source/line_info.dart
+++ b/pkg/analyzer/lib/source/line_info.dart
@@ -62,8 +62,13 @@
 
   /**
    * Return the location information for the character at the given [offset].
+   *
+   * A future version of this API will return a [CharacterLocation] rather than
+        // ignore: deprecated_member_use
+   * a [LineInfo_Location].
    */
-  CharacterLocation getLocation(int offset) {
+  // ignore: deprecated_member_use
+  LineInfo_Location getLocation(int offset) {
     var min = 0;
     var max = lineStarts.length - 1;
 
diff --git a/pkg/analyzer/lib/source/package_map_resolver.dart b/pkg/analyzer/lib/source/package_map_resolver.dart
index 3eeda21..6a1d230 100644
--- a/pkg/analyzer/lib/source/package_map_resolver.dart
+++ b/pkg/analyzer/lib/source/package_map_resolver.dart
@@ -2,100 +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.
 
-library analyzer.source.package_map_resolver;
+@deprecated
+library src.source.package_map_provider;
 
-import 'dart:core';
-
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/util/asserts.dart' as asserts;
-import 'package:path/path.dart' as pathos;
-
-/**
- * A [UriResolver] implementation for the `package:` scheme that uses a map of
- * package names to their directories.
- */
-class PackageMapUriResolver extends UriResolver {
-  /**
-   * The name of the `package` scheme.
-   */
-  static const String PACKAGE_SCHEME = "package";
-
-  /**
-   * A table mapping package names to the path of the directories containing
-   * the package.
-   */
-  final Map<String, List<Folder>> packageMap;
-
-  /**
-   * The [ResourceProvider] for this resolver.
-   */
-  final ResourceProvider resourceProvider;
-
-  /**
-   * Create a new [PackageMapUriResolver].
-   *
-   * [packageMap] is a table mapping package names to the paths of the
-   * directories containing the package
-   */
-  PackageMapUriResolver(this.resourceProvider, this.packageMap) {
-    asserts.notNull(resourceProvider);
-    asserts.notNull(packageMap);
-    packageMap.forEach((name, folders) {
-      if (folders.length != 1) {
-        throw new ArgumentError(
-            'Exactly one folder must be specified for a package.'
-            'Found $name = $folders');
-      }
-    });
-  }
-
-  @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
-    if (!isPackageUri(uri)) {
-      return null;
-    }
-    // Prepare path.
-    String path = uri.path;
-    // Prepare path components.
-    int index = path.indexOf('/');
-    if (index == -1 || index == 0) {
-      return null;
-    }
-    // <pkgName>/<relPath>
-    String pkgName = path.substring(0, index);
-    String relPath = path.substring(index + 1);
-    // If the package is known, return the corresponding file.
-    List<Folder> packageDirs = packageMap[pkgName];
-    if (packageDirs != null) {
-      Folder packageDir = packageDirs.single;
-      File file = packageDir.getChildAssumingFile(relPath);
-      return file.createSource(uri);
-    }
-    return null;
-  }
-
-  @override
-  Uri restoreAbsolute(Source source) {
-    String sourcePath = source.fullName;
-    pathos.Context pathContext = resourceProvider.pathContext;
-    for (String pkgName in packageMap.keys) {
-      Folder pkgFolder = packageMap[pkgName][0];
-      String pkgFolderPath = pkgFolder.path;
-      if (sourcePath.startsWith(pkgFolderPath + pathContext.separator)) {
-        String relPath = sourcePath.substring(pkgFolderPath.length + 1);
-        List<String> relPathComponents = pathContext.split(relPath);
-        String relUriPath = pathos.posix.joinAll(relPathComponents);
-        return Uri.parse('$PACKAGE_SCHEME:$pkgName/$relUriPath');
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Returns `true` if [uri] is a `package` URI.
-   */
-  static bool isPackageUri(Uri uri) {
-    return uri.scheme == PACKAGE_SCHEME;
-  }
-}
+export 'package:analyzer/src/source/package_map_resolver.dart';
diff --git a/pkg/analyzer/lib/src/context/builder.dart b/pkg/analyzer/lib/src/context/builder.dart
index 2aee1c4..5b3e1db 100644
--- a/pkg/analyzer/lib/src/context/builder.dart
+++ b/pkg/analyzer/lib/src/context/builder.dart
@@ -7,8 +7,6 @@
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/plugin/resolver_provider.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
 import 'package:analyzer/src/command_line/arguments.dart'
     show
@@ -21,6 +19,7 @@
     show AnalysisDriver, AnalysisDriverScheduler;
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/bazel.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/gn.dart';
@@ -28,7 +27,9 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/workspace.dart';
 import 'package:analyzer/src/lint/registry.dart';
+import 'package:analyzer/src/plugin/resolver_provider.dart';
 import 'package:analyzer/src/services/lint.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/summary/summary_sdk.dart';
 import 'package:analyzer/src/task/options.dart';
 import 'package:analyzer/src/util/sdk.dart';
diff --git a/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart
index a70c50e5..4ccf4cd 100644
--- a/pkg/analyzer/lib/src/context/context.dart
+++ b/pkg/analyzer/lib/src/context/context.dart
@@ -9,7 +9,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/exception/exception.dart';
-import 'package:analyzer/plugin/resolver_provider.dart';
 import 'package:analyzer/src/cancelable_future.dart';
 import 'package:analyzer/src/context/builder.dart' show EmbedderYamlLocator;
 import 'package:analyzer/src/context/cache.dart';
@@ -20,6 +19,7 @@
 import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_collection.dart';
+import 'package:analyzer/src/plugin/resolver_provider.dart';
 import 'package:analyzer/src/plugin/task.dart';
 import 'package:analyzer/src/task/api/dart.dart';
 import 'package:analyzer/src/task/api/general.dart';
diff --git a/pkg/analyzer/lib/src/context/source.dart b/pkg/analyzer/lib/src/context/source.dart
index 9ea1d7d..ad7bdaa 100644
--- a/pkg/analyzer/lib/src/context/source.dart
+++ b/pkg/analyzer/lib/src/context/source.dart
@@ -2,19 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer.src.context.source;
-
 import 'dart:collection';
 import 'dart:math' show min;
 
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart' as utils;
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:package_config/packages.dart';
 
 /**
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 91c19a8..d48b1d6 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 = 56;
+  static const int DATA_VERSION = 57;
 
   /**
    * The number of exception contexts allowed to write. Once this field is
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 89b8073..e16375c 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -675,7 +675,7 @@
     // TODO(scheglov) remove EnumMemberBuilder class
 
     new TypeParameterBoundsResolver(
-            _typeProvider, _libraryElement, source, errorListener)
+            _context.typeSystem, _libraryElement, source, errorListener)
         .resolveTypeBounds(unit);
 
     unit.accept(new TypeResolverVisitor(
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 56eb475..c3dba9c 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -1792,7 +1792,7 @@
         isEqualTokens(node.modifierKeyword, other.modifierKeyword) &&
         isEqualNodes(node.returnType, other.returnType) &&
         isEqualTokens(node.propertyKeyword, other.propertyKeyword) &&
-        isEqualTokens(node.propertyKeyword, other.propertyKeyword) &&
+        isEqualTokens(node.operatorKeyword, other.operatorKeyword) &&
         isEqualNodes(node.name, other.name) &&
         isEqualNodes(node.parameters, other.parameters) &&
         isEqualNodes(node.body, other.body);
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index a651d07..5d91528 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -16,6 +16,8 @@
 import 'package:analyzer/src/generated/type_system.dart';
 import 'package:analyzer/src/generated/utilities_collection.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:analyzer/src/summary/resynthesize.dart'
+    show RecursiveInstantiateToBounds;
 
 /**
  * Type of callbacks used by [DeferredFunctionTypeImpl].
@@ -1691,7 +1693,11 @@
   @override
   List<DartType> get typeArguments {
     if (_typeArguments == null) {
-      _typeArguments = _typeArgumentsComputer();
+      try {
+        _typeArguments = _typeArgumentsComputer();
+      } on RecursiveInstantiateToBounds {
+        _hasTypeParameterReferenceInBound = true;
+      }
       _typeArgumentsComputer = null;
     }
     return _typeArguments;
@@ -2597,6 +2603,11 @@
   final String name;
 
   /**
+   * The cached value for [hasTypeParameterReferenceInBound].
+   */
+  bool _hasTypeParameterReferenceInBound;
+
+  /**
    * Initialize a newly created type to be declared by the given [element] and
    * to have the given [name].
    */
@@ -2608,6 +2619,46 @@
   @override
   Element get element => _element;
 
+  /**
+   * Return `true` if the type is parameterized and has a type parameter with
+   * the bound that references a type parameter.
+   */
+  bool get hasTypeParameterReferenceInBound {
+    if (_hasTypeParameterReferenceInBound == null) {
+      bool hasTypeParameterReference(DartType type) {
+        if (type == this) {
+          // Cycle detection -- and cycles should be considered unboundable.
+          return true;
+        } else if (type is TypeImpl &&
+            type._hasTypeParameterReferenceInBound == true) {
+          return true;
+        } else if (type is TypeParameterType) {
+          return true;
+        } else if (type is FunctionType) {
+          return (type as TypeImpl).hasTypeParameterReferenceInBound;
+        } else if (type is ParameterizedType) {
+          return type.typeArguments.any(hasTypeParameterReference);
+        } else {
+          return false;
+        }
+      }
+
+      Element element = this.element;
+      if (element is FunctionTypedElement) {
+        _hasTypeParameterReferenceInBound = element.parameters.any(
+                (parameter) => hasTypeParameterReference(parameter.type)) ||
+            (element.returnType != null &&
+                hasTypeParameterReference(element.returnType));
+      } else if (element is TypeParameterizedElement) {
+        _hasTypeParameterReferenceInBound = element.typeParameters
+            .any((parameter) => hasTypeParameterReference(parameter.bound));
+      } else {
+        _hasTypeParameterReferenceInBound = false;
+      }
+    }
+    return _hasTypeParameterReferenceInBound;
+  }
+
   @override
   bool get isBottom => false;
 
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 997767c..bb67cb9 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -22,7 +22,12 @@
 import 'package:front_end/src/fasta/scanner.dart' hide StringToken;
 import 'package:front_end/src/scanner/errors.dart' show translateErrorToken;
 import 'package:front_end/src/scanner/token.dart'
-    show StringToken, SyntheticBeginToken, SyntheticStringToken, SyntheticToken;
+    show
+        BeginToken,
+        StringToken,
+        SyntheticBeginToken,
+        SyntheticStringToken,
+        SyntheticToken;
 
 import 'package:front_end/src/fasta/problems.dart' show unhandled;
 import 'package:front_end/src/fasta/messages.dart'
@@ -2250,26 +2255,25 @@
     }
 
     if (parameters == null && (getOrSet == null || optional('set', getOrSet))) {
-      Token previous = typeParameters?.endToken;
-      if (previous == null) {
+      Token token = typeParameters?.endToken;
+      if (token == null) {
         if (name is AstNode) {
-          previous = name.endToken;
+          token = name.endToken;
         } else if (name is _OperatorName) {
-          previous = name.name.endToken;
+          token = name.name.endToken;
         } else {
           throw new UnimplementedError();
         }
       }
-      Token leftParen =
-          new SyntheticBeginToken(TokenType.OPEN_PAREN, previous.end);
+      Token next = token.next;
+      int offset = next.charOffset;
+      BeginToken leftParen =
+          new SyntheticBeginToken(TokenType.OPEN_PAREN, offset);
+      token.setNext(leftParen);
       Token rightParen =
-          new SyntheticToken(TokenType.CLOSE_PAREN, leftParen.offset);
-      rightParen.next = previous.next;
-      leftParen.next = rightParen;
-      previous.next = leftParen;
-      leftParen.previous = previous;
-      rightParen.previous = leftParen;
-      rightParen.next.previous = rightParen;
+          leftParen.setNext(new SyntheticToken(TokenType.CLOSE_PAREN, offset));
+      leftParen.endGroup = rightParen;
+      rightParen.setNext(next);
       parameters = ast.formalParameterList(
           leftParen, <FormalParameter>[], null, null, rightParen);
     }
diff --git a/pkg/analyzer/lib/src/fasta/error_converter.dart b/pkg/analyzer/lib/src/fasta/error_converter.dart
index 5032154..660a6b6 100644
--- a/pkg/analyzer/lib/src/fasta/error_converter.dart
+++ b/pkg/analyzer/lib/src/fasta/error_converter.dart
@@ -64,6 +64,12 @@
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.COLON_IN_PLACE_OF_IN, offset, length);
         return;
+      case "CONCRETE_CLASS_WITH_ABSTRACT_MEMBER":
+        errorReporter?.reportErrorForOffset(
+            StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
+            offset,
+            length);
+        return;
       case "CONST_AFTER_FACTORY":
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.CONST_AFTER_FACTORY, offset, length);
diff --git a/pkg/analyzer/lib/src/fasta/token_utils.dart b/pkg/analyzer/lib/src/fasta/token_utils.dart
index 790d04a..52f4388 100644
--- a/pkg/analyzer/lib/src/fasta/token_utils.dart
+++ b/pkg/analyzer/lib/src/fasta/token_utils.dart
@@ -24,19 +24,16 @@
   /// to be an analyzer token stream by removing error tokens and reporting
   /// those errors to the associated error listener.
   Token convertTokens(Token firstToken) {
-    Token previous = new Token.eof(-1);
-    Token token = firstToken;
-    token.previous = previous;
-    previous.next = token;
-    while (!token.isEof) {
-      if (token.type.kind == BAD_INPUT_TOKEN) {
-        translateErrorToken(token, reportError);
-        previous.next = token.next;
-        token.next.previous = previous;
+    Token token = new Token.eof(-1)..setNext(firstToken);
+    Token next = firstToken;
+    while (!next.isEof) {
+      if (next.type.kind == BAD_INPUT_TOKEN) {
+        translateErrorToken(next, reportError);
+        token.setNext(next.next);
       } else {
-        previous = token;
+        token = next;
       }
-      token = token.next;
+      next = token.next;
     }
     return firstToken;
   }
diff --git a/pkg/analyzer/lib/src/file_system/file_system.dart b/pkg/analyzer/lib/src/file_system/file_system.dart
new file mode 100644
index 0000000..8a6ea4b
--- /dev/null
+++ b/pkg/analyzer/lib/src/file_system/file_system.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/file_system/file_system.dart';
+
+/**
+ * A [UriResolver] for [Resource]s.
+ */
+class ResourceUriResolver extends UriResolver {
+  /**
+   * The name of the `file` scheme.
+   */
+  static final String FILE_SCHEME = "file";
+
+  final ResourceProvider _provider;
+
+  ResourceUriResolver(this._provider);
+
+  ResourceProvider get provider => _provider;
+
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+    if (!isFileUri(uri)) {
+      return null;
+    }
+    String path = _provider.pathContext.fromUri(uri);
+    Resource resource = _provider.getResource(path);
+    if (resource is File) {
+      return resource.createSource(actualUri ?? uri);
+    }
+    return null;
+  }
+
+  @override
+  Uri restoreAbsolute(Source source) =>
+      _provider.pathContext.toUri(source.fullName);
+
+  /**
+   * Return `true` if the given [uri] is a `file` URI.
+   */
+  static bool isFileUri(Uri uri) => uri.scheme == FILE_SCHEME;
+}
diff --git a/pkg/analyzer/lib/src/generated/bazel.dart b/pkg/analyzer/lib/src/generated/bazel.dart
index 89efeef..ae17e37 100644
--- a/pkg/analyzer/lib/src/generated/bazel.dart
+++ b/pkg/analyzer/lib/src/generated/bazel.dart
@@ -2,12 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer.src.generated.bazel;
-
 import 'dart:collection';
 import 'dart:core';
 
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 30d1a57..0e14ee2 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -658,6 +658,21 @@
         DartType staticType = _resolver.strongMode
             ? _getStaticTypeOrFunctionType(target)
             : _getStaticType(target);
+
+        if (_resolver.strongMode &&
+            staticType is FunctionType &&
+            methodName.name == FunctionElement.CALL_METHOD_NAME) {
+          if (target is SimpleIdentifier) {
+            methodName.staticElement = target.staticElement;
+          }
+          methodName.staticType = target.staticType;
+          node.staticType = staticType;
+          node.staticInvokeType = staticType;
+          node.argumentList.correspondingStaticParameters =
+              _computeCorrespondingParameters(node.argumentList, staticType);
+          return null;
+        }
+
         DartType propagatedType = _getPropagatedType(target);
         staticElement = _resolveInvokedElementWithTarget(
             target, staticType, methodName, isConditional);
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 45b1794..56d147d 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -12,7 +12,6 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
-import 'package:analyzer/plugin/resolver_provider.dart';
 import 'package:analyzer/source/error_processor.dart';
 import 'package:analyzer/src/cancelable_future.dart';
 import 'package:analyzer/src/context/builder.dart' show EmbedderYamlLocator;
@@ -24,6 +23,7 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
 import 'package:analyzer/src/plugin/engine_plugin.dart';
+import 'package:analyzer/src/plugin/resolver_provider.dart';
 import 'package:analyzer/src/services/lint.dart';
 import 'package:analyzer/src/task/api/dart.dart';
 import 'package:analyzer/src/task/api/model.dart';
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 4382091..281110b 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -7277,19 +7277,10 @@
       return;
     }
 
-    var element = node.type.element;
-    if (element is TypeParameterizedElement &&
-        element.typeParameters.any((p) => p.bound != null)) {
+    final type = node.type;
+    if (type is TypeImpl && type.hasTypeParameterReferenceInBound) {
       _errorReporter.reportErrorForNode(
-          StrongModeCode.NOT_INSTANTIATED_BOUND, node, [node.type]);
-    }
-
-    var enclosingElement = element?.enclosingElement;
-    if (element is GenericFunctionTypeElement &&
-        enclosingElement is GenericTypeAliasElement &&
-        enclosingElement.typeParameters.any((p) => p.bound != null)) {
-      _errorReporter.reportErrorForNode(
-          StrongModeCode.NOT_INSTANTIATED_BOUND, node, [node.type]);
+          StrongModeCode.NOT_INSTANTIATED_BOUND, node, [type]);
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/generated/gn.dart b/pkg/analyzer/lib/src/generated/gn.dart
index 51440cb..ae31823 100644
--- a/pkg/analyzer/lib/src/generated/gn.dart
+++ b/pkg/analyzer/lib/src/generated/gn.dart
@@ -2,17 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer.src.generated.gn;
-
 import 'dart:collection';
 import 'dart:core';
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/workspace.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:package_config/packages.dart';
 import 'package:package_config/packages_file.dart';
 import 'package:package_config/src/packages_impl.dart';
diff --git a/pkg/analyzer/lib/src/generated/package.dart b/pkg/analyzer/lib/src/generated/package.dart
index 5983dd3..fba626f 100644
--- a/pkg/analyzer/lib/src/generated/package.dart
+++ b/pkg/analyzer/lib/src/generated/package.dart
@@ -2,18 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer.src.generated.package;
-
 import 'dart:collection';
 
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/context/builder.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:package_config/packages.dart';
 import 'package:yaml/yaml.dart';
 
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 69583e8..5562394 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -8885,7 +8885,7 @@
  * type aliases.
  */
 class TypeParameterBoundsResolver {
-  final TypeProvider typeProvider;
+  final TypeSystem typeSystem;
   final LibraryElement library;
   final Source source;
   final AnalysisErrorListener errorListener;
@@ -8894,7 +8894,7 @@
   TypeNameResolver typeNameResolver = null;
 
   TypeParameterBoundsResolver(
-      this.typeProvider, this.library, this.source, this.errorListener);
+      this.typeSystem, this.library, this.source, this.errorListener);
 
   /**
    * Resolve bounds of type parameters of classes, class and function type
@@ -8964,12 +8964,8 @@
             } else {
               libraryScope ??= new LibraryScope(library);
               typeParametersScope ??= createTypeParametersScope();
-              typeNameResolver ??= new TypeNameResolver(
-                  new TypeSystemImpl(typeProvider),
-                  typeProvider,
-                  library,
-                  source,
-                  errorListener);
+              typeNameResolver ??= new TypeNameResolver(typeSystem,
+                  typeSystem.typeProvider, library, source, errorListener);
               typeNameResolver.nameScope = typeParametersScope;
               _resolveTypeName(bound);
               typeParameterElement.bound = bound.type;
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index 16ad79b..7c76550 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -358,10 +358,15 @@
       }
     }
 
-    List<TypeParameterType> getFreeParameters(DartType type) {
+    List<TypeParameterType> getFreeParameters(DartType rootType) {
       List<TypeParameterType> parameters = null;
+      Set<DartType> visitedTypes = new HashSet<DartType>();
 
       void appendParameters(DartType type) {
+        if (visitedTypes.contains(type)) {
+          return;
+        }
+        visitedTypes.add(type);
         if (type is TypeParameterType && all.contains(type)) {
           parameters ??= <TypeParameterType>[];
           parameters.add(type);
@@ -370,7 +375,7 @@
         }
       }
 
-      appendParameters(type);
+      appendParameters(rootType);
       return parameters;
     }
 
diff --git a/pkg/analyzer/lib/src/lint/analysis.dart b/pkg/analyzer/lib/src/lint/analysis.dart
index 5884ac1..006ccb6 100644
--- a/pkg/analyzer/lib/src/lint/analysis.dart
+++ b/pkg/analyzer/lib/src/lint/analysis.dart
@@ -9,11 +9,11 @@
 import 'package:analyzer/file_system/file_system.dart'
     show File, Folder, ResourceProvider, ResourceUriResolver;
 import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart' hide AnalysisResult;
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -23,6 +23,7 @@
 import 'package:analyzer/src/lint/project.dart';
 import 'package:analyzer/src/lint/registry.dart';
 import 'package:analyzer/src/services/lint.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/util/sdk.dart';
 import 'package:front_end/src/api_prototype/byte_store.dart';
 import 'package:front_end/src/base/performance_logger.dart';
diff --git a/pkg/analyzer/lib/src/plugin/resolver_provider.dart b/pkg/analyzer/lib/src/plugin/resolver_provider.dart
new file mode 100644
index 0000000..abbb3a8
--- /dev/null
+++ b/pkg/analyzer/lib/src/plugin/resolver_provider.dart
@@ -0,0 +1,13 @@
+// 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.
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+/**
+ * A function that will return a [UriResolver] that can be used to resolve a
+ * specific kind of URI within the analysis context rooted at the given
+ * [folder].
+ */
+typedef UriResolver ResolverProvider(Folder folder);
diff --git a/pkg/analyzer/lib/src/source/package_map_resolver.dart b/pkg/analyzer/lib/src/source/package_map_resolver.dart
new file mode 100644
index 0000000..b325201
--- /dev/null
+++ b/pkg/analyzer/lib/src/source/package_map_resolver.dart
@@ -0,0 +1,99 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:core';
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/util/asserts.dart' as asserts;
+import 'package:path/path.dart' as pathos;
+
+/**
+ * A [UriResolver] implementation for the `package:` scheme that uses a map of
+ * package names to their directories.
+ */
+class PackageMapUriResolver extends UriResolver {
+  /**
+   * The name of the `package` scheme.
+   */
+  static const String PACKAGE_SCHEME = "package";
+
+  /**
+   * A table mapping package names to the path of the directories containing
+   * the package.
+   */
+  final Map<String, List<Folder>> packageMap;
+
+  /**
+   * The [ResourceProvider] for this resolver.
+   */
+  final ResourceProvider resourceProvider;
+
+  /**
+   * Create a new [PackageMapUriResolver].
+   *
+   * [packageMap] is a table mapping package names to the paths of the
+   * directories containing the package
+   */
+  PackageMapUriResolver(this.resourceProvider, this.packageMap) {
+    asserts.notNull(resourceProvider);
+    asserts.notNull(packageMap);
+    packageMap.forEach((name, folders) {
+      if (folders.length != 1) {
+        throw new ArgumentError(
+            'Exactly one folder must be specified for a package.'
+            'Found $name = $folders');
+      }
+    });
+  }
+
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+    if (!isPackageUri(uri)) {
+      return null;
+    }
+    // Prepare path.
+    String path = uri.path;
+    // Prepare path components.
+    int index = path.indexOf('/');
+    if (index == -1 || index == 0) {
+      return null;
+    }
+    // <pkgName>/<relPath>
+    String pkgName = path.substring(0, index);
+    String relPath = path.substring(index + 1);
+    // If the package is known, return the corresponding file.
+    List<Folder> packageDirs = packageMap[pkgName];
+    if (packageDirs != null) {
+      Folder packageDir = packageDirs.single;
+      File file = packageDir.getChildAssumingFile(relPath);
+      return file.createSource(uri);
+    }
+    return null;
+  }
+
+  @override
+  Uri restoreAbsolute(Source source) {
+    String sourcePath = source.fullName;
+    pathos.Context pathContext = resourceProvider.pathContext;
+    for (String pkgName in packageMap.keys) {
+      Folder pkgFolder = packageMap[pkgName][0];
+      String pkgFolderPath = pkgFolder.path;
+      if (sourcePath.startsWith(pkgFolderPath + pathContext.separator)) {
+        String relPath = sourcePath.substring(pkgFolderPath.length + 1);
+        List<String> relPathComponents = pathContext.split(relPath);
+        String relUriPath = pathos.posix.joinAll(relPathComponents);
+        return Uri.parse('$PACKAGE_SCHEME:$pkgName/$relUriPath');
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Returns `true` if [uri] is a `package` URI.
+   */
+  static bool isPackageUri(Uri uri) {
+    return uri.scheme == PACKAGE_SCHEME;
+  }
+}
diff --git a/pkg/analyzer/lib/src/summary/resynthesize.dart b/pkg/analyzer/lib/src/summary/resynthesize.dart
index f15fcd2..2271c0c 100644
--- a/pkg/analyzer/lib/src/summary/resynthesize.dart
+++ b/pkg/analyzer/lib/src/summary/resynthesize.dart
@@ -858,6 +858,8 @@
   }
 }
 
+class RecursiveInstantiateToBounds {}
+
 /// Specialization of [ReferenceInfo] for resynthesis from linked summaries.
 class _ReferenceInfo extends ReferenceInfo {
   /**
@@ -983,14 +985,27 @@
       InterfaceTypeImpl type =
           new InterfaceTypeImpl.elementWithNameAndArgs(element, name, () {
         if (typeArguments == null) {
-          if (libraryResynthesizer.summaryResynthesizer.strongMode &&
-              instantiateToBoundsAllowed) {
-            InterfaceType instantiatedToBounds = libraryResynthesizer
-                .summaryResynthesizer.context.typeSystem
-                .instantiateToBounds(element.type) as InterfaceType;
-            return instantiatedToBounds.typeArguments;
+          if (!_isBeingInstantiatedToBounds) {
+            _isBeingInstantiatedToBounds = true;
+            _isRecursiveWhileInstantiateToBounds = false;
+            try {
+              if (libraryResynthesizer.summaryResynthesizer.strongMode) {
+                InterfaceType instantiatedToBounds = libraryResynthesizer
+                    .summaryResynthesizer.context.typeSystem
+                    .instantiateToBounds(element.type) as InterfaceType;
+                if (_isRecursiveWhileInstantiateToBounds) {
+                  throw new RecursiveInstantiateToBounds();
+                }
+                return instantiatedToBounds.typeArguments;
+              } else {
+                return _dynamicTypeArguments;
+              }
+            } finally {
+              _isBeingInstantiatedToBounds = false;
+            }
           } else {
-            return _dynamicTypeArguments;
+            _isRecursiveWhileInstantiateToBounds = true;
+            typeArguments = _dynamicTypeArguments;
           }
         }
         return typeArguments;
@@ -1352,6 +1367,7 @@
       if (declaredType && !referenceInfo.isDeclarableType) {
         return DynamicTypeImpl.instance;
       }
+
       return referenceInfo.buildType(
           instantiateToBoundsAllowed,
           type.typeArguments.length,
diff --git a/pkg/analyzer/lib/src/task/dart.dart b/pkg/analyzer/lib/src/task/dart.dart
index d117708..fd3b106 100644
--- a/pkg/analyzer/lib/src/task/dart.dart
+++ b/pkg/analyzer/lib/src/task/dart.dart
@@ -4927,7 +4927,7 @@
     //
     RecordingErrorListener errorListener = new RecordingErrorListener();
     new TypeParameterBoundsResolver(
-            typeProvider, library, unitElement.source, errorListener)
+            context.typeSystem, library, unitElement.source, errorListener)
         .resolveTypeBounds(unit);
     //
     // Record outputs.
diff --git a/pkg/analyzer/lib/src/util/absolute_path.dart b/pkg/analyzer/lib/src/util/absolute_path.dart
deleted file mode 100644
index 28f5732..0000000
--- a/pkg/analyzer/lib/src/util/absolute_path.dart
+++ /dev/null
@@ -1,170 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library analyzer.src.util.absolute_path;
-
-/// The class for manipulating absolute, normalized paths.
-class AbsolutePathContext {
-  static const int _COLON = 0x3A;
-  static const int _LOWER_A = 0x61;
-  static const int _LOWER_Z = 0x7A;
-  static const int _UPPER_A = 0x41;
-  static const int _UPPER_Z = 0x5A;
-
-  final bool _isWindows;
-  String separator;
-  int _separatorChar;
-  String _singlePeriodComponent;
-  String _doublePeriodComponent;
-  String _singlePeriodEnding;
-  String _doublePeriodEnding;
-
-  AbsolutePathContext(this._isWindows) {
-    separator = _isWindows ? r'\' : '/';
-    _separatorChar = separator.codeUnitAt(0);
-    _singlePeriodComponent = separator + '.' + separator;
-    _doublePeriodComponent = separator + '..' + separator;
-    _singlePeriodEnding = separator + '.';
-    _doublePeriodEnding = separator + '..';
-  }
-
-  /// Append the given relative [suffix] to the given absolute [parent].
-  ///
-  ///     context.append('/path/to', 'foo'); // -> '/path/to/foo'
-  ///
-  /// The given [suffix] cannot be an absolute path or use `..`.
-  String append(String parent, String suffix) {
-    return '$parent$separator$suffix';
-  }
-
-  /// Return the part of the absolute [path] after the last separator on the
-  /// context's platform.
-  ///
-  ///     context.basename('/path/to/foo.dart'); // -> 'foo.dart'
-  ///     context.basename('/path/to');          // -> 'to'
-  ///     context.basename('/path');             // -> 'path'
-  ///     context.basename('/');                 // -> ''
-  String basename(String path) {
-    int index = path.lastIndexOf(separator);
-    return path.substring(index + 1);
-  }
-
-  /// Return the part of the absolute [path] before the last separator.
-  ///
-  ///     context.dirname('/path/to/foo.dart'); // -> '/path/to'
-  ///     context.dirname('/path/to');          // -> '/path'
-  ///     context.dirname(r'/path');            // -> '/'
-  ///     context.dirname(r'/');                // -> '/'
-  ///     context.dirname(r'C:\path');          // -> 'C:\'
-  ///     context.dirname(r'C:\');              // -> 'C:\'
-  String dirname(String path) {
-    int firstIndex = path.indexOf(separator);
-    int lastIndex = path.lastIndexOf(separator);
-    return lastIndex == firstIndex
-        ? path.substring(0, firstIndex + 1)
-        : path.substring(0, lastIndex);
-  }
-
-  /// Return `true` if the given [path] is valid.
-  ///
-  ///     context.isNormalized('/foo/bar');        // -> true
-  ///     context.isNormalized('/foo/bar/../baz'); // -> false
-  bool isValid(String path) {
-    return _isAbsolute(path) && _isNormalized(path);
-  }
-
-  /// Return `true` if [child] is a path beneath [parent], and `false`
-  /// otherwise. Both the [child] and [parent] paths must be absolute paths.
-  ///
-  ///     context.isWithin('/root/path', '/root/path/a'); // -> true
-  ///     context.isWithin('/root/path', '/root/other');  // -> false
-  ///     context.isWithin('/root/path', '/root/path');   // -> false
-  bool isWithin(String parent, String child) {
-    int parentLength = parent.length;
-    int childLength = child.length;
-    if (parentLength >= childLength) {
-      return false;
-    }
-    if (child.codeUnitAt(parentLength) != _separatorChar) {
-      return false;
-    }
-    return _startsWithUnsafe(child, parent);
-  }
-
-  /// Split [path] into its components using [separator].
-  ///
-  ///     context.split('/path/to/foo'); // -> ['', 'path', 'to', 'foo']
-  List<String> split(String path) {
-    return path.split(separator);
-  }
-
-  /// If the given [child] is within the given [parent], then return the
-  /// relative path from [parent] to [child]. Otherwise return `null`. Both
-  /// the [child] and [parent] paths must be absolute paths.
-  ///
-  ///     context.relative('/root/path', '/root/path/a/b.dart'); // -> 'a/b.dart'
-  ///     context.relative('/root/path', '/root/other.dart');    // -> null
-  String suffix(String parent, String child) {
-    String parentPrefix = parent + separator;
-    if (child.startsWith(parentPrefix)) {
-      return child.substring(parentPrefix.length);
-    }
-    return null;
-  }
-
-  /// Return `true` if the given [path] is absolute.
-  ///
-  ///     _isAbsolute('/foo/bar');   // -> true
-  ///     _isAbsolute('/');          // -> true
-  ///     _isAbsolute('foo/bar');    // -> false
-  ///     _isAbsolute('C:\foo\bar'); // -> true
-  ///     _isAbsolute('C:\');        // -> true
-  ///     _isAbsolute('foo\bar');    // -> false
-  bool _isAbsolute(String path) {
-    if (_isWindows) {
-      return path.length >= 3 &&
-          _isAlphabetic(path.codeUnitAt(0)) &&
-          path.codeUnitAt(1) == _COLON &&
-          path.codeUnitAt(2) == _separatorChar;
-    } else {
-      return path.isNotEmpty && path.codeUnitAt(0) == _separatorChar;
-    }
-  }
-
-  /// Return `true` if the given absolute [path] is normalized.
-  ///
-  ///     _isNormalized('/foo/bar');        // -> true
-  ///     _isNormalized('/foo/..bar');      // -> true
-  ///     _isNormalized('/foo/bar..');      // -> true
-  ///     _isNormalized('/');               // -> true
-  ///     _isNormalized('/foo/bar/../baz'); // -> false
-  ///     _isNormalized('/foo/bar/..');     // -> false
-  bool _isNormalized(String path) {
-    return !path.contains(_singlePeriodComponent) &&
-        !path.contains(_doublePeriodComponent) &&
-        !path.endsWith(_singlePeriodEnding) &&
-        !path.endsWith(_doublePeriodEnding);
-  }
-
-  /// Returns whether [char] is the code for an ASCII letter (uppercase or
-  /// lowercase).
-  static bool _isAlphabetic(int char) {
-    return char >= _UPPER_A && char <= _UPPER_Z ||
-        char >= _LOWER_A && char <= _LOWER_Z;
-  }
-
-  /// Return `true` if [str] starts with the given [prefix].
-  ///
-  /// The check is done from the end of [prefix], because absolute paths
-  /// usually have the same prefix, e.g. the user's home directory.
-  static bool _startsWithUnsafe(String str, String prefix) {
-    int len = prefix.length;
-    for (int i = len - 1; i >= 0; i--) {
-      if (str.codeUnitAt(i) != prefix.codeUnitAt(i)) {
-        return false;
-      }
-    }
-    return true;
-  }
-}
diff --git a/pkg/analyzer/lib/task/model.dart b/pkg/analyzer/lib/task/model.dart
new file mode 100644
index 0000000..1b33bf4
--- /dev/null
+++ b/pkg/analyzer/lib/task/model.dart
@@ -0,0 +1,8 @@
+// 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.
+
+@deprecated
+library task.model;
+
+export 'package:analyzer/src/task/api/model.dart';
diff --git a/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart b/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
index 610048d..c08c9cd 100644
--- a/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
+++ b/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
@@ -2,10 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer.test.file_system.resource_uri_resolver_test;
-
-import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analyzer/test/generated/all_the_rest_test.dart b/pkg/analyzer/test/generated/all_the_rest_test.dart
index a14fde5..42664e8 100644
--- a/pkg/analyzer/test/generated/all_the_rest_test.dart
+++ b/pkg/analyzer/test/generated/all_the_rest_test.dart
@@ -18,6 +18,7 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart' hide SdkLibrariesReader;
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_engine_io.dart';
 import 'package:analyzer/src/generated/java_io.dart';
diff --git a/pkg/analyzer/test/generated/analysis_context_factory.dart b/pkg/analyzer/test/generated/analysis_context_factory.dart
index 5f02ed3..73eb7d3 100644
--- a/pkg/analyzer/test/generated/analysis_context_factory.dart
+++ b/pkg/analyzer/test/generated/analysis_context_factory.dart
@@ -15,6 +15,7 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/sdk.dart';
diff --git a/pkg/analyzer/test/generated/engine_test.dart b/pkg/analyzer/test/generated/engine_test.dart
index 043f1a3..ed41c50 100644
--- a/pkg/analyzer/test/generated/engine_test.dart
+++ b/pkg/analyzer/test/generated/engine_test.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
-import 'package:analyzer/plugin/resolver_provider.dart';
 import 'package:analyzer/src/cancelable_future.dart';
 import 'package:analyzer/src/context/builder.dart' show EmbedderYamlLocator;
 import 'package:analyzer/src/context/cache.dart';
@@ -17,6 +16,7 @@
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/plugin/resolver_provider.dart';
 import 'package:analyzer/src/string_source.dart';
 import 'package:analyzer/src/task/api/model.dart';
 import 'package:html/dom.dart' show Document;
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index c979ff2..94c4d91 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -2176,6 +2176,37 @@
     expect(expression.leftOperand, new isInstanceOf<BinaryExpression>());
   }
 
+  void test_logicalAndExpressionStatement() {
+    // Assert that `<` and `>` are not interpreted as type arguments.
+    ExpressionStatement statement = parseStatement("C<T && T>U;");
+    BinaryExpression expression = statement.expression;
+    expect(expression.leftOperand, new isInstanceOf<BinaryExpression>());
+  }
+
+  void test_methodInvocation1() {
+    // Assert that `<` and `>` are not interpreted as type arguments.
+    ExpressionStatement statement = parseStatement("f(a < b, c > 3);");
+    assertNoErrors();
+    MethodInvocation method = statement.expression;
+    expect(method.argumentList.arguments, hasLength(2));
+  }
+
+  void test_methodInvocation2() {
+    // Assert that `<` and `>` are not interpreted as type arguments.
+    ExpressionStatement statement = parseStatement("f(a < b, c >> 3);");
+    assertNoErrors();
+    MethodInvocation method = statement.expression;
+    expect(method.argumentList.arguments, hasLength(2));
+  }
+
+  void test_methodInvocation3() {
+    // Assert that `<` and `>` are not interpreted as type arguments.
+    ExpressionStatement statement = parseStatement("f(a < b, c < d >> 3);");
+    assertNoErrors();
+    MethodInvocation method = statement.expression;
+    expect(method.argumentList.arguments, hasLength(2));
+  }
+
   void test_logicalAndExpression_precedence_bitwiseOr_left() {
     BinaryExpression expression = parseExpression("x | y < z");
     expect(expression.leftOperand, new isInstanceOf<BinaryExpression>());
@@ -3416,10 +3447,7 @@
     FormalParameterList list = parser.parseFormalParameterList();
     expectNotNullIfNoErrors(list);
     listener.assertErrors(usingFastaParser
-        ? [
-            expectedError(ParserErrorCode.MISSING_IDENTIFIER, 8, 1),
-            expectedError(ParserErrorCode.EXPECTED_TOKEN, 10, 3)
-          ]
+        ? [expectedError(ParserErrorCode.MISSING_IDENTIFIER, 8, 1)]
         : [
             expectedError(ParserErrorCode.MISSING_IDENTIFIER, 8, 1),
             expectedError(ParserErrorCode.EXPECTED_TOKEN, 8, 1)
@@ -3587,7 +3615,12 @@
   void test_functionTypedField_invalidType_class() {
     if (usingFastaParser) {
       parseCompilationUnit("Function(class) x = null;",
-          errors: [expectedError(ParserErrorCode.EXPECTED_TYPE_NAME, 9, 5)]);
+          errors: usingFastaParser
+              ? [
+                  expectedError(ParserErrorCode.EXPECTED_TYPE_NAME, 9, 5),
+                  expectedError(ParserErrorCode.MISSING_IDENTIFIER, 9, 5)
+                ]
+              : [expectedError(ParserErrorCode.EXPECTED_TYPE_NAME, 9, 5)]);
     }
   }
 
@@ -3617,7 +3650,6 @@
             ? [
                 expectedError(ScannerErrorCode.EXPECTED_TOKEN, 20, 1),
                 expectedError(ScannerErrorCode.EXPECTED_TOKEN, 20, 1),
-                expectedError(ParserErrorCode.EXPECTED_TOKEN, 11, 8),
                 expectedError(ParserErrorCode.MISSING_FUNCTION_BODY, 20, 0),
               ]
             : [
@@ -3666,14 +3698,12 @@
 }''');
     CompilationUnit unit = parser.parseCompilationUnit2();
     expectNotNullIfNoErrors(unit);
-    listener.assertErrors([
-      expectedError(
-          usingFastaParser
-              ? ParserErrorCode.EXPECTED_TOKEN
-              : ParserErrorCode.UNEXPECTED_TOKEN,
-          30,
-          1)
-    ]);
+    listener.assertErrors(usingFastaParser
+        ? [
+            expectedError(ParserErrorCode.EXPECTED_TYPE_NAME, 30, 1),
+            expectedError(ParserErrorCode.EXPECTED_TOKEN, 30, 1)
+          ]
+        : [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 30, 1)]);
   }
 
   void test_getterInFunction_block_noReturnType() {
@@ -5608,7 +5638,7 @@
     FormalParameterList list = parser.parseFormalParameterList();
     expectNotNullIfNoErrors(list);
     listener.assertErrors(usingFastaParser
-        ? [expectedError(ParserErrorCode.VAR_AND_TYPE, 5, 3)]
+        ? [expectedError(ParserErrorCode.VAR_AND_TYPE, 1, 3)]
         : [expectedError(ParserErrorCode.EXPECTED_TOKEN, 9, 1)]);
   }
 
@@ -9172,15 +9202,14 @@
   }
 
   void test_parseFormalParameterList_prefixedType_partial2() {
-    int errorOffset = usingFastaParser ? 4 : 3;
     FormalParameterList list = parseFormalParameterList('(io.,a)', errors: [
       expectedError(
           usingFastaParser
               ? ParserErrorCode.EXPECTED_TYPE_NAME
               : ParserErrorCode.MISSING_IDENTIFIER,
-          errorOffset,
+          4,
           1),
-      expectedError(ParserErrorCode.MISSING_IDENTIFIER, errorOffset, 1)
+      expectedError(ParserErrorCode.MISSING_IDENTIFIER, 4, 1)
     ]);
     expect(list, isNotNull);
     expect(list.leftParenthesis, isNotNull);
@@ -13146,6 +13175,20 @@
  * More complex tests should be defined in the class [ComplexParserTest].
  */
 abstract class SimpleParserTestMixin implements AbstractParserTestCase {
+  void test_classDeclaration_complexTypeParam() {
+    CompilationUnit unit = parseCompilationUnit('''
+class C<@Foo.bar(const [], const [1], const{"":r""}, 0xFF + 2, .3, 4.5) T> {}
+''');
+    ClassDeclaration clazz = unit.declarations[0];
+    expect(clazz.name.name, 'C');
+    expect(clazz.typeParameters.typeParameters, hasLength(1));
+    TypeParameter typeParameter = clazz.typeParameters.typeParameters[0];
+    expect(typeParameter.name.name, 'T');
+    expect(typeParameter.metadata, hasLength(1));
+    Annotation metadata = typeParameter.metadata[0];
+    expect(metadata.name.name, 'Foo.bar');
+  }
+
   ConstructorName parseConstructorName(String name) {
     createParser('new $name();');
     Statement statement = parser.parseStatement2();
@@ -15044,6 +15087,50 @@
     expect(variableList.type, new isInstanceOf<GenericFunctionType>());
   }
 
+  void test_parseNonLabeledStatement_variableDeclaration_typeParam() {
+    VariableDeclarationStatement statement = parseStatement('C<T> v;');
+    assertNoErrors();
+    VariableDeclarationList variableList = statement.variables;
+    List<VariableDeclaration> variables = variableList.variables;
+    expect(variables, hasLength(1));
+    expect(variables[0].name.name, 'v');
+    TypeName typeName = variableList.type;
+    expect(typeName.name.name, 'C');
+    expect(typeName.typeArguments.arguments, hasLength(1));
+    TypeName typeArgument = typeName.typeArguments.arguments[0];
+    expect(typeArgument.name.name, 'T');
+  }
+
+  void test_parseNonLabeledStatement_variableDeclaration_typeParam2() {
+    VariableDeclarationStatement statement =
+        parseStatement('C<T /* ignored comment */ > v;');
+    assertNoErrors();
+    VariableDeclarationList variableList = statement.variables;
+    List<VariableDeclaration> variables = variableList.variables;
+    expect(variables, hasLength(1));
+    expect(variables[0].name.name, 'v');
+    TypeName typeName = variableList.type;
+    expect(typeName.name.name, 'C');
+    expect(typeName.typeArguments.arguments, hasLength(1));
+    TypeName typeArgument = typeName.typeArguments.arguments[0];
+    expect(typeArgument.name.name, 'T');
+  }
+
+  void test_parseNonLabeledStatement_variableDeclaration_typeParam3() {
+    VariableDeclarationStatement statement =
+        parseStatement('C<T Function(String s)> v;');
+    assertNoErrors();
+    VariableDeclarationList variableList = statement.variables;
+    List<VariableDeclaration> variables = variableList.variables;
+    expect(variables, hasLength(1));
+    expect(variables[0].name.name, 'v');
+    TypeName typeName = variableList.type;
+    expect(typeName.name.name, 'C');
+    expect(typeName.typeArguments.arguments, hasLength(1));
+    expect(typeName.typeArguments.arguments[0],
+        new isInstanceOf<GenericFunctionType>());
+  }
+
   void test_invalid_typeParamAnnotation() {
     parseCompilationUnit('main() { C<@Foo T> v; }',
         errors: usingFastaParser
@@ -15056,6 +15143,36 @@
               ]);
   }
 
+  void test_invalid_typeParamAnnotation2() {
+    parseCompilationUnit('main() { C<@Foo.bar(1) T> v; }',
+        errors: usingFastaParser
+            // TODO(danrubel): Improve this error to indicate that annotations
+            // are not valid in this context.
+            ? [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 11, 1)]
+            : [
+                expectedError(ParserErrorCode.MISSING_IDENTIFIER, 11, 1),
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 11, 1)
+              ]);
+  }
+
+  void test_invalid_typeParamAnnotation3() {
+    if (usingFastaParser) {
+      parseCompilationUnit('''
+main() {
+  C<@Foo.bar(const [], const [1], const{"":r""}, 0xFF + 2, .3, 4.5) T,
+    F Function<G>(int, String, {Bar b}),
+    void Function<H>(int i, [String j, K]),
+    A<B<C>>,
+    W<X<Y<Z>>>
+  > v;
+}''', errors: [
+        // TODO(danrubel): Improve this error to indicate that annotations
+        // are not valid in this context.
+        expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 13, 1)
+      ]);
+    }
+  }
+
   void test_parseStatement_emptyTypeArgumentList() {
     var declaration = parseStatement('C<> c;') as VariableDeclarationStatement;
     assertErrorsWithCodes([ParserErrorCode.EXPECTED_TYPE_NAME]);
diff --git a/pkg/analyzer/test/generated/resolver_test_case.dart b/pkg/analyzer/test/generated/resolver_test_case.dart
index 4f9f022..96b1156 100644
--- a/pkg/analyzer/test/generated/resolver_test_case.dart
+++ b/pkg/analyzer/test/generated/resolver_test_case.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer.test.generated.resolver_test_case;
-
 import 'dart:async';
 
 import 'package:analyzer/dart/ast/ast.dart';
@@ -14,12 +12,12 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart' hide AnalysisResult;
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -27,6 +25,7 @@
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/testing/element_factory.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:front_end/src/api_prototype/byte_store.dart';
 import 'package:front_end/src/base/performance_logger.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analyzer/test/generated/source_factory_test.dart b/pkg/analyzer/test/generated/source_factory_test.dart
index eda1c21..d5dbae9 100644
--- a/pkg/analyzer/test/generated/source_factory_test.dart
+++ b/pkg/analyzer/test/generated/source_factory_test.dart
@@ -2,17 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer.test.generated.test.generated.source_factory;
-
 import 'dart:convert';
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine, Logger;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart' as utils;
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/source/source_resource.dart';
 import 'package:package_config/packages.dart';
 import 'package:package_config/packages_file.dart' as pkgfile show parse;
diff --git a/pkg/analyzer/test/generated/static_warning_code_test.dart b/pkg/analyzer/test/generated/static_warning_code_test.dart
index ea87317..f908337 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -368,6 +368,20 @@
     verify([source]);
   }
 
+  test_argumentTypeNotAssignable_call() async {
+    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
+    Source source = addSource(r'''
+typedef bool Predicate<T>(T object);
+
+Predicate<String> f() => null;
+
+void main() {
+  f().call(3);
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+  }
+
   test_argumentTypeNotAssignable_cascadeSecond() async {
     Source source = addSource(r'''
 // filler filler filler filler filler filler filler filler filler filler
diff --git a/pkg/analyzer/test/generated/strong_mode_driver_test.dart b/pkg/analyzer/test/generated/strong_mode_driver_test.dart
index 28609bb..4e83452 100644
--- a/pkg/analyzer/test/generated/strong_mode_driver_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_driver_test.dart
@@ -65,6 +65,18 @@
   test_genericMethod_functionTypedParameter_tearoff() {
     return super.test_genericMethod_functionTypedParameter_tearoff();
   }
+
+  @override
+  test_notInstantiatedBound_class_error_recursion() {
+    // overridden because not failing
+    return super.test_notInstantiatedBound_class_error_recursion();
+  }
+
+  @override
+  test_notInstantiatedBound_class_error_recursion_less_direct() {
+    // overridden because not failing
+    return super.test_notInstantiatedBound_class_error_recursion_less_direct();
+  }
 }
 
 @reflectiveTest
diff --git a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
index 433d68c..fdd3388 100644
--- a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
@@ -392,48 +392,6 @@
 
   @override
   @failingTest
-  test_notInstantiatedBound_direct_class_class() async {
-    // Expected 1 errors of type StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
-    await super.test_notInstantiatedBound_direct_class_class();
-  }
-
-  @override
-  @failingTest
-  test_notInstantiatedBound_direct_class_typedef() async {
-    // Expected 1 errors of type StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
-    await super.test_notInstantiatedBound_direct_class_typedef();
-  }
-
-  @override
-  @failingTest
-  test_notInstantiatedBound_direct_typedef_class() async {
-    // Expected 1 errors of type StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
-    await super.test_notInstantiatedBound_direct_typedef_class();
-  }
-
-  @override
-  @failingTest
-  test_notInstantiatedBound_functionType() async {
-    // Expected 2 errors of type StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
-    await super.test_notInstantiatedBound_functionType();
-  }
-
-  @override
-  @failingTest
-  test_notInstantiatedBound_indirect_class_class() async {
-    // Expected 1 errors of type StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
-    await super.test_notInstantiatedBound_indirect_class_class();
-  }
-
-  @override
-  @failingTest
-  test_notInstantiatedBound_indirect_class_class2() async {
-    // Expected 2 errors of type StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
-    await super.test_notInstantiatedBound_indirect_class_class2();
-  }
-
-  @override
-  @failingTest
   test_setterWithDynamicTypeIsError() async {
     // Expected 2 errors of type StaticWarningCode.NON_VOID_RETURN_FOR_SETTER, found 0
     await super.test_setterWithDynamicTypeIsError();
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index b7ead13..6a0a0b3 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -3910,42 +3910,48 @@
 ''');
   }
 
-  test_notInstantiatedBound_direct_class_class() async {
+  test_notInstantiatedBound_error_class_argument() async {
     String code = r'''
-class A<T extends int> {}
+class A<K, V extends List<K>> {}
 class C<T extends A> {}
 ''';
     await resolveTestUnit(code, noErrors: false);
     assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
   }
 
-  test_notInstantiatedBound_direct_class_typedef() async {
-    // Check that if the bound of a class is an uninstantiated typedef
-    // we emit an error
+  test_notInstantiatedBound_error_class_argument2() async {
     String code = r'''
-typedef void F<T extends int>();
-class C<T extends F> {}
+class A<K, V extends List<List<K>>> {}
+class C<T extends A> {}
 ''';
     await resolveTestUnit(code, noErrors: false);
     assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
   }
 
-  test_notInstantiatedBound_direct_typedef_class() async {
-    // Check that if the bound of a typeded is an uninstantiated class
-    // we emit an error
+  test_notInstantiatedBound_error_class_direct() async {
     String code = r'''
-class C<T extends int> {}
-typedef void F<T extends C>();
+class A<K, V extends K> {}
+class C<T extends A> {}
 ''';
     await resolveTestUnit(code, noErrors: false);
     assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
   }
 
-  test_notInstantiatedBound_functionType() async {
+  test_notInstantiatedBound_error_class_indirect() async {
+    String code = r'''
+class A<K, V extends K> {}
+class C<T extends List<A>> {}
+''';
+    await resolveTestUnit(code, noErrors: false);
+    assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
+  }
+
+  test_notInstantiatedBound_error_functionType() async {
     await resolveTestUnit(r'''
-class A<T extends int> {}
-class C<T extends Function(A)> {}
-class D<T extends A Function()> {}
+class A<T extends Function(T)> {}
+class B<T extends T Function()> {}
+class C<T extends A> {}
+class D<T extends B> {}
 ''', noErrors: false);
     assertErrors(testSource, [
       StrongModeCode.NOT_INSTANTIATED_BOUND,
@@ -3953,27 +3959,140 @@
     ]);
   }
 
-  test_notInstantiatedBound_indirect_class_class() async {
+  @failingTest
+  test_notInstantiatedBound_class_error_recursion() async {
     String code = r'''
-class A<T> {}
-class B<T extends int> {}
-class C<T extends A<B>> {}
+class A<T extends B> {} // points to a
+class B<T extends A> {} // points to b
+class C<T extends A> {} // points to a cyclical type
+''';
+    await resolveTestUnit(code, noErrors: false);
+    assertErrors(testSource, [
+      StrongModeCode.NOT_INSTANTIATED_BOUND,
+      StrongModeCode.NOT_INSTANTIATED_BOUND,
+      StrongModeCode.NOT_INSTANTIATED_BOUND,
+    ]);
+  }
+
+  @failingTest
+  test_notInstantiatedBound_class_error_recursion_less_direct() async {
+    String code = r'''
+class A<T extends B<A>> {}
+class B<T extends A<B>> {}
+''';
+    await resolveTestUnit(code, noErrors: false);
+    assertErrors(testSource, [
+      StrongModeCode.NOT_INSTANTIATED_BOUND,
+      StrongModeCode.NOT_INSTANTIATED_BOUND,
+    ]);
+  }
+
+  test_notInstantiatedBound_error_typedef_argument() async {
+    String code = r'''
+class A<K, V extends List<K>> {}
+typedef void F<T extends A>();
 ''';
     await resolveTestUnit(code, noErrors: false);
     assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
   }
 
-  test_notInstantiatedBound_indirect_class_class2() async {
+  test_notInstantiatedBound_error_typedef_argument2() async {
+    String code = r'''
+class A<K, V extends List<List<K>>> {}
+typedef void F<T extends A>();
+''';
+    await resolveTestUnit(code, noErrors: false);
+    assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
+  }
+
+  test_notInstantiatedBound_error_typedef_direct() async {
+    String code = r'''
+class A<K, V extends K> {}
+typedef void F<T extends A>();
+''';
+    await resolveTestUnit(code, noErrors: false);
+    assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
+  }
+
+  test_notInstantiatedBound_class_error_recursion_typedef() async {
+    String code = r'''
+typedef F(C value);
+class C<T extends F> {}
+class D<T extends C> {}
+''';
+    await resolveTestUnit(code, noErrors: false);
+    assertErrors(testSource, [
+      StrongModeCode.NOT_INSTANTIATED_BOUND,
+      StrongModeCode.NOT_INSTANTIATED_BOUND,
+      CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
+    ]);
+  }
+
+  test_notInstantiatedBound_ok_class() async {
+    String code = r'''
+class A<T extends int> {}
+class C1<T extends A> {}
+class C2<T extends List<A>> {}
+''';
+    await resolveTestUnit(code);
+    assertNoErrors(testSource);
+  }
+
+  test_notInstantiatedBound_ok_class_class2() async {
+    String code = r'''
+class A<T> {}
+class C<T extends A<int>> {}
+class D<T extends C> {}
+''';
+    await resolveTestUnit(code);
+    assertNoErrors(testSource);
+  }
+
+  test_notInstantiatedBound_ok_class_class3() async {
+    String code = r'''
+class A<T> {}
+class B<T extends int> {}
+class C<T extends A<B>> {}
+''';
+    await resolveTestUnit(code);
+    assertNoErrors(testSource);
+  }
+
+  test_notInstantiatedBound_ok_class_class4() async {
     String code = r'''
 class A<K, V> {}
 class B<T extends int> {}
 class C<T extends A<B, B>> {}
 ''';
-    await resolveTestUnit(code, noErrors: false);
-    assertErrors(testSource, [
-      StrongModeCode.NOT_INSTANTIATED_BOUND,
-      StrongModeCode.NOT_INSTANTIATED_BOUND
-    ]);
+    await resolveTestUnit(code);
+    assertNoErrors(testSource);
+  }
+
+  test_notInstantiatedBound_ok_class_typedef() async {
+    String code = r'''
+typedef void F<T extends int>();
+class C<T extends F> {}
+''';
+    await resolveTestUnit(code);
+    assertNoErrors(testSource);
+  }
+
+  test_notInstantiatedBound_ok_typedef_class() async {
+    String code = r'''
+class C<T extends int> {}
+typedef void F<T extends C>();
+''';
+    await resolveTestUnit(code);
+    assertNoErrors(testSource);
+  }
+
+  test_notInstantiatedBound_ok_class_function() async {
+    String code = r'''
+class A<T extends void Function<Z>()> {}
+class B<T extends A> {}
+''';
+    await resolveTestUnit(code);
+    assertNoErrors(testSource);
   }
 
   test_objectMethodOnFunctions_Anonymous() async {
diff --git a/pkg/analyzer/test/resource_utils.dart b/pkg/analyzer/test/resource_utils.dart
index c03eb1d..10aed70 100644
--- a/pkg/analyzer/test/resource_utils.dart
+++ b/pkg/analyzer/test/resource_utils.dart
@@ -10,7 +10,6 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/util/absolute_path.dart';
 import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 
@@ -92,12 +91,7 @@
 class TestResourceProvider implements ResourceProvider {
   final ResourceProvider _provider;
 
-  TestResourceProvider(this._provider) {
-    expect(_provider.absolutePathContext.separator, isWindows ? '\\' : '/');
-  }
-
-  @override
-  AbsolutePathContext get absolutePathContext => _provider.absolutePathContext;
+  TestResourceProvider(this._provider);
 
   @override
   path.Context get pathContext => _provider.pathContext;
diff --git a/pkg/analyzer/test/source/analysis_options_provider_test.dart b/pkg/analyzer/test/source/analysis_options_provider_test.dart
index 00e24ad..4d376e4 100644
--- a/pkg/analyzer/test/source/analysis_options_provider_test.dart
+++ b/pkg/analyzer/test/source/analysis_options_provider_test.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/util/yaml.dart';
diff --git a/pkg/analyzer/test/source/package_map_resolver_test.dart b/pkg/analyzer/test/source/package_map_resolver_test.dart
index 924704d..6072255 100644
--- a/pkg/analyzer/test/source/package_map_resolver_test.dart
+++ b/pkg/analyzer/test/source/package_map_resolver_test.dart
@@ -2,12 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer.test.source.package_map_resolver_test;
-
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:path/path.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analyzer/test/src/context/abstract_context.dart b/pkg/analyzer/test/src/context/abstract_context.dart
index 103433e..6c184b3 100644
--- a/pkg/analyzer/test/src/context/abstract_context.dart
+++ b/pkg/analyzer/test/src/context/abstract_context.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/context/cache.dart';
 import 'package:analyzer/src/context/context.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
diff --git a/pkg/analyzer/test/src/context/builder_test.dart b/pkg/analyzer/test/src/context/builder_test.dart
index 01fbb86..2601fcd 100644
--- a/pkg/analyzer/test/src/context/builder_test.dart
+++ b/pkg/analyzer/test/src/context/builder_test.dart
@@ -4,11 +4,11 @@
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/command_line/arguments.dart';
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/context/context_root.dart';
 import 'package:analyzer/src/context/source.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/bazel.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
@@ -16,6 +16,7 @@
 import 'package:analyzer/src/lint/linter.dart';
 import 'package:analyzer/src/lint/registry.dart';
 import 'package:analyzer/src/services/lint.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:args/args.dart';
 import 'package:package_config/packages.dart';
 import 'package:package_config/src/packages_impl.dart';
diff --git a/pkg/analyzer/test/src/context/cache_test.dart b/pkg/analyzer/test/src/context/cache_test.dart
index 32b2cbd..279aef0 100644
--- a/pkg/analyzer/test/src/context/cache_test.dart
+++ b/pkg/analyzer/test/src/context/cache_test.dart
@@ -6,12 +6,12 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/context/cache.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_collection.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/task/api/model.dart';
 import 'package:analyzer/src/task/model.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analyzer/test/src/context/context_test.dart b/pkg/analyzer/test/src/context/context_test.dart
index 14565dc..a4e112b 100644
--- a/pkg/analyzer/test/src/context/context_test.dart
+++ b/pkg/analyzer/test/src/context/context_test.dart
@@ -14,7 +14,6 @@
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/cancelable_future.dart';
 import 'package:analyzer/src/context/cache.dart';
 import 'package:analyzer/src/context/context.dart';
@@ -23,6 +22,7 @@
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_collection.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/task/api/dart.dart';
 import 'package:analyzer/src/task/api/model.dart';
 import 'package:analyzer/src/task/dart.dart';
diff --git a/pkg/analyzer/test/src/context/source_test.dart b/pkg/analyzer/test/src/context/source_test.dart
index 5347f29..21c47ad 100644
--- a/pkg/analyzer/test/src/context/source_test.dart
+++ b/pkg/analyzer/test/src/context/source_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/context/source.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:package_config/packages.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analyzer/test/src/dart/analysis/base.dart b/pkg/analyzer/test/src/dart/analysis/base.dart
index fff1a3c..dacd732 100644
--- a/pkg/analyzer/test/src/dart/analysis/base.dart
+++ b/pkg/analyzer/test/src/dart/analysis/base.dart
@@ -6,13 +6,14 @@
 import 'package:analyzer/dart/element/visitor.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/status.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:front_end/src/api_prototype/byte_store.dart';
 import 'package:front_end/src/base/performance_logger.dart';
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 907139e..ab5f6b6 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -9,7 +9,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/error.dart';
-import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
@@ -18,6 +17,7 @@
 import 'package:analyzer/src/dart/constant/evaluation.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/resolver.dart' show ResolverErrorCode;
 import 'package:analyzer/src/generated/sdk.dart';
diff --git a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
index 7dc865f..3a84319 100644
--- a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
@@ -7,12 +7,13 @@
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/top_level_declaration.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisOptions, AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:convert/convert.dart';
 import 'package:crypto/crypto.dart';
 import 'package:front_end/src/api_prototype/byte_store.dart';
diff --git a/pkg/analyzer/test/src/fasta/recovery/extra_code_test.dart b/pkg/analyzer/test/src/fasta/recovery/extra_code_test.dart
index 3cbbd73..1d2917a 100644
--- a/pkg/analyzer/test/src/fasta/recovery/extra_code_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/extra_code_test.dart
@@ -23,19 +23,14 @@
  */
 @reflectiveTest
 class AnnotationTest extends AbstractRecoveryTest {
-  @failingTest
   void test_typeArgument() {
-    // https://github.com/dart-lang/sdk/issues/22314
-    // Parser crashes
-    // 'package:analyzer/src/fasta/ast_builder.dart': Failed assertion:
-    //     line 256 pos 12: 'token.isKeywordOrIdentifier': is not true.
     testRecovery('''
 const annotation = null;
 class A<E> {}
 class C {
   m() => new A<@annotation C>();
 }
-''', [ParserErrorCode.UNEXPECTED_TOKEN, ParserErrorCode.UNEXPECTED_TOKEN], '''
+''', [ParserErrorCode.UNEXPECTED_TOKEN], '''
 const annotation = null;
 class A<E> {}
 class C {
diff --git a/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart b/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart
index 1531a12..9d6e061 100644
--- a/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart
@@ -294,6 +294,19 @@
   }
 
   @failingTest
+  void test_missingGet() {
+    testRecovery('''
+class Bar {
+  int foo => 0;
+}
+''', [ParserErrorCode.MISSING_GET], '''
+class Bar {
+  int get foo => 0;
+}
+''');
+  }
+
+  @failingTest
   void test_parameterList_leftParen() {
     // https://github.com/dart-lang/sdk/issues/22938
     testRecovery('''
@@ -425,7 +438,6 @@
 ''');
   }
 
-  @failingTest
   void test_extraComma_named_noLast() {
     testRecovery('''
 f({a, , b}) {}
@@ -443,7 +455,6 @@
 ''');
   }
 
-  @failingTest
   void test_extraComma_positional_noLast() {
     testRecovery('''
 f([a, , b]) {}
@@ -461,7 +472,6 @@
 ''');
   }
 
-  @failingTest
   void test_extraComma_required_noLast() {
     testRecovery('''
 f(a, , b) {}
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/do_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/do_statement_test.dart
index b8eb3ff..56fb98f 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/do_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/do_statement_test.dart
@@ -35,7 +35,7 @@
               'leftBrace',
               'do {',
               [
-                ParserErrorCode.EXPECTED_TOKEN,
+                ScannerErrorCode.EXPECTED_TOKEN,
                 ParserErrorCode.EXPECTED_TOKEN,
                 ParserErrorCode.EXPECTED_TOKEN,
                 ParserErrorCode.MISSING_IDENTIFIER,
@@ -43,7 +43,7 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "do {} while (_s_);",
-              allFailing: true),
+              failing: allExceptEof),
           new TestDescriptor(
               'rightBrace',
               'do {}',
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 9cd9192..7c73192 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
@@ -32,9 +32,13 @@
           new TestDescriptor(
               'keyword',
               'export',
-              [/*ParserErrorCode.MISSING_URI,*/ ParserErrorCode.EXPECTED_TOKEN],
-              "export '';",
-              allFailing: true),
+              [
+                // TODO(danrubel): Consider an improved error message
+                // ParserErrorCode.MISSING_URI,
+                ParserErrorCode.EXPECTED_STRING_LITERAL,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              "export '';"),
           new TestDescriptor('emptyUri', "export ''",
               [ParserErrorCode.EXPECTED_TOKEN], "export '';"),
           new TestDescriptor('uri', "export 'a.dart'",
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 eb6dfc6..52cf298 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
@@ -12,17 +12,19 @@
 
 class ImportDirectivesTest extends PartialCodeTest {
   buildAll() {
-    List<String> allExceptEof =
-        PartialCodeTest.prePartSuffixes.map((t) => t.name).toList();
     buildTests(
         'import_directive',
         [
           new TestDescriptor(
               'keyword',
               'import',
-              [/*ParserErrorCode.MISSING_URI,*/ ParserErrorCode.EXPECTED_TOKEN],
-              "import '';",
-              allFailing: true),
+              [
+                // TODO(danrubel): Consider an improved error message
+                // ParserErrorCode.MISSING_URI,
+                ParserErrorCode.EXPECTED_STRING_LITERAL,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              "import '';"),
           new TestDescriptor('emptyUri', "import ''",
               [ParserErrorCode.EXPECTED_TOKEN], "import '';"),
           new TestDescriptor('fullUri', "import 'a.dart'",
@@ -46,7 +48,7 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "import 'a.dart' if (_s_) '';",
-              failing: allExceptEof),
+              failing: ['functionNonVoid', 'getter', 'setter']),
           new TestDescriptor(
               'ifId',
               "import 'a.dart' if (b",
@@ -55,8 +57,7 @@
                 ParserErrorCode.EXPECTED_TOKEN,
                 ParserErrorCode.EXPECTED_STRING_LITERAL
               ],
-              "import 'a.dart' if (b) '';",
-              failing: allExceptEof),
+              "import 'a.dart' if (b) '';"),
           new TestDescriptor(
               'ifEquals',
               "import 'a.dart' if (b ==",
@@ -66,8 +67,7 @@
                 ScannerErrorCode.EXPECTED_TOKEN,
                 ParserErrorCode.EXPECTED_STRING_LITERAL
               ],
-              "import 'a.dart' if (b == '') '';",
-              failing: allExceptEof),
+              "import 'a.dart' if (b == '') '';"),
           new TestDescriptor(
               'ifCondition',
               "import 'a.dart' if (b)",
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart
index 23eac88..388eec1 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart
@@ -59,14 +59,8 @@
               ],
               "const a, _s_;",
               failing: <String>[
-                'assert',
-                'block',
-                'break',
-                'continue',
-                'for',
                 'labeled',
                 'localFunctionNonVoid',
-                'return',
               ]),
           new TestDescriptor(
               'constTypeNameComma',
@@ -77,14 +71,8 @@
               ],
               "const int a, _s_;",
               failing: [
-                'assert',
-                'block',
-                'break',
-                'continue',
-                'for',
                 'labeled',
                 'localFunctionNonVoid',
-                'return',
               ]),
           new TestDescriptor('constNameCommaName', 'const a, b',
               [ParserErrorCode.EXPECTED_TOKEN], "const a, b;"),
@@ -99,16 +87,10 @@
               ],
               "final _s_;",
               failing: [
-                'assert',
-                'block',
-                'break',
-                'continue',
-                'for',
                 'labeled',
                 'localFunctionNonVoid',
                 'localFunctionVoid',
                 'localVariable',
-                'return',
               ]),
           new TestDescriptor('finalName', 'final a',
               [ParserErrorCode.EXPECTED_TOKEN], "final a;",
@@ -138,16 +120,10 @@
               ],
               "var _s_;",
               failing: [
-                'assert',
-                'block',
-                'break',
-                'continue',
-                'for',
                 'labeled',
                 'localFunctionNonVoid',
                 'localFunctionVoid',
                 'localVariable',
-                'return',
               ]),
           new TestDescriptor(
               'varName', 'var a', [ParserErrorCode.EXPECTED_TOKEN], "var a;",
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_directive_test.dart
index bed24e2..814cf9b 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_directive_test.dart
@@ -18,9 +18,13 @@
           new TestDescriptor(
               'keyword',
               'part',
-              [/*ParserErrorCode.MISSING_URI,*/ ParserErrorCode.EXPECTED_TOKEN],
-              "part '';",
-              allFailing: true),
+              [
+                // TODO(danrubel): Consider an improved error message
+                // ParserErrorCode.MISSING_URI,
+                ParserErrorCode.EXPECTED_STRING_LITERAL,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              "part '';"),
           new TestDescriptor('emptyUri', "part ''",
               [ParserErrorCode.EXPECTED_TOKEN], "part '';"),
           new TestDescriptor('uri', "part 'a.dart'",
diff --git a/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart b/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart
index c555393..60b559c 100644
--- a/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart
@@ -26,6 +26,7 @@
     try {
       validUnit =
           parseCompilationUnit(validCode, codes: expectedErrorsInValidCode);
+      validateTokenStream(validUnit.beginToken);
     } catch (e) {
 //      print('');
 //      print('  Errors in valid code.');
@@ -55,8 +56,14 @@
 
   void validateTokenStream(Token token) {
     while (!token.isEof) {
-      expect(token.end, lessThanOrEqualTo(token.next.offset));
-      token = token.next;
+      Token next = token.next;
+      expect(token.end, lessThanOrEqualTo(next.offset));
+      if (next.isSynthetic) {
+        if (const [')', ']', '}'].contains(next.lexeme)) {
+          expect(next.beforeSynthetic, token);
+        }
+      }
+      token = next;
     }
   }
 }
diff --git a/pkg/analyzer/test/src/source/source_resource_test.dart b/pkg/analyzer/test/src/source/source_resource_test.dart
index 29474a0..cde9868 100644
--- a/pkg/analyzer/test/src/source/source_resource_test.dart
+++ b/pkg/analyzer/test/src/source/source_resource_test.dart
@@ -2,11 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer.test.src.source.source_resource_test;
-
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/java_engine_io.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
diff --git a/pkg/analyzer/test/src/task/options_test.dart b/pkg/analyzer/test/src/task/options_test.dart
index 0b6ec9f..186ab04 100644
--- a/pkg/analyzer/test/src/task/options_test.dart
+++ b/pkg/analyzer/test/src/task/options_test.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/source/error_processor.dart';
 import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/lint/linter.dart';
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
index cb9db3a..44e1444 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -11,6 +11,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../../utils.dart';
+import '../../summary/element_text.dart';
 import 'strong_test_helper.dart';
 
 void main() {
@@ -3527,58 +3528,12 @@
     expect(x.type.toString(), 'void');
   }
 
-  test_instantiateToBounds_generic2_hasBound_definedAfter() async {
-    var unit = await checkFileElement(r'''
-class B<T extends /*error:NOT_INSTANTIATED_BOUND*/A> {}
-class A<T extends int> {}
-B v = null;
-''');
-    expect(unit.topLevelVariables[0].type.toString(), 'B<A<dynamic>>');
-  }
-
-  test_instantiateToBounds_generic2_hasBound_definedBefore() async {
-    var unit = await checkFileElement(r'''
-class A<T extends int> {}
-class B<T extends /*error:NOT_INSTANTIATED_BOUND*/A> {}
-B v = null;
-''');
-    expect(unit.topLevelVariables[0].type.toString(), 'B<A<dynamic>>');
-  }
-
-  test_instantiateToBounds_generic2_noBound() async {
-    var unit = await checkFileElement(r'''
-class A<T> {}
-class B<T extends A> {}
-B v = null;
-''');
-    expect(unit.topLevelVariables[0].type.toString(), 'B<A<dynamic>>');
-  }
-
-  test_instantiateToBounds_generic_hasBound_definedAfter() async {
-    var unit = await checkFileElement(r'''
-A v = null;
-class A<T extends int> {}
-''');
-    expect(unit.topLevelVariables[0].type.toString(), 'A<int>');
-  }
-
-  test_instantiateToBounds_generic_hasBound_definedBefore() async {
-    var unit = await checkFileElement(r'''
-class A<T extends int> {}
-A v = null;
-''');
-    expect(unit.topLevelVariables[0].type.toString(), 'A<int>');
-  }
-
   test_instantiateToBounds_invokeConstructor_noBound() async {
-    var unit = await checkFile('''
+    var unit = await checkFileElement('''
 class C<T> {}
-main() {
-  var v = new C();
-}
+var x = /*info:INFERRED_TYPE_ALLOCATION*/new C();
 ''');
-    var v = findLocalVariable(unit, 'v');
-    expect(v.type.toString(), 'C<dynamic>');
+    expect(unit.topLevelVariables[0].type.toString(), 'C<dynamic>');
   }
 
   test_instantiateToBounds_invokeConstructor_typeArgsExact() async {
@@ -3595,7 +3550,128 @@
 class B<T extends A> {}
 B v = null;
 ''');
-    expect(unit.topLevelVariables[0].type.toString(), 'B<A>');
+    checkElementText(unit.library, r'''
+class A {
+}
+class B<T extends A> {
+}
+B<A> v;
+''');
+  }
+
+  test_instantiateToBounds_typeName_error1() async {
+    var unit = await checkFileElement(r'''
+class A<T1 extends int, T2 extends T1> {}
+class B<T extends /*error:NOT_INSTANTIATED_BOUND*/A> {}
+B v = null;
+''');
+    checkElementText(unit.library, r'''
+class A<T1 extends int, T2 extends T1> {
+}
+class B<T extends A<int, int>> {
+}
+B<A<int, int>> v;
+''');
+  }
+
+  test_instantiateToBounds_typeName_error2() async {
+    var unit = await checkFileElement(r'''
+class A<T1 extends T2, T2 extends int> {}
+class B<T extends /*error:NOT_INSTANTIATED_BOUND*/A> {}
+B v = null;
+''');
+    checkElementText(unit.library, r'''
+class A<T1 extends T2, T2 extends int> {
+}
+class B<T extends A<int, int>> {
+}
+B<A<int, int>> v;
+''');
+  }
+
+  test_instantiateToBounds_typeName_error3() async {
+    var unit = await checkFileElement(r'''
+class A<T1 extends int, T2 extends List<T1>> {}
+class B<T extends /*error:NOT_INSTANTIATED_BOUND*/A> {}
+B v = null;
+''');
+    checkElementText(unit.library, r'''
+class A<T1 extends int, T2 extends List<T1>> {
+}
+class B<T extends A<int, List<int>>> {
+}
+B<A<int, List<int>>> v;
+''');
+  }
+
+  @failingTest
+  test_instantiateToBounds_typeName_OK_hasBound_definedAfter() async {
+    var unit = await checkFileElement(r'''
+class B<T extends A> {}
+class A<T extends int> {}
+B v = null;
+''');
+    checkElementText(unit.library, r'''
+class B<T extends A<int>> {
+}
+class A<T extends int> {
+}
+B<A<int>> v;
+''');
+  }
+
+  test_instantiateToBounds_typeName_OK_hasBound_definedBefore() async {
+    var unit = await checkFileElement(r'''
+class A<T extends int> {}
+class B<T extends A> {}
+B v = null;
+''');
+    checkElementText(unit.library, r'''
+class A<T extends int> {
+}
+class B<T extends A<int>> {
+}
+B<A<int>> v;
+''');
+  }
+
+  test_instantiateToBounds_typeName_OK_inBound_hasBound_definedAfter() async {
+    var unit = await checkFileElement(r'''
+A v = null;
+class A<T extends int> {}
+''');
+    checkElementText(unit.library, r'''
+class A<T extends int> {
+}
+A<int> v;
+''');
+  }
+
+  test_instantiateToBounds_typeName_OK_inBound_hasBound_definedBefore() async {
+    var unit = await checkFileElement(r'''
+class A<T extends int> {}
+A v = null;
+''');
+    checkElementText(unit.library, r'''
+class A<T extends int> {
+}
+A<int> v;
+''');
+  }
+
+  test_instantiateToBounds_typeName_OK_noBound() async {
+    var unit = await checkFileElement(r'''
+class A<T> {}
+class B<T extends A> {}
+B v = null;
+''');
+    checkElementText(unit.library, r'''
+class A<T> {
+}
+class B<T extends A<dynamic>> {
+}
+B<A<dynamic>> v;
+''');
   }
 
   test_lambdaDoesNotHavePropagatedTypeHint() async {
@@ -4354,11 +4430,34 @@
   bool get hasExtraTaskModelPass => false;
 
   @override
+  test_instantiateToBounds_typeName_OK_hasBound_definedAfter() async {
+    await super.test_instantiateToBounds_typeName_OK_hasBound_definedAfter();
+  }
+
+  @override
+  test_listLiteralsCanInferNull_topLevel() =>
+      super.test_listLiteralsCanInferNull_topLevel();
+
+  @override
+  test_mapLiteralsCanInferNull_topLevel() =>
+      super.test_mapLiteralsCanInferNull_topLevel();
+
+  @override
+  test_nullCoalescingOperator() async {
+    await super.test_nullCoalescingOperator();
+  }
+
+  @override
   test_circularReference_viaClosures() async {
     await super.test_circularReference_viaClosures();
   }
 
   @override
+  test_unsafeBlockClosureInference_closureCall() async {
+    await super.test_unsafeBlockClosureInference_closureCall();
+  }
+
+  @override
   test_circularReference_viaClosures_initializerTypes() async {
     await super.test_circularReference_viaClosures_initializerTypes();
   }
diff --git a/pkg/analyzer/test/src/task/strong/strong_test_helper.dart b/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
index f1c59c2..bd0f90a 100644
--- a/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
+++ b/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
@@ -26,6 +26,7 @@
 import 'package:front_end/src/base/performance_logger.dart';
 import 'package:source_span/source_span.dart';
 import 'package:test/test.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 
 import '../../context/mock_sdk.dart';
 
diff --git a/pkg/analyzer/test/src/util/absolute_path_test.dart b/pkg/analyzer/test/src/util/absolute_path_test.dart
deleted file mode 100644
index 42c8449..0000000
--- a/pkg/analyzer/test/src/util/absolute_path_test.dart
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library analyzer.test.src.util.absolute_path_test;
-
-import 'package:analyzer/src/util/absolute_path.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(AbsolutePathContextPosixTest);
-    defineReflectiveTests(AbsolutePathContextWindowsTest);
-  });
-}
-
-@reflectiveTest
-class AbsolutePathContextPosixTest {
-  AbsolutePathContext context = new AbsolutePathContext(false);
-
-  void test_append() {
-    expect(context.append(r'/path/to', r'foo.dart'), r'/path/to/foo.dart');
-  }
-
-  void test_basename() {
-    expect(context.basename(r'/path/to/foo.dart'), r'foo.dart');
-    expect(context.basename(r'/path/to'), r'to');
-    expect(context.basename(r'/path'), r'path');
-    expect(context.basename(r'/'), r'');
-  }
-
-  void test_dirname() {
-    expect(context.dirname(r'/path/to/foo.dart'), r'/path/to');
-    expect(context.dirname(r'/path/to'), r'/path');
-    expect(context.dirname(r'/path'), r'/');
-    expect(context.dirname(r'/'), r'/');
-  }
-
-  void test_isValid_absolute() {
-    expect(context.isValid(r'/foo/bar'), isTrue);
-    expect(context.isValid(r'/foo'), isTrue);
-    expect(context.isValid(r'/'), isTrue);
-    expect(context.isValid(r''), isFalse);
-    expect(context.isValid(r'foo/bar'), isFalse);
-  }
-
-  void test_isValid_normalized() {
-    expect(context.isValid(r'/foo/bar'), isTrue);
-    expect(context.isValid(r'/foo/..bar'), isTrue);
-    expect(context.isValid(r'/foo/.bar/baz'), isTrue);
-    expect(context.isValid(r'/foo/...'), isTrue);
-    expect(context.isValid(r'/foo/bar..'), isTrue);
-    expect(context.isValid(r'/foo/.../bar'), isTrue);
-    expect(context.isValid(r'/foo/.bar/.'), isFalse);
-    expect(context.isValid(r'/foo/bar/../baz'), isFalse);
-    expect(context.isValid(r'/foo/bar/..'), isFalse);
-    expect(context.isValid(r'/foo/./bar'), isFalse);
-    expect(context.isValid(r'/.'), isFalse);
-  }
-
-  void test_isWithin() {
-    expect(context.isWithin(r'/root/path', r'/root/path/a'), isTrue);
-    expect(context.isWithin(r'/root/path', r'/root/other'), isFalse);
-    expect(context.isWithin(r'/root/path', r'/root/path'), isFalse);
-  }
-
-  void test_split() {
-    expect(context.split(r'/path/to/foo'), [r'', r'path', r'to', r'foo']);
-    expect(context.split(r'/path'), [r'', r'path']);
-  }
-
-  void test_suffix() {
-    expect(context.suffix(r'/root/path', r'/root/path/a/b.dart'), r'a/b.dart');
-    expect(context.suffix(r'/root/path', r'/root/other.dart'), isNull);
-  }
-}
-
-@reflectiveTest
-class AbsolutePathContextWindowsTest {
-  AbsolutePathContext context = new AbsolutePathContext(true);
-
-  void test_append() {
-    expect(context.append(r'C:\path\to', r'foo.dart'), r'C:\path\to\foo.dart');
-  }
-
-  void test_basename() {
-    expect(context.basename(r'C:\path\to\foo.dart'), r'foo.dart');
-    expect(context.basename(r'C:\path\to'), r'to');
-    expect(context.basename(r'C:\path'), r'path');
-    expect(context.basename(r'C:\'), r'');
-  }
-
-  void test_dirname() {
-    expect(context.dirname(r'C:\path\to\foo.dart'), r'C:\path\to');
-    expect(context.dirname(r'C:\path\to'), r'C:\path');
-    expect(context.dirname(r'C:\path'), r'C:\');
-    expect(context.dirname(r'C:\'), r'C:\');
-  }
-
-  void test_isValid_absolute() {
-    expect(context.isValid(r'C:\foo\bar'), isTrue);
-    expect(context.isValid(r'c:\foo\bar'), isTrue);
-    expect(context.isValid(r'D:\foo\bar'), isTrue);
-    expect(context.isValid(r'C:\foo'), isTrue);
-    expect(context.isValid(r'C:\'), isTrue);
-    expect(context.isValid(r''), isFalse);
-    expect(context.isValid(r'foo\bar'), isFalse);
-  }
-
-  void test_isValid_normalized() {
-    expect(context.isValid(r'C:\foo\bar'), isTrue);
-    expect(context.isValid(r'C:\foo\..bar'), isTrue);
-    expect(context.isValid(r'C:\foo\.bar\baz'), isTrue);
-    expect(context.isValid(r'C:\foo\...'), isTrue);
-    expect(context.isValid(r'C:\foo\bar..'), isTrue);
-    expect(context.isValid(r'C:\foo\...\bar'), isTrue);
-    expect(context.isValid(r'C:\foo\.bar\.'), isFalse);
-    expect(context.isValid(r'C:\foo\bar\..\baz'), isFalse);
-    expect(context.isValid(r'C:\foo\bar\..'), isFalse);
-    expect(context.isValid(r'C:\foo\.\bar'), isFalse);
-    expect(context.isValid(r'C:\.'), isFalse);
-  }
-
-  void test_isWithin() {
-    expect(context.isWithin(r'C:\root\path', r'C:\root\path\a'), isTrue);
-    expect(context.isWithin(r'C:\root\path', r'C:\root\other'), isFalse);
-    expect(context.isWithin(r'C:\root\path', r'C:\root\path'), isFalse);
-  }
-
-  void test_split() {
-    expect(context.split(r'C:\path\to\foo'), [r'C:', r'path', r'to', r'foo']);
-    expect(context.split(r'C:\path'), [r'C:', r'path']);
-  }
-
-  void test_suffix() {
-    expect(
-        context.suffix(r'C:\root\path', r'C:\root\path\a\b.dart'), r'a\b.dart');
-    expect(context.suffix(r'C:\root\path', r'C:\root\other.dart'), isNull);
-  }
-}
diff --git a/pkg/analyzer/test/src/util/test_all.dart b/pkg/analyzer/test/src/util/test_all.dart
index de12251..d9cd7bd 100644
--- a/pkg/analyzer/test/src/util/test_all.dart
+++ b/pkg/analyzer/test/src/util/test_all.dart
@@ -6,7 +6,6 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import 'absolute_path_test.dart' as absolute_path_test;
 import 'asserts_test.dart' as asserts_test;
 import 'glob_test.dart' as glob_test;
 import 'lru_map_test.dart' as lru_map_test;
@@ -15,7 +14,6 @@
 /// Utility for manually running all tests.
 main() {
   defineReflectiveSuite(() {
-    absolute_path_test.main();
     asserts_test.main();
     glob_test.main();
     lru_map_test.main();
diff --git a/pkg/analyzer/tool/task_dependency_graph/generate.dart b/pkg/analyzer/tool/task_dependency_graph/generate.dart
index e3ddb67..53477e1 100644
--- a/pkg/analyzer/tool/task_dependency_graph/generate.dart
+++ b/pkg/analyzer/tool/task_dependency_graph/generate.dart
@@ -15,8 +15,6 @@
  *   of exactly one task.
  * - Convert this tool to use package_config to find the package map.
  */
-library analyzer.tool.task_dependency_graph.generate;
-
 import 'dart:async';
 import 'dart:io' hide File;
 import 'dart:io' as io;
@@ -24,19 +22,19 @@
 import 'package:analyzer/analyzer.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:front_end/src/api_prototype/byte_store.dart';
 import 'package:front_end/src/base/performance_logger.dart';
 import 'package:front_end/src/codegen/tools.dart';
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index ca20983..492de93 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -9,13 +9,12 @@
 import 'package:analyzer/file_system/file_system.dart' as file_system;
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/plugin/resolver_provider.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/interner.dart';
@@ -25,8 +24,10 @@
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/utilities_general.dart'
     show PerformanceTag;
+import 'package:analyzer/src/plugin/resolver_provider.dart';
 import 'package:analyzer/src/pubspec/pubspec_validator.dart';
 import 'package:analyzer/src/source/package_map_provider.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/source/path_filter.dart';
 import 'package:analyzer/src/source/pub_package_map_provider.dart';
 import 'package:analyzer/src/source/sdk_ext.dart';
@@ -509,7 +510,7 @@
         resolvers
             .add(new InSummaryUriResolver(resourceProvider, summaryDataStore));
         resolvers.add(resolver);
-        resolvers.add(new file_system.ResourceUriResolver(resourceProvider));
+        resolvers.add(new ResourceUriResolver(resourceProvider));
         return new SourceFactory(resolvers);
       }
     }
@@ -579,7 +580,7 @@
     }
 
     // Finally files.
-    resolvers.add(new file_system.ResourceUriResolver(resourceProvider));
+    resolvers.add(new ResourceUriResolver(resourceProvider));
 
     return new SourceFactory(resolvers, packageInfo.packages);
   }
diff --git a/pkg/analyzer_cli/lib/starter.dart b/pkg/analyzer_cli/lib/starter.dart
index 206fff6..40d480c 100644
--- a/pkg/analyzer_cli/lib/starter.dart
+++ b/pkg/analyzer_cli/lib/starter.dart
@@ -2,11 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer_cli.starter;
-
 import 'dart:async';
 
-import 'package:analyzer/plugin/resolver_provider.dart';
+import 'package:analyzer/src/plugin/resolver_provider.dart';
 import 'package:analyzer_cli/src/driver.dart';
 import 'package:plugin/plugin.dart';
 
diff --git a/pkg/analyzer_cli/tool/perf.dart b/pkg/analyzer_cli/tool/perf.dart
index 4aa3aa6..3e622c8 100644
--- a/pkg/analyzer_cli/tool/perf.dart
+++ b/pkg/analyzer_cli/tool/perf.dart
@@ -3,25 +3,23 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// An entrypoint used to run portions of analyzer and measure its performance.
-library analyzer_cli.tool.perf;
-
 import 'dart:async';
 import 'dart:io' show exit;
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/error/listener.dart';
-import 'package:analyzer/file_system/file_system.dart' show ResourceUriResolver;
 import 'package:analyzer/file_system/physical_file_system.dart'
     show PhysicalResourceProvider;
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/dart/scanner/reader.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart' show FolderBasedDartSdk;
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:package_config/discovery.dart';
 
 main(List<String> args) async {
diff --git a/pkg/analyzer_plugin/test/support/abstract_context.dart b/pkg/analyzer_plugin/test/support/abstract_context.dart
index e5b4622..844b487 100644
--- a/pkg/analyzer_plugin/test/support/abstract_context.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_context.dart
@@ -11,16 +11,17 @@
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/engine.dart' as engine;
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/testing/element_search.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 
 import 'mock_sdk.dart';
 
diff --git a/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart b/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
index 6bb494c..9211a5e 100644
--- a/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
+++ b/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
@@ -6,8 +6,8 @@
 
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/src/utilities/completion/completion_core.dart';
 import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index 140d9e8..04c300e 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -18,6 +18,8 @@
 import 'universe/call_structure.dart' show CallStructure;
 import 'universe/selector.dart' show Selector;
 import 'universe/call_structure.dart';
+import 'universe/world_builder.dart';
+import 'world.dart';
 
 /// The common elements and types in Dart.
 class CommonElements {
@@ -160,11 +162,39 @@
         _findConstructor(symbolImplementationClass, '');
   }
 
+  bool _computedSymbolConstructorDependencies = false;
+  ConstructorEntity _symbolConstructorImplementationTarget;
+
+  void _ensureSymbolConstructorDependencies() {
+    if (_computedSymbolConstructorDependencies) return;
+    _computedSymbolConstructorDependencies = true;
+    if (_symbolConstructorTarget == null) {
+      if (_symbolImplementationClass == null) {
+        _symbolImplementationClass =
+            _findClass(internalLibrary, 'Symbol', required: false);
+      }
+      if (_symbolImplementationClass != null) {
+        _symbolConstructorTarget =
+            _findConstructor(_symbolImplementationClass, '', required: false);
+      }
+    }
+    if (_symbolClass == null) {
+      _symbolClass = _findClass(coreLibrary, 'Symbol', required: false);
+    }
+    if (_symbolClass == null) {
+      return;
+    }
+    _symbolConstructorImplementationTarget =
+        _findConstructor(symbolClass, '', required: false);
+  }
+
   /// Whether [element] is the same as [symbolConstructor]. Used to check
   /// for the constructor without computing it until it is likely to be seen.
   bool isSymbolConstructor(ConstructorEntity element) {
-    return element == symbolConstructorTarget ||
-        element == _findConstructor(symbolClass, '', required: false);
+    assert(element != null);
+    _ensureSymbolConstructorDependencies();
+    return element == _symbolConstructorImplementationTarget ||
+        element == _symbolConstructorTarget;
   }
 
   /// The `MirrorSystem` class in dart:mirrors.
@@ -698,10 +728,13 @@
   ClassEntity get jsUInt31Class =>
       _jsUInt31Class ??= _findInterceptorsClass('JSUInt31');
 
-  FunctionEntity _findIndexForNativeSubclassType;
-  FunctionEntity get findIndexForNativeSubclassType =>
-      _findIndexForNativeSubclassType ??= _findLibraryMember(
-          interceptorsLibrary, 'findIndexForNativeSubclassType');
+  /// Returns `true` member is the 'findIndexForNativeSubclassType' method
+  /// declared in `dart:_interceptors`.
+  bool isFindIndexForNativeSubclassType(MemberEntity member) {
+    return member.name == 'findIndexForNativeSubclassType' &&
+        member.isTopLevel &&
+        member.library == interceptorsLibrary;
+  }
 
   FunctionEntity _getInterceptorMethod;
   FunctionEntity get getInterceptorMethod =>
@@ -712,9 +745,10 @@
       _getNativeInterceptorMethod ??=
           _findInterceptorsFunction('getNativeInterceptor');
 
-  MemberEntity _jsIndexableLength;
-  MemberEntity get jsIndexableLength =>
-      _jsIndexableLength ??= _findClassMember(jsIndexableClass, 'length');
+  /// Returns `true` if [selector] applies to `JSIndexable.length`.
+  bool appliesToJsIndexableLength(Selector selector) {
+    return selector.name == 'length' && (selector.isGetter || selector.isCall);
+  }
 
   ConstructorEntity _jsArrayTypedConstructor;
   ConstructorEntity get jsArrayTypedConstructor =>
@@ -728,6 +762,33 @@
   FunctionEntity get jsArrayAdd =>
       _jsArrayAdd ??= _findClassMember(jsArrayClass, 'add');
 
+  bool isJsStringClass(ClassEntity cls) {
+    return cls.name == 'JSString' && cls.library == interceptorsLibrary;
+  }
+
+  bool isJsStringSplit(MemberEntity member) {
+    return member.name == 'split' &&
+        member.isInstanceMember &&
+        isJsStringClass(member.enclosingClass);
+  }
+
+  /// Returns `true` if [selector] applies to `JSString.split` on [receiver]
+  /// in the given [world].
+  ///
+  /// Returns `false` if `JSString.split` is not available.
+  bool appliesToJsStringSplit(
+      Selector selector, ReceiverConstraint receiver, World world) {
+    if (_jsStringSplit == null) {
+      ClassEntity cls =
+          _findClass(interceptorsLibrary, 'JSString', required: false);
+      if (cls == null) return false;
+      _jsStringSplit = _findClassMember(cls, 'split', required: false);
+      if (_jsStringSplit == null) return false;
+    }
+    return selector.applies(_jsStringSplit) &&
+        (receiver == null || receiver.canHit(jsStringSplit, selector, world));
+  }
+
   FunctionEntity _jsStringSplit;
   FunctionEntity get jsStringSplit =>
       _jsStringSplit ??= _findClassMember(jsStringClass, 'split');
@@ -1122,6 +1183,12 @@
       _env.lookupLibrary(Uris.dart__native_typed_data, required: true),
       'NativeTypedArrayOfInt');
 
+  ClassEntity _typedArrayOfDoubleClass;
+  ClassEntity get typedArrayOfDoubleClass =>
+      _typedArrayOfDoubleClass ??= _findClass(
+          _env.lookupLibrary(Uris.dart__native_typed_data, required: true),
+          'NativeTypedArrayOfDouble');
+
   // From dart:_js_embedded_names
 
   /// Holds the class for the [JsGetName] enum.
@@ -1420,6 +1487,11 @@
   /// Returns the function type variables defined on [function].
   List<TypeVariableType> getFunctionTypeVariables(FunctionEntity function);
 
+  /// Returns the 'element' type of a function with an async, async* ot sync*
+  /// marker. The return type of the method is inspected to determine the type
+  /// parameter of the Future, Stream or Iterable.
+  DartType getFunctionAsyncOrSyncStarElementType(FunctionEntity function);
+
   /// Returns the type of [field].
   DartType getFieldType(FieldEntity field);
 
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index e63edc3..7bc310e 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -170,6 +170,12 @@
 
   bool compilationFailed = false;
 
+  // Callback function used for testing resolution enqueuing.
+  void Function() onResolutionQueueEmptyForTesting;
+
+  // Callback function used for testing codegen enqueuing.
+  void Function() onCodegenQueueEmptyForTesting;
+
   Compiler(
       {CompilerOptions options,
       api.CompilerOutput outputProvider,
diff --git a/pkg/compiler/lib/src/dump_info.dart b/pkg/compiler/lib/src/dump_info.dart
index ad5e6f2..e97726c 100644
--- a/pkg/compiler/lib/src/dump_info.dart
+++ b/pkg/compiler/lib/src/dump_info.dart
@@ -128,7 +128,9 @@
       compiler.globalInference.results.resultOfParameter(e);
 
   FieldInfo visitField(FieldEntity field) {
-    if (!_hasBeenResolved(field)) return null;
+    if (!_hasBeenResolved(field)) {
+      return null;
+    }
     TypeMask inferredType = _resultOfMember(field).type;
     // If a field has an empty inferred type it is never used.
     if (inferredType == null || inferredType.isEmpty) return null;
@@ -163,6 +165,12 @@
     return info;
   }
 
+  bool _hasBeenResolved(MemberEntity entity) {
+    return compiler.globalInference.typesInferrerInternal.inferrer.types
+        .memberTypeInformations
+        .containsKey(entity);
+  }
+
   ClassInfo visitClass(ClassEntity clazz) {
     // Omit class if it is not needed.
     if (!_hasClassBeenResolved(clazz)) return null;
@@ -372,11 +380,6 @@
     return _infoFromOutputUnit(outputUnit);
   }
 
-  bool _hasBeenResolved(Entity entity) {
-    return compiler.enqueuer.codegenEnqueuerForTesting.processedEntities
-        .contains(entity);
-  }
-
   bool _hasClassBeenResolved(ClassEntity cls) {
     return compiler.backend.mirrorsData.isClassResolved(cls);
   }
diff --git a/pkg/compiler/lib/src/elements/resolution_types.dart b/pkg/compiler/lib/src/elements/resolution_types.dart
index 2ae43fa..4b80a11 100644
--- a/pkg/compiler/lib/src/elements/resolution_types.dart
+++ b/pkg/compiler/lib/src/elements/resolution_types.dart
@@ -162,6 +162,12 @@
   /// Is [: true :] if this type contains any type variables.
   bool get containsTypeVariables => typeVariableOccurrence != null;
 
+  bool get containsFreeTypeVariables {
+    assert(!containsMethodTypeVariableType,
+        'Used only after removing method type variables');
+    return containsTypeVariables;
+  }
+
   /// Returns a textual representation of this type as if it was the type
   /// of a member named [name].
   String getStringAsDeclared(String name) {
@@ -1233,10 +1239,12 @@
   }
 
   bool isPotentialSubtype(
-      covariant ResolutionDartType t, covariant ResolutionDartType s) {
+      covariant ResolutionDartType t, covariant ResolutionDartType s,
+      {bool assumeInstantiations: true}) {
     // TODO(johnniwinther): Return a set of variable points in the positive
     // cases.
-    return potentialSubtypeVisitor.isSubtype(t, s);
+    return potentialSubtypeVisitor.isPotentialSubtype(t, s,
+        assumeInstantiations: assumeInstantiations);
   }
 
   @override
diff --git a/pkg/compiler/lib/src/elements/types.dart b/pkg/compiler/lib/src/elements/types.dart
index c2110c7..b60700f 100644
--- a/pkg/compiler/lib/src/elements/types.dart
+++ b/pkg/compiler/lib/src/elements/types.dart
@@ -74,6 +74,12 @@
   /// Whether this type contains a type variable.
   bool get containsTypeVariables => false;
 
+  /// Whether this type contains a free class type variable or function type
+  /// variable.
+  // TODO(sra): Review uses of [containsTypeVariables] for update with
+  // [containsFreeTypeVariables].
+  bool get containsFreeTypeVariables => _containsFreeTypeVariables(null);
+
   /// Is `true` if this type is the 'Object' type defined in 'dart:core'.
   bool get isObject => false;
 
@@ -96,6 +102,8 @@
   R accept<R, A>(DartTypeVisitor<R, A> visitor, A argument);
 
   bool _equals(DartType other, _Assumptions assumptions);
+
+  bool _containsFreeTypeVariables(List<FunctionTypeVariable> bindings) => false;
 }
 
 /// Pairs of [FunctionTypeVariable]s that are currently assumed to be equivalent.
@@ -173,6 +181,11 @@
     typeArguments.forEach((type) => type.forEachTypeVariable(f));
   }
 
+  bool _containsFreeTypeVariables(List<FunctionTypeVariable> bindings) {
+    return typeArguments
+        .any((type) => type._containsFreeTypeVariables(bindings));
+  }
+
   InterfaceType subst(List<DartType> arguments, List<DartType> parameters) {
     if (typeArguments.isEmpty) {
       // Return fast on non-generic types.
@@ -263,6 +276,9 @@
     typeArguments.forEach((type) => type.forEachTypeVariable(f));
   }
 
+  bool _containsFreeTypeVariables(List<FunctionTypeVariable> bindings) =>
+      typeArguments.any((type) => type._containsFreeTypeVariables(bindings));
+
   TypedefType subst(List<DartType> arguments, List<DartType> parameters) {
     if (typeArguments.isEmpty) {
       // Return fast on non-generic types.
@@ -350,6 +366,8 @@
 
   @override
   bool get isMalformed => true;
+
+  bool _containsFreeTypeVariables(List<FunctionTypeVariable> bindings) => false;
 }
 
 class TypeVariableType extends DartType {
@@ -365,6 +383,8 @@
     f(this);
   }
 
+  bool _containsFreeTypeVariables(List<FunctionTypeVariable> bindings) => true;
+
   DartType subst(List<DartType> arguments, List<DartType> parameters) {
     assert(arguments.length == parameters.length);
     if (parameters.isEmpty) {
@@ -433,6 +453,12 @@
   @override
   bool get isFunctionTypeVariable => true;
 
+  bool _containsFreeTypeVariables(List<FunctionTypeVariable> bindings) {
+    if (bindings == null) return true;
+    if (bindings.indexOf(this) >= 0) return false;
+    return true;
+  }
+
   DartType subst(List<DartType> arguments, List<DartType> parameters) {
     assert(arguments.length == parameters.length);
     if (parameters.isEmpty) {
@@ -564,6 +590,29 @@
     namedParameterTypes.forEach((type) => type.forEachTypeVariable(f));
   }
 
+  bool _containsFreeTypeVariables(List<FunctionTypeVariable> bindings) {
+    int restore;
+    if (typeVariables.isNotEmpty) {
+      if (bindings == null) {
+        bindings = <FunctionTypeVariable>[];
+      } else {
+        restore = bindings.length;
+      }
+      bindings.addAll(typeVariables);
+    }
+
+    bool hasFree(DartType type) => type._containsFreeTypeVariables(bindings);
+
+    bool result = hasFree(returnType) ||
+        typeVariables.any((type) => hasFree(type.bound)) ||
+        parameterTypes.any(hasFree) ||
+        optionalParameterTypes.any(hasFree) ||
+        namedParameterTypes.any(hasFree);
+
+    if (restore != null) bindings.length = restore;
+    return result;
+  }
+
   bool get isFunctionType => true;
 
   DartType subst(List<DartType> arguments, List<DartType> parameters) {
@@ -674,7 +723,7 @@
         }
       }
     }
-    bool result = returnType == other.returnType &&
+    bool result = returnType._equals(other.returnType, assumptions) &&
         _equalTypes(parameterTypes, other.parameterTypes, assumptions) &&
         _equalTypes(optionalParameterTypes, other.optionalParameterTypes,
             assumptions) &&
@@ -778,6 +827,9 @@
     typeArgument.forEachTypeVariable(f);
   }
 
+  bool _containsFreeTypeVariables(List<FunctionTypeVariable> bindings) =>
+      typeArgument._containsFreeTypeVariables(bindings);
+
   R accept<R, A>(DartTypeVisitor<R, A> visitor, A argument) =>
       visitor.visitFutureOrType(this, argument);
 
@@ -981,29 +1033,37 @@
     if (s is! FunctionType) return false;
     FunctionType tf = t;
     FunctionType sf = s;
-    if (invalidFunctionReturnTypes(tf.returnType, sf.returnType)) {
+    int typeVariablesCount = getCommonTypeVariablesCount(tf, sf);
+    if (typeVariablesCount == null) {
       return false;
     }
-
-    if (tf.typeVariables.length != sf.typeVariables.length) {
-      return false;
-    }
-    for (int i = 0; i < tf.typeVariables.length; i++) {
+    for (int i = 0; i < typeVariablesCount; i++) {
       assumptions.assume(tf.typeVariables[i], sf.typeVariables[i]);
     }
-    for (int i = 0; i < tf.typeVariables.length; i++) {
+    for (int i = 0; i < typeVariablesCount; i++) {
       if (!tf.typeVariables[i].bound
           ._equals(sf.typeVariables[i].bound, assumptions)) {
         return false;
       }
     }
+    if (invalidFunctionReturnTypes(tf.returnType, sf.returnType)) {
+      return false;
+    }
+
     bool result = visitFunctionTypeInternal(tf, sf);
-    for (int i = 0; i < tf.typeVariables.length; i++) {
+    for (int i = 0; i < typeVariablesCount; i++) {
       assumptions.forget(tf.typeVariables[i], sf.typeVariables[i]);
     }
     return result;
   }
 
+  int getCommonTypeVariablesCount(FunctionType t, FunctionType s) {
+    if (t.typeVariables.length == s.typeVariables.length) {
+      return t.typeVariables.length;
+    }
+    return null;
+  }
+
   bool visitFunctionTypeInternal(FunctionType tf, FunctionType sf) {
     // TODO(johnniwinther): Rewrite the function subtyping to be more readable
     // but still as efficient.
@@ -1249,12 +1309,34 @@
 /// `false` only if we are sure no such substitution exists.
 abstract class PotentialSubtypeVisitor<T extends DartType>
     extends SubtypeVisitor<T> {
+  bool _assumeInstantiations = true;
+
   bool isSubtype(DartType t, DartType s) {
     if (t is TypeVariableType || s is TypeVariableType) {
       return true;
     }
+    if ((t is FunctionTypeVariable || s is FunctionTypeVariable) &&
+        _assumeInstantiations) {
+      return true;
+    }
     return super.isSubtype(t, s);
   }
+
+  int getCommonTypeVariablesCount(FunctionType t, FunctionType s) {
+    if (t.typeVariables.length == s.typeVariables.length) {
+      return t.typeVariables.length;
+    }
+    if (_assumeInstantiations && s.typeVariables.length == 0) {
+      return 0;
+    }
+    return null;
+  }
+
+  bool isPotentialSubtype(DartType t, DartType s,
+      {bool assumeInstantiations: true}) {
+    _assumeInstantiations = assumeInstantiations;
+    return isSubtype(t, s);
+  }
 }
 
 /// Basic interface for the Dart type system.
@@ -1270,7 +1352,11 @@
 
   /// Returns `true` if [t] might be a subtype of [s] for some values of
   /// type variables in [s] and [t].
-  bool isPotentialSubtype(DartType t, DartType s);
+  ///
+  /// If [assumeInstantiations], generic function types are assumed to be
+  /// potentially instantiated.
+  bool isPotentialSubtype(DartType t, DartType s,
+      {bool assumeInstantiations: true});
 
   static const int IS_SUBTYPE = 1;
   static const int MAYBE_SUBTYPE = 0;
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
index 6fa0f01..0abf135 100644
--- a/pkg/compiler/lib/src/enqueue.dart
+++ b/pkg/compiler/lib/src/enqueue.dart
@@ -55,13 +55,15 @@
   }
 
   ResolutionEnqueuer createResolutionEnqueuer() {
-    return _resolution ??=
-        compiler.backend.createResolutionEnqueuer(this, compiler);
+    return _resolution ??= compiler.backend
+        .createResolutionEnqueuer(this, compiler)
+          ..onEmptyForTesting = compiler.onResolutionQueueEmptyForTesting;
   }
 
   Enqueuer createCodegenEnqueuer(ClosedWorld closedWorld) {
-    return codegenEnqueuerForTesting =
-        compiler.backend.createCodegenEnqueuer(this, compiler, closedWorld);
+    return codegenEnqueuerForTesting = compiler.backend
+        .createCodegenEnqueuer(this, compiler, closedWorld)
+          ..onEmptyForTesting = compiler.onCodegenQueueEmptyForTesting;
   }
 }
 
@@ -213,6 +215,10 @@
   /// has been emptied.
   final Queue<DeferredAction> _deferredQueue = new Queue<DeferredAction>();
 
+  // If not `null` this is called when the queue has been emptied. It allows for
+  // applying additional impacts before re-emptying the queue.
+  void Function() onEmptyForTesting;
+
   ResolutionEnqueuer(this.task, this._options, this._reporter, this.strategy,
       this.listener, this._worldBuilder, this._workItemBuilder,
       [this.name = 'resolution enqueuer']) {
@@ -396,7 +402,7 @@
     _worldBuilder.registerClosurizedMember(element);
   }
 
-  void forEach(void f(WorkItem work)) {
+  void _forEach(void f(WorkItem work)) {
     do {
       while (_queue.isNotEmpty) {
         // TODO(johnniwinther): Find an optimal process order.
@@ -418,6 +424,14 @@
         _recentConstants);
   }
 
+  void forEach(void f(WorkItem work)) {
+    _forEach(f);
+    if (onEmptyForTesting != null) {
+      onEmptyForTesting();
+      _forEach(f);
+    }
+  }
+
   void logSummary(void log(String message)) {
     log('Resolved ${processedEntities.length} elements.');
     listener.logSummary(log);
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index 100fbdb..6d6b2f5 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -1634,7 +1634,8 @@
 
     TypeInformation rhsType = visit(node.value);
     MemberEntity member = _elementMap.getSuperMember(
-        _analyzedMember, node.name, node.interfaceTarget);
+        _analyzedMember, node.name, node.interfaceTarget,
+        setter: true);
     TypeMask mask = _memberData.typeOfSend(node);
     Selector selector = new Selector.setter(_elementMap.getName(node.name));
     ArgumentsTypes arguments = new ArgumentsTypes([rhsType], null);
diff --git a/pkg/compiler/lib/src/js/js_debug.dart b/pkg/compiler/lib/src/js/js_debug.dart
index 8851aa6..f58853e 100644
--- a/pkg/compiler/lib/src/js/js_debug.dart
+++ b/pkg/compiler/lib/src/js/js_debug.dart
@@ -12,10 +12,10 @@
 import '../util/util.dart' show Indentation, Tagging;
 
 /// Unparse the JavaScript [node].
-String nodeToString(Node node) {
+String nodeToString(Node node, {bool pretty: false}) {
   JavaScriptPrintingOptions options = new JavaScriptPrintingOptions(
-      shouldCompressOutput: true,
-      preferSemicolonToNewlineInMinifiedOutput: true);
+      shouldCompressOutput: !pretty,
+      preferSemicolonToNewlineInMinifiedOutput: !pretty);
   LenientPrintingContext printingContext = new LenientPrintingContext();
   new Printer(options, printingContext).visit(node);
   return printingContext.getText();
diff --git a/pkg/compiler/lib/src/js/rewrite_async.dart b/pkg/compiler/lib/src/js/rewrite_async.dart
index b69771e..c26521e 100644
--- a/pkg/compiler/lib/src/js/rewrite_async.dart
+++ b/pkg/compiler/lib/src/js/rewrite_async.dart
@@ -1739,6 +1739,7 @@
   ///
   /// Specific to async methods.
   final js.Expression completerFactory;
+  final js.Expression completerFactoryTypeArgument;
 
   final js.Expression wrapBody;
 
@@ -1748,6 +1749,7 @@
       this.asyncReturn,
       this.asyncRethrow,
       this.completerFactory,
+      this.completerFactoryTypeArgument,
       this.wrapBody,
       String safeVariableName(String proposedName),
       js.Name bodyName})
@@ -1799,8 +1801,10 @@
     List<js.VariableInitialization> variables = <js.VariableInitialization>[];
     variables.add(_makeVariableInitializer(
         completer,
-        new js.Call(completerFactory, [])
-            .withSourceInformation(sourceInformation),
+        js.js('#(#)', [
+          completerFactory,
+          completerFactoryTypeArgument
+        ]).withSourceInformation(sourceInformation),
         sourceInformation));
     if (analysis.hasExplicitReturns) {
       variables
@@ -1900,6 +1904,7 @@
   /// Constructor creating the Iterable for a sync* method. Called with
   /// [bodyName].
   final js.Expression iterableFactory;
+  final js.Expression iterableFactoryTypeArgument;
 
   /// A JS Expression that creates a marker showing that iteration is over.
   ///
@@ -1917,6 +1922,7 @@
   SyncStarRewriter(DiagnosticReporter diagnosticListener, spannable,
       {this.endOfIteration,
       this.iterableFactory,
+      this.iterableFactoryTypeArgument,
       this.yieldStarExpression,
       this.uncaughtErrorExpression,
       String safeVariableName(String proposedName),
@@ -2009,8 +2015,9 @@
       "returnInnerInnerFunction": returnInnerInnerFunction,
     }).withSourceInformation(functionSourceInformation);
     js.Expression callIterableFactory =
-        js.js("#iterableFactory(#innerFunction)", {
+        js.js("#iterableFactory(#innerFunction, #type)", {
       "iterableFactory": iterableFactory,
+      "type": iterableFactoryTypeArgument,
       "innerFunction": innerFunction,
     }).withSourceInformation(bodySourceInformation);
     js.Statement returnCallIterableFactory = new js.Return(callIterableFactory)
@@ -2108,6 +2115,7 @@
   ///
   /// Specific to async* methods.
   final js.Expression newController;
+  final js.Expression newControllerTypeArgument;
 
   /// Used to get the `Stream` out of the [controllerName] variable.
   final js.Expression streamOfController;
@@ -2128,6 +2136,7 @@
       {this.asyncStarHelper,
       this.streamOfController,
       this.newController,
+      this.newControllerTypeArgument,
       this.yieldExpression,
       this.yieldStarExpression,
       this.wrapBody,
@@ -2317,8 +2326,11 @@
     List<js.VariableInitialization> variables = <js.VariableInitialization>[];
     variables.add(_makeVariableInitializer(
         controller,
-        js.js('#(#)', [newController, bodyName]).withSourceInformation(
-            sourceInformation),
+        js.js('#(#, #)', [
+          newController,
+          bodyName,
+          newControllerTypeArgument
+        ]).withSourceInformation(sourceInformation),
         sourceInformation));
     if (analysis.hasYield) {
       variables.add(
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 4043360..dd73a35 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -764,7 +764,9 @@
             rtiNeedBuilder,
             _nativeResolutionEnqueuer,
             noSuchMethodRegistry,
-            const OpenWorldStrategy(),
+            compiler.options.strongMode && useStrongModeWorldStrategy
+                ? const StrongModeWorldStrategy()
+                : const OpenWorldStrategy(),
             classHierarchyBuilder,
             classQueries),
         compiler.frontendStrategy.createResolutionWorkItemBuilder(
@@ -1154,35 +1156,20 @@
 
   jsAst.Expression rewriteAsync(
       CommonElements commonElements,
+      ElementEnvironment elementEnvironment,
       FunctionEntity element,
       jsAst.Expression code,
       SourceInformation bodySourceInformation,
       SourceInformation exitSourceInformation) {
-    bool startAsyncSynchronously = compiler.options.startAsyncSynchronously;
+    if (element.asyncMarker == AsyncMarker.SYNC) return code;
 
     AsyncRewriterBase rewriter = null;
     jsAst.Name name = namer.methodPropertyName(element);
+
     switch (element.asyncMarker) {
       case AsyncMarker.ASYNC:
-        var startFunction = startAsyncSynchronously
-            ? commonElements.asyncHelperStartSync
-            : commonElements.asyncHelperStart;
-        var completerConstructor = startAsyncSynchronously
-            ? commonElements.asyncAwaitCompleterConstructor
-            : commonElements.syncCompleterConstructor;
-        rewriter = new AsyncRewriter(reporter, element,
-            asyncStart: emitter.staticFunctionAccess(startFunction),
-            asyncAwait:
-                emitter.staticFunctionAccess(commonElements.asyncHelperAwait),
-            asyncReturn:
-                emitter.staticFunctionAccess(commonElements.asyncHelperReturn),
-            asyncRethrow:
-                emitter.staticFunctionAccess(commonElements.asyncHelperRethrow),
-            wrapBody: emitter.staticFunctionAccess(commonElements.wrapBody),
-            completerFactory:
-                emitter.staticFunctionAccess(completerConstructor),
-            safeVariableName: namer.safeVariablePrefixForAsyncRewrite,
-            bodyName: namer.deriveAsyncBodyName(name));
+        rewriter = _makeAsyncRewriter(
+            commonElements, elementEnvironment, element, code, name);
         break;
       case AsyncMarker.SYNC_STAR:
         rewriter = new SyncStarRewriter(reporter, element,
@@ -1190,6 +1177,8 @@
                 emitter.staticFunctionAccess(commonElements.endOfIteration),
             iterableFactory: emitter.staticFunctionAccess(
                 commonElements.syncStarIterableConstructor),
+            iterableFactoryTypeArgument:
+                _fetchItemType(element, elementEnvironment),
             yieldStarExpression:
                 emitter.staticFunctionAccess(commonElements.yieldStar),
             uncaughtErrorExpression: emitter
@@ -1206,6 +1195,8 @@
             wrapBody: emitter.staticFunctionAccess(commonElements.wrapBody),
             newController: emitter.staticFunctionAccess(
                 commonElements.asyncStarControllerConstructor),
+            newControllerTypeArgument:
+                _fetchItemType(element, elementEnvironment),
             safeVariableName: namer.safeVariablePrefixForAsyncRewrite,
             yieldExpression:
                 emitter.staticFunctionAccess(commonElements.yieldSingle),
@@ -1213,13 +1204,60 @@
                 emitter.staticFunctionAccess(commonElements.yieldStar),
             bodyName: namer.deriveAsyncBodyName(name));
         break;
-      default:
-        assert(element.asyncMarker == AsyncMarker.SYNC);
-        return code;
     }
     return rewriter.rewrite(code, bodySourceInformation, exitSourceInformation);
   }
 
+  /// Returns an expression that evaluates the type argument to the
+  /// Future/Stream/Iterable.
+  jsAst.Expression _fetchItemType(
+      FunctionEntity element, ElementEnvironment elementEnvironment) {
+    DartType type =
+        elementEnvironment.getFunctionAsyncOrSyncStarElementType(element);
+
+    if (!type.containsFreeTypeVariables) {
+      return rtiEncoder.getTypeRepresentation(emitter.emitter, type, null);
+    }
+
+    // TODO(sra): Handle types that have type variables.
+    return js('null');
+  }
+
+  AsyncRewriter _makeAsyncRewriter(
+      CommonElements commonElements,
+      ElementEnvironment elementEnvironment,
+      FunctionEntity element,
+      jsAst.Expression code,
+      jsAst.Name name) {
+    bool startAsyncSynchronously = compiler.options.startAsyncSynchronously;
+
+    var startFunction = startAsyncSynchronously
+        ? commonElements.asyncHelperStartSync
+        : commonElements.asyncHelperStart;
+    var completerConstructor = startAsyncSynchronously
+        ? commonElements.asyncAwaitCompleterConstructor
+        : commonElements.syncCompleterConstructor;
+
+    jsAst.Expression itemTypeExpression =
+        _fetchItemType(element, elementEnvironment);
+
+    var rewriter = new AsyncRewriter(reporter, element,
+        asyncStart: emitter.staticFunctionAccess(startFunction),
+        asyncAwait:
+            emitter.staticFunctionAccess(commonElements.asyncHelperAwait),
+        asyncReturn:
+            emitter.staticFunctionAccess(commonElements.asyncHelperReturn),
+        asyncRethrow:
+            emitter.staticFunctionAccess(commonElements.asyncHelperRethrow),
+        wrapBody: emitter.staticFunctionAccess(commonElements.wrapBody),
+        completerFactory: emitter.staticFunctionAccess(completerConstructor),
+        completerFactoryTypeArgument: itemTypeExpression,
+        safeVariableName: namer.safeVariablePrefixForAsyncRewrite,
+        bodyName: namer.deriveAsyncBodyName(name));
+
+    return rewriter;
+  }
+
   /// Creates an impact strategy to use for compilation.
   ImpactStrategy createImpactStrategy(
       {bool supportDeferredLoad: true, bool supportDumpInfo: true}) {
diff --git a/pkg/compiler/lib/src/js_backend/backend_usage.dart b/pkg/compiler/lib/src/js_backend/backend_usage.dart
index 056757e..c69a632 100644
--- a/pkg/compiler/lib/src/js_backend/backend_usage.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_usage.dart
@@ -47,6 +47,9 @@
 
   /// `true` if `noSuchMethod` is used.
   bool get isNoSuchMethodUsed;
+
+  /// `true` if generic instantiation is used.
+  bool get isGenericInstantiationUsed;
 }
 
 abstract class BackendUsageBuilder {
@@ -87,6 +90,9 @@
   /// `true` if `noSuchMethod` is used.
   bool isNoSuchMethodUsed;
 
+  /// `true` if generic instantiation is used.
+  bool isGenericInstantiationUsed;
+
   BackendUsage close();
 }
 
@@ -126,6 +132,9 @@
   /// `true` if `noSuchMethod` is used.
   bool isNoSuchMethodUsed = false;
 
+  /// `true` if generic instantiation is used.
+  bool isGenericInstantiationUsed = false;
+
   BackendUsageBuilderImpl(this._commonElements);
 
   @override
@@ -284,7 +293,8 @@
         isIsolateInUse: isIsolateInUse,
         isFunctionApplyUsed: isFunctionApplyUsed,
         isMirrorsUsed: isMirrorsUsed,
-        isNoSuchMethodUsed: isNoSuchMethodUsed);
+        isNoSuchMethodUsed: isNoSuchMethodUsed,
+        isGenericInstantiationUsed: isGenericInstantiationUsed);
   }
 }
 
@@ -323,6 +333,9 @@
   /// `true` if `noSuchMethod` is used.
   final bool isNoSuchMethodUsed;
 
+  /// `true` if generic instantiation is used.
+  final bool isGenericInstantiationUsed;
+
   BackendUsageImpl(
       {Set<FunctionEntity> globalFunctionDependencies,
       Set<ClassEntity> globalClassDependencies,
@@ -336,7 +349,8 @@
       this.isIsolateInUse,
       this.isFunctionApplyUsed,
       this.isMirrorsUsed,
-      this.isNoSuchMethodUsed})
+      this.isNoSuchMethodUsed,
+      this.isGenericInstantiationUsed})
       : this._globalFunctionDependencies = globalFunctionDependencies,
         this._globalClassDependencies = globalClassDependencies,
         this._helperFunctionsUsed = helperFunctionsUsed,
diff --git a/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart b/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart
index c2c7d83..4aec501 100644
--- a/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart
+++ b/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart
@@ -296,7 +296,7 @@
       return 'list$suffix';
     }
 
-    if (commonElements.isListSupertype(element)) {
+    if (commonElements.isListSupertype(element) && type.treatAsRaw) {
       return nativeCheck ? 'listSuperNative$suffix' : 'listSuper$suffix';
     }
 
diff --git a/pkg/compiler/lib/src/js_backend/custom_elements_analysis.dart b/pkg/compiler/lib/src/js_backend/custom_elements_analysis.dart
index 29c6db8..4b27e24 100644
--- a/pkg/compiler/lib/src/js_backend/custom_elements_analysis.dart
+++ b/pkg/compiler/lib/src/js_backend/custom_elements_analysis.dart
@@ -73,7 +73,7 @@
 
   void registerStaticUse(MemberEntity element) {
     assert(element != null);
-    if (element == _commonElements.findIndexForNativeSubclassType) {
+    if (_commonElements.isFindIndexForNativeSubclassType(element)) {
       join.demanded = true;
     }
   }
diff --git a/pkg/compiler/lib/src/js_backend/enqueuer.dart b/pkg/compiler/lib/src/js_backend/enqueuer.dart
index ae9ab20..4e72531 100644
--- a/pkg/compiler/lib/src/js_backend/enqueuer.dart
+++ b/pkg/compiler/lib/src/js_backend/enqueuer.dart
@@ -50,6 +50,10 @@
   /// All declaration elements that have been processed by codegen.
   final Set<MemberEntity> _processedEntities = new Set<MemberEntity>();
 
+  // If not `null` this is called when the queue has been emptied. It allows for
+  // applying additional impacts before re-emptying the queue.
+  void Function() onEmptyForTesting;
+
   static const ImpactUseCase IMPACT_USE =
       const ImpactUseCase('CodegenEnqueuer');
 
@@ -228,7 +232,7 @@
     _worldBuilder.registerClosurizedMember(element);
   }
 
-  void forEach(void f(WorkItem work)) {
+  void _forEach(void f(WorkItem work)) {
     do {
       while (_queue.isNotEmpty) {
         // TODO(johnniwinther): Find an optimal process order.
@@ -248,6 +252,14 @@
         _queue.isNotEmpty || _recentClasses.isNotEmpty || _recentConstants);
   }
 
+  void forEach(void f(WorkItem work)) {
+    _forEach(f);
+    if (onEmptyForTesting != null) {
+      onEmptyForTesting();
+      _forEach(f);
+    }
+  }
+
   /// [_onQueueEmpty] is called whenever the queue is drained. [recentClasses]
   /// contains the set of all classes seen for the first time since
   /// [_onQueueEmpty] was called last. A return value of [true] indicates that
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index 32282b9..27b074b 100644
--- a/pkg/compiler/lib/src/js_backend/impact_transformer.dart
+++ b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
@@ -41,7 +41,7 @@
   final BackendImpacts _impacts;
   final NativeBasicData _nativeBasicData;
   final NativeResolutionEnqueuer _nativeResolutionEnqueuer;
-  final BackendUsageBuilder _backendUsageBuider;
+  final BackendUsageBuilder _backendUsageBuilder;
   final MirrorsDataBuilder _mirrorsDataBuilder;
   final CustomElementsResolutionAnalysis _customElementsResolutionAnalysis;
   final RuntimeTypesNeedBuilder _rtiNeedBuilder;
@@ -54,7 +54,7 @@
       this._impacts,
       this._nativeBasicData,
       this._nativeResolutionEnqueuer,
-      this._backendUsageBuider,
+      this._backendUsageBuilder,
       this._mirrorsDataBuilder,
       this._customElementsResolutionAnalysis,
       this._rtiNeedBuilder,
@@ -67,7 +67,7 @@
 
     void registerImpact(BackendImpact impact) {
       impact.registerImpact(transformed, _elementEnvironment);
-      _backendUsageBuider.processBackendImpact(impact);
+      _backendUsageBuilder.processBackendImpact(impact);
     }
 
     for (Feature feature in worldImpact.features) {
@@ -110,6 +110,7 @@
           break;
         case Feature.GENERIC_INSTANTIATION:
           registerImpact(_impacts.genericInstantiation);
+          _backendUsageBuilder.isGenericInstantiationUsed = true;
           break;
         case Feature.LAZY_FIELD:
           registerImpact(_impacts.lazyField);
@@ -251,7 +252,9 @@
           Local closure = staticUse.element;
           FunctionType type = _elementEnvironment.getLocalFunctionType(closure);
           if (type.containsTypeVariables ||
-              (_options.strongMode && !optimizeLocalSignaturesForStrongMode)) {
+              // TODO(johnniwinther): Can we avoid the need for signatures in
+              // Dart 2?
+              _options.strongMode) {
             registerImpact(_impacts.computeSignature);
           }
           break;
@@ -300,7 +303,7 @@
   void onIsCheck(DartType type, TransformedWorldImpact transformed) {
     void registerImpact(BackendImpact impact) {
       impact.registerImpact(transformed, _elementEnvironment);
-      _backendUsageBuider.processBackendImpact(impact);
+      _backendUsageBuilder.processBackendImpact(impact);
     }
 
     type = _elementEnvironment.getUnaliasedType(type);
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index 813ea76..9c3dd7b 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -27,10 +27,6 @@
 
 bool cacheRtiDataForTesting = false;
 
-// TODO(johnniwinther): Remove this when local signatures are optimized for
-// Dart 2.
-const bool optimizeLocalSignaturesForStrongMode = false;
-
 /// For each class, stores the possible class subtype tests that could succeed.
 abstract class TypeChecks {
   /// Get the set of checks required for class [element].
@@ -1412,6 +1408,12 @@
       });
     }
 
+    Set<Local> localFunctions = strongMode
+        ? resolutionWorldBuilder.localFunctions.toSet()
+        : resolutionWorldBuilder.localFunctionsWithFreeTypeVariables.toSet();
+    Set<FunctionEntity> closurizedMembers =
+        resolutionWorldBuilder.closurizedMembersWithFreeTypeVariables.toSet();
+
     // Check local functions and closurized members.
     void checkClosures({DartType potentialSubtypeOf}) {
       bool checkFunctionType(FunctionType functionType) {
@@ -1426,32 +1428,51 @@
         return false;
       }
 
+      Set<Local> localFunctionsToRemove;
+      Set<FunctionEntity> closurizedMembersToRemove;
       if (strongMode) {
-        assert(!optimizeLocalSignaturesForStrongMode);
-        // TODO(johnniwinther): Optimize generation of signatures for Dart 2.
-        for (Local function in resolutionWorldBuilder.localFunctions) {
+        for (Local function in localFunctions) {
           FunctionType functionType =
               _elementEnvironment.getLocalFunctionType(function);
-          functionType.forEachTypeVariable((TypeVariableType typeVariable) {
-            potentiallyNeedTypeArguments(typeVariable.element.typeDeclaration);
-          });
-          localFunctionsNeedingSignature.add(function);
+          if (potentialSubtypeOf == null ||
+              closedWorld.dartTypes.isPotentialSubtype(
+                  functionType, potentialSubtypeOf,
+                  assumeInstantiations:
+                      closedWorld.backendUsage.isGenericInstantiationUsed)) {
+            functionType.forEachTypeVariable((TypeVariableType typeVariable) {
+              Entity typeDeclaration = typeVariable.element.typeDeclaration;
+              if (!processedEntities.contains(typeDeclaration)) {
+                potentiallyNeedTypeArguments(typeDeclaration);
+              }
+            });
+            localFunctionsNeedingSignature.add(function);
+            localFunctionsToRemove ??= new Set<Local>();
+            localFunctionsToRemove.add(function);
+          }
         }
       } else {
-        for (Local function
-            in resolutionWorldBuilder.localFunctionsWithFreeTypeVariables) {
+        for (Local function in localFunctions) {
           if (checkFunctionType(
               _elementEnvironment.getLocalFunctionType(function))) {
             localFunctionsNeedingSignature.add(function);
+            localFunctionsToRemove ??= new Set<Local>();
+            localFunctionsToRemove.add(function);
           }
         }
       }
-      for (FunctionEntity function
-          in resolutionWorldBuilder.closurizedMembersWithFreeTypeVariables) {
+      for (FunctionEntity function in closurizedMembers) {
         if (checkFunctionType(_elementEnvironment.getFunctionType(function))) {
           methodsNeedingSignature.add(function);
+          closurizedMembersToRemove ??= new Set<FunctionEntity>();
+          closurizedMembersToRemove.add(function);
         }
       }
+      if (localFunctionsToRemove != null) {
+        localFunctions.removeAll(localFunctionsToRemove);
+      }
+      if (closurizedMembersToRemove != null) {
+        closurizedMembers.removeAll(closurizedMembersToRemove);
+      }
     }
 
     // Compute the set of all classes and methods that need runtime type
diff --git a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
index 14177b0..eae6858 100644
--- a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
@@ -315,7 +315,10 @@
         return null;
       }
       jsAst.Expression arrayCheck = js('receiver.constructor == Array');
-      jsAst.Expression indexableCheck =
+
+      // Lazy generation of the indexable check. If indexable behavior isn't
+      // used, the isJsIndexable function isn't part of the closed world.
+      jsAst.Expression genericIndexableCheck() =>
           _generateIsJsIndexableCall(js('receiver'), js('receiver'));
 
       jsAst.Expression orExp(left, right) {
@@ -333,7 +336,7 @@
         }
 
         if (containsJsIndexable) {
-          typeCheck = orExp(typeCheck, indexableCheck);
+          typeCheck = orExp(typeCheck, genericIndexableCheck());
         }
 
         return js.statement('''
@@ -349,7 +352,7 @@
         }
 
         if (containsJsIndexable) {
-          typeCheck = orExp(typeCheck, indexableCheck);
+          typeCheck = orExp(typeCheck, genericIndexableCheck());
         }
 
         return js.statement(r'''
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
index ad8f33b..5e3279f 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
@@ -635,6 +635,7 @@
 
     List<StaticMethod> statics = memberElements
         .where((e) => !e.isField)
+        .cast<FunctionEntity>()
         .map(_buildStaticMethod)
         .toList();
 
diff --git a/pkg/compiler/lib/src/js_emitter/sorter.dart b/pkg/compiler/lib/src/js_emitter/sorter.dart
index d3cfff6..70fbd51 100644
--- a/pkg/compiler/lib/src/js_emitter/sorter.dart
+++ b/pkg/compiler/lib/src/js_emitter/sorter.dart
@@ -19,7 +19,7 @@
   Iterable<TypedefEntity> sortTypedefs(Iterable<TypedefEntity> typedefs);
 
   /// Returns a sorted list of [members].
-  Iterable<MemberEntity> sortMembers(Iterable<MemberEntity> members);
+  Iterable<T> sortMembers<T extends MemberEntity>(Iterable<T> members);
 
   int compareLibrariesByLocation(LibraryEntity a, LibraryEntity b);
   int compareClassesByLocation(ClassEntity a, ClassEntity b);
@@ -63,7 +63,7 @@
   }
 
   @override
-  List<MemberEntity> sortMembers(Iterable<MemberEntity> members) {
+  Iterable<T> sortMembers<T extends MemberEntity>(Iterable<T> members) {
     return Elements.sortedByPosition(new List.from(members, growable: false));
   }
 
diff --git a/pkg/compiler/lib/src/js_model/closure.dart b/pkg/compiler/lib/src/js_model/closure.dart
index a56afcf..9334b52 100644
--- a/pkg/compiler/lib/src/js_model/closure.dart
+++ b/pkg/compiler/lib/src/js_model/closure.dart
@@ -16,6 +16,7 @@
 import '../kernel/env.dart';
 import '../options.dart';
 import '../ssa/type_builder.dart';
+import '../universe/selector.dart';
 import '../world.dart';
 import 'elements.dart';
 import 'closure_visitors.dart';
@@ -77,6 +78,7 @@
 class KernelClosureConversionTask extends ClosureConversionTask<ir.Node> {
   final KernelToElementMapForBuilding _elementMap;
   final GlobalLocalsMap _globalLocalsMap;
+  final CompilerOptions _options;
 
   /// Map of the scoping information that corresponds to a particular entity.
   Map<MemberEntity, ScopeInfo> _scopeMap = <MemberEntity, ScopeInfo>{};
@@ -93,19 +95,8 @@
   Map<ir.TreeNode, ClosureRepresentationInfo> _localClosureRepresentationMap =
       <ir.TreeNode, ClosureRepresentationInfo>{};
 
-  /// If true add type assertions to assert that at runtime the type is in line
-  /// with the stated type.
-  final bool _addTypeChecks;
-
-  /// If true, we are compiling using strong mode, and therefore we will create
-  /// a "signatureMethod" for a closure that can output the type. In this
-  /// instance, we may need access to a type variable that has not otherwise
-  /// been captured, and therefore we need to mark it as being used so that the
-  /// RTI optimization doesn't optimize it away..
-  final bool _strongMode;
-
-  KernelClosureConversionTask(Measurer measurer, this._elementMap,
-      this._globalLocalsMap, this._addTypeChecks, this._strongMode)
+  KernelClosureConversionTask(
+      Measurer measurer, this._elementMap, this._globalLocalsMap, this._options)
       : super(measurer);
 
   /// The combined steps of generating our intermediate representation of
@@ -118,68 +109,127 @@
   void convertClosures(Iterable<MemberEntity> processedEntities,
       ClosedWorldRefiner closedWorldRefiner) {}
 
-  void _updateScopeBasedOnRtiNeed(
-      KernelScopeInfo scope,
-      bool Function(ClassEntity) classNeedsTypeArguments,
-      bool Function(MemberEntity) methodNeedsTypeArguments,
-      bool Function(ir.Node) localFunctionNeedsTypeArguments,
+  void _updateScopeBasedOnRtiNeed(KernelScopeInfo scope, ClosureRtiNeed rtiNeed,
       MemberEntity outermostEntity) {
-    if (scope.thisUsedAsFreeVariableIfNeedsRti &&
-        (classNeedsTypeArguments(outermostEntity.enclosingClass) ||
-            // TODO(johnniwinther): Instead of _strongMode, make this branch test
-            // if an added signature method needs type arguments (see comment in
-            // TypeVariableKind.method branch below.
-            _strongMode)) {
-      scope.thisUsedAsFreeVariable = true;
-    }
-    if (_addTypeChecks) {
-      scope.freeVariables.addAll(scope.freeVariablesForRti);
-    } else {
-      for (TypeVariableTypeWithContext typeVariable
-          in scope.freeVariablesForRti) {
-        switch (typeVariable.kind) {
-          case TypeVariableKind.cls:
-            if (classNeedsTypeArguments(
-                _elementMap.getClass(typeVariable.typeDeclaration))) {
-              scope.freeVariables.add(typeVariable);
+    bool includeForRti(Set<VariableUse> useSet) {
+      for (VariableUse usage in useSet) {
+        switch (usage.kind) {
+          case VariableUseKind.explicit:
+            return true;
+            break;
+          case VariableUseKind.implicitCast:
+            if (_options.implicitDowncastCheckPolicy.isEmitted) {
+              return true;
             }
             break;
-          case TypeVariableKind.method:
-            if (methodNeedsTypeArguments(
-                    _elementMap.getMember(typeVariable.typeDeclaration)) ||
-                // In Dart 2, we have the notion of generic methods. This is
-                // partly implemented by adding a "method signature" function to
-                // closure classes. This signature reports the type of the
-                // method, and therefore may access the type variable of the
-                // parameter, which might otherwise not be used (and therefore
-                // isn't captured in the set that `methodNeedsTypeArguments`
-                // compares against.
-                // TODO(johnniwinther): Include this reasoning inside
-                // [methodNeedsTypeArguments] rather than an add on here.
-                _strongMode &&
-                    scope.freeVariablesForRti.contains(typeVariable)) {
-              scope.freeVariables.add(typeVariable);
+          case VariableUseKind.localType:
+            if (_options.assignmentCheckPolicy.isEmitted) {
+              return true;
             }
             break;
-          case TypeVariableKind.local:
-            if (localFunctionNeedsTypeArguments(typeVariable.typeDeclaration)) {
-              scope.freeVariables.add(typeVariable);
+
+          case VariableUseKind.constructorTypeArgument:
+            ConstructorEntity constructor =
+                _elementMap.getConstructor(usage.member);
+            if (rtiNeed.classNeedsTypeArguments(constructor.enclosingClass)) {
+              return true;
             }
             break;
-          case TypeVariableKind.function:
+          case VariableUseKind.staticTypeArgument:
+            FunctionEntity method = _elementMap.getMethod(usage.member);
+            if (rtiNeed.methodNeedsTypeArguments(method)) {
+              return true;
+            }
+            break;
+          case VariableUseKind.instanceTypeArgument:
+            Selector selector = _elementMap.getSelector(usage.invocation);
+            if (rtiNeed.selectorNeedsTypeArguments(selector)) {
+              return true;
+            }
+            break;
+          case VariableUseKind.localTypeArgument:
+            // TODO(johnniwinther): We should be able to track direct local
+            // function invocations and not have to use the selector here.
+            Selector selector = _elementMap.getSelector(usage.invocation);
+            if (rtiNeed.localFunctionNeedsTypeArguments(usage.localFunction) ||
+                rtiNeed.selectorNeedsTypeArguments(selector)) {
+              return true;
+            }
+            break;
+          case VariableUseKind.memberParameter:
+            if (_options.parameterCheckPolicy.isEmitted) {
+              return true;
+            } else {
+              FunctionEntity method = _elementMap.getMethod(usage.member);
+              if (rtiNeed.methodNeedsSignature(method)) {
+                return true;
+              }
+            }
+            break;
+          case VariableUseKind.localParameter:
+            if (_options.parameterCheckPolicy.isEmitted) {
+              return true;
+            } else if (rtiNeed
+                .localFunctionNeedsSignature(usage.localFunction)) {
+              return true;
+            }
+            break;
+          case VariableUseKind.memberReturnType:
+            if (_options.assignmentCheckPolicy.isEmitted) {
+              return true;
+            } else {
+              FunctionEntity method = _elementMap.getMethod(usage.member);
+              if (rtiNeed.methodNeedsSignature(method)) {
+                return true;
+              }
+            }
+            break;
+          case VariableUseKind.localReturnType:
+            if (_options.assignmentCheckPolicy.isEmitted) {
+              return true;
+            } else if (rtiNeed
+                .localFunctionNeedsSignature(usage.localFunction)) {
+              return true;
+            }
+            break;
+          case VariableUseKind.fieldType:
+            if (_options.assignmentCheckPolicy.isEmitted ||
+                _options.parameterCheckPolicy.isEmitted) {
+              return true;
+            }
+            break;
+          case VariableUseKind.listLiteral:
+            if (rtiNeed.classNeedsTypeArguments(
+                _elementMap.commonElements.jsArrayClass)) {
+              return true;
+            }
+            break;
+          case VariableUseKind.mapLiteral:
+            if (rtiNeed.classNeedsTypeArguments(
+                _elementMap.commonElements.mapLiteralClass)) {
+              return true;
+            }
             break;
         }
       }
+      return false;
     }
+
+    if (includeForRti(scope.thisUsedAsFreeVariableIfNeedsRti)) {
+      scope.thisUsedAsFreeVariable = true;
+    }
+    scope.freeVariablesForRti.forEach(
+        (TypeVariableTypeWithContext typeVariable, Set<VariableUse> useSet) {
+      if (includeForRti(useSet)) {
+        scope.freeVariables.add(typeVariable);
+      }
+    });
   }
 
   Iterable<FunctionEntity> createClosureEntities(
       JsClosedWorldBuilder closedWorldBuilder,
       Map<MemberEntity, ScopeModel> closureModels,
-      {bool Function(ir.Node) localFunctionNeedsSignature,
-      bool Function(ClassEntity) classNeedsTypeArguments,
-      bool Function(FunctionEntity) methodNeedsTypeArguments,
-      bool Function(ir.Node) localFunctionNeedsTypeArguments}) {
+      ClosureRtiNeed rtiNeed) {
     List<FunctionEntity> callMethods = <FunctionEntity>[];
     closureModels.forEach((MemberEntity member, ScopeModel model) {
       KernelToLocalsMap localsMap = _globalLocalsMap.getLocalsMap(member);
@@ -192,8 +242,7 @@
           .forEach((ir.Node node, KernelCapturedScope scope) {
         Map<Local, JRecordField> boxedVariables =
             _elementMap.makeRecordContainer(scope, member, localsMap);
-        _updateScopeBasedOnRtiNeed(scope, classNeedsTypeArguments,
-            methodNeedsTypeArguments, localFunctionNeedsTypeArguments, member);
+        _updateScopeBasedOnRtiNeed(scope, rtiNeed, member);
 
         if (scope is KernelCapturedLoopScope) {
           _capturedScopesMap[node] = new JsCapturedLoopScope.from(
@@ -222,11 +271,9 @@
             functionNode,
             closuresToGenerate[node],
             allBoxedVariables,
-            classNeedsTypeArguments,
-            methodNeedsTypeArguments,
-            localFunctionNeedsTypeArguments,
+            rtiNeed,
             createSignatureMethod:
-                localFunctionNeedsSignature(functionNode.parent));
+                rtiNeed.localFunctionNeedsSignature(functionNode.parent));
         // Add also for the call method.
         _scopeMap[closureClassInfo.callMethod] = closureClassInfo;
         _scopeMap[closureClassInfo.signatureMethod] = closureClassInfo;
@@ -234,19 +281,14 @@
         // Set up capturedScope for signature method. This is distinct from
         // _capturedScopesMap because there is no corresponding ir.Node for the
         // signature.
-        if (localFunctionNeedsSignature(functionNode.parent) &&
+        if (rtiNeed.localFunctionNeedsSignature(functionNode.parent) &&
             model.capturedScopesMap[functionNode] != null) {
           KernelCapturedScope capturedScope =
               model.capturedScopesMap[functionNode];
           assert(capturedScope is! KernelCapturedLoopScope);
           KernelCapturedScope signatureCapturedScope =
               new KernelCapturedScope.forSignature(capturedScope);
-          _updateScopeBasedOnRtiNeed(
-              signatureCapturedScope,
-              classNeedsTypeArguments,
-              methodNeedsTypeArguments,
-              localFunctionNeedsTypeArguments,
-              member);
+          _updateScopeBasedOnRtiNeed(signatureCapturedScope, rtiNeed, member);
           _capturedScopeForSignatureMap[closureClassInfo.signatureMethod] =
               new JsCapturedScope.from(
                   {}, signatureCapturedScope, localsMap, _elementMap);
@@ -269,12 +311,9 @@
       ir.FunctionNode node,
       KernelScopeInfo info,
       Map<Local, JRecordField> boxedVariables,
-      bool Function(ClassEntity) classNeedsTypeArguments,
-      bool Function(FunctionEntity) methodNeedsTypeArguments,
-      bool Function(ir.Node) localFunctionNeedsTypeArguments,
+      ClosureRtiNeed rtiNeed,
       {bool createSignatureMethod}) {
-    _updateScopeBasedOnRtiNeed(info, classNeedsTypeArguments,
-        methodNeedsTypeArguments, localFunctionNeedsTypeArguments, member);
+    _updateScopeBasedOnRtiNeed(info, rtiNeed, member);
     KernelToLocalsMap localsMap = _globalLocalsMap.getLocalsMap(member);
     KernelClosureClassInfo closureClassInfo =
         closedWorldBuilder.buildClosureClass(
@@ -355,6 +394,150 @@
   }
 }
 
+enum VariableUseKind {
+  /// An explicit variable use.
+  ///
+  /// For type variable this is an explicit as-cast, an is-test or a type
+  /// literal.
+  explicit,
+
+  /// A type variable used in the type of a local variable.
+  localType,
+
+  /// A type variable used in an implicit cast.
+  implicitCast,
+
+  /// A type variable passed as the type argument of a list literal.
+  listLiteral,
+
+  /// A type variable passed as the type argument of a map literal.
+  mapLiteral,
+
+  /// A type variable passed as a type argument to a constructor.
+  constructorTypeArgument,
+
+  /// A type variable passed as a type argument to a static method.
+  staticTypeArgument,
+
+  /// A type variable passed as a type argument to an instance method.
+  instanceTypeArgument,
+
+  /// A type variable passed as a type argument to a local function.
+  localTypeArgument,
+
+  /// A type variable in a parameter type of a member.
+  memberParameter,
+
+  /// A type variable in a parameter type of a local function.
+  localParameter,
+
+  /// A type variable used in a return type of a member.
+  memberReturnType,
+
+  /// A type variable used in a return type of a local function.
+  localReturnType,
+
+  /// A type variable in a field type.
+  fieldType,
+}
+
+class VariableUse {
+  final VariableUseKind kind;
+  final ir.Member member;
+  final ir.TreeNode /*ir.FunctionDeclaration|ir.FunctionExpression*/
+      localFunction;
+  final ir.MethodInvocation invocation;
+
+  const VariableUse._simple(this.kind)
+      : this.member = null,
+        this.localFunction = null,
+        this.invocation = null;
+
+  VariableUse.memberParameter(this.member)
+      : this.kind = VariableUseKind.memberParameter,
+        this.localFunction = null,
+        this.invocation = null;
+
+  VariableUse.localParameter(this.localFunction)
+      : this.kind = VariableUseKind.localParameter,
+        this.member = null,
+        this.invocation = null {
+    assert(localFunction is ir.FunctionDeclaration ||
+        localFunction is ir.FunctionExpression);
+  }
+
+  VariableUse.memberReturnType(this.member)
+      : this.kind = VariableUseKind.memberReturnType,
+        this.localFunction = null,
+        this.invocation = null;
+
+  VariableUse.localReturnType(this.localFunction)
+      : this.kind = VariableUseKind.localReturnType,
+        this.member = null,
+        this.invocation = null {
+    assert(localFunction is ir.FunctionDeclaration ||
+        localFunction is ir.FunctionExpression);
+  }
+
+  VariableUse.constructorTypeArgument(this.member)
+      : this.kind = VariableUseKind.constructorTypeArgument,
+        this.localFunction = null,
+        this.invocation = null;
+
+  VariableUse.staticTypeArgument(this.member)
+      : this.kind = VariableUseKind.staticTypeArgument,
+        this.localFunction = null,
+        this.invocation = null;
+
+  VariableUse.instanceTypeArgument(this.invocation)
+      : this.kind = VariableUseKind.instanceTypeArgument,
+        this.member = null,
+        this.localFunction = null;
+
+  VariableUse.localTypeArgument(this.localFunction, this.invocation)
+      : this.kind = VariableUseKind.localTypeArgument,
+        this.member = null {
+    assert(localFunction is ir.FunctionDeclaration ||
+        localFunction is ir.FunctionExpression);
+  }
+
+  static const VariableUse explicit =
+      const VariableUse._simple(VariableUseKind.explicit);
+
+  static const VariableUse localType =
+      const VariableUse._simple(VariableUseKind.localType);
+
+  static const VariableUse implicitCast =
+      const VariableUse._simple(VariableUseKind.implicitCast);
+
+  static const VariableUse listLiteral =
+      const VariableUse._simple(VariableUseKind.listLiteral);
+
+  static const VariableUse mapLiteral =
+      const VariableUse._simple(VariableUseKind.mapLiteral);
+
+  static const VariableUse fieldType =
+      const VariableUse._simple(VariableUseKind.fieldType);
+
+  int get hashCode =>
+      kind.hashCode * 11 +
+      member.hashCode * 13 +
+      localFunction.hashCode * 17 +
+      invocation.hashCode * 19;
+
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    if (other is! VariableUse) return false;
+    return kind == other.kind &&
+        member == other.member &&
+        localFunction == other.localFunction &&
+        invocation == other.invocation;
+  }
+
+  String toString() => 'VariableUse(kind=$kind,member=$member,'
+      'localFunction=$localFunction,invocation=$invocation)';
+}
+
 class KernelScopeInfo {
   final Set<ir.VariableDeclaration> localsUsedInTryOrSync;
   final bool hasThisLocal;
@@ -375,8 +558,8 @@
   /// freeVariables set. Whether these variables are actually used as
   /// freeVariables will be set by the time this structure is converted to a
   /// JsScopeInfo, so JsScopeInfo does not need to use them.
-  Set<TypeVariableTypeWithContext> freeVariablesForRti =
-      new Set<TypeVariableTypeWithContext>();
+  Map<TypeVariableTypeWithContext, Set<VariableUse>> freeVariablesForRti =
+      <TypeVariableTypeWithContext, Set<VariableUse>>{};
 
   /// If true, `this` is used as a free variable, in this scope. It is stored
   /// separately from [freeVariables] because there is no single
@@ -387,7 +570,7 @@
   /// performing runtime type checks. It is stored
   /// separately from [thisUsedAsFreeVariable] because we don't know at this
   /// stage if we will be needing type checks for this scope.
-  bool thisUsedAsFreeVariableIfNeedsRti = false;
+  Set<VariableUse> thisUsedAsFreeVariableIfNeedsRti = new Set<VariableUse>();
 
   KernelScopeInfo(this.hasThisLocal)
       : localsUsedInTryOrSync = new Set<ir.VariableDeclaration>(),
@@ -411,10 +594,16 @@
 
   String toString() {
     StringBuffer sb = new StringBuffer();
-    sb.write('this=$hasThisLocal,');
+    sb.write('KernelScopeInfo(this=$hasThisLocal,');
     sb.write('freeVriables=$freeVariables,');
     sb.write('localsUsedInTryOrSync={${localsUsedInTryOrSync.join(', ')}}');
-    sb.write('freeVariablesForRti={${freeVariablesForRti.join(', ')}}');
+    String comma = '';
+    sb.write('freeVariablesForRti={');
+    freeVariablesForRti.forEach((key, value) {
+      sb.write('$comma$key:$value');
+      comma = ',';
+    });
+    sb.write('})');
     return sb.toString();
   }
 }
@@ -482,11 +671,11 @@
       Set<ir.VariableDeclaration> boxedVariables,
       NodeBox capturedVariablesAccessor,
       Set<ir.VariableDeclaration> localsUsedInTryOrSync,
-      Set<ir.Node /* VariableDeclaration | TypeParameterTypeWithContext */ >
+      Set<ir.Node /* VariableDeclaration | TypeVariableTypeWithContext */ >
           freeVariables,
-      Set<TypeVariableTypeWithContext> freeVariablesForRti,
+      Map<TypeVariableTypeWithContext, Set<VariableUse>> freeVariablesForRti,
       bool thisUsedAsFreeVariable,
-      bool thisUsedAsFreeVariableIfNeedsRti,
+      Set<VariableUse> thisUsedAsFreeVariableIfNeedsRti,
       bool hasThisLocal)
       : super.withBoxedVariables(
             boxedVariables,
@@ -541,11 +730,11 @@
       NodeBox capturedVariablesAccessor,
       this.boxedLoopVariables,
       Set<ir.VariableDeclaration> localsUsedInTryOrSync,
-      Set<ir.Node /* VariableDeclaration | TypeParameterTypeWithContext */ >
+      Set<ir.Node /* VariableDeclaration | TypeVariableTypeWithContext */ >
           freeVariables,
-      Set<TypeVariableTypeWithContext> freeVariablesForRti,
+      Map<TypeVariableTypeWithContext, Set<VariableUse>> freeVariablesForRti,
       bool thisUsedAsFreeVariable,
-      bool thisUsedAsFreeVariableIfNeedsRti,
+      Set<VariableUse> thisUsedAsFreeVariableIfNeedsRti,
       bool hasThisLocal)
       : super(
             boxedVariables,
@@ -959,3 +1148,17 @@
       'TypeVariableTypeWithContext(type=$type,context=$context,'
       'kind=$kind,typeDeclaration=$typeDeclaration)';
 }
+
+abstract class ClosureRtiNeed {
+  bool classNeedsTypeArguments(ClassEntity cls);
+
+  bool methodNeedsTypeArguments(FunctionEntity method);
+
+  bool methodNeedsSignature(MemberEntity method);
+
+  bool localFunctionNeedsTypeArguments(ir.Node node);
+
+  bool localFunctionNeedsSignature(ir.Node node);
+
+  bool selectorNeedsTypeArguments(Selector selector);
+}
diff --git a/pkg/compiler/lib/src/js_model/closure_visitors.dart b/pkg/compiler/lib/src/js_model/closure_visitors.dart
index 28bd0f1..ea35aaf 100644
--- a/pkg/compiler/lib/src/js_model/closure_visitors.dart
+++ b/pkg/compiler/lib/src/js_model/closure_visitors.dart
@@ -68,18 +68,16 @@
   /// have unique names.
   int _boxCounter = 0;
 
-  /// Set to `true` in the visitor if a type annotation is always needed.
+  /// The current usage of a type annotation.
   ///
-  /// This is for instance the case for expressions like `o is T` and `o as T`.
-  bool _contextNeedsType = false;
+  /// This is updated in the visitor to distinguish between unconditional
+  /// type variable usage, such as type literals and is tests, and conditional
+  /// type variable usage, such as type argument in method invocations.
+  VariableUse _currentTypeUsage;
 
   CapturedScopeBuilder(this._model, this._options, {bool hasThisLocal})
       : this._hasThisLocal = hasThisLocal;
 
-  /// If true add type assetions to assert that at runtime the type is in line
-  /// with the stated type.
-  bool get _addTypeChecks => _options.enableTypeAssertions;
-
   /// Update the [CapturedScope] object corresponding to
   /// this node if any variables are captured.
   void attachCapturedScopeVariables(ir.TreeNode node) {
@@ -179,25 +177,31 @@
 
   @override
   visitVariableGet(ir.VariableGet node) {
-    _markVariableAsUsed(node.variable);
-    node.visitChildren(this);
+    _markVariableAsUsed(node.variable, VariableUse.explicit);
+    // Don't visit `node.promotedType`.
   }
 
   @override
   visitVariableSet(ir.VariableSet node) {
     _mutatedVariables.add(node.variable);
-    _markVariableAsUsed(node.variable);
-    if (_addTypeChecks) node.variable.type.accept(this);
+    _markVariableAsUsed(node.variable, VariableUse.explicit);
+    visitInContext(node.variable.type, VariableUse.localType);
     node.visitChildren(this);
   }
 
-  @override
-  visitVariableDeclaration(ir.VariableDeclaration declaration) {
-    if (!declaration.isFieldFormal) {
-      _scopeVariables.add(declaration);
+  void handleVariableDeclaration(
+      ir.VariableDeclaration node, VariableUse usage) {
+    if (!node.isFieldFormal) {
+      _scopeVariables.add(node);
     }
 
-    declaration.visitChildren(this);
+    visitInContext(node.type, usage);
+    node.initializer?.accept(this);
+  }
+
+  @override
+  visitVariableDeclaration(ir.VariableDeclaration node) {
+    handleVariableDeclaration(node, VariableUse.localType);
   }
 
   /// Add this variable to the set of free variables if appropriate and add to
@@ -207,9 +211,10 @@
   /// checked.
   void _markVariableAsUsed(
       ir.Node /* VariableDeclaration | TypeParameterTypeWithContext */ variable,
-      {bool onlyForRtiChecks = false}) {
+      VariableUse usage) {
     assert(variable is ir.VariableDeclaration ||
         variable is TypeVariableTypeWithContext);
+    assert(usage != null);
     if (_isInsideClosure && !_inCurrentContext(variable)) {
       // If the element is not declared in the current function and the element
       // is not the closure itself we need to mark the element as free variable.
@@ -217,10 +222,12 @@
       // optimization: factories have type parameters as function
       // parameters, and type parameters are declared in the class, not
       // the factory.
-      if (!onlyForRtiChecks) {
+      if (usage == VariableUse.explicit) {
         _currentScopeInfo.freeVariables.add(variable);
       } else {
-        _currentScopeInfo.freeVariablesForRti.add(variable);
+        _currentScopeInfo.freeVariablesForRti
+            .putIfAbsent(variable, () => new Set<VariableUse>())
+            .add(usage);
       }
     }
     if (_inTry && variable is ir.VariableDeclaration) {
@@ -230,41 +237,36 @@
 
   @override
   void visitThisExpression(ir.ThisExpression thisExpression) {
-    if (_hasThisLocal) _registerNeedsThis();
+    if (_hasThisLocal) _registerNeedsThis(VariableUse.explicit);
   }
 
   @override
   void visitTypeParameter(ir.TypeParameter typeParameter) {
-    if (_addTypeChecks) {
-      ir.TreeNode context = _executableContext;
-      TypeVariableTypeWithContext typeVariable =
-          new TypeVariableTypeWithContext(
-              new ir.TypeParameterType(typeParameter),
-              // If this typeParameter is part of a typedef then its parent is
-              // null because it has no context. Just pass in null for the
-              // context in that case.
-              typeParameter.parent != null
-                  ? typeParameter.parent.parent
-                  : null);
-      if (_isInsideClosure && context is ir.Procedure && context.isFactory) {
-        // This is a closure in a factory constructor.  Since there is no
-        // [:this:], we have to mark the type arguments as free variables to
-        // capture them in the closure.
-        _useTypeVariableAsLocal(typeVariable);
-      }
+    ir.TreeNode context = _executableContext;
+    TypeVariableTypeWithContext typeVariable = new TypeVariableTypeWithContext(
+        new ir.TypeParameterType(typeParameter),
+        // If this typeParameter is part of a typedef then its parent is
+        // null because it has no context. Just pass in null for the
+        // context in that case.
+        typeParameter.parent != null ? typeParameter.parent.parent : null);
+    if (_isInsideClosure && context is ir.Procedure && context.isFactory) {
+      // This is a closure in a factory constructor.  Since there is no
+      // [:this:], we have to mark the type arguments as free variables to
+      // capture them in the closure.
+      _useTypeVariableAsLocal(typeVariable, _currentTypeUsage);
+    }
 
-      if (_executableContext is ir.Member && _executableContext is! ir.Field) {
-        // In checked mode, using a type variable in a type annotation may lead
-        // to a runtime type check that needs to access the type argument and
-        // therefore the closure needs a this-element, if it is not in a field
-        // initializer; field initializers are evaluated in a context where
-        // the type arguments are available in locals.
+    if (_executableContext is ir.Member && _executableContext is! ir.Field) {
+      // In checked mode, using a type variable in a type annotation may lead
+      // to a runtime type check that needs to access the type argument and
+      // therefore the closure needs a this-element, if it is not in a field
+      // initializer; field initializers are evaluated in a context where
+      // the type arguments are available in locals.
 
-        if (_hasThisLocal) {
-          _registerNeedsThis();
-        } else {
-          _useTypeVariableAsLocal(typeVariable);
-        }
+      if (_hasThisLocal) {
+        _registerNeedsThis(_currentTypeUsage);
+      } else {
+        _useTypeVariableAsLocal(typeVariable, _currentTypeUsage);
       }
     }
   }
@@ -274,12 +276,12 @@
   /// If [onlyIfNeedsRti] is true, set thisUsedAsFreeVariableIfNeedsRti to true
   /// instead of thisUsedAsFreeVariable as we will only use `this` if runtime
   /// type information is checked.
-  void _registerNeedsThis({bool onlyIfNeedsRti = false}) {
+  void _registerNeedsThis(VariableUse usage) {
     if (_isInsideClosure) {
-      if (!onlyIfNeedsRti) {
+      if (usage == VariableUse.explicit) {
         _currentScopeInfo.thisUsedAsFreeVariable = true;
       } else {
-        _currentScopeInfo.thisUsedAsFreeVariableIfNeedsRti = true;
+        _currentScopeInfo.thisUsedAsFreeVariableIfNeedsRti.add(usage);
       }
     }
   }
@@ -362,19 +364,30 @@
         scope.hasThisLocal);
   }
 
-  void visitSuperMethodInvocation(ir.SuperMethodInvocation invocation) {
-    if (_hasThisLocal) _registerNeedsThis();
-    invocation.visitChildren(this);
+  void visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
+    if (_hasThisLocal) {
+      _registerNeedsThis(VariableUse.explicit);
+    }
+    if (node.arguments.types.isNotEmpty) {
+      visitListInContext(node.arguments.types,
+          new VariableUse.staticTypeArgument(node.interfaceTarget));
+    }
+    ir.visitList(node.arguments.positional, this);
+    ir.visitList(node.arguments.named, this);
   }
 
-  void visitSuperPropertySet(ir.SuperPropertySet propertySet) {
-    if (_hasThisLocal) _registerNeedsThis();
-    propertySet.visitChildren(this);
+  void visitSuperPropertySet(ir.SuperPropertySet node) {
+    if (_hasThisLocal) {
+      _registerNeedsThis(VariableUse.explicit);
+    }
+    node.visitChildren(this);
   }
 
-  void visitSuperPropertyGet(ir.SuperPropertyGet propertyGet) {
-    if (_hasThisLocal) _registerNeedsThis();
-    propertyGet.visitChildren(this);
+  void visitSuperPropertyGet(ir.SuperPropertyGet node) {
+    if (_hasThisLocal) {
+      _registerNeedsThis(VariableUse.explicit);
+    }
+    node.visitChildren(this);
   }
 
   void visitInvokable(ir.TreeNode node) {
@@ -417,16 +430,21 @@
     assert(freeVariables.isEmpty || savedIsInsideClosure);
     for (ir.Node freeVariable in freeVariables) {
       _capturedVariables.add(freeVariable);
-      _markVariableAsUsed(freeVariable);
+      _markVariableAsUsed(freeVariable, VariableUse.explicit);
     }
-    for (ir.Node freeVariableForRti in savedScopeInfo.freeVariablesForRti) {
-      _markVariableAsUsed(freeVariableForRti, onlyForRtiChecks: true);
-    }
+    savedScopeInfo.freeVariablesForRti.forEach(
+        (TypeVariableTypeWithContext freeVariableForRti,
+            Set<VariableUse> useSet) {
+      for (VariableUse usage in useSet) {
+        _markVariableAsUsed(freeVariableForRti, usage);
+      }
+    });
     if (_isInsideClosure && savedScopeInfo.thisUsedAsFreeVariable) {
       _currentScopeInfo.thisUsedAsFreeVariable = true;
     }
-    if (_isInsideClosure && savedScopeInfo.thisUsedAsFreeVariableIfNeedsRti) {
-      _currentScopeInfo.thisUsedAsFreeVariableIfNeedsRti = true;
+    if (_isInsideClosure) {
+      _currentScopeInfo.thisUsedAsFreeVariableIfNeedsRti
+          .addAll(savedScopeInfo.thisUsedAsFreeVariableIfNeedsRti);
     }
   }
 
@@ -447,7 +465,9 @@
 
   @override
   void visitField(ir.Field field) {
+    _currentTypeUsage = VariableUse.fieldType;
     visitInvokable(field);
+    _currentTypeUsage = null;
   }
 
   @override
@@ -472,32 +492,141 @@
 
   @override
   visitTypeParameterType(ir.TypeParameterType type) {
-    _analyzeTypeVariable(type, onlyIfNeedsRti: !_contextNeedsType);
+    _analyzeTypeVariable(type, _currentTypeUsage);
+  }
+
+  visitInContext(ir.Node node, VariableUse use) {
+    VariableUse oldCurrentTypeUsage = _currentTypeUsage;
+    _currentTypeUsage = use;
+    node?.accept(this);
+    _currentTypeUsage = oldCurrentTypeUsage;
+  }
+
+  visitListInContext(List<ir.Node> nodes, VariableUse use) {
+    VariableUse oldCurrentTypeUsage = _currentTypeUsage;
+    _currentTypeUsage = use;
+    ir.visitList(nodes, this);
+    _currentTypeUsage = oldCurrentTypeUsage;
+  }
+
+  visitChildrenInContext(ir.Node node, VariableUse use) {
+    VariableUse oldCurrentTypeUsage = _currentTypeUsage;
+    _currentTypeUsage = use;
+    node.visitChildren(this);
+    _currentTypeUsage = oldCurrentTypeUsage;
   }
 
   @override
   visitTypeLiteral(ir.TypeLiteral node) {
-    bool oldContextNeedsType = _contextNeedsType;
-    _contextNeedsType = true;
-    node.visitChildren(this);
-    _contextNeedsType = oldContextNeedsType;
+    visitChildrenInContext(node, VariableUse.explicit);
   }
 
   @override
   visitIsExpression(ir.IsExpression node) {
-    bool oldContextNeedsType = _contextNeedsType;
-    _contextNeedsType = true;
-    node.visitChildren(this);
-    _contextNeedsType = oldContextNeedsType;
+    node.operand.accept(this);
+    visitInContext(node.type, VariableUse.explicit);
   }
 
   @override
   visitAsExpression(ir.AsExpression node) {
-    bool oldContextNeedsType = _contextNeedsType;
-    _contextNeedsType =
-        !node.isTypeError || _options.implicitDowncastCheckPolicy.isEmitted;
-    node.visitChildren(this);
-    _contextNeedsType = oldContextNeedsType;
+    node.operand.accept(this);
+    visitInContext(node.type,
+        node.isTypeError ? VariableUse.implicitCast : VariableUse.explicit);
+  }
+
+  @override
+  visitFunctionNode(ir.FunctionNode node) {
+    VariableUse parameterUsage = node.parent is ir.Member
+        ? new VariableUse.memberParameter(node.parent)
+        : new VariableUse.localParameter(node.parent);
+    visitListInContext(node.typeParameters, parameterUsage);
+    for (ir.VariableDeclaration declaration in node.positionalParameters) {
+      handleVariableDeclaration(declaration, parameterUsage);
+    }
+    for (ir.VariableDeclaration declaration in node.namedParameters) {
+      handleVariableDeclaration(declaration, parameterUsage);
+    }
+    visitInContext(
+        node.returnType,
+        node.parent is ir.Member
+            ? new VariableUse.memberReturnType(node.parent)
+            : new VariableUse.localReturnType(node.parent));
+    node.body?.accept(this);
+  }
+
+  @override
+  visitListLiteral(ir.ListLiteral node) {
+    visitInContext(node.typeArgument, VariableUse.listLiteral);
+    ir.visitList(node.expressions, this);
+  }
+
+  @override
+  visitMapLiteral(ir.MapLiteral node) {
+    visitInContext(node.keyType, VariableUse.mapLiteral);
+    visitInContext(node.valueType, VariableUse.mapLiteral);
+    ir.visitList(node.entries, this);
+  }
+
+  @override
+  visitStaticInvocation(ir.StaticInvocation node) {
+    if (node.arguments.types.isNotEmpty) {
+      VariableUse usage;
+      if (node.target.kind == ir.ProcedureKind.Factory) {
+        usage = new VariableUse.constructorTypeArgument(node.target);
+      } else {
+        usage = new VariableUse.staticTypeArgument(node.target);
+      }
+
+      visitListInContext(node.arguments.types, usage);
+    }
+    ir.visitList(node.arguments.positional, this);
+    ir.visitList(node.arguments.named, this);
+  }
+
+  @override
+  visitConstructorInvocation(ir.ConstructorInvocation node) {
+    if (node.arguments.types.isNotEmpty) {
+      visitListInContext(node.arguments.types,
+          new VariableUse.constructorTypeArgument(node.target));
+    }
+    ir.visitList(node.arguments.positional, this);
+    ir.visitList(node.arguments.named, this);
+  }
+
+  @override
+  visitConditionalExpression(ir.ConditionalExpression node) {
+    node.condition.accept(this);
+    node.then.accept(this);
+    node.otherwise.accept(this);
+    // Don't visit `node.staticType`.
+  }
+
+  @override
+  visitMethodInvocation(ir.MethodInvocation node) {
+    ir.TreeNode receiver = node.receiver;
+    receiver.accept(this);
+    if (node.arguments.types.isNotEmpty) {
+      VariableUse usage;
+      if (receiver is ir.VariableGet &&
+          (receiver.variable.parent is ir.FunctionDeclaration ||
+              receiver.variable.parent is ir.FunctionExpression)) {
+        usage =
+            new VariableUse.localTypeArgument(receiver.variable.parent, node);
+      } else {
+        usage = new VariableUse.instanceTypeArgument(node);
+      }
+      visitListInContext(node.arguments.types, usage);
+    }
+    ir.visitList(node.arguments.positional, this);
+    ir.visitList(node.arguments.named, this);
+  }
+
+  @override
+  visitCatch(ir.Catch node) {
+    visitInContext(node.guard, VariableUse.explicit);
+    node.exception?.accept(this);
+    node.stackTrace?.accept(this);
+    node.body.accept(this);
   }
 
   /// Returns true if the node is a field, or a constructor (factory or
@@ -507,8 +636,8 @@
       node is ir.Field ||
       (node is ir.Procedure && node.isFactory);
 
-  void _analyzeTypeVariable(ir.TypeParameterType type,
-      {bool onlyIfNeedsRti: true}) {
+  void _analyzeTypeVariable(ir.TypeParameterType type, VariableUse usage) {
+    assert(usage != null);
     if (_outermostNode is ir.Member) {
       TypeVariableTypeWithContext typeVariable =
           new TypeVariableTypeWithContext(type, _outermostNode);
@@ -516,17 +645,15 @@
         case TypeVariableKind.cls:
           if (_isFieldOrConstructor(_outermostNode)) {
             // Class type variable used in a field or constructor.
-            _useTypeVariableAsLocal(typeVariable,
-                onlyForRtiChecks: onlyIfNeedsRti);
+            _useTypeVariableAsLocal(typeVariable, usage);
           } else {
             // Class type variable used in a method.
-            _registerNeedsThis(onlyIfNeedsRti: onlyIfNeedsRti);
+            _registerNeedsThis(usage);
           }
           break;
         case TypeVariableKind.method:
         case TypeVariableKind.local:
-          _useTypeVariableAsLocal(typeVariable,
-              onlyForRtiChecks: onlyIfNeedsRti);
+          _useTypeVariableAsLocal(typeVariable, usage);
           break;
         case TypeVariableKind.function:
         // The type variable is a function type variable, like `T` in
@@ -540,11 +667,11 @@
 
   /// If [onlyForRtiChecks] is true, the variable will be added to a list
   /// indicating it *may* be used only if runtime type information is checked.
-  void _useTypeVariableAsLocal(TypeVariableTypeWithContext typeVariable,
-      {bool onlyForRtiChecks: false}) {
+  void _useTypeVariableAsLocal(
+      TypeVariableTypeWithContext typeVariable, VariableUse usage) {
     if (typeVariable.kind != TypeVariableKind.cls && !_options.strongMode) {
       return;
     }
-    _markVariableAsUsed(typeVariable, onlyForRtiChecks: onlyForRtiChecks);
+    _markVariableAsUsed(typeVariable, usage);
   }
 }
diff --git a/pkg/compiler/lib/src/js_model/elements.dart b/pkg/compiler/lib/src/js_model/elements.dart
index 3e762b9..fdda596 100644
--- a/pkg/compiler/lib/src/js_model/elements.dart
+++ b/pkg/compiler/lib/src/js_model/elements.dart
@@ -18,31 +18,42 @@
 ///
 /// Querying for the frontend element for a backend-only element throws an
 /// exception.
-class JsToFrontendMap {
-  LibraryEntity toBackendLibrary(LibraryEntity library) => library;
+abstract class JsToFrontendMap {
+  LibraryEntity toBackendLibrary(LibraryEntity library);
 
-  ClassEntity toBackendClass(ClassEntity cls) => cls;
+  ClassEntity toBackendClass(ClassEntity cls);
 
-  MemberEntity toBackendMember(MemberEntity member) => member;
+  /// Returns the backend member corresponding to [member]. If a member isn't
+  /// live, it doesn't have a corresponding backend member and `null` is
+  /// returned instead.
+  MemberEntity toBackendMember(MemberEntity member);
 
-  DartType toBackendType(DartType type) => type;
+  DartType toBackendType(DartType type);
 
   Set<LibraryEntity> toBackendLibrarySet(Iterable<LibraryEntity> set) {
     return set.map(toBackendLibrary).toSet();
   }
 
   Set<ClassEntity> toBackendClassSet(Iterable<ClassEntity> set) {
+    // TODO(johnniwinther): Filter unused classes.
     return set.map(toBackendClass).toSet();
   }
 
   Set<MemberEntity> toBackendMemberSet(Iterable<MemberEntity> set) {
-    return set.map(toBackendMember).toSet();
+    return set.map(toBackendMember).where((MemberEntity member) {
+      // Members that are not live don't have a corresponding backend member.
+      return member != null;
+    }).toSet();
   }
 
   Set<FunctionEntity> toBackendFunctionSet(Iterable<FunctionEntity> set) {
     Set<FunctionEntity> newSet = new Set<FunctionEntity>();
     for (FunctionEntity element in set) {
-      newSet.add(toBackendMember(element));
+      FunctionEntity backendFunction = toBackendMember(element);
+      if (backendFunction != null) {
+        // Members that are not live don't have a corresponding backend member.
+        newSet.add(backendFunction);
+      }
     }
     return newSet;
   }
@@ -69,7 +80,12 @@
     Map<K, V> map, K convertKey(K key), V convertValue(V value)) {
   Map<K, V> newMap = <K, V>{};
   map.forEach((K key, V value) {
-    newMap[convertKey(key)] = convertValue(value);
+    K newKey = convertKey(key);
+    V newValue = convertValue(value);
+    if (newKey != null && newValue != null) {
+      // Entities that are not used don't have a corresponding backend entity.
+      newMap[newKey] = newValue;
+    }
   });
   return newMap;
 }
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index 888b04b..9572c32 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -72,15 +72,14 @@
   ClosedWorldRefiner createClosedWorldRefiner(ClosedWorld closedWorld) {
     KernelFrontEndStrategy strategy = _compiler.frontendStrategy;
     _elementMap = new JsKernelToElementMap(
-        _compiler.reporter, _compiler.environment, strategy.elementMap);
+        _compiler.reporter,
+        _compiler.environment,
+        strategy.elementMap,
+        closedWorld.processedMembers);
     _elementEnvironment = _elementMap.elementEnvironment;
     _commonElements = _elementMap.commonElements;
     _closureDataLookup = new KernelClosureConversionTask(
-        _compiler.measurer,
-        _elementMap,
-        _globalLocalsMap,
-        _compiler.options.enableTypeAssertions,
-        _compiler.options.strongMode);
+        _compiler.measurer, _elementMap, _globalLocalsMap, _compiler.options);
     JsClosedWorldBuilder closedWorldBuilder = new JsClosedWorldBuilder(
         _elementMap, _closureDataLookup, _compiler.options);
     return closedWorldBuilder._convertClosedWorld(
@@ -115,7 +114,12 @@
           result[closureInfo.closureClassEntity] = unit;
           result[closureInfo.callMethod] = unit;
         } else {
-          result[toBackendEntity(entity)] = unit;
+          Entity backendEntity = toBackendEntity(entity);
+          if (backendEntity != null) {
+            // If [entity] isn't used it doesn't have a corresponding backend
+            // entity.
+            result[backendEntity] = unit;
+          }
         }
       });
       return result;
@@ -281,11 +285,9 @@
     if (_options.disableRtiOptimization) {
       rtiNeed = new TrivialRuntimeTypesNeed();
       callMethods = _closureConversionTask.createClosureEntities(
-          this, map.toBackendMemberMap(closureModels, identity),
-          localFunctionNeedsSignature: (_) => true,
-          classNeedsTypeArguments: (_) => true,
-          methodNeedsTypeArguments: (_) => true,
-          localFunctionNeedsTypeArguments: (_) => true);
+          this,
+          map.toBackendMemberMap(closureModels, identity),
+          const TrivialClosureRtiNeed());
     } else {
       RuntimeTypesNeedImpl kernelRtiNeed = closedWorld.rtiNeed;
       Set<ir.Node> localFunctionsNodesNeedingSignature = new Set<ir.Node>();
@@ -308,23 +310,14 @@
       RuntimeTypesNeedImpl jRtiNeed =
           _convertRuntimeTypesNeed(map, backendUsage, kernelRtiNeed);
       callMethods = _closureConversionTask.createClosureEntities(
-          this, map.toBackendMemberMap(closureModels, identity),
-          localFunctionNeedsSignature: (ir.Node node) {
-            assert(node is ir.FunctionDeclaration ||
-                node is ir.FunctionExpression);
-            return backendUsage.isRuntimeTypeUsed
-                ? true
-                : localFunctionsNodesNeedingSignature.contains(node);
-          },
-          classNeedsTypeArguments: jRtiNeed.classNeedsTypeArguments,
-          methodNeedsTypeArguments: jRtiNeed.methodNeedsTypeArguments,
-          localFunctionNeedsTypeArguments: (ir.Node node) {
-            assert(node is ir.FunctionDeclaration ||
-                node is ir.FunctionExpression);
-            return backendUsage.isRuntimeTypeUsed
-                ? true
-                : localFunctionsNodesNeedingTypeArguments.contains(node);
-          });
+          this,
+          map.toBackendMemberMap(closureModels, identity),
+          new JsClosureRtiNeed(
+            backendUsage,
+            jRtiNeed,
+            localFunctionsNodesNeedingTypeArguments,
+            localFunctionsNodesNeedingSignature,
+          ));
 
       List<FunctionEntity> callMethodsNeedingSignature = <FunctionEntity>[];
       for (ir.Node node in localFunctionsNodesNeedingSignature) {
@@ -463,8 +456,12 @@
         <FunctionEntity, NativeBehavior>{};
     nativeData.nativeMethodBehavior
         .forEach((FunctionEntity method, NativeBehavior behavior) {
-      nativeMethodBehavior[map.toBackendMember(method)] =
-          convertNativeBehavior(behavior);
+      FunctionEntity backendMethod = map.toBackendMember(method);
+      if (backendMethod != null) {
+        // If [method] isn't used it doesn't have a corresponding backend
+        // method.
+        nativeMethodBehavior[backendMethod] = convertNativeBehavior(behavior);
+      }
     });
     Map<MemberEntity, NativeBehavior> nativeFieldLoadBehavior =
         map.toBackendMemberMap(
@@ -773,3 +770,53 @@
   List<DartType> _visitList(List<DartType> list) =>
       list.map<DartType>((t) => t.accept(this, null)).toList();
 }
+
+class TrivialClosureRtiNeed implements ClosureRtiNeed {
+  const TrivialClosureRtiNeed();
+
+  bool localFunctionNeedsSignature(ir.Node node) => true;
+  bool classNeedsTypeArguments(ClassEntity cls) => true;
+  bool methodNeedsTypeArguments(FunctionEntity method) => true;
+  bool localFunctionNeedsTypeArguments(ir.Node node) => true;
+  bool selectorNeedsTypeArguments(Selector selector) => true;
+  bool methodNeedsSignature(MemberEntity method) => true;
+}
+
+class JsClosureRtiNeed implements ClosureRtiNeed {
+  final BackendUsage backendUsage;
+  final RuntimeTypesNeed rtiNeed;
+  final Set<ir.Node> localFunctionsNodesNeedingTypeArguments;
+  final Set<ir.Node> localFunctionsNodesNeedingSignature;
+
+  JsClosureRtiNeed(
+      this.backendUsage,
+      this.rtiNeed,
+      this.localFunctionsNodesNeedingTypeArguments,
+      this.localFunctionsNodesNeedingSignature);
+
+  bool localFunctionNeedsSignature(ir.Node node) {
+    assert(node is ir.FunctionDeclaration || node is ir.FunctionExpression);
+    return backendUsage.isRuntimeTypeUsed
+        ? true
+        : localFunctionsNodesNeedingSignature.contains(node);
+  }
+
+  bool classNeedsTypeArguments(ClassEntity cls) =>
+      rtiNeed.classNeedsTypeArguments(cls);
+
+  bool methodNeedsTypeArguments(FunctionEntity method) =>
+      rtiNeed.methodNeedsTypeArguments(method);
+
+  bool localFunctionNeedsTypeArguments(ir.Node node) {
+    assert(node is ir.FunctionDeclaration || node is ir.FunctionExpression);
+    return backendUsage.isRuntimeTypeUsed
+        ? true
+        : localFunctionsNodesNeedingTypeArguments.contains(node);
+  }
+
+  bool selectorNeedsTypeArguments(Selector selector) =>
+      rtiNeed.selectorNeedsTypeArguments(selector);
+
+  bool methodNeedsSignature(MemberEntity method) =>
+      rtiNeed.methodNeedsSignature(method);
+}
diff --git a/pkg/compiler/lib/src/js_model/locals.dart b/pkg/compiler/lib/src/js_model/locals.dart
index af6f30a..8c7e543 100644
--- a/pkg/compiler/lib/src/js_model/locals.dart
+++ b/pkg/compiler/lib/src/js_model/locals.dart
@@ -223,6 +223,29 @@
     JJumpTarget target;
     ir.TreeNode body = node.target.body;
     ir.TreeNode parent = node.target.parent;
+
+    // TODO(johnniwinther): Coordinate with CFE-team to avoid such arbitrary
+    // reverse engineering mismatches:
+    if (parent is ir.Block && parent.statements.last == node.target) {
+      // In strong mode for code like this:
+      //
+      //     for (int i in list) {
+      //       continue;
+      //     }
+      //
+      // an implicit cast may be inserted before the label statement, resulting
+      // in code like this:
+      //
+      //     for (var i in list) {
+      //       var #1 = i as int;
+      //       l1: {
+      //          break l1:
+      //       }
+      //     }
+      //
+      // for which we should still use the for loop as a continue target.
+      parent = parent.parent;
+    }
     if (canBeBreakTarget(body)) {
       // We have code like
       //
diff --git a/pkg/compiler/lib/src/kernel/element_map.dart b/pkg/compiler/lib/src/kernel/element_map.dart
index 48a25e7..d9c3e7a 100644
--- a/pkg/compiler/lib/src/kernel/element_map.dart
+++ b/pkg/compiler/lib/src/kernel/element_map.dart
@@ -185,6 +185,10 @@
 
   /// Returns the definition information for [cls].
   ClassDefinition getClassDefinition(covariant ClassEntity cls);
+
+  /// Returns the static type of [node].
+  // TODO(johnniwinther): This should be provided directly from kernel.
+  DartType getStaticType(ir.Expression node);
 }
 
 /// Interface that translates between Kernel IR nodes and entities used for
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index ecf8d0a..e7791c6 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -5,6 +5,9 @@
 library dart2js.kernel.element_map;
 
 import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/class_hierarchy.dart' as ir;
+import 'package:kernel/core_types.dart' as ir;
+import 'package:kernel/type_environment.dart' as ir;
 
 import '../closure.dart' show BoxLocal, ThisLocal;
 import '../common.dart';
@@ -202,6 +205,10 @@
     });
   }
 
+  void ensureClassMembers(ir.Class node) {
+    _classes.getEnv(_getClass(node)).ensureMembers(this);
+  }
+
   MemberEntity lookupClassMember(IndexedClass cls, String name,
       {bool setter: false}) {
     assert(checkFamily(cls));
@@ -342,17 +349,24 @@
   MemberEntity getSuperMember(
       MemberEntity context, ir.Name name, ir.Member target,
       {bool setter: false}) {
-    if (target != null) {
+    if (target != null && !target.isAbstract && target.isInstanceMember) {
       return getMember(target);
     }
     ClassEntity cls = context.enclosingClass;
+    assert(
+        cls != null,
+        failedAt(context,
+            "No enclosing class for super member access in $context."));
     IndexedClass superclass = _getSuperType(cls)?.element;
     while (superclass != null) {
       ClassEnv env = _classes.getEnv(superclass);
       MemberEntity superMember =
           env.lookupMember(this, name.name, setter: setter);
-      if (superMember != null && !superMember.isAbstract) {
-        return superMember;
+      if (superMember != null) {
+        if (!superMember.isInstanceMember) return null;
+        if (!superMember.isAbstract) {
+          return superMember;
+        }
       }
       superclass = _getSuperType(superclass)?.element;
     }
@@ -1187,11 +1201,37 @@
         KElementCreatorMixin {
   native.BehaviorBuilder _nativeBehaviorBuilder;
   FrontendStrategy _frontendStrategy;
+  ir.TypeEnvironment _typeEnvironment;
+  bool _isStaticTypePrepared = false;
 
   KernelToElementMapForImpactImpl(DiagnosticReporter reporter,
       Environment environment, this._frontendStrategy, CompilerOptions options)
       : super(options, reporter, environment);
 
+  DartType getStaticType(ir.Expression node) {
+    if (!_isStaticTypePrepared) {
+      _isStaticTypePrepared = true;
+      try {
+        _typeEnvironment ??= new ir.TypeEnvironment(
+            new ir.CoreTypes(_env.mainComponent),
+            new ir.ClassHierarchy(_env.mainComponent),
+            strongMode: options.strongMode);
+      } catch (e) {}
+    }
+    if (_typeEnvironment == null) {
+      // The class hierarchy crashes on multiple inheritance. Use `dynamic`
+      // as static type.
+      return commonElements.dynamicType;
+    }
+    ir.TreeNode enclosingClass = node;
+    while (enclosingClass != null && enclosingClass is! ir.Class) {
+      enclosingClass = enclosingClass.parent;
+    }
+    _typeEnvironment.thisType =
+        enclosingClass is ir.Class ? enclosingClass.thisType : null;
+    return getDartType(node.getStaticType(_typeEnvironment));
+  }
+
   @override
   bool checkFamily(Entity entity) {
     assert(
@@ -1409,6 +1449,39 @@
   }
 
   @override
+  DartType getFunctionAsyncOrSyncStarElementType(FunctionEntity function) {
+    DartType returnType = getFunctionType(function).returnType;
+    switch (function.asyncMarker) {
+      case AsyncMarker.SYNC:
+        return returnType;
+      case AsyncMarker.SYNC_STAR:
+        if (returnType is InterfaceType) {
+          if (returnType.element == elementMap.commonElements.iterableClass) {
+            return returnType.typeArguments.first;
+          }
+        }
+        return dynamicType;
+      case AsyncMarker.ASYNC:
+        if (returnType is FutureOrType) return returnType.typeArgument;
+        if (returnType is InterfaceType) {
+          if (returnType.element == elementMap.commonElements.futureClass) {
+            return returnType.typeArguments.first;
+          }
+        }
+        return dynamicType;
+      case AsyncMarker.ASYNC_STAR:
+        if (returnType is InterfaceType) {
+          if (returnType.element == elementMap.commonElements.streamClass) {
+            return returnType.typeArguments.first;
+          }
+        }
+        return dynamicType;
+    }
+    assert(false, 'Unexpected marker ${function.asyncMarker}');
+    return null;
+  }
+
+  @override
   DartType getFieldType(FieldEntity field) {
     return elementMap._getFieldType(field);
   }
@@ -2159,8 +2232,11 @@
 
   NativeBasicData nativeBasicData;
 
-  JsKernelToElementMap(DiagnosticReporter reporter, Environment environment,
-      KernelToElementMapForImpactImpl _elementMap)
+  JsKernelToElementMap(
+      DiagnosticReporter reporter,
+      Environment environment,
+      KernelToElementMapForImpactImpl _elementMap,
+      Iterable<MemberEntity> liveMembers)
       : super(_elementMap.options, reporter, environment) {
     _env = _elementMap._env;
     for (int libraryIndex = 0;
@@ -2173,7 +2249,11 @@
       IndexedLibrary newLibrary = convertLibrary(oldLibrary);
       _libraryMap[env.library] =
           _libraries.register<IndexedLibrary, LibraryData, LibraryEnv>(
-              newLibrary, data.copy(), env);
+              newLibrary,
+              data.copy(),
+              options.strongMode && useStrongModeWorldStrategy
+                  ? env.copyLive(_elementMap, liveMembers)
+                  : env);
       assert(newLibrary.libraryIndex == oldLibrary.libraryIndex);
     }
     for (int classIndex = 0;
@@ -2185,7 +2265,12 @@
       IndexedLibrary oldLibrary = oldClass.library;
       LibraryEntity newLibrary = _libraries.getEntity(oldLibrary.libraryIndex);
       IndexedClass newClass = convertClass(newLibrary, oldClass);
-      _classMap[env.cls] = _classes.register(newClass, data.copy(), env);
+      _classMap[env.cls] = _classes.register(
+          newClass,
+          data.copy(),
+          options.strongMode && useStrongModeWorldStrategy
+              ? env.copyLive(_elementMap, liveMembers)
+              : env);
       assert(newClass.classIndex == oldClass.classIndex);
     }
     for (int typedefIndex = 0;
@@ -2211,6 +2296,12 @@
         memberIndex < _elementMap._members.length;
         memberIndex++) {
       IndexedMember oldMember = _elementMap._members.getEntity(memberIndex);
+      if (options.strongMode &&
+          useStrongModeWorldStrategy &&
+          !liveMembers.contains(oldMember)) {
+        _members.skipIndex(oldMember.memberIndex);
+        continue;
+      }
       MemberDataImpl data = _elementMap._members.getData(oldMember);
       IndexedLibrary oldLibrary = oldMember.library;
       IndexedClass oldClass = oldMember.enclosingClass;
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index 90077cb..da925b6 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -32,6 +32,8 @@
   /// TODO(johnniwinther): Handle arbitrary load order if needed.
   ir.Member get mainMethod => _components.first?.mainMethod;
 
+  ir.Component get mainComponent => _components.first;
+
   void addComponent(ir.Component component) {
     if (_components.add(component)) {
       if (_libraryMap != null) {
@@ -84,6 +86,9 @@
 
   LibraryEnv(this.library);
 
+  LibraryEnv.internal(
+      this.library, this._classMap, this._memberMap, this._setterMap);
+
   void _ensureClassMap() {
     if (_classMap == null) {
       _classMap = <String, ClassEnv>{};
@@ -150,6 +155,45 @@
       }
     }
   }
+
+  /// Creates a new [LibraryEnv] containing only the members in [liveMembers].
+  ///
+  /// Currently all classes are copied.
+  // TODO(johnniwinther): Filter unused classes.
+  LibraryEnv copyLive(
+      KernelToElementMap elementMap, Iterable<MemberEntity> liveMembers) {
+    Map<String, ClassEnv> classMap;
+    Map<String, ir.Member> memberMap;
+    Map<String, ir.Member> setterMap;
+    if (_classMap == null) {
+      classMap = const <String, ClassEnv>{};
+    } else {
+      classMap = _classMap;
+    }
+    if (_memberMap == null) {
+      memberMap = const <String, ir.Member>{};
+    } else {
+      memberMap = <String, ir.Member>{};
+      _memberMap.forEach((String name, ir.Member node) {
+        MemberEntity member = elementMap.getMember(node);
+        if (liveMembers.contains(member)) {
+          memberMap[name] = node;
+        }
+      });
+    }
+    if (_setterMap == null) {
+      setterMap = const <String, ir.Member>{};
+    } else {
+      setterMap = <String, ir.Member>{};
+      _setterMap.forEach((String name, ir.Member node) {
+        MemberEntity member = elementMap.getMember(node);
+        if (liveMembers.contains(member)) {
+          setterMap[name] = node;
+        }
+      });
+    }
+    return new LibraryEnv.internal(library, classMap, memberMap, setterMap);
+  }
 }
 
 class LibraryData {
@@ -196,6 +240,9 @@
   /// Whether the class is an unnamed mixin application.
   bool get isUnnamedMixinApplication;
 
+  /// Ensures that all members have been computed for [cls].
+  void ensureMembers(KernelToElementMapBase elementMap);
+
   /// Return the [MemberEntity] for the member [name] in the class. If [setter]
   /// is `true`, the setter or assignable field corresponding to [name] is
   /// returned.
@@ -217,6 +264,10 @@
   /// Calls [f] for each constructor body for the live constructors in the
   /// class.
   void forEachConstructorBody(void f(ConstructorBodyEntity constructor));
+
+  /// Creates a new [ClassEnv] containing only the members in [liveMembers].
+  ClassEnv copyLive(
+      KernelToElementMap elementMap, Iterable<MemberEntity> liveMembers);
 }
 
 int orderByFileOffset(ir.TreeNode a, ir.TreeNode b) {
@@ -243,6 +294,9 @@
 
   ClassEnvImpl(this.cls);
 
+  ClassEnvImpl.internal(this.cls, this._constructorMap, this._memberMap,
+      this._setterMap, this._members);
+
   bool get isUnnamedMixinApplication => cls.isSyntheticMixinImplementation;
 
   /// Copied from 'package:kernel/transformations/mixin_full_resolution.dart'.
@@ -291,6 +345,10 @@
         initializers: <ir.Initializer>[superInitializer]);
   }
 
+  void ensureMembers(KernelToElementMapBase elementMap) {
+    _ensureMaps(elementMap);
+  }
+
   void _ensureMaps(KernelToElementMapBase elementMap) {
     if (_memberMap != null) return;
 
@@ -364,6 +422,7 @@
 
     int mixinMemberCount = 0;
     if (cls.mixedInClass != null) {
+      elementMap.ensureClassMembers(cls.mixedInClass);
       addFields(cls.mixedInClass.mixin, includeStatic: false);
       addProcedures(cls.mixedInClass.mixin, includeStatic: false);
       mergeSort(members, compare: orderByFileOffset);
@@ -446,6 +505,60 @@
   void forEachConstructorBody(void f(ConstructorBodyEntity constructor)) {
     _constructorBodyList?.forEach(f);
   }
+
+  ClassEnv copyLive(
+      KernelToElementMap elementMap, Iterable<MemberEntity> liveMembers) {
+    Map<String, ir.Member> constructorMap;
+    Map<String, ir.Member> memberMap;
+    Map<String, ir.Member> setterMap;
+    List<ir.Member> members;
+    if (_constructorMap == null) {
+      constructorMap = const <String, ir.Member>{};
+    } else {
+      constructorMap = <String, ir.Member>{};
+      _constructorMap.forEach((String name, ir.Member node) {
+        MemberEntity member = elementMap.getMember(node);
+        if (liveMembers.contains(member)) {
+          constructorMap[name] = node;
+        }
+      });
+    }
+    if (_memberMap == null) {
+      memberMap = const <String, ir.Member>{};
+    } else {
+      memberMap = <String, ir.Member>{};
+      _memberMap.forEach((String name, ir.Member node) {
+        MemberEntity member = elementMap.getMember(node);
+        if (liveMembers.contains(member)) {
+          memberMap[name] = node;
+        }
+      });
+    }
+    if (_setterMap == null) {
+      setterMap = const <String, ir.Member>{};
+    } else {
+      setterMap = <String, ir.Member>{};
+      _setterMap.forEach((String name, ir.Member node) {
+        MemberEntity member = elementMap.getMember(node);
+        if (liveMembers.contains(member)) {
+          setterMap[name] = node;
+        }
+      });
+    }
+    if (_members == null) {
+      members = const <ir.Member>[];
+    } else {
+      members = <ir.Member>[];
+      _members.forEach((ir.Member node) {
+        MemberEntity member = elementMap.getMember(node);
+        if (liveMembers.contains(member)) {
+          members.add(node);
+        }
+      });
+    }
+    return new ClassEnvImpl.internal(
+        cls, constructorMap, memberMap, setterMap, members);
+  }
 }
 
 class ClosureClassEnv extends RecordEnv {
@@ -460,6 +573,11 @@
     }
     return super.lookupMember(elementMap, name, setter: setter);
   }
+
+  @override
+  ClassEnv copyLive(
+          KernelToElementMap elementMap, Iterable<MemberEntity> liveMembers) =>
+      this;
 }
 
 class RecordEnv implements ClassEnv {
@@ -468,6 +586,11 @@
   RecordEnv(this._memberMap);
 
   @override
+  void ensureMembers(KernelToElementMapBase elementMap) {
+    // All members have been computed at creation.
+  }
+
+  @override
   void forEachConstructorBody(void f(ConstructorBodyEntity constructor)) {
     // We do not create constructor bodies for containers.
   }
@@ -502,6 +625,12 @@
 
   @override
   ir.Class get cls => null;
+
+  @override
+  ClassEnv copyLive(
+      KernelToElementMap elementMap, Iterable<MemberEntity> liveMembers) {
+    return this;
+  }
 }
 
 class ClassData {
diff --git a/pkg/compiler/lib/src/kernel/indexed.dart b/pkg/compiler/lib/src/kernel/indexed.dart
index bf7be15..28545af 100644
--- a/pkg/compiler/lib/src/kernel/indexed.dart
+++ b/pkg/compiler/lib/src/kernel/indexed.dart
@@ -61,9 +61,10 @@
 
 /// Index based map of entities of type [E].
 class EntityMap<E extends _Indexed> extends EntityMapBase<E> {
-  /// Registers a new entity.
+  /// Registers a new [entity].
   ///
-  /// [createEntity] is called to create the entity with the given index.
+  /// The index of [entity] is set to match its index in the entity list in this
+  /// map.
   E0 register<E0 extends E>(E0 entity) {
     assert(entity != null);
     assert(entity._index == null);
@@ -93,11 +94,17 @@
 /// Index based map of entities of type [E] with a corresponding data object
 /// of type [D].
 class EntityDataMap<E extends _Indexed, D> extends EntityDataMapBase<E, D> {
-  /// Registers a new entity with an associated data object.
+  /// Mark entity [index] as missing
+  void skipIndex(int index) {
+    assert(index == _list.length);
+    _list.add(null);
+    _data.add(null);
+  }
+
+  /// Registers a new [entity] with an associated [data] object.
   ///
-  /// Firstly, [createEntity] is called to create the entity with the given
-  /// index. Secondly, [createData] is called with the newly created entity to
-  /// create the associated data object.
+  /// The index of [entity] is set to match its index in the entity and data
+  /// lists in this map.
   E0 register<E0 extends E, D0 extends D>(E0 entity, D0 data) {
     assert(entity != null);
     assert(entity._index == null);
@@ -130,12 +137,11 @@
 /// type [D] and an environment of type [V].
 class EntityDataEnvMap<E extends _Indexed, D, V>
     extends EntityDataEnvMapBase<E, D, V> {
-  /// Registers a new entity with an associated data object and environment.
+  /// Registers a new [entity] with an associated [data] object and environment
+  /// [env].
   ///
-  /// Firstly, [createEntity] is called to create the entity with the given
-  /// index. Secondly, [createData] is called with the newly created entity to
-  /// create the associated data object. Thirdly, [createEnv] is called with
-  /// the newly created entity to create the associated environment object.
+  /// The index of [entity] is set to match its index in the entity, data and
+  /// environment lists in this map.
   E0 register<E0 extends E, D0 extends D, V0 extends V>(
       E0 entity, D0 data, V0 env) {
     assert(entity != null);
diff --git a/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart
index d0de459..b575680 100644
--- a/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart
@@ -238,7 +238,7 @@
   }
 
   @override
-  Iterable<MemberEntity> sortMembers(Iterable<MemberEntity> members) {
+  Iterable<T> sortMembers<T extends MemberEntity>(Iterable<T> members) {
     return members.toList()..sort(compareMembersByLocation);
   }
 
diff --git a/pkg/compiler/lib/src/kernel/types.dart b/pkg/compiler/lib/src/kernel/types.dart
index 3f6a1a6..9f6efde 100644
--- a/pkg/compiler/lib/src/kernel/types.dart
+++ b/pkg/compiler/lib/src/kernel/types.dart
@@ -16,8 +16,10 @@
             new _KernelPotentialSubtypeVisitor(elementMap);
 
   @override
-  bool isPotentialSubtype(DartType t, DartType s) {
-    return potentialSubtypeVisitor.isSubtype(t, s);
+  bool isPotentialSubtype(DartType t, DartType s,
+      {bool assumeInstantiations: true}) {
+    return potentialSubtypeVisitor.isPotentialSubtype(t, s,
+        assumeInstantiations: assumeInstantiations);
   }
 
   @override
diff --git a/pkg/compiler/lib/src/parser/element_listener.dart b/pkg/compiler/lib/src/parser/element_listener.dart
index 71ea505..081a066 100644
--- a/pkg/compiler/lib/src/parser/element_listener.dart
+++ b/pkg/compiler/lib/src/parser/element_listener.dart
@@ -852,7 +852,7 @@
   Token synthesizeIdentifier(Token token) {
     Token synthesizedToken =
         new StringToken.fromString(TokenType.IDENTIFIER, '?', token.charOffset);
-    synthesizedToken.next = token.next;
+    synthesizedToken.setNext(token.next);
     return synthesizedToken;
   }
 
diff --git a/pkg/compiler/lib/src/resolution/members.dart b/pkg/compiler/lib/src/resolution/members.dart
index e50aede..abda55c 100644
--- a/pkg/compiler/lib/src/resolution/members.dart
+++ b/pkg/compiler/lib/src/resolution/members.dart
@@ -4328,6 +4328,7 @@
             MessageKind.INVALID_AWAIT_FOR_IN);
       }
       registry.registerFeature(Feature.ASYNC_FOR_IN);
+      registry.registerDynamicUse(new DynamicUse(Selectors.cancel));
       registry.registerDynamicUse(new DynamicUse(Selectors.current));
       registry.registerDynamicUse(new DynamicUse(Selectors.moveNext));
     }
diff --git a/pkg/compiler/lib/src/resolution/resolution_strategy.dart b/pkg/compiler/lib/src/resolution/resolution_strategy.dart
index c4bfb96..b73f923 100644
--- a/pkg/compiler/lib/src/resolution/resolution_strategy.dart
+++ b/pkg/compiler/lib/src/resolution/resolution_strategy.dart
@@ -737,6 +737,11 @@
   }
 
   @override
+  DartType getFunctionAsyncOrSyncStarElementType(FunctionEntity function) {
+    return dynamicType;
+  }
+
+  @override
   DartType getFieldType(covariant FieldElement field) {
     field.computeType(_resolution);
     return field.type;
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index 37c4541..23353e6 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -4126,7 +4126,7 @@
       }
     }
 
-    bool isOptimizableOperation(Selector selector, Element element) {
+    bool isOptimizableOperation(Selector selector, MemberElement element) {
       ClassElement cls = element.enclosingClass;
       if (isOptimizableOperationOnIndexable(selector, element)) return true;
       if (!interceptorData.interceptedClasses.contains(cls)) return false;
@@ -4136,7 +4136,7 @@
       if (selector.isIndexSet) return true;
       if (element == commonElements.jsArrayAdd ||
           element == commonElements.jsArrayRemoveLast ||
-          element == commonElements.jsStringSplit) {
+          commonElements.isJsStringSplit(element)) {
         return true;
       }
       return false;
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index efed6ee..06ebbe7 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -2787,14 +2787,17 @@
     node.value.accept(this);
     HInstruction value = pop();
 
-    if (node.interfaceTarget == null) {
+    MemberEntity member = _elementMap.getSuperMember(
+        _currentFrame.member, node.name, node.interfaceTarget,
+        setter: true);
+    if (member == null) {
       _generateSuperNoSuchMethod(node, _elementMap.getSelector(node).name + "=",
           <HInstruction>[value], const <DartType>[], sourceInformation);
     } else {
       _buildInvokeSuper(
           _elementMap.getSelector(node),
           _elementMap.getClass(_containingClass(node)),
-          _elementMap.getMember(node.interfaceTarget),
+          member,
           <HInstruction>[value],
           const <DartType>[],
           sourceInformation);
@@ -3811,7 +3814,7 @@
       if (selector.isIndexSet) return true;
       if (element == commonElements.jsArrayAdd ||
           element == commonElements.jsArrayRemoveLast ||
-          element == commonElements.jsStringSplit) {
+          commonElements.isJsStringSplit(element)) {
         return true;
       }
       return false;
@@ -4170,14 +4173,16 @@
   void visitSuperPropertyGet(ir.SuperPropertyGet node) {
     SourceInformation sourceInformation =
         _sourceInformationBuilder.buildGet(node);
-    if (node.interfaceTarget == null) {
+    MemberEntity member = _elementMap.getSuperMember(
+        _currentFrame.member, node.name, node.interfaceTarget);
+    if (member == null) {
       _generateSuperNoSuchMethod(node, _elementMap.getSelector(node).name,
           const <HInstruction>[], const <DartType>[], sourceInformation);
     } else {
       _buildInvokeSuper(
           _elementMap.getSelector(node),
           _elementMap.getClass(_containingClass(node)),
-          _elementMap.getMember(node.interfaceTarget),
+          member,
           const <HInstruction>[],
           const <DartType>[],
           sourceInformation);
@@ -4188,7 +4193,9 @@
   void visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
     SourceInformation sourceInformation =
         _sourceInformationBuilder.buildCall(node, node);
-    if (node.interfaceTarget == null) {
+    MemberEntity member = _elementMap.getSuperMember(
+        _currentFrame.member, node.name, node.interfaceTarget);
+    if (member == null) {
       Selector selector = _elementMap.getSelector(node);
       List<DartType> typeArguments = <DartType>[];
       selector =
@@ -4199,9 +4206,8 @@
           node, selector.name, arguments, typeArguments, sourceInformation);
       return;
     }
-    FunctionEntity function = _elementMap.getMethod(node.interfaceTarget);
     List<DartType> typeArguments =
-        _getStaticTypeArguments(function, node.arguments);
+        _getStaticTypeArguments(member, node.arguments);
     List<HInstruction> arguments = _visitArgumentsForStaticTarget(
         node.interfaceTarget.function,
         node.arguments,
@@ -4210,7 +4216,7 @@
     _buildInvokeSuper(
         _elementMap.getSelector(node),
         _elementMap.getClass(_containingClass(node)),
-        function,
+        member,
         arguments,
         typeArguments,
         sourceInformation);
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index f108912..2e4c056 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -1738,7 +1738,7 @@
         methodName = 'push';
       } else if (target == _commonElements.jsArrayRemoveLast) {
         methodName = 'pop';
-      } else if (target == _commonElements.jsStringSplit) {
+      } else if (_commonElements.isJsStringSplit(target)) {
         methodName = 'split';
         // Split returns a List, so we make sure the backend knows the
         // list class is instantiated.
diff --git a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
index c476754..f02b6c6 100644
--- a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
+++ b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
@@ -122,16 +122,52 @@
       CompilerOptions options,
       CommonElements commonElements,
       ClosedWorld closedWorld) {
-    if (instruction.inputs[1].isMutableIndexable(closedWorld)) {
-      if (!instruction.inputs[2].isInteger(closedWorld) &&
-          options.enableTypeAssertions) {
-        // We want the right checked mode error.
+    HInstruction receiver = instruction.inputs[1];
+    HInstruction index = instruction.inputs[2];
+    if (!receiver.isMutableIndexable(closedWorld)) return null;
+    if (!index.isInteger(closedWorld) && options.enableTypeAssertions) {
+      // We want the right checked mode error.
+      return null;
+    }
+
+    HInstruction value = instruction.inputs[3];
+    if (options.parameterCheckPolicy.isEmitted) {
+      if (!_valueParameterCheckAlwaysSucceeds(
+          instruction, receiver, value, commonElements, closedWorld)) {
         return null;
       }
-      return new HIndexAssign(instruction.inputs[1], instruction.inputs[2],
-          instruction.inputs[3], instruction.selector);
     }
-    return null;
+    return new HIndexAssign(receiver, index, value, instruction.selector);
+  }
+
+  /// Returns [true] if [value] meets the requirements for being stored into
+  /// indexable [receiver].
+  bool _valueParameterCheckAlwaysSucceeds(
+      HInvokeDynamic instruction,
+      HInstruction receiver,
+      HInstruction value,
+      CommonElements commonElements,
+      ClosedWorld closedWorld) {
+    // Handle typed arrays by recognizing the exact implementation of `[]=` and
+    // checking if [value] has the appropriate type.
+    if (instruction.element != null) {
+      ClassEntity cls = instruction.element.enclosingClass;
+      if (cls == commonElements.typedArrayOfIntClass) {
+        return value.isInteger(closedWorld);
+      } else if (cls == commonElements.typedArrayOfDoubleClass) {
+        return value.isNumber(closedWorld);
+      }
+    }
+
+    // The type check will pass if it passed before. We know it passed before if
+    // the value was loaded from the same indexable.
+    if (value is HIndex) {
+      if (value.receiver.nonCheck() == receiver.nonCheck()) {
+        return true;
+      }
+    }
+
+    return false;
   }
 }
 
@@ -212,8 +248,18 @@
       GlobalTypeInferenceResults results,
       CompilerOptions options,
       ClosedWorld closedWorld) {
-    TypeMask operandType = instruction.inputs[1].instructionType;
-    if (instruction.inputs[1].isNumberOrNull(closedWorld)) return operandType;
+    HInstruction operand = instruction.inputs[1];
+    if (operand.isNumberOrNull(closedWorld)) {
+      // We have integer subclasses that represent ranges, so widen any int
+      // subclass to full integer.
+      if (operand.isIntegerOrNull(closedWorld)) {
+        return closedWorld.commonMasks.intType;
+      }
+      if (operand.isDoubleOrNull(closedWorld)) {
+        return closedWorld.commonMasks.doubleType;
+      }
+      return closedWorld.commonMasks.numType;
+    }
     return super
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
   }
@@ -227,7 +273,11 @@
       ClosedWorld closedWorld) {
     HInstruction input = instruction.inputs[1];
     if (input.isNumber(closedWorld)) {
-      return new HNegate(input, instruction.selector, input.instructionType);
+      return new HNegate(
+          input,
+          instruction.selector,
+          computeTypeFromInputTypes(
+              instruction, results, options, closedWorld));
     }
     return null;
   }
diff --git a/pkg/compiler/lib/src/ssa/kernel_impact.dart b/pkg/compiler/lib/src/ssa/kernel_impact.dart
index 3e93ba2..6f96104 100644
--- a/pkg/compiler/lib/src/ssa/kernel_impact.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart
@@ -19,6 +19,7 @@
 import '../universe/feature.dart';
 import '../universe/selector.dart';
 import '../universe/use.dart';
+import '../universe/world_builder.dart';
 
 ResolutionImpact buildKernelImpact(
     ir.Member member,
@@ -438,9 +439,16 @@
     List<DartType> typeArguments = _visitArguments(node.arguments);
     // TODO(johnniwinther): Restrict the dynamic use to only match the known
     // target.
-    impactBuilder.registerDynamicUse(new GenericDynamicUse(
-        new Selector.call(elementMap.getMember(node.target).memberName,
-            elementMap.getCallStructure(node.arguments)),
+    ReceiverConstraint constraint;
+    MemberEntity member = elementMap.getMember(node.target);
+    if (_options.strongMode && useStrongModeWorldStrategy) {
+      // TODO(johnniwinther): Restrict this to subclasses?
+      constraint = new StrongModeConstraint(member.enclosingClass);
+    }
+    impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(
+        new Selector.call(
+            member.memberName, elementMap.getCallStructure(node.arguments)),
+        constraint,
         typeArguments));
   }
 
@@ -514,10 +522,10 @@
   }
 
   @override
-  void visitMethodInvocation(ir.MethodInvocation invocation) {
-    Selector selector = elementMap.getSelector(invocation);
-    List<DartType> typeArguments = _visitArguments(invocation.arguments);
-    var receiver = invocation.receiver;
+  void visitMethodInvocation(ir.MethodInvocation node) {
+    Selector selector = elementMap.getSelector(node);
+    List<DartType> typeArguments = _visitArguments(node.arguments);
+    var receiver = node.receiver;
     if (receiver is ir.VariableGet &&
         receiver.variable.isFinal &&
         receiver.variable.parent is ir.FunctionDeclaration) {
@@ -530,25 +538,49 @@
             localFunction, selector.callStructure, typeArguments));
       }
     } else {
-      visitNode(invocation.receiver);
-      impactBuilder
-          .registerDynamicUse(new GenericDynamicUse(selector, typeArguments));
+      visitNode(node.receiver);
+      ReceiverConstraint constraint;
+      if (_options.strongMode && useStrongModeWorldStrategy) {
+        DartType receiverType = elementMap.getStaticType(node.receiver);
+        if (receiverType is InterfaceType) {
+          constraint = new StrongModeConstraint(receiverType.element);
+        }
+      }
+
+      impactBuilder.registerDynamicUse(
+          new ConstrainedDynamicUse(selector, constraint, typeArguments));
     }
   }
 
   @override
   void visitPropertyGet(ir.PropertyGet node) {
     visitNode(node.receiver);
-    impactBuilder.registerDynamicUse(
-        new DynamicUse(new Selector.getter(elementMap.getName(node.name))));
+    ReceiverConstraint constraint;
+    if (_options.strongMode && useStrongModeWorldStrategy) {
+      DartType receiverType = elementMap.getStaticType(node.receiver);
+      if (receiverType is InterfaceType) {
+        constraint = new StrongModeConstraint(receiverType.element);
+      }
+    }
+    impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(
+        new Selector.getter(elementMap.getName(node.name)),
+        constraint, const <DartType>[]));
   }
 
   @override
   void visitPropertySet(ir.PropertySet node) {
     visitNode(node.receiver);
     visitNode(node.value);
-    impactBuilder.registerDynamicUse(
-        new DynamicUse(new Selector.setter(elementMap.getName(node.name))));
+    ReceiverConstraint constraint;
+    if (_options.strongMode && useStrongModeWorldStrategy) {
+      DartType receiverType = elementMap.getStaticType(node.receiver);
+      if (receiverType is InterfaceType) {
+        constraint = new StrongModeConstraint(receiverType.element);
+      }
+    }
+    impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(
+        new Selector.setter(elementMap.getName(node.name)),
+        constraint, const <DartType>[]));
   }
 
   @override
@@ -561,6 +593,7 @@
 
   @override
   void visitInstantiation(ir.Instantiation node) {
+    // TODO(johnniwinther): Track which arities are used in instantiation.
     impactBuilder.registerFeature(Feature.GENERIC_INSTANTIATION);
     node.visitChildren(this);
   }
@@ -632,8 +665,11 @@
     visitNode(node.variable);
     visitNode(node.iterable);
     visitNode(node.body);
+    // TODO(johnniwinther): Use receiver constraints for the dynamic uses in
+    // strong mode.
     if (node.isAsync) {
       impactBuilder.registerFeature(Feature.ASYNC_FOR_IN);
+      impactBuilder.registerDynamicUse(new DynamicUse(Selectors.cancel));
     } else {
       impactBuilder.registerFeature(Feature.SYNC_FOR_IN);
       impactBuilder.registerDynamicUse(new DynamicUse(Selectors.iterator));
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index 40c6687..5aa3fc6 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -420,7 +420,8 @@
           }
         }
       } else if (input.isStringOrNull(_closedWorld)) {
-        if (applies(commonElements.jsStringSplit)) {
+        if (commonElements.appliesToJsStringSplit(
+            selector, mask, _closedWorld)) {
           return handleStringSplit(node);
         } else if (applies(commonElements.jsStringOperatorAdd)) {
           // `operator+` is turned into a JavaScript '+' so we need to
@@ -456,7 +457,7 @@
         return result;
       }
     } else if (selector.isGetter) {
-      if (selector.applies(commonElements.jsIndexableLength)) {
+      if (commonElements.appliesToJsIndexableLength(selector)) {
         HInstruction optimized = tryOptimizeLengthInterceptedGetter(node);
         if (optimized != null) return optimized;
       }
@@ -2672,12 +2673,20 @@
   }
 
   void visitGetLength(HGetLength instruction) {
-    _visitFieldGet(closedWorld.commonElements.jsIndexableLength,
-        instruction.receiver.nonCheck(), instruction);
+    HInstruction receiver = instruction.receiver.nonCheck();
+    HInstruction existing =
+        memorySet.lookupFieldValue(MemoryFeature.length, receiver);
+    if (existing != null) {
+      checkNewGvnCandidates(instruction, existing);
+      instruction.block.rewriteWithBetterUser(instruction, existing);
+      instruction.block.remove(instruction);
+    } else {
+      memorySet.registerFieldValue(MemoryFeature.length, receiver, instruction);
+    }
   }
 
   void _visitFieldGet(
-      MemberEntity element, HInstruction receiver, HInstruction instruction) {
+      FieldEntity element, HInstruction receiver, HInstruction instruction) {
     HInstruction existing = memorySet.lookupFieldValue(element, receiver);
     if (existing != null) {
       checkNewGvnCandidates(instruction, existing);
@@ -2831,50 +2840,48 @@
   void visitTypeInfoExpression(HTypeInfoExpression instruction) {}
 }
 
-/**
- * Holds values of memory places.
- *
- * Generally, values that name a place (a receiver) have type refinements and
- * other checks removed to ensure that checks and type refinements do not
- * confuse aliasing.  Values stored into a memory place keep the type
- * refinements to help further optimizations.
- */
+/// A non-field based feature of an object.
+enum MemoryFeature {
+  // Access to the `length` property of a `JSIndexable`.
+  length,
+}
+
+/// Holds values of memory places.
+///
+/// Generally, values that name a place (a receiver) have type refinements and
+/// other checks removed to ensure that checks and type refinements do not
+/// confuse aliasing.  Values stored into a memory place keep the type
+/// refinements to help further optimizations.
 class MemorySet {
   final ClosedWorld closedWorld;
 
-  /**
-   * Maps a field to a map of receiver to value.
-   */
-  // The key is [MemberEntity] rather than [FieldEntity] so that HGetLength can
-  // be modeled as the JSIndexable.length abstract getter.
+  /// Maps a field to a map of receivers to their current field values.
+  ///
+  /// The field is either a [FieldEntity], a [FunctionEntity] in case of
+  /// instance methods, or a [MemoryFeature] for `length` access on
+  /// `JSIndexable`.
+  ///
   // TODO(25544): Split length effects from other effects and model lengths
   // separately.
-  final Map<MemberEntity, Map<HInstruction, HInstruction>> fieldValues =
-      <MemberEntity, Map<HInstruction, HInstruction>>{};
+  final Map<Object /*MemberEntity|MemoryFeature*/,
+          Map<HInstruction, HInstruction>>
+      fieldValues = <Object, Map<HInstruction, HInstruction>>{};
 
-  /**
-   * Maps a receiver to a map of keys to value.
-   */
+  /// Maps a receiver to a map of keys to value.
   final Map<HInstruction, Map<HInstruction, HInstruction>> keyedValues =
       <HInstruction, Map<HInstruction, HInstruction>>{};
 
-  /**
-   * Set of objects that we know don't escape the current function.
-   */
+  /// Set of objects that we know don't escape the current function.
   final Setlet<HInstruction> nonEscapingReceivers = new Setlet<HInstruction>();
 
   MemorySet(this.closedWorld);
 
-  /**
-   * Returns whether [first] and [second] always alias to the same object.
-   */
+  /// Returns whether [first] and [second] always alias to the same object.
   bool mustAlias(HInstruction first, HInstruction second) {
     return first == second;
   }
 
-  /**
-   * Returns whether [first] and [second] may alias to the same object.
-   */
+  /// Returns whether [first] and [second] may alias to the same object.
   bool mayAlias(HInstruction first, HInstruction second) {
     if (mustAlias(first, second)) return true;
     if (isConcrete(first) && isConcrete(second)) return false;
@@ -2886,8 +2893,8 @@
         .isDisjoint(second.instructionType, closedWorld);
   }
 
-  bool isFinal(MemberEntity element) {
-    return closedWorld.fieldNeverChanges(element);
+  bool isFinal(Object element) {
+    return element is MemberEntity && closedWorld.fieldNeverChanges(element);
   }
 
   bool isConcrete(HInstruction instruction) {
@@ -2900,9 +2907,7 @@
     return closedWorld.commonMasks.couldBeTypedArray(receiver.instructionType);
   }
 
-  /**
-   * Returns whether [receiver] escapes the current function.
-   */
+  /// Returns whether [receiver] escapes the current function.
   bool escapes(HInstruction receiver) {
     assert(receiver == null || receiver == receiver.nonCheck());
     return !nonEscapingReceivers.contains(receiver);
@@ -2913,21 +2918,22 @@
     nonEscapingReceivers.add(instruction);
   }
 
-  /**
-   * Sets `receiver.element` to contain [value]. Kills all potential places that
-   * may be affected by this update. Returns `true` if the update is redundant.
-   */
+  /// Sets the [field] on [receiver] to contain [value]. Kills all potential
+  /// places that may be affected by this update. Returns `true` if the update
+  /// is redundant.
   bool registerFieldValueUpdate(
-      MemberEntity element, HInstruction receiver, HInstruction value) {
+      Object field, HInstruction receiver, HInstruction value) {
+    assert(field is MemberEntity || field is MemoryFeature,
+        "Unexpected member/feature: $field");
     assert(receiver == null || receiver == receiver.nonCheck());
-    if (closedWorld.nativeData.isNativeMember(element)) {
+    if (closedWorld.nativeData.isNativeMember(field)) {
       return false; // TODO(14955): Remove this restriction?
     }
     // [value] is being set in some place in memory, we remove it from the
     // non-escaping set.
     nonEscapingReceivers.remove(value.nonCheck());
     Map<HInstruction, HInstruction> map =
-        fieldValues.putIfAbsent(element, () => <HInstruction, HInstruction>{});
+        fieldValues.putIfAbsent(field, () => <HInstruction, HInstruction>{});
     bool isRedundant = map[receiver] == value;
     map.forEach((key, value) {
       if (mayAlias(receiver, key)) map[key] = null;
@@ -2936,35 +2942,33 @@
     return isRedundant;
   }
 
-  /**
-   * Registers that `receiver.element` is now [value].
-   */
+  /// Registers that the [field] on [receiver] is now [value].
   void registerFieldValue(
-      MemberEntity element, HInstruction receiver, HInstruction value) {
+      Object field, HInstruction receiver, HInstruction value) {
+    assert(field is MemberEntity || field is MemoryFeature,
+        "Unexpected member/feature: $field");
     assert(receiver == null || receiver == receiver.nonCheck());
-    if (closedWorld.nativeData.isNativeMember(element)) {
+    if (field is MemberEntity && closedWorld.nativeData.isNativeMember(field)) {
       return; // TODO(14955): Remove this restriction?
     }
     Map<HInstruction, HInstruction> map =
-        fieldValues.putIfAbsent(element, () => <HInstruction, HInstruction>{});
+        fieldValues.putIfAbsent(field, () => <HInstruction, HInstruction>{});
     map[receiver] = value;
   }
 
-  /**
-   * Returns the value stored in `receiver.element`. Returns `null` if we don't
-   * know.
-   */
-  HInstruction lookupFieldValue(MemberEntity element, HInstruction receiver) {
+  /// Returns the value stored for [field] on [receiver]. Returns `null` if we
+  /// don't know.
+  HInstruction lookupFieldValue(Object field, HInstruction receiver) {
+    assert(field is MemberEntity || field is MemoryFeature,
+        "Unexpected member/feature: $field");
     assert(receiver == null || receiver == receiver.nonCheck());
-    Map<HInstruction, HInstruction> map = fieldValues[element];
+    Map<HInstruction, HInstruction> map = fieldValues[field];
     return (map == null) ? null : map[receiver];
   }
 
-  /**
-   * Kill all places that may be affected by this [instruction]. Also update the
-   * set of non-escaping objects in case [instruction] has non-escaping objects
-   * in its inputs.
-   */
+  /// Kill all places that may be affected by this [instruction]. Also update
+  /// the set of non-escaping objects in case [instruction] has non-escaping
+  /// objects in its inputs.
   void killAffectedBy(HInstruction instruction) {
     // Even if [instruction] does not have side effects, it may use non-escaping
     // objects and store them in a new object, which make these objects
@@ -2975,9 +2979,10 @@
 
     if (instruction.sideEffects.changesInstanceProperty() ||
         instruction.sideEffects.changesStaticProperty()) {
-      List<MemberEntity> fieldsToRemove;
       List<HInstruction> receiversToRemove = <HInstruction>[];
-      fieldValues.forEach((MemberEntity element, map) {
+
+      List<Object> fieldsToRemove;
+      fieldValues.forEach((Object element, map) {
         if (isFinal(element)) return;
         map.forEach((receiver, value) {
           if (escapes(receiver)) {
@@ -2986,7 +2991,7 @@
         });
         if (receiversToRemove.length == map.length) {
           // Remove them all by removing the entire map.
-          (fieldsToRemove ??= <MemberEntity>[]).add(element);
+          (fieldsToRemove ??= <Object>[]).add(element);
         } else {
           receiversToRemove.forEach(map.remove);
         }
@@ -3006,18 +3011,14 @@
     }
   }
 
-  /**
-   * Returns the value stored in `receiver[index]`. Returns null if
-   * we don't know.
-   */
+  /// Returns the value stored in `receiver[index]`. Returns null if we don't
+  /// know.
   HInstruction lookupKeyedValue(HInstruction receiver, HInstruction index) {
     Map<HInstruction, HInstruction> map = keyedValues[receiver];
     return (map == null) ? null : map[index];
   }
 
-  /**
-   * Registers that `receiver[index]` is now [value].
-   */
+  /// Registers that `receiver[index]` is now [value].
   void registerKeyedValue(
       HInstruction receiver, HInstruction index, HInstruction value) {
     Map<HInstruction, HInstruction> map =
@@ -3025,10 +3026,8 @@
     map[index] = value;
   }
 
-  /**
-   * Sets `receiver[index]` to contain [value]. Kills all potential
-   * places that may be affected by this update.
-   */
+  /// Sets `receiver[index]` to contain [value]. Kills all potential places that
+  /// may be affected by this update.
   void registerKeyedValueUpdate(
       HInstruction receiver, HInstruction index, HInstruction value) {
     nonEscapingReceivers.remove(value.nonCheck());
@@ -3053,11 +3052,11 @@
     map[index] = value;
   }
 
-  /**
-   * Returns null if either [first] or [second] is null. Otherwise
-   * returns [first] if [first] and [second] are equal. Otherwise
-   * creates or re-uses a phi in [block] that holds [first] and [second].
-   */
+  /// Returns a common instruction for [first] and [second].
+  ///
+  /// Returns `null` if either [first] or [second] is null. Returns [first] if
+  /// [first] and [second] are equal. Otherwise creates or re-uses a phi in
+  /// [block] that holds [first] and [second].
   HInstruction findCommonInstruction(HInstruction first, HInstruction second,
       HBasicBlock block, int predecessorIndex) {
     if (first == null || second == null) return null;
@@ -3110,9 +3109,7 @@
     }
   }
 
-  /**
-   * Returns the intersection between [this] and [other].
-   */
+  /// Returns the intersection between [this] and the [other] memory set.
   MemorySet intersectionFor(
       MemorySet other, HBasicBlock block, int predecessorIndex) {
     MemorySet result = new MemorySet(closedWorld);
@@ -3195,9 +3192,7 @@
     return result;
   }
 
-  /**
-   * Returns a copy of [this].
-   */
+  /// Returns a copy of [this] memory set.
   MemorySet clone() {
     MemorySet result = new MemorySet(closedWorld);
 
diff --git a/pkg/compiler/lib/src/ssa/ssa.dart b/pkg/compiler/lib/src/ssa/ssa.dart
index c87eae7..4dd04bc 100644
--- a/pkg/compiler/lib/src/ssa/ssa.dart
+++ b/pkg/compiler/lib/src/ssa/ssa.dart
@@ -48,9 +48,9 @@
     if (element is FunctionEntity) {
       SourceInformationBuilder sourceInformationBuilder =
           backend.sourceInformationStrategy.createBuilderForContext(element);
-
       result = backend.rewriteAsync(
           closedWorld.commonElements,
+          closedWorld.elementEnvironment,
           element,
           result,
           sourceInformationBuilder.buildAsyncBody(),
diff --git a/pkg/compiler/lib/src/types/type_mask.dart b/pkg/compiler/lib/src/types/type_mask.dart
index 7af49b4..bf79fb9 100644
--- a/pkg/compiler/lib/src/types/type_mask.dart
+++ b/pkg/compiler/lib/src/types/type_mask.dart
@@ -44,9 +44,7 @@
       _masks = null;
       return true;
     }
-    if (_masks == null) {
-      _masks = new Setlet<TypeMask>();
-    }
+    _masks ??= new Set<TypeMask>();
     return _masks.add(mask);
   }
 
diff --git a/pkg/compiler/lib/src/universe/class_hierarchy_builder.dart b/pkg/compiler/lib/src/universe/class_hierarchy_builder.dart
index e45c3ac..c6cf563 100644
--- a/pkg/compiler/lib/src/universe/class_hierarchy_builder.dart
+++ b/pkg/compiler/lib/src/universe/class_hierarchy_builder.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import '../common.dart';
 import '../common_elements.dart';
 import '../elements/elements.dart' show ClassElement, MixinApplicationElement;
 import '../elements/entities.dart';
@@ -53,11 +54,21 @@
       }
 
       ClassEntity appliedMixin = _classQueries.getAppliedMixin(cls);
-      if (appliedMixin != null) {
-        // TODO(johnniwinther): Store this in the [ClassSet].
+      while (appliedMixin != null) {
+        // TODO(johnniwinther): Use the data stored in [ClassSet].
         registerMixinUse(cls, appliedMixin);
-      }
+        ClassSet mixinSet = _ensureClassSet(appliedMixin);
+        mixinSet.addMixinApplication(node);
 
+        // In case of
+        //
+        //    class A {}
+        //    class B = Object with A;
+        //    class C = Object with B;
+        //
+        // we need to register that C not only mixes in B but also A.
+        appliedMixin = _classQueries.getAppliedMixin(appliedMixin);
+      }
       return classSet;
     });
   }
@@ -78,7 +89,7 @@
 
   void updateClassHierarchyNodeForClass(ClassEntity cls,
       {bool directlyInstantiated: false, bool abstractlyInstantiated: false}) {
-    ClassHierarchyNode node = _ensureClassHierarchyNode(cls);
+    ClassHierarchyNode node = _ensureClassSet(cls).node;
     _updateSuperClassHierarchyNodeForClass(node);
     if (directlyInstantiated) {
       node.isDirectlyInstantiated = true;
@@ -95,6 +106,50 @@
         mixinUses.putIfAbsent(mixin, () => new Set<ClassEntity>());
     users.add(mixinApplication);
   }
+
+  bool _isSubtypeOf(ClassEntity x, ClassEntity y) {
+    assert(
+        classSets.containsKey(x), "ClassSet for $x has not been computed yet.");
+    ClassSet classSet = classSets[y];
+    assert(classSet != null,
+        failedAt(y, "No ClassSet for $y (${y.runtimeType}): ${classSets}"));
+    ClassHierarchyNode classHierarchyNode = classHierarchyNodes[x];
+    assert(classHierarchyNode != null,
+        failedAt(x, "No ClassHierarchyNode for $x"));
+    return classSet.hasSubtype(classHierarchyNode);
+  }
+
+  bool isInheritedInSubtypeOf(ClassEntity x, ClassEntity y) {
+    ClassSet classSet = classSets[x];
+    assert(classSet != null,
+        failedAt(x, "No ClassSet for $x (${x.runtimeType}): ${classSets}"));
+
+    if (_isSubtypeOf(x, y)) {
+      // [x] implements [y] itself, possible through supertypes.
+      return true;
+    }
+
+    /// Returns `true` if any live subclass of [node] implements [y].
+    bool subclassImplements(ClassHierarchyNode node, {bool strict}) {
+      return node.anySubclass((ClassEntity z) => _isSubtypeOf(z, y),
+          ClassHierarchyNode.INSTANTIATED,
+          strict: strict);
+    }
+
+    if (subclassImplements(classSet.node, strict: true)) {
+      // A subclass of [x] implements [y].
+      return true;
+    }
+
+    for (ClassHierarchyNode mixinApplication
+        in classSet.mixinApplicationNodes) {
+      if (subclassImplements(mixinApplication, strict: false)) {
+        // A subclass of [mixinApplication] implements [y].
+        return true;
+      }
+    }
+    return false;
+  }
 }
 
 abstract class ClassQueries {
@@ -105,6 +160,11 @@
   ClassEntity getDeclaration(covariant ClassEntity cls);
 
   /// Returns the class mixed into [cls] if any.
+  // TODO(johnniwinther): Replace this by a `getAppliedMixins` function that
+  // return transitively mixed in classes like in:
+  //     class A {}
+  //     class B = Object with A;
+  //     class C = Object with B;
   ClassEntity getAppliedMixin(covariant ClassEntity cls);
 
   /// Returns the hierarchy depth of [cls].
diff --git a/pkg/compiler/lib/src/universe/class_set.dart b/pkg/compiler/lib/src/universe/class_set.dart
index 13a0cdb..c5a4869 100644
--- a/pkg/compiler/lib/src/universe/class_set.dart
+++ b/pkg/compiler/lib/src/universe/class_set.dart
@@ -482,6 +482,22 @@
   ///
   List<ClassHierarchyNode> _subtypes;
 
+  /// A list of the class hierarchy nodes for the class that directly mix in
+  /// [cls].
+  ///
+  /// For instance
+  ///
+  ///     class A {}
+  ///     class B extends Object with A {}
+  ///     class C = Object with A;
+  ///     class D extends B {}
+  ///     class E extends C {}
+  ///
+  /// The class hierarchy nodes for the unnamed mixin application `Object+A` and
+  /// the named mixin application `C` are in [_mixinApplications].
+  ///
+  List<ClassHierarchyNode> _mixinApplications;
+
   ClassSet(this.node);
 
   ClassEntity get cls => node.cls;
@@ -531,6 +547,10 @@
     return _subtypes ?? const <ClassHierarchyNode>[];
   }
 
+  Iterable<ClassHierarchyNode> get mixinApplicationNodes {
+    return _mixinApplications ?? const <ClassHierarchyNode>[];
+  }
+
   /// Returns an [Iterable] of the subclasses of [cls] possibly including [cls].
   ///
   /// Subclasses are included if their instantiation properties intersect with
@@ -701,6 +721,15 @@
     }
   }
 
+  /// Adds [mixinApplication] as a class that mixes in [cls].
+  void addMixinApplication(ClassHierarchyNode mixinApplication) {
+    if (_mixinApplications == null) {
+      _mixinApplications = <ClassHierarchyNode>[mixinApplication];
+    } else {
+      _mixinApplications.add(mixinApplication);
+    }
+  }
+
   /// Returns the most specific subtype of [cls] (including [cls]) that is
   /// directly instantiated or a superclass of all directly instantiated
   /// subtypes. If no subtypes of [cls] are instantiated, `null` is returned.
@@ -743,11 +772,19 @@
     node.printOn(sb, '  ');
     sb.write('\n');
     if (_subtypes != null) {
+      sb.write('  subtypes:\n');
       for (ClassHierarchyNode node in _subtypes) {
         node.printOn(sb, '  ');
         sb.write('\n');
       }
     }
+    if (_mixinApplications != null) {
+      sb.write('  mixin-applications:\n');
+      for (ClassHierarchyNode node in _mixinApplications) {
+        node.printOn(sb, '  ');
+        sb.write('\n');
+      }
+    }
     sb.write(']');
     return sb.toString();
   }
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder.dart b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
index fa33d69..d679a67 100644
--- a/pkg/compiler/lib/src/universe/codegen_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
@@ -463,6 +463,9 @@
 
   _MemberUsage _getMemberUsage(
       covariant MemberEntity member, MemberUsedCallback memberUsed) {
+    // TODO(johnniwinther): Change [TypeMask] to not apply to a superclass
+    // member unless the class has been instantiated. Similar to
+    // [StrongModeConstraint].
     return _instanceMemberUsage.putIfAbsent(member, () {
       String memberName = member.name;
       ClassEntity cls = member.enclosingClass;
@@ -470,13 +473,13 @@
       _MemberUsage usage = new _MemberUsage(member, isNative: isNative);
       EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
       useSet.addAll(usage.appliedUse);
-      if (hasInvokedGetter(member, _world)) {
+      if (!usage.hasRead && hasInvokedGetter(member, _world)) {
         useSet.addAll(usage.read());
       }
-      if (hasInvokedSetter(member, _world)) {
+      if (!usage.hasWrite && hasInvokedSetter(member, _world)) {
         useSet.addAll(usage.write());
       }
-      if (hasInvocation(member, _world)) {
+      if (!usage.hasInvoke && hasInvocation(member, _world)) {
         useSet.addAll(usage.invoke());
       }
 
diff --git a/pkg/compiler/lib/src/universe/resolution_world_builder.dart b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
index 160f196..fc3502f 100644
--- a/pkg/compiler/lib/src/universe/resolution_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
@@ -520,10 +520,17 @@
       } else {
         kind = Instantiation.DIRECTLY_INSTANTIATED;
       }
-      _processInstantiatedClass(cls, classUsed);
     }
     info.addInstantiation(constructor, type, kind,
         isRedirection: isRedirection);
+    if (kind != Instantiation.UNINSTANTIATED) {
+      if (_options.strongMode) {
+        classHierarchyBuilder.updateClassHierarchyNodeForClass(cls,
+            directlyInstantiated: info.isDirectlyInstantiated,
+            abstractlyInstantiated: info.isAbstractlyInstantiated);
+      }
+      _processInstantiatedClass(cls, classUsed);
+    }
 
     // TODO(johnniwinther): Use [_instantiationInfo] to compute this information
     // instead.
@@ -617,14 +624,14 @@
       Map<String, Map<Selector, SelectorConstraints>> selectorMap) {
     Selector selector = dynamicUse.selector;
     String name = selector.name;
-    ReceiverConstraint mask = dynamicUse.mask;
+    ReceiverConstraint constraint = dynamicUse.mask;
     Map<Selector, SelectorConstraints> selectors = selectorMap.putIfAbsent(
         name, () => new Maplet<Selector, SelectorConstraints>());
     UniverseSelectorConstraints constraints =
         selectors.putIfAbsent(selector, () {
       return selectorConstraintsStrategy.createSelectorConstraints(selector);
     });
-    return constraints.addReceiverConstraint(mask);
+    return constraints.addReceiverConstraint(constraint);
   }
 
   void registerIsCheck(covariant DartType type) {
@@ -799,10 +806,12 @@
     // its metadata parsed and analyzed.
     // Note: this assumes that there are no non-native fields on native
     // classes, which may not be the case when a native class is subclassed.
-    _memberUsage.putIfAbsent(member, () {
+    bool newUsage = false;
+    _MemberUsage usage = _memberUsage.putIfAbsent(member, () {
+      newUsage = true;
       bool isNative = _nativeBasicData.isNativeClass(cls);
-      _MemberUsage usage = new _MemberUsage(member, isNative: isNative);
       EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
+      _MemberUsage usage = new _MemberUsage(member, isNative: isNative);
       useSet.addAll(usage.appliedUse);
       if (member.isField && isNative) {
         registerUsedElement(member);
@@ -813,13 +822,13 @@
         closurizedMembersWithFreeTypeVariables.add(member);
       }
 
-      if (_hasInvokedGetter(member)) {
+      if (!usage.hasRead && _hasInvokedGetter(member)) {
         useSet.addAll(usage.read());
       }
-      if (_hasInvocation(member)) {
+      if (!usage.hasInvoke && _hasInvocation(member)) {
         useSet.addAll(usage.invoke());
       }
-      if (hasInvokedSetter(member)) {
+      if (!usage.hasWrite && hasInvokedSetter(member)) {
         useSet.addAll(usage.write());
       }
 
@@ -837,10 +846,28 @@
             .putIfAbsent(memberName, () => new Set<_MemberUsage>())
             .add(usage);
       }
-
       memberUsed(usage.entity, useSet);
       return usage;
     });
+    if (!newUsage) {
+      EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
+      if (!usage.hasRead && _hasInvokedGetter(member)) {
+        useSet.addAll(usage.read());
+      }
+      if (!usage.hasInvoke && _hasInvocation(member)) {
+        useSet.addAll(usage.invoke());
+      }
+      if (!usage.hasWrite && hasInvokedSetter(member)) {
+        useSet.addAll(usage.write());
+      }
+      if (!usage.pendingUse.contains(MemberUse.NORMAL)) {
+        _instanceMembersByName[memberName]?.remove(usage);
+      }
+      if (!usage.pendingUse.contains(MemberUse.CLOSURIZE_INSTANCE)) {
+        _instanceFunctionsByName[memberName]?.remove(usage);
+      }
+      memberUsed(usage.entity, useSet);
+    }
   }
 
   /// Returns an iterable over all mixin applications that mixin [cls].
@@ -926,6 +953,15 @@
   void registerClass(ClassEntity cls) {
     classHierarchyBuilder.registerClass(cls);
   }
+
+  bool isInheritedInSubtypeOf(MemberEntity member, ClassEntity type) {
+    // TODO(johnniwinther): Use the [member] itself to avoid enqueueing members
+    // that are overridden.
+    classHierarchyBuilder.registerClass(member.enclosingClass);
+    classHierarchyBuilder.registerClass(type);
+    return classHierarchyBuilder.isInheritedInSubtypeOf(
+        member.enclosingClass, type);
+  }
 }
 
 abstract class KernelResolutionWorldBuilderBase
diff --git a/pkg/compiler/lib/src/universe/world_builder.dart b/pkg/compiler/lib/src/universe/world_builder.dart
index 4feb2a8..031baf2 100644
--- a/pkg/compiler/lib/src/universe/world_builder.dart
+++ b/pkg/compiler/lib/src/universe/world_builder.dart
@@ -169,6 +169,98 @@
   }
 }
 
+bool useStrongModeWorldStrategy = false;
+
+/// Open world strategy that constrains instance member access to subtypes of
+/// the static type of the receiver.
+///
+/// This strategy is used for Dart 2.
+class StrongModeWorldStrategy implements SelectorConstraintsStrategy {
+  const StrongModeWorldStrategy();
+
+  StrongModeWorldConstraints createSelectorConstraints(Selector selector) {
+    return new StrongModeWorldConstraints();
+  }
+}
+
+class StrongModeWorldConstraints extends UniverseSelectorConstraints {
+  bool isAll = false;
+  Set<StrongModeConstraint> _constraints;
+
+  @override
+  bool applies(MemberEntity element, Selector selector, World world) {
+    if (isAll) return true;
+    if (_constraints == null) return false;
+    for (StrongModeConstraint constraint in _constraints) {
+      if (constraint.canHit(element, selector, world)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  bool needsNoSuchMethodHandling(Selector selector, World world) {
+    if (isAll) {
+      return true;
+    }
+    if (_constraints != null) {
+      for (StrongModeConstraint constraint in _constraints) {
+        if (constraint.needsNoSuchMethodHandling(selector, world)) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  @override
+  bool addReceiverConstraint(StrongModeConstraint constraint) {
+    if (isAll) return false;
+    if (constraint?.cls == null) {
+      isAll = true;
+      _constraints = null;
+      return true;
+    }
+    _constraints ??= new Set<StrongModeConstraint>();
+    return _constraints.add(constraint);
+  }
+
+  String toString() {
+    if (isAll) {
+      return '<all>';
+    } else if (_constraints != null) {
+      return '<${_constraints.map((c) => c.cls).join(',')}>';
+    } else {
+      return '<none>';
+    }
+  }
+}
+
+class StrongModeConstraint implements ReceiverConstraint {
+  final ClassEntity cls;
+
+  const StrongModeConstraint(this.cls);
+
+  @override
+  bool needsNoSuchMethodHandling(Selector selector, World world) => true;
+
+  @override
+  bool canHit(MemberEntity element, Selector selector, OpenWorld world) {
+    return world.isInheritedInSubtypeOf(element, cls);
+  }
+
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    if (other is! StrongModeConstraint) return false;
+    return cls == other.cls;
+  }
+
+  int get hashCode => cls.hashCode * 13;
+
+  String toString() => 'StrongModeConstraint($cls)';
+}
+
 /// The [WorldBuilder] is an auxiliary class used in the process of computing
 /// the [ClosedWorld].
 // TODO(johnniwinther): Move common implementation to a [WorldBuilderBase] when
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index 183575c..bfe1a5d 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -404,6 +404,21 @@
 
   /// Returns an iterable over all mixin applications that mixin [cls].
   Iterable<ClassEntity> allMixinUsesOf(ClassEntity cls);
+
+  /// Returns `true` if [member] is inherited into a subtype of [type].
+  ///
+  /// For instance:
+  ///
+  ///     class A { m() {} }
+  ///     class B extends A implements I {}
+  ///     class C extends Object with A implements I {}
+  ///     abstract class I { m(); }
+  ///     abstract class J implements A { }
+  ///
+  /// Here `A.m` is inherited into `A`, `B`, and `C`. Becausec `B` and
+  /// `C` implement `I`, `isInheritedInSubtypeOf(A.M, I)` is true, but
+  /// `isInheritedInSubtypeOf(A.M, J)` is false.
+  bool isInheritedInSubtypeOf(MemberEntity member, ClassEntity type);
 }
 
 /// Enum values defining subset of classes included in queries.
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/generators.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/generators.dart
index d8f20d7..e6cfecf 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/generators.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/generators.dart
@@ -13,8 +13,8 @@
 
 // TODO(vsm): Remove once this flag is the default.
 bool startAsyncSynchronously = false;
-void setStartAsyncSynchronously() {
-  startAsyncSynchronously = true;
+void setStartAsyncSynchronously([bool value = true]) {
+  startAsyncSynchronously = value;
 }
 
 final _jsIterator = JS('', 'Symbol("_jsIterator")');
diff --git a/pkg/dev_compiler/tool/input_sdk/private/isolate_helper.dart b/pkg/dev_compiler/tool/input_sdk/private/isolate_helper.dart
index 3facf9e..dec36ce 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/isolate_helper.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/isolate_helper.dart
@@ -35,13 +35,13 @@
   if (args == null) args = <String>[];
   if (args is List) {
     if (args is! List<String>) args = new List<String>.from(args);
-    if (main is _MainFunction) {
-      main();
-    } else if (main is _MainFunctionArgs) {
-      main(args);
-    } else if (main is _MainFunctionArgsMessage) {
-      main(args, null);
+    // DDC attaches signatures only when torn off, and the typical way of
+    // getting `main` via the JS ABI won't do this. So use JS to invoke main.
+    if (JS<bool>('!', 'typeof # == "function"', main)) {
+      // JS will ignore extra arguments.
+      JS('', '#(#, #)', main, args, null);
     } else {
+      // Not a function. Use a dynamic call to throw an error.
       (main as dynamic)(args);
     }
   } else {
@@ -53,10 +53,6 @@
 // those uses to just refer to the one in dart:runtime.
 final global = dart.global_;
 
-typedef _MainFunction();
-typedef _MainFunctionArgs(List<String> args);
-typedef _MainFunctionArgsMessage(List<String> args, Null message);
-
 class TimerImpl implements Timer {
   final bool _once;
   int _handle;
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 41f5b16..1513772 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -3656,6 +3656,69 @@
     tip: r"""Try adding a parameter list to the function declaration.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+    templateMissingImplementationCause =
+    const Template<Message Function(String name)>(
+        messageTemplate: r"""'#name' is defined here.""",
+        withArguments: _withArgumentsMissingImplementationCause);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeMissingImplementationCause =
+    const Code<Message Function(String name)>(
+        "MissingImplementationCause", templateMissingImplementationCause,
+        severity: Severity.context);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsMissingImplementationCause(String name) {
+  return new Message(codeMissingImplementationCause,
+      message: """'$name' is defined here.""", arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String name,
+        String
+            string)> templateMissingImplementationNotAbstract = const Template<
+        Message Function(String name, String string)>(
+    messageTemplate:
+        r"""The non-abstract class '#name' is missing implementations for these members:
+  #string.""",
+    tipTemplate: r"""Try to either
+ - provide an implementation,
+ - inherit an implementation from a superclass or mixin,
+ - mark the class as abstract, or
+ - provide a 'noSuchMethod' implementation.
+""",
+    withArguments: _withArgumentsMissingImplementationNotAbstract);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name, String string)>
+    codeMissingImplementationNotAbstract =
+    const Code<Message Function(String name, String string)>(
+        "MissingImplementationNotAbstract",
+        templateMissingImplementationNotAbstract,
+        analyzerCode: "CONCRETE_CLASS_WITH_ABSTRACT_MEMBER",
+        dart2jsCode: "*fatal*",
+        severity: Severity.errorLegacyWarning);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsMissingImplementationNotAbstract(
+    String name, String string) {
+  return new Message(codeMissingImplementationNotAbstract,
+      message:
+          """The non-abstract class '$name' is missing implementations for these members:
+  $string.""",
+      tip: """Try to either
+ - provide an implementation,
+ - inherit an implementation from a superclass or mixin,
+ - mark the class as abstract, or
+ - provide a 'noSuchMethod' implementation.
+""",
+      arguments: {'name': name, 'string': string});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMissingInput = messageMissingInput;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
index be422f2..6584f7c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
@@ -29,6 +29,8 @@
 
 import 'package:kernel/clone.dart' show CloneWithoutBody;
 
+import 'package:kernel/core_types.dart' show CoreTypes;
+
 import 'package:kernel/type_algebra.dart' show Substitution, getSubstitutionMap;
 
 import 'package:kernel/type_environment.dart' show TypeEnvironment;
@@ -37,12 +39,15 @@
 
 import '../fasta_codes.dart'
     show
+        LocatedMessage,
         Message,
         messagePatchClassOrigin,
         messagePatchClassTypeVariablesMismatch,
         messagePatchDeclarationMismatch,
         messagePatchDeclarationOrigin,
         noLength,
+        templateMissingImplementationCause,
+        templateMissingImplementationNotAbstract,
         templateOverriddenMethodCause,
         templateOverrideFewerNamedArguments,
         templateOverrideFewerPositionalArguments,
@@ -288,6 +293,66 @@
     });
   }
 
+  void checkAbstractMembers(CoreTypes coreTypes, ClassHierarchy hierarchy) {
+    if (isAbstract ||
+        hierarchy.getDispatchTarget(cls, noSuchMethodName).enclosingClass !=
+            coreTypes.objectClass) {
+      // Unimplemented members allowed
+      // TODO(dmitryas): Call hasUserDefinedNoSuchMethod instead when ready.
+      return;
+    }
+
+    List<LocatedMessage> context = null;
+
+    void findMissingImplementations({bool setters}) {
+      List<Member> dispatchTargets =
+          hierarchy.getDispatchTargets(cls, setters: setters);
+      int targetIndex = 0;
+      for (Member interfaceMember
+          in hierarchy.getInterfaceMembers(cls, setters: setters)) {
+        // Is this either a public member or a visible private member?
+        if (!interfaceMember.name.isPrivate ||
+            (interfaceMember.enclosingLibrary == cls.enclosingLibrary &&
+                interfaceMember.fileUri ==
+                    interfaceMember.enclosingClass.fileUri)) {
+          while (targetIndex < dispatchTargets.length &&
+              ClassHierarchy.compareMembers(
+                      dispatchTargets[targetIndex], interfaceMember) <
+                  0) {
+            targetIndex++;
+          }
+          if (targetIndex >= dispatchTargets.length ||
+              ClassHierarchy.compareMembers(
+                      dispatchTargets[targetIndex], interfaceMember) >
+                  0) {
+            Name name = interfaceMember.name;
+            String displayName = name.name + (setters ? "=" : "");
+            context ??= <LocatedMessage>[];
+            context.add(templateMissingImplementationCause
+                .withArguments(displayName)
+                .withLocation(interfaceMember.fileUri,
+                    interfaceMember.fileOffset, name.name.length));
+          }
+        }
+      }
+    }
+
+    findMissingImplementations(setters: false);
+    findMissingImplementations(setters: true);
+
+    if (context?.isNotEmpty ?? false) {
+      String memberString =
+          context.map((message) => "'${message.arguments["name"]}'").join(", ");
+      library.addProblem(
+          templateMissingImplementationNotAbstract.withArguments(
+              cls.name, memberString),
+          cls.fileOffset,
+          cls.name.length,
+          cls.fileUri,
+          context: context);
+    }
+  }
+
   // TODO(dmitryas): Find a better place for this routine.
   static bool hasUserDefinedNoSuchMethod(
       Class klass, ClassHierarchy hierarchy) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index cfeaeab..4255dbc 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -262,6 +262,7 @@
         loader.performTopLevelInference(myClasses);
       }
       loader.checkOverrides(myClasses);
+      loader.checkAbstractMembers(myClasses);
       loader.addNoSuchMethodForwarders(myClasses);
     } on deprecated_InputError catch (e) {
       ticker.logMs("Got deprecated_InputError");
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 b72575b..b2969e2 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
@@ -64,8 +64,7 @@
 
   /// Identifier is a field initializer in a formal parameter list (i.e. it
   /// appears directly after `this.`).
-  static const fieldInitializer =
-      const IdentifierContext('fieldInitializer', isContinuation: true);
+  static const fieldInitializer = const FieldInitializerIdentifierContext();
 
   /// Identifier is a formal parameter being declared as part of a function,
   /// method, or typedef declaration.
@@ -246,7 +245,7 @@
 
   /// Identifier is a name being declared by a local variable declaration.
   static const localVariableDeclaration =
-      const IdentifierContext('localVariableDeclaration', inDeclaration: true);
+      const LocalVariableDeclarationIdentifierContext();
 
   /// Identifier is a reference to a label (e.g. `foo` in `break foo;`).
   /// Labels have their own scope.
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 8922d33..a5e4efa 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
@@ -63,12 +63,21 @@
   Token ensureIdentifier(Token token, Parser parser) {
     Token identifier = token.next;
     assert(identifier.kind != IDENTIFIER_TOKEN);
+    const followingValues = const ['.', '==', ')'];
+
     if (identifier.isIdentifier) {
-      return identifier;
+      // DottedNameIdentifierContext are only used in conditional import
+      // expressions. Although some top level keywords such as `import` can be
+      // used as identifiers, they are more likely the start of the next
+      // directive or declaration.
+      if (!identifier.isTopLevelKeyword ||
+          isOneOfOrEof(identifier.next, followingValues)) {
+        return identifier;
+      }
     }
 
     if (looksLikeStartOfNextDeclaration(identifier) ||
-        isOneOfOrEof(identifier, const ['.', '==', ')'])) {
+        isOneOfOrEof(identifier, followingValues)) {
       identifier = parser.insertSyntheticIdentifier(token, this,
           message: fasta.templateExpectedIdentifier.withArguments(identifier));
     } else {
@@ -94,50 +103,64 @@
 
   @override
   Token ensureIdentifier(Token token, Parser parser) {
-    Token next = token.next;
-    assert(next.kind != IDENTIFIER_TOKEN);
-    if (next.isIdentifier) {
-      if (optional('await', next) && next.next.isIdentifier) {
+    Token identifier = token.next;
+    assert(identifier.kind != IDENTIFIER_TOKEN);
+    if (identifier.isIdentifier) {
+      if (optional('await', identifier) && identifier.next.isIdentifier) {
         // Although the `await` can be used in an expression,
         // it is followed by another identifier which does not form
         // a valid expression. Report an error on the `await` token
         // rather than the token following it.
         parser.reportRecoverableErrorWithToken(
-            next, fasta.templateUnexpectedToken);
+            identifier, fasta.templateUnexpectedToken);
 
         // TODO(danrubel) Consider a new listener event so that analyzer
         // can represent this as an await expression in a context that does
         // not allow await.
-        return next.next;
-      } else if (!parser.inPlainSync && next.type.isPseudo) {
-        if (optional('await', next)) {
-          parser.reportRecoverableError(next, fasta.messageAwaitAsIdentifier);
-        } else if (optional('yield', next)) {
-          parser.reportRecoverableError(next, fasta.messageYieldAsIdentifier);
-        } else if (optional('async', next)) {
-          parser.reportRecoverableError(next, fasta.messageAsyncAsIdentifier);
-        }
+        return identifier.next;
+      } else {
+        checkAsyncAwaitYieldAsIdentifier(identifier, parser);
       }
-      return next;
+      return identifier;
     }
     parser.reportRecoverableErrorWithToken(
-        next, fasta.templateExpectedIdentifier);
-    if (next.isKeywordOrIdentifier) {
-      if (!isOneOfOrEof(next, const ['as', 'is'])) {
-        return next;
+        identifier, fasta.templateExpectedIdentifier);
+    if (identifier.isKeywordOrIdentifier) {
+      if (!isOneOfOrEof(identifier, const ['as', 'is'])) {
+        return identifier;
       }
-    } else if (!next.isOperator &&
-        !isOneOfOrEof(
-            next, const ['.', ',', '(', ')', '[', ']', '}', '?', ':', ';'])) {
+    } else if (!identifier.isOperator &&
+        !isOneOfOrEof(identifier,
+            const ['.', ',', '(', ')', '[', ']', '}', '?', ':', ';'])) {
       // When in doubt, consume the token to ensure we make progress
-      token = next;
-      next = token.next;
+      token = identifier;
+      identifier = token.next;
     }
     // Insert a synthetic identifier to satisfy listeners.
     return insertSyntheticIdentifierAfter(token, parser);
   }
 }
 
+/// See [IdentifierContext].fieldInitializer
+class FieldInitializerIdentifierContext extends IdentifierContext {
+  const FieldInitializerIdentifierContext()
+      : super('fieldInitializer', isContinuation: true);
+
+  @override
+  Token ensureIdentifier(Token token, Parser parser) {
+    assert(optional('.', token));
+    Token identifier = token.next;
+    assert(identifier.kind != IDENTIFIER_TOKEN);
+    if (identifier.isIdentifier) {
+      return identifier;
+    }
+    parser.reportRecoverableErrorWithToken(
+        identifier, fasta.templateExpectedIdentifier);
+    // Insert a synthetic identifier to satisfy listeners.
+    return insertSyntheticIdentifierAfter(token, parser);
+  }
+}
+
 /// See [IdentifierContext].libraryName
 class LibraryIdentifierContext extends IdentifierContext {
   const LibraryIdentifierContext()
@@ -178,6 +201,36 @@
   }
 }
 
+/// See [IdentifierContext].localVariableDeclaration
+class LocalVariableDeclarationIdentifierContext extends IdentifierContext {
+  const LocalVariableDeclarationIdentifierContext()
+      : super('localVariableDeclaration', inDeclaration: true);
+
+  @override
+  Token ensureIdentifier(Token token, Parser parser) {
+    Token identifier = token.next;
+    assert(identifier.kind != IDENTIFIER_TOKEN);
+    if (identifier.isIdentifier) {
+      checkAsyncAwaitYieldAsIdentifier(identifier, parser);
+      return identifier;
+    }
+    if (isOneOfOrEof(identifier, const [';', '=', ',', '{', '}']) ||
+        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 = insertSyntheticIdentifierAfter(identifier, parser);
+      }
+    }
+    return identifier;
+  }
+}
+
 /// See [IdentifierContext].typeReference
 class TypeReferenceIdentifierContext extends IdentifierContext {
   const TypeReferenceIdentifierContext()
@@ -210,20 +263,10 @@
       // annotation is not allowed before type arguments.
       parser.reportRecoverableErrorWithToken(
           next, fasta.templateUnexpectedToken);
-
-      Token annotation = next.next;
-      if (annotation.isIdentifier) {
-        if (optional('(', annotation.next)) {
-          if (annotation.next.endGroup.next.isIdentifier) {
-            token = annotation.next.endGroup;
-            next = token.next;
-          }
-        } else if (annotation.next.isIdentifier) {
-          token = annotation;
-          next = token.next;
-        }
-      }
+      token = skipMetadata(next);
+      next = token.next;
     }
+
     if (isValidTypeReference(next)) {
       return next;
     } else if (next.isKeywordOrIdentifier) {
@@ -251,6 +294,18 @@
   }
 }
 
+void checkAsyncAwaitYieldAsIdentifier(Token identifier, Parser parser) {
+  if (!parser.inPlainSync && identifier.type.isPseudo) {
+    if (optional('await', identifier)) {
+      parser.reportRecoverableError(identifier, fasta.messageAwaitAsIdentifier);
+    } else if (optional('yield', identifier)) {
+      parser.reportRecoverableError(identifier, fasta.messageYieldAsIdentifier);
+    } else if (optional('async', identifier)) {
+      parser.reportRecoverableError(identifier, fasta.messageAsyncAsIdentifier);
+    }
+  }
+}
+
 bool isOneOfOrEof(Token token, Iterable<String> followingValues) {
   for (String tokenValue in followingValues) {
     if (optional(tokenValue, token)) {
@@ -263,3 +318,42 @@
 bool looksLikeStartOfNextDeclaration(Token token) =>
     token.isTopLevelKeyword ||
     isOneOfOrEof(token, const ['const', 'get', 'final', 'set', 'var', 'void']);
+
+bool looksLikeStartOfNextStatement(Token token) => isOneOfOrEof(token, const [
+      'assert',
+      'break',
+      'const',
+      'continue',
+      'do',
+      'final',
+      'for',
+      'if',
+      'return',
+      'switch',
+      'try',
+      'var',
+      'void',
+      'while'
+    ]);
+
+Token skipMetadata(Token token) {
+  assert(optional('@', token));
+  Token next = token.next;
+  if (next.isIdentifier) {
+    token = next;
+    next = token.next;
+    while (optional('.', next)) {
+      token = next;
+      next = token.next;
+      if (next.isIdentifier) {
+        token = next;
+        next = token.next;
+      }
+    }
+    if (optional('(', next)) {
+      token = next.endGroup;
+      next = token.next;
+    }
+  }
+  return token;
+}
diff --git a/pkg/front_end/lib/src/fasta/parser/modifier_context.dart b/pkg/front_end/lib/src/fasta/parser/modifier_context.dart
index 9bf2da1..83d9a8d 100644
--- a/pkg/front_end/lib/src/fasta/parser/modifier_context.dart
+++ b/pkg/front_end/lib/src/fasta/parser/modifier_context.dart
@@ -4,8 +4,8 @@
 
 import '../../scanner/token.dart' show Token;
 import '../messages.dart' as fasta;
+import 'member_kind.dart' show MemberKind;
 import 'parser.dart' show Parser;
-import 'type_continuation.dart' show TypeContinuation;
 import 'util.dart' show optional;
 
 bool isModifier(Token token) {
@@ -28,25 +28,6 @@
   return true;
 }
 
-TypeContinuation typeContinuationAfterVar(TypeContinuation typeContinuation) {
-  switch (typeContinuation) {
-    case TypeContinuation.NormalFormalParameter:
-    case TypeContinuation.NormalFormalParameterAfterVar:
-      return TypeContinuation.NormalFormalParameterAfterVar;
-
-    case TypeContinuation.OptionalPositionalFormalParameter:
-    case TypeContinuation.OptionalPositionalFormalParameterAfterVar:
-      return TypeContinuation.OptionalPositionalFormalParameterAfterVar;
-
-    case TypeContinuation.NamedFormalParameter:
-    case TypeContinuation.NamedFormalParameterAfterVar:
-      return TypeContinuation.NamedFormalParameterAfterVar;
-
-    default:
-      return TypeContinuation.OptionalAfterVar;
-  }
-}
-
 /// This class is used to parse modifiers in most locations where modifiers
 /// can occur, but does not call handleModifier or handleModifiers.
 class ModifierRecoveryContext {
@@ -88,18 +69,27 @@
   }
 
   /// Parse modifiers for formal parameters.
-  Token parseFormalParameterModifiers(Token token, bool isStaticOrTopLevel,
+  Token parseFormalParameterModifiers(Token token, MemberKind memberKind,
       {Token covariantToken, Token varFinalOrConst}) {
     token = parseModifiers(token,
         covariantToken: covariantToken, varFinalOrConst: varFinalOrConst);
 
-    if (isStaticOrTopLevel) {
+    if (memberKind == MemberKind.StaticMethod ||
+        memberKind == MemberKind.TopLevelMethod) {
       reportExtraneousModifier(this.covariantToken);
       this.covariantToken = null;
     }
     if (constToken != null) {
       reportExtraneousModifier(constToken);
       varFinalOrConst = null;
+    } else if (memberKind == MemberKind.GeneralizedFunctionType) {
+      if (varFinalOrConst != null) {
+        parser.reportRecoverableError(
+            varFinalOrConst, fasta.messageFunctionTypedParameterVar);
+        varFinalOrConst = null;
+        finalToken = null;
+        varToken = null;
+      }
     }
     reportExtraneousModifier(abstractToken);
     reportExtraneousModifier(externalToken);
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 394e0d5..a23beb1 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -77,16 +77,14 @@
 
 import 'member_kind.dart' show MemberKind;
 
-import 'modifier_context.dart'
-    show ModifierRecoveryContext, isModifier, typeContinuationAfterVar;
+import 'modifier_context.dart' show ModifierRecoveryContext, isModifier;
 
 import 'recovery_listeners.dart'
     show ClassHeaderRecoveryListener, ImportRecoveryListener;
 
 import 'token_stream_rewriter.dart' show TokenStreamRewriter;
 
-import 'type_continuation.dart'
-    show TypeContinuation, typeContinuationFromFormalParameterKind;
+import 'type_continuation.dart' show TypeContinuation;
 
 import 'type_info.dart'
     show
@@ -94,7 +92,7 @@
         computeType,
         isGeneralizedFunctionType,
         isValidTypeReference,
-        noTypeInfo;
+        noType;
 
 import 'util.dart' show optional;
 
@@ -772,8 +770,7 @@
       next.setNext(leftParen);
       leftParen = openParen;
     }
-    token = leftParen;
-    token = parseDottedName(token);
+    token = parseDottedName(leftParen);
     Token next = token.next;
     Token equalitySign;
     if (optional('==', next)) {
@@ -782,17 +779,14 @@
       next = token.next;
     }
     if (next != leftParen.endGroup) {
-      reportRecoverableErrorWithToken(next, fasta.templateUnexpectedToken);
       Token endGroup = leftParen.endGroup;
       if (endGroup.isSynthetic) {
         // The scanner did not place the synthetic ')' correctly, so move it.
-
-        // TODO(danrubel): Its costly to find the token before the endGroup.
-        // Consider beforeSynthetic field that points to the previous token
-        // only for synthetic tokens such as ')', '}', ']' so that the parser
-        // can easily move these to the correct location.
+        next = rewriter.moveSynthetic(token, endGroup);
+      } else {
+        reportRecoverableErrorWithToken(next, fasta.templateUnexpectedToken);
+        next = endGroup;
       }
-      next = endGroup;
     }
     token = next;
     assert(optional(')', token));
@@ -1221,9 +1215,11 @@
     assert(parameterKind != null);
     token = parseMetadataStar(token);
     Token next = token.next;
+    Token start = next;
 
-    TypeContinuation typeContinuation =
-        typeContinuationFromFormalParameterKind(parameterKind);
+    final bool inFunctionType =
+        memberKind == MemberKind.GeneralizedFunctionType;
+
     Token covariantToken;
     Token varFinalOrConst;
     if (isModifier(next)) {
@@ -1236,38 +1232,171 @@
       }
 
       if (isModifier(next)) {
-        if (optional('var', next)) {
-          typeContinuation = typeContinuationAfterVar(typeContinuation);
-          varFinalOrConst = token = next;
-          next = token.next;
-        } else if (optional('final', next)) {
-          varFinalOrConst = token = next;
-          next = token.next;
+        if (!inFunctionType) {
+          if (optional('var', next)) {
+            varFinalOrConst = token = next;
+            next = token.next;
+          } else if (optional('final', next)) {
+            varFinalOrConst = token = next;
+            next = token.next;
+          }
         }
 
         if (isModifier(next)) {
           // Recovery
           ModifierRecoveryContext context = new ModifierRecoveryContext(this);
-          token = context.parseFormalParameterModifiers(
-              token,
-              memberKind == MemberKind.StaticMethod ||
-                  memberKind == MemberKind.TopLevelMethod,
-              covariantToken: covariantToken,
-              varFinalOrConst: varFinalOrConst);
+          token = context.parseFormalParameterModifiers(token, memberKind,
+              covariantToken: covariantToken, varFinalOrConst: varFinalOrConst);
           covariantToken = context.covariantToken;
           varFinalOrConst = context.varFinalOrConst;
-          if (varFinalOrConst != null && optional('var', varFinalOrConst)) {
-            typeContinuation = typeContinuationAfterVar(typeContinuation);
-          }
           context = null;
         }
       }
     }
-    listener.beginFormalParameter(
-        next, memberKind, covariantToken, varFinalOrConst);
 
-    return parseType(
-        token, typeContinuation, null, memberKind, varFinalOrConst);
+    listener.beginFormalParameter(
+        start, memberKind, covariantToken, varFinalOrConst);
+
+    // Type is required in a generalized function type, but optional otherwise.
+    final Token beforeType = token;
+    TypeInfo typeInfo = computeType(token, inFunctionType);
+    token = typeInfo.skipType(token);
+    next = token.next;
+    if (typeInfo == noType &&
+        (optional('.', next) ||
+            (next.isIdentifier && optional('.', next.next)))) {
+      // Recovery: Malformed type reference.
+      typeInfo = computeType(beforeType, true);
+      token = typeInfo.skipType(beforeType);
+      next = token.next;
+    }
+
+    final bool isNamedParameter =
+        parameterKind == FormalParameterKind.optionalNamed;
+
+    Token thisKeyword;
+    Token periodAfterThis;
+    IdentifierContext nameContext =
+        IdentifierContext.formalParameterDeclaration;
+
+    if (!inFunctionType && optional('this', next)) {
+      thisKeyword = token = next;
+      next = token.next;
+      if (!optional('.', next)) {
+        // Recover from a missing period by inserting one.
+        next = rewriteAndRecover(
+                token,
+                fasta.templateExpectedButGot.withArguments('.'),
+                new SyntheticToken(TokenType.PERIOD, next.charOffset))
+            .next;
+      }
+      periodAfterThis = token = next;
+      next = token.next;
+      nameContext = IdentifierContext.fieldInitializer;
+    }
+
+    if (next.isIdentifier) {
+      token = next;
+      next = token.next;
+    }
+    Token beforeInlineFunctionType;
+    if (optional("<", next)) {
+      Token closer = next.endGroup;
+      if (closer != null) {
+        if (optional("(", closer.next)) {
+          if (varFinalOrConst != null) {
+            reportRecoverableError(
+                varFinalOrConst, fasta.messageFunctionTypedParameterVar);
+          }
+          beforeInlineFunctionType = token;
+          token = closer.next.endGroup;
+          next = token.next;
+        }
+      }
+    } else if (optional("(", next)) {
+      if (varFinalOrConst != null) {
+        reportRecoverableError(
+            varFinalOrConst, fasta.messageFunctionTypedParameterVar);
+      }
+      beforeInlineFunctionType = token;
+      token = next.endGroup;
+      next = token.next;
+    }
+    if (typeInfo != noType &&
+        varFinalOrConst != null &&
+        optional('var', varFinalOrConst)) {
+      reportRecoverableError(varFinalOrConst, fasta.messageTypeAfterVar);
+    }
+
+    Token endInlineFunctionType;
+    if (beforeInlineFunctionType != null) {
+      endInlineFunctionType = parseTypeVariablesOpt(beforeInlineFunctionType);
+      listener.beginFunctionTypedFormalParameter(beforeInlineFunctionType.next);
+      token = typeInfo.parseType(beforeType, this);
+      endInlineFunctionType = parseFormalParametersRequiredOpt(
+          endInlineFunctionType, MemberKind.FunctionTypedParameter);
+      listener.endFunctionTypedFormalParameter();
+
+      // Generalized function types don't allow inline function types.
+      // The following isn't allowed:
+      //    int Function(int bar(String x)).
+      if (inFunctionType) {
+        reportRecoverableError(beforeInlineFunctionType.next,
+            fasta.messageInvalidInlineFunctionType);
+      }
+    } else if (inFunctionType) {
+      token = typeInfo.ensureTypeOrVoid(beforeType, this);
+    } else {
+      token = typeInfo.parseType(beforeType, this);
+    }
+
+    Token nameToken;
+    if (periodAfterThis != null) {
+      token = periodAfterThis;
+    }
+    next = token.next;
+    if (inFunctionType && !isNamedParameter && !next.isKeywordOrIdentifier) {
+      nameToken = token.next;
+      listener.handleNoName(nameToken);
+    } else {
+      nameToken = token = ensureIdentifier(token, nameContext);
+      if (isNamedParameter && nameToken.lexeme.startsWith("_")) {
+        reportRecoverableError(nameToken, fasta.messagePrivateNamedParameter);
+      }
+    }
+    if (endInlineFunctionType != null) {
+      token = endInlineFunctionType;
+    }
+    next = token.next;
+
+    String value = next.stringValue;
+    if ((identical('=', value)) || (identical(':', value))) {
+      Token equal = next;
+      listener.beginFormalParameterDefaultValueExpression();
+      token = parseExpression(equal);
+      next = token.next;
+      listener.endFormalParameterDefaultValueExpression();
+      // TODO(danrubel): Consider removing the last parameter from the
+      // handleValuedFormalParameter event... it appears to be unused.
+      listener.handleValuedFormalParameter(equal, next);
+      if (isMandatoryFormalParameterKind(parameterKind)) {
+        reportRecoverableError(
+            equal, fasta.messageRequiredParameterWithDefault);
+      } else if (isOptionalPositionalFormalParameterKind(parameterKind) &&
+          identical(':', value)) {
+        reportRecoverableError(
+            equal, fasta.messagePositionalParameterWithEquals);
+      } else if (inFunctionType ||
+          memberKind == MemberKind.FunctionTypeAlias ||
+          memberKind == MemberKind.FunctionTypedParameter) {
+        reportRecoverableError(equal, fasta.messageFunctionTypeDefaultValue);
+      }
+    } else {
+      listener.handleFormalParameterWithoutValue(next);
+    }
+    listener.endFormalParameter(
+        thisKeyword, periodAfterThis, nameToken, parameterKind, memberKind);
+    return token;
   }
 
   /// ```
@@ -1371,37 +1500,6 @@
     return token;
   }
 
-  /// Skip over the `Function` type parameter.
-  /// For example, `Function<E>(int foo)` or `Function(foo)` or just `Function`.
-  Token skipGenericFunctionType(Token token) {
-    Token last = token;
-    Token next = token.next;
-    while (optional('Function', next)) {
-      last = token;
-      token = next;
-      next = token.next;
-      if (optional('<', next)) {
-        next = next.endGroup;
-        if (next == null) {
-          // TODO(danrubel): Consider better recovery
-          // because this is probably a type reference.
-          return token;
-        }
-        token = next;
-        next = token.next;
-      }
-      if (optional('(', next)) {
-        token = next.endGroup;
-        next = token.next;
-      }
-    }
-    if (next.isKeywordOrIdentifier) {
-      return token;
-    } else {
-      return last;
-    }
-  }
-
   /// Returns `true` if [token] matches '<' type (',' type)* '>' '(', and
   /// otherwise returns `false`. The final '(' is not part of the grammar
   /// construct `typeArguments`, but it is required here such that type
@@ -1999,8 +2097,6 @@
     } else if (context == IdentifierContext.localFunctionDeclaration ||
         context == IdentifierContext.localFunctionDeclarationContinuation) {
       followingValues = ['.', '(', '{', '=>'];
-    } else if (context == IdentifierContext.localVariableDeclaration) {
-      followingValues = [';', '=', ',', '}'];
     } else if (context == IdentifierContext.methodDeclaration ||
         context == IdentifierContext.methodDeclarationContinuation) {
       followingValues = ['.', '(', '{', '=>'];
@@ -2084,8 +2180,6 @@
     } else if (context ==
         IdentifierContext.localFunctionDeclarationContinuation) {
       initialKeywords = statementKeywords();
-    } else if (context == IdentifierContext.localVariableDeclaration) {
-      initialKeywords = statementKeywords();
     } else if (context == IdentifierContext.methodDeclaration) {
       initialKeywords = classMemberKeywords();
     } else if (context == IdentifierContext.methodDeclarationContinuation) {
@@ -2143,26 +2237,6 @@
     return token;
   }
 
-  /// Returns `true` if the stringValue of the [token] is either [value1],
-  /// [value2], or [value3].
-  bool isOneOf3(Token token, String value1, String value2, String value3) {
-    String stringValue = token.stringValue;
-    return identical(value1, stringValue) ||
-        identical(value2, stringValue) ||
-        identical(value3, stringValue);
-  }
-
-  /// Returns `true` if the stringValue of the [token] is either [value1],
-  /// [value2], [value3], or [value4].
-  bool isOneOf4(
-      Token token, String value1, String value2, String value3, String value4) {
-    String stringValue = token.stringValue;
-    return identical(value1, stringValue) ||
-        identical(value2, stringValue) ||
-        identical(value3, stringValue) ||
-        identical(value4, stringValue);
-  }
-
   bool notEofOrValue(String value, Token token) {
     return !identical(token.kind, EOF_TOKEN) &&
         !identical(value, token.stringValue);
@@ -2361,7 +2435,6 @@
       return false;
     }
 
-    FormalParameterKind parameterKind;
     switch (continuation) {
       case TypeContinuation.Required:
         // If the token after the type is not an identifier,
@@ -2440,224 +2513,6 @@
         if (beforeName.next != name)
           throw new StateError("beforeName.next != name");
         return parseNamedFunctionRest(beforeName, begin, formals, true);
-
-      case TypeContinuation.NormalFormalParameter:
-      case TypeContinuation.NormalFormalParameterAfterVar:
-        parameterKind = FormalParameterKind.mandatory;
-        hasVar = continuation == TypeContinuation.NormalFormalParameterAfterVar;
-        continue handleParameters;
-
-      case TypeContinuation.OptionalPositionalFormalParameter:
-      case TypeContinuation.OptionalPositionalFormalParameterAfterVar:
-        parameterKind = FormalParameterKind.optionalPositional;
-        hasVar = continuation ==
-            TypeContinuation.OptionalPositionalFormalParameterAfterVar;
-        continue handleParameters;
-
-      case TypeContinuation.NamedFormalParameterAfterVar:
-        hasVar = true;
-        continue handleParameters;
-
-      handleParameters:
-      case TypeContinuation.NamedFormalParameter:
-        parameterKind ??= FormalParameterKind.optionalNamed;
-        bool inFunctionType = memberKind == MemberKind.GeneralizedFunctionType;
-        bool isNamedParameter =
-            parameterKind == FormalParameterKind.optionalNamed;
-
-        bool untyped = false;
-        if (!looksLikeType || optional("this", begin)) {
-          untyped = true;
-          beforeToken = beforeBegin;
-          token = begin;
-        }
-
-        Token thisKeyword;
-        Token periodAfterThis;
-        Token beforeNameToken = beforeToken;
-        Token nameToken = token;
-        IdentifierContext nameContext =
-            IdentifierContext.formalParameterDeclaration;
-        beforeToken = token;
-        token = token.next;
-        if (inFunctionType) {
-          if (isNamedParameter) {
-            nameContext = IdentifierContext.formalParameterDeclaration;
-            if (!nameToken.isKeywordOrIdentifier) {
-              beforeToken = beforeNameToken;
-              token = nameToken;
-            }
-          } else if (nameToken.isKeywordOrIdentifier) {
-            if (untyped) {
-              // Type is required in a function type but name is not.
-              untyped = false;
-              nameContext = null;
-              beforeNameToken = nameToken;
-              nameToken = nameToken.next;
-            } else {
-              nameContext = IdentifierContext.formalParameterDeclaration;
-            }
-          } else {
-            // No name required in a function type.
-            nameContext = null;
-            beforeToken = beforeNameToken;
-            token = nameToken;
-          }
-        } else if (optional('this', nameToken)) {
-          thisKeyword = nameToken;
-          if (!optional('.', token)) {
-            // Recover from a missing period by inserting one.
-            Message message = fasta.templateExpectedButGot.withArguments('.');
-            Token newToken =
-                new SyntheticToken(TokenType.PERIOD, token.charOffset);
-            periodAfterThis =
-                rewriteAndRecover(thisKeyword, message, newToken).next;
-          } else {
-            periodAfterThis = token;
-          }
-          beforeToken = periodAfterThis;
-          token = periodAfterThis.next;
-          nameContext = IdentifierContext.fieldInitializer;
-          if (!token.isIdentifier) {
-            // Recover from a missing identifier by inserting one.
-            token = insertSyntheticIdentifier(beforeToken, nameContext);
-          }
-          beforeNameToken = beforeToken;
-          beforeToken = nameToken = token;
-          token = token.next;
-        } else if (!nameToken.isIdentifier) {
-          if (optional('.', nameToken)) {
-            // Recovery:
-            // Looks like a prefixed type, but missing the type and param names.
-            // Set the nameToken so that a synthetic identifier is inserted
-            // after the `.` token.
-            beforeToken = beforeNameToken = nameToken;
-            token = nameToken = nameToken.next;
-          } else if (context == IdentifierContext.prefixedTypeReference) {
-            // Recovery:
-            // Looks like a prefixed type, but missing the parameter name.
-            beforeToken = nameToken =
-                insertSyntheticIdentifier(beforeNameToken, nameContext);
-            token = beforeToken.next;
-          } else {
-            untyped = true;
-            beforeNameToken = beforeBegin;
-            beforeToken = nameToken = begin;
-            token = nameToken.next;
-          }
-        }
-        if (isNamedParameter && nameToken.lexeme.startsWith("_")) {
-          // TODO(ahe): Move this to after committing the type.
-          reportRecoverableError(nameToken, fasta.messagePrivateNamedParameter);
-        }
-
-        Token inlineFunctionTypeStart;
-        if (optional("<", token)) {
-          Token closer = token.endGroup;
-          if (closer != null) {
-            if (optional("(", closer.next)) {
-              if (varFinalOrConst != null) {
-                reportRecoverableError(
-                    varFinalOrConst, fasta.messageFunctionTypedParameterVar);
-              }
-              inlineFunctionTypeStart = beforeToken;
-              beforeToken = token;
-              token = token.next;
-            }
-          }
-        } else if (optional("(", token)) {
-          if (varFinalOrConst != null) {
-            reportRecoverableError(
-                varFinalOrConst, fasta.messageFunctionTypedParameterVar);
-          }
-          inlineFunctionTypeStart = beforeToken;
-          beforeToken = token.endGroup;
-          token = beforeToken.next;
-        }
-
-        if (inlineFunctionTypeStart != null) {
-          token = parseTypeVariablesOpt(inlineFunctionTypeStart);
-          // TODO(brianwilkerson): Figure out how to remove the invocation of
-          // `previous`. The method `parseTypeVariablesOpt` returns the last
-          // consumed token.
-          beforeToken = token.previous;
-          listener
-              .beginFunctionTypedFormalParameter(inlineFunctionTypeStart.next);
-          if (!untyped) {
-            if (voidToken != null) {
-              listener.handleVoidKeyword(voidToken);
-            } else {
-              Token saved = token;
-              commitType();
-              token = saved;
-              // We need to recompute the before tokens because [commitType] can
-              // cause synthetic tokens to be inserted.
-              beforeToken = previousToken(beforeToken, token);
-              beforeNameToken = previousToken(beforeNameToken, nameToken);
-            }
-          } else {
-            listener.handleNoType(beforeToken);
-          }
-          beforeToken = parseFormalParametersRequiredOpt(
-              token, MemberKind.FunctionTypedParameter);
-          token = beforeToken.next;
-          listener.endFunctionTypedFormalParameter();
-
-          // Generalized function types don't allow inline function types.
-          // The following isn't allowed:
-          //    int Function(int bar(String x)).
-          if (memberKind == MemberKind.GeneralizedFunctionType) {
-            reportRecoverableError(inlineFunctionTypeStart.next,
-                fasta.messageInvalidInlineFunctionType);
-          }
-        } else if (untyped) {
-          listener.handleNoType(token);
-        } else {
-          Token saved = token;
-          commitType();
-          token = saved;
-          // We need to recompute the before tokens because [commitType] can
-          // cause synthetic tokens to be inserted.
-          beforeToken = previousToken(beforeToken, token);
-          beforeNameToken = previousToken(beforeNameToken, nameToken);
-        }
-
-        if (nameContext != null) {
-          nameToken = ensureIdentifier(beforeNameToken, nameContext);
-          // We need to recompute the before tokens because [ensureIdentifier]
-          // can cause synthetic tokens to be inserted.
-          beforeToken = previousToken(beforeToken, token);
-        } else {
-          listener.handleNoName(nameToken);
-        }
-
-        String value = token.stringValue;
-        if ((identical('=', value)) || (identical(':', value))) {
-          Token equal = token;
-          listener.beginFormalParameterDefaultValueExpression();
-          beforeToken = parseExpression(token);
-          listener.endFormalParameterDefaultValueExpression();
-          token = beforeToken.next;
-          listener.handleValuedFormalParameter(equal, token);
-          if (isMandatoryFormalParameterKind(parameterKind)) {
-            reportRecoverableError(
-                equal, fasta.messageRequiredParameterWithDefault);
-          } else if (isOptionalPositionalFormalParameterKind(parameterKind) &&
-              identical(':', value)) {
-            reportRecoverableError(
-                equal, fasta.messagePositionalParameterWithEquals);
-          } else if (inFunctionType ||
-              memberKind == MemberKind.FunctionTypeAlias ||
-              memberKind == MemberKind.FunctionTypedParameter) {
-            reportRecoverableError(
-                equal, fasta.messageFunctionTypeDefaultValue);
-          }
-        } else {
-          listener.handleFormalParameterWithoutValue(token);
-        }
-        listener.endFormalParameter(
-            thisKeyword, periodAfterThis, nameToken, parameterKind, memberKind);
-        return beforeToken;
     }
 
     throw "Internal error: Unhandled continuation '$continuation'.";
@@ -2884,7 +2739,7 @@
         covariantToken = null;
       }
     }
-    if (typeInfo == noTypeInfo) {
+    if (typeInfo == noType) {
       if (varFinalOrConst == null) {
         reportRecoverableError(
             beforeName.next, fasta.messageMissingConstFinalVarOrType);
@@ -3252,12 +3107,12 @@
     assert(value != '>');
     Token replacement = new Token(TokenType.GT, next.charOffset);
     if (identical(value, '>>')) {
-      replacement.next = new Token(TokenType.GT, next.charOffset + 1);
+      replacement.setNext(new Token(TokenType.GT, next.charOffset + 1));
     } else if (identical(value, '>=')) {
-      replacement.next = new Token(TokenType.EQ, next.charOffset + 1);
+      replacement.setNext(new Token(TokenType.EQ, next.charOffset + 1));
     } else if (identical(value, '>>=')) {
-      replacement.next = new Token(TokenType.GT, next.charOffset + 1);
-      replacement.next.next = new Token(TokenType.EQ, next.charOffset + 2);
+      replacement.setNext(new Token(TokenType.GT, next.charOffset + 1));
+      replacement.next.setNext(new Token(TokenType.EQ, next.charOffset + 2));
     } else {
       // Recovery
       rewriteAndRecover(token, fasta.templateExpectedToken.withArguments('>'),
@@ -3298,30 +3153,6 @@
     return expect(';', token);
   }
 
-  /// Provides a partial order on modifiers.
-  ///
-  /// The order is based on the order modifiers must appear in according to the
-  /// grammar. For example, `external` must come before `static`.
-  ///
-  /// In addition, if two modifiers have the same order, they can't both be
-  /// used together, for example, `final` and `var` can't be used together.
-  ///
-  /// If [token] isn't a modifier, 127 is returned.
-  int modifierOrder(Token token) {
-    final String value = token.stringValue;
-    if (identical('external', value)) return 0;
-    if (identical('static', value) || identical('covariant', value)) {
-      return 1;
-    }
-    if (identical('final', value) ||
-        identical('var', value) ||
-        identical('const', value)) {
-      return 2;
-    }
-    if (identical('abstract', value)) return 3;
-    return 127;
-  }
-
   Token parseNativeClause(Token token) {
     Token nativeToken = token = token.next;
     assert(optional('native', nativeToken));
@@ -3370,14 +3201,6 @@
     return token;
   }
 
-  bool isGetOrSet(Token token) {
-    final String value = token.stringValue;
-    return (identical(value, 'get')) || (identical(value, 'set'));
-  }
-
-  bool isModifierOrFactory(Token next) =>
-      optional('factory', next) || isModifier(next);
-
   bool isUnaryMinus(Token token) =>
       token.kind == IDENTIFIER_TOKEN &&
       token.lexeme == 'unary' &&
@@ -3533,7 +3356,7 @@
             typeInfo,
             getOrSet);
       }
-    } else if (typeInfo == noTypeInfo && varFinalOrConst == null) {
+    } else if (typeInfo == noType && varFinalOrConst == null) {
       Token next2 = next.next;
       if (next2.isUserDefinableOperator && next2.endGroup == null) {
         String value = next2.next.stringValue;
@@ -5358,7 +5181,7 @@
     assert(optional('const', constToken));
     if (!isModifier(constToken.next)) {
       TypeInfo typeInfo = computeType(constToken, false);
-      if (typeInfo == noTypeInfo) {
+      if (typeInfo == noType) {
         Token next = constToken.next;
         if (!next.isIdentifier) {
           return parseExpressionStatement(start);
@@ -5489,11 +5312,11 @@
       // identifier, then allow ensureIdentifier to report an error
       // and don't report errors here.
       if (varFinalOrConst == null) {
-        if (typeInfo == noTypeInfo) {
+        if (typeInfo == noType) {
           reportRecoverableError(next, fasta.messageMissingConstFinalVarOrType);
         }
       } else if (optional('var', varFinalOrConst)) {
-        if (typeInfo != noTypeInfo) {
+        if (typeInfo != noType) {
           reportRecoverableError(varFinalOrConst, fasta.messageTypeAfterVar);
         }
       }
@@ -6600,7 +6423,7 @@
   /// Create a short token chain from the [beginToken] and [endToken] and return
   /// the [beginToken].
   Token link(BeginToken beginToken, Token endToken) {
-    beginToken.next = endToken;
+    beginToken.setNext(endToken);
     beginToken.endGroup = endToken;
     return beginToken;
   }
diff --git a/pkg/front_end/lib/src/fasta/parser/token_stream_rewriter.dart b/pkg/front_end/lib/src/fasta/parser/token_stream_rewriter.dart
index aa850f9..eb7f4d5 100644
--- a/pkg/front_end/lib/src/fasta/parser/token_stream_rewriter.dart
+++ b/pkg/front_end/lib/src/fasta/parser/token_stream_rewriter.dart
@@ -34,30 +34,38 @@
   /// after the [previousToken]. Return the [previousToken].
   Token insertTokenAfter(Token previousToken, Token insertedToken) {
     Token afterToken = previousToken.next;
-    previousToken.next = insertedToken;
-    insertedToken.previous = previousToken;
+    previousToken.setNext(insertedToken);
 
     Token lastReplacement = _lastTokenInChain(insertedToken);
-    lastReplacement.next = afterToken;
-    afterToken.previous = lastReplacement;
+    lastReplacement.setNext(afterToken);
 
     return previousToken;
   }
 
+  /// Move [endGroup] (a synthetic `)`, `]`, `}`, or `>` token) after [token]
+  /// in the token stream and return [endGroup].
+  Token moveSynthetic(Token token, Token endGroup) {
+    assert(endGroup.beforeSynthetic != null);
+
+    Token next = token.next;
+    endGroup.beforeSynthetic.setNext(endGroup.next);
+    token.setNext(endGroup);
+    endGroup.setNext(next);
+    endGroup.offset = next.offset;
+    return endGroup;
+  }
+
   /// Replace the single token immediately following the [previousToken] with
   /// the chain of tokens starting at the [replacementToken]. Return the
   /// [replacementToken].
   Token replaceTokenFollowing(Token previousToken, Token replacementToken) {
     Token replacedToken = previousToken.next;
-    previousToken.next = replacementToken;
-    replacementToken.previous = previousToken;
+    previousToken.setNext(replacementToken);
 
     (replacementToken as SimpleToken).precedingComments =
         replacedToken.precedingComments;
 
-    Token lastReplacement = _lastTokenInChain(replacementToken);
-    lastReplacement.next = replacedToken.next;
-    replacedToken.next.previous = lastReplacement;
+    _lastTokenInChain(replacementToken).setNext(replacedToken.next);
 
     return replacementToken;
   }
diff --git a/pkg/front_end/lib/src/fasta/parser/type_continuation.dart b/pkg/front_end/lib/src/fasta/parser/type_continuation.dart
index a825ae5..a8aafd2 100644
--- a/pkg/front_end/lib/src/fasta/parser/type_continuation.dart
+++ b/pkg/front_end/lib/src/fasta/parser/type_continuation.dart
@@ -4,8 +4,6 @@
 
 library fasta.parser.type_continuation;
 
-import 'formal_parameter_kind.dart' show FormalParameterKind;
-
 /// Indication of how the parser should continue after (attempting) to parse a
 /// type.
 ///
@@ -34,42 +32,4 @@
   /// Indicates that the parser is parsing an expression and has just seen an
   /// identifier.
   SendOrFunctionLiteral,
-
-  /// Indicates that an optional type followed by a normal formal parameter is
-  /// expected.
-  NormalFormalParameter,
-
-  /// Indicates that an optional type followed by an optional positional formal
-  /// parameter is expected.
-  OptionalPositionalFormalParameter,
-
-  /// Indicates that an optional type followed by a named formal parameter is
-  /// expected.
-  NamedFormalParameter,
-
-  /// Same as [NormalFormalParameter], but we have seen `var`.
-  NormalFormalParameterAfterVar,
-
-  /// Same as [OptionalPositionalFormalParameter], but we have seen `var`.
-  OptionalPositionalFormalParameterAfterVar,
-
-  /// Same as [NamedFormalParameter], but we have seen `var`.
-  NamedFormalParameterAfterVar,
-}
-
-TypeContinuation typeContinuationFromFormalParameterKind(
-    FormalParameterKind type) {
-  if (type != null) {
-    switch (type) {
-      case FormalParameterKind.mandatory:
-        return TypeContinuation.NormalFormalParameter;
-
-      case FormalParameterKind.optionalNamed:
-        return TypeContinuation.NamedFormalParameter;
-
-      case FormalParameterKind.optionalPositional:
-        return TypeContinuation.OptionalPositionalFormalParameter;
-    }
-  }
-  return null;
 }
diff --git a/pkg/front_end/lib/src/fasta/parser/type_info.dart b/pkg/front_end/lib/src/fasta/parser/type_info.dart
index 01e6edb..29a6a7a 100644
--- a/pkg/front_end/lib/src/fasta/parser/type_info.dart
+++ b/pkg/front_end/lib/src/fasta/parser/type_info.dart
@@ -10,15 +10,7 @@
 
 import 'parser.dart' show Parser;
 
-import 'type_info_impl.dart'
-    show
-        ComplexTypeInfo,
-        NoTypeInfo,
-        PrefixedTypeInfo,
-        SimpleTypeArgumentsInfo,
-        SimpleTypeInfo,
-        VoidTypeInfo,
-        looksLikeName;
+import 'type_info_impl.dart';
 
 import 'util.dart' show optional;
 
@@ -63,26 +55,26 @@
   Token skipType(Token token);
 }
 
-/// [NoTypeInfo] is a specialized [TypeInfo] returned by [computeType] when
+/// [NoType] is a specialized [TypeInfo] returned by [computeType] when
 /// there is no type information in the source.
-const TypeInfo noTypeInfo = const NoTypeInfo();
+const TypeInfo noType = const NoType();
 
-/// [VoidTypeInfo] is a specialized [TypeInfo] returned by [computeType] when
+/// [VoidType] is a specialized [TypeInfo] returned by [computeType] when
 /// there is a single identifier as the type reference.
-const TypeInfo voidTypeInfo = const VoidTypeInfo();
+const TypeInfo voidType = const VoidType();
 
-/// [SimpleTypeInfo] is a specialized [TypeInfo] returned by [computeType]
+/// [SimpleType] is a specialized [TypeInfo] returned by [computeType]
 /// when there is a single identifier as the type reference.
-const TypeInfo simpleTypeInfo = const SimpleTypeInfo();
+const TypeInfo simpleType = const SimpleType();
 
-/// [PrefixedTypeInfo] is a specialized [TypeInfo] returned by [computeType]
+/// [PrefixedType] is a specialized [TypeInfo] returned by [computeType]
 /// when the type reference is of the form: identifier `.` identifier.
-const TypeInfo prefixedTypeInfo = const PrefixedTypeInfo();
+const TypeInfo prefixedType = const PrefixedType();
 
-/// [SimpleTypeArgumentsInfo] is a specialized [TypeInfo] returned by
+/// [SimpleTypeWith1Argument] is a specialized [TypeInfo] returned by
 /// [computeType] when the type reference is of the form:
 /// identifier `<` identifier `>`.
-const TypeInfo simpleTypeArgumentsInfo = const SimpleTypeArgumentsInfo();
+const TypeInfo simpleTypeWith1Argument = const SimpleTypeWith1Argument();
 
 Token insertSyntheticIdentifierAfter(Token token, Parser parser) {
   Token identifier = new SyntheticStringToken(
@@ -138,8 +130,11 @@
           }
         }
       }
+    } else if (required && optional('.', next)) {
+      // Recovery: looks like prefixed type missing the prefix
+      return new ComplexTypeInfo(token).computePrefixedType(required);
     }
-    return noTypeInfo;
+    return noType;
   }
 
   if (optional('void', next)) {
@@ -149,7 +144,7 @@
       return new ComplexTypeInfo(token).computeVoidGFT(required);
     }
     // `void`
-    return voidTypeInfo;
+    return voidType;
   }
 
   if (isGeneralizedFunctionType(next)) {
@@ -173,10 +168,10 @@
           if (!isGeneralizedFunctionType(next)) {
             if (required || looksLikeName(next)) {
               // identifier `<` identifier `>` identifier
-              return simpleTypeArgumentsInfo;
+              return simpleTypeWith1Argument;
             } else {
               // identifier `<` identifier `>` non-identifier
-              return noTypeInfo;
+              return noType;
             }
           }
         }
@@ -190,7 +185,7 @@
           .computeSimpleWithTypeArguments(required);
     }
     // identifier `<`
-    return required ? simpleTypeInfo : noTypeInfo;
+    return required ? simpleType : noType;
   }
 
   if (optional('.', next)) {
@@ -201,17 +196,19 @@
       if (!optional('<', next) && !isGeneralizedFunctionType(next)) {
         if (required || looksLikeName(next)) {
           // identifier `.` identifier identifier
-          return prefixedTypeInfo;
+          return prefixedType;
         } else {
           // identifier `.` identifier non-identifier
-          return noTypeInfo;
+          return noType;
         }
       }
       // identifier `.` identifier
       return new ComplexTypeInfo(token).computePrefixedType(required);
     }
     // identifier `.` non-identifier
-    return required ? simpleTypeInfo : noTypeInfo;
+    return required
+        ? new ComplexTypeInfo(token).computePrefixedType(required)
+        : noType;
   }
 
   if (isGeneralizedFunctionType(next)) {
@@ -221,7 +218,7 @@
 
   if (required || looksLikeName(next)) {
     // identifier identifier
-    return simpleTypeInfo;
+    return simpleType;
   }
-  return noTypeInfo;
+  return noType;
 }
diff --git a/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart b/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
index 08b2cce..f0e77fb 100644
--- a/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
+++ b/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
@@ -22,9 +22,9 @@
 
 import 'util.dart' show optional;
 
-/// See documentation on the [noTypeInfo] const.
-class NoTypeInfo implements TypeInfo {
-  const NoTypeInfo();
+/// See documentation on the [noType] const.
+class NoType implements TypeInfo {
+  const NoType();
 
   @override
   bool get couldBeExpression => false;
@@ -34,7 +34,7 @@
     parser.reportRecoverableErrorWithToken(
         token.next, fasta.templateExpectedType);
     insertSyntheticIdentifierAfter(token, parser);
-    return simpleTypeInfo.parseType(token, parser);
+    return simpleType.parseType(token, parser);
   }
 
   @override
@@ -57,9 +57,9 @@
   }
 }
 
-/// See documentation on the [prefixedTypeInfo] const.
-class PrefixedTypeInfo implements TypeInfo {
-  const PrefixedTypeInfo();
+/// See documentation on the [prefixedType] const.
+class PrefixedType implements TypeInfo {
+  const PrefixedType();
 
   @override
   bool get couldBeExpression => true;
@@ -103,9 +103,9 @@
   }
 }
 
-/// See documentation on the [simpleTypeArgumentsInfo] const.
-class SimpleTypeArgumentsInfo implements TypeInfo {
-  const SimpleTypeArgumentsInfo();
+/// See documentation on the [simpleTypeWith1Argument] const.
+class SimpleTypeWith1Argument implements TypeInfo {
+  const SimpleTypeWith1Argument();
 
   @override
   bool get couldBeExpression => false;
@@ -133,7 +133,7 @@
     assert(optional('<', token));
     listener.beginTypeArguments(token);
 
-    token = simpleTypeInfo.parseTypeNotVoid(token, parser);
+    token = simpleType.parseTypeNotVoid(token, parser);
 
     token = token.next;
     assert(optional('>', token));
@@ -150,9 +150,9 @@
   }
 }
 
-/// See documentation on the [simpleTypeInfo] const.
-class SimpleTypeInfo implements TypeInfo {
-  const SimpleTypeInfo();
+/// See documentation on the [simpleType] const.
+class SimpleType implements TypeInfo {
+  const SimpleType();
 
   @override
   bool get couldBeExpression => true;
@@ -186,9 +186,9 @@
   }
 }
 
-/// See documentation on the [voidTypeInfo] const.
-class VoidTypeInfo implements TypeInfo {
-  const VoidTypeInfo();
+/// See documentation on the [voidType] const.
+class VoidType implements TypeInfo {
+  const VoidType();
 
   @override
   bool get couldBeExpression => false;
@@ -197,7 +197,7 @@
   Token ensureTypeNotVoid(Token token, Parser parser) {
     // Report an error, then parse `void` as if it were a type name.
     parser.reportRecoverableError(token.next, fasta.messageInvalidVoid);
-    return simpleTypeInfo.parseTypeNotVoid(token, parser);
+    return simpleType.parseTypeNotVoid(token, parser);
   }
 
   @override
@@ -224,28 +224,33 @@
 bool looksLikeName(Token token) =>
     token.isIdentifier || optional('this', token);
 
-Token skipTypeArguments(Token token) {
+Token skipTypeVariables(Token token) {
   assert(optional('<', token));
   Token endGroup = token.endGroup;
+  if (endGroup == null) {
+    return null;
+  }
 
   // The scanner sets the endGroup in situations like this: C<T && T>U;
   // Scan the type arguments to assert there are no operators.
-  // TODO(danrubel) Fix the scanner and remove this code.
-  if (endGroup != null) {
-    token = token.next;
-    while (token != endGroup) {
-      if (token.isOperator) {
-        String value = token.stringValue;
-        if (!identical(value, '<') &&
-            !identical(value, '>') &&
-            !identical(value, '>>')) {
-          return null;
-        }
-      }
-      token = token.next;
+  // TODO(danrubel): Fix the scanner to do this scanning.
+  token = token.next;
+  while (token != endGroup) {
+    if (token.isKeywordOrIdentifier ||
+        optional(',', token) ||
+        optional('.', token) ||
+        optional('<', token) ||
+        optional('>', token) ||
+        optional('>>', token) ||
+        optional('@', token)) {
+      // ok
+    } else if (optional('(', token)) {
+      token = token.endGroup;
+    } else {
+      return null;
     }
+    token = token.next;
   }
-
   return endGroup;
 }
 
@@ -253,7 +258,7 @@
 /// type references that cannot be represented by the constants above.
 class ComplexTypeInfo implements TypeInfo {
   /// The first token in the type reference.
-  final Token start;
+  Token start;
 
   /// The last token in the type reference.
   Token end;
@@ -291,6 +296,12 @@
   Token parseType(Token token, Parser parser) {
     assert(identical(token.next, start));
 
+    if (optional('.', start)) {
+      // Recovery: Insert missing identifier without sending events
+      start = parser.insertSyntheticIdentifier(
+          token, IdentifierContext.prefixedTypeReference);
+    }
+
     for (Link<Token> t = typeVariableStarters; t.isNotEmpty; t = t.tail) {
       parser.parseTypeVariablesOpt(t.head);
       parser.listener.beginFunctionType(start);
@@ -300,13 +311,14 @@
       // A function type without return type.
       // Push the non-existing return type first. The loop below will
       // generate the full type.
-      noTypeInfo.parseTypeNotVoid(token, parser);
+      noType.parseTypeNotVoid(token, parser);
     } else {
-      Token start = token.next;
-      if (optional('void', start)) {
-        token = voidTypeInfo.parseType(token, parser);
+      Token typeRefOrPrefix = token.next;
+      if (optional('void', typeRefOrPrefix)) {
+        token = voidType.parseType(token, parser);
       } else {
-        if (!optional('.', start.next)) {
+        if (!optional('.', typeRefOrPrefix) &&
+            !optional('.', typeRefOrPrefix.next)) {
           token =
               parser.ensureIdentifier(token, IdentifierContext.typeReference);
         } else {
@@ -314,9 +326,12 @@
               token, IdentifierContext.prefixedTypeReference);
           token = parser.parseQualifiedRest(
               token, IdentifierContext.typeReferenceContinuation);
+          if (token.isSynthetic && end == typeRefOrPrefix.next) {
+            end = token;
+          }
         }
         token = parser.parseTypeArgumentsOpt(token);
-        parser.listener.handleType(start, token.next);
+        parser.listener.handleType(typeRefOrPrefix, token.next);
       }
     }
 
@@ -358,7 +373,7 @@
     computeRest(start, required);
 
     if (gftHasReturnType == null) {
-      return required ? simpleTypeInfo : noTypeInfo;
+      return required ? simpleType : noType;
     }
     assert(end != null);
     return this;
@@ -372,7 +387,7 @@
     computeRest(start.next, required);
 
     if (gftHasReturnType == null) {
-      return voidTypeInfo;
+      return voidType;
     }
     assert(end != null);
     return this;
@@ -386,7 +401,7 @@
     Token token = start.next;
     if (optional('<', token)) {
       typeArguments = token;
-      token = skipTypeArguments(typeArguments);
+      token = skipTypeVariables(typeArguments);
       if (token == null) {
         token = typeArguments;
         typeArguments = null;
@@ -408,7 +423,7 @@
     computeRest(start.next, required);
 
     if (gftHasReturnType == null) {
-      return simpleTypeInfo;
+      return simpleType;
     }
     assert(end != null);
     return this;
@@ -421,15 +436,15 @@
     typeArguments = start.next;
     assert(optional('<', typeArguments));
 
-    Token token = skipTypeArguments(typeArguments);
+    Token token = skipTypeVariables(typeArguments);
     if (token == null) {
-      return required ? simpleTypeInfo : noTypeInfo;
+      return required ? simpleType : noType;
     }
     end = token;
     computeRest(token.next, required);
 
     if (!required && !looksLikeName(end.next) && gftHasReturnType == null) {
-      return noTypeInfo;
+      return noType;
     }
     assert(end != null);
     return this;
@@ -438,19 +453,23 @@
   /// Given identifier `.` identifier, compute the type
   /// and return the receiver or one of the [TypeInfo] constants.
   TypeInfo computePrefixedType(bool required) {
-    assert(isValidTypeReference(start));
-    Token token = start.next;
+    Token token = start;
+    if (!optional('.', token)) {
+      assert(isValidTypeReference(token));
+      token = token.next;
+    }
     assert(optional('.', token));
-    token = token.next;
-    assert(isValidTypeReference(token));
+    if (isValidTypeReference(token.next)) {
+      token = token.next;
+    }
 
     end = token;
     token = token.next;
     if (optional('<', token)) {
       typeArguments = token;
-      token = skipTypeArguments(token);
+      token = skipTypeVariables(token);
       if (token == null) {
-        return required ? prefixedTypeInfo : noTypeInfo;
+        return required ? prefixedType : noType;
       }
       end = token;
       token = token.next;
@@ -458,7 +477,7 @@
     computeRest(token, required);
 
     if (!required && !looksLikeName(end.next) && gftHasReturnType == null) {
-      return noTypeInfo;
+      return noType;
     }
     assert(end != null);
     return this;
@@ -469,7 +488,7 @@
       Token typeVariableStart = token;
       token = token.next;
       if (optional('<', token)) {
-        token = token.endGroup;
+        token = skipTypeVariables(token);
         if (token == null) {
           break; // Not a function type.
         }
diff --git a/pkg/front_end/lib/src/fasta/scanner/array_based_scanner.dart b/pkg/front_end/lib/src/fasta/scanner/array_based_scanner.dart
index 8f7100b..5d8487a 100644
--- a/pkg/front_end/lib/src/fasta/scanner/array_based_scanner.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/array_based_scanner.dart
@@ -361,7 +361,7 @@
     //      v
     //     EOF
     TokenType type = closeBraceInfoFor(begin);
-    appendToken(new SyntheticToken(type, tokenStart));
+    appendToken(new SyntheticToken(type, tokenStart)..beforeSynthetic = tail);
     begin.endGroup = tail;
     appendErrorToken(new UnmatchedToken(begin));
   }
diff --git a/pkg/front_end/lib/src/fasta/scanner/recover.dart b/pkg/front_end/lib/src/fasta/scanner/recover.dart
index 5341f1b..d969362 100644
--- a/pkg/front_end/lib/src/fasta/scanner/recover.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/recover.dart
@@ -124,7 +124,7 @@
     }
     String value = new String.fromCharCodes(codeUnits);
     return synthesizeToken(charOffset, value, TokenType.IDENTIFIER)
-      ..next = next;
+      ..setNext(next);
   }
 
   recoverExponent() {
@@ -137,7 +137,7 @@
 
   recoverHexDigit() {
     return synthesizeToken(errorTail.charOffset, "0", TokenType.INT)
-      ..next = errorTail.next;
+      ..setNext(errorTail.next);
   }
 
   recoverStringInterpolation() {
@@ -164,8 +164,7 @@
         if (errorTail == null) {
           error = next;
         } else {
-          errorTail.next = next;
-          next.previous = errorTail;
+          errorTail.setNext(next);
         }
         errorTail = next;
         next = next.next;
@@ -204,23 +203,21 @@
     if (goodTail == null) {
       good = current;
     } else {
-      goodTail.next = current;
-      current.previous = goodTail;
+      goodTail.setNext(current);
     }
     beforeGoodTail = goodTail;
     goodTail = current;
   }
 
-  error.previous = new Token.eof(-1)..next = error;
+  new Token.eof(-1).setNext(error);
   Token tail;
   if (good != null) {
-    errorTail.next = good;
-    good.previous = errorTail;
+    errorTail.setNext(good);
     tail = goodTail;
   } else {
     tail = errorTail;
   }
-  if (!tail.isEof) tail.next = new Token.eof(tail.end)..previous = tail;
+  if (!tail.isEof) tail.setNext(new Token.eof(tail.end));
   return error;
 }
 
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 79676d4..687a738 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -636,6 +636,17 @@
     ticker.logMs("Checked overrides");
   }
 
+  void checkAbstractMembers(List<SourceClassBuilder> sourceClasses) {
+    if (!target.strongMode) return;
+    assert(hierarchy != null);
+    for (SourceClassBuilder builder in sourceClasses) {
+      if (builder.library.loader == this) {
+        builder.checkAbstractMembers(coreTypes, hierarchy);
+      }
+    }
+    ticker.logMs("Checked abstract members");
+  }
+
   void addNoSuchMethodForwarders(List<SourceClassBuilder> sourceClasses) {
     if (!target.backendTarget.enableNoSuchMethodForwarders) return;
 
diff --git a/pkg/front_end/lib/src/incremental/unlinked_unit.dart b/pkg/front_end/lib/src/incremental/unlinked_unit.dart
index 0b5753a..8d38da3 100644
--- a/pkg/front_end/lib/src/incremental/unlinked_unit.dart
+++ b/pkg/front_end/lib/src/incremental/unlinked_unit.dart
@@ -61,12 +61,15 @@
 
 /// Exclude all `native 'xyz';` token sequences.
 void _excludeNativeClauses(Token token) {
-  for (; token.kind != EOF_TOKEN; token = token.next) {
-    if (optional('native', token) &&
-        token.next.kind == STRING_TOKEN &&
-        optional(';', token.next.next)) {
-      token.previous.next = token.next.next;
+  while (token.kind != EOF_TOKEN) {
+    Token next = token.next;
+    if (optional('native', next) &&
+        next.next.kind == STRING_TOKEN &&
+        optional(';', next.next.next)) {
+      next = next.next.next;
+      token.setNext(next);
     }
+    token = next;
   }
 }
 
diff --git a/pkg/front_end/lib/src/scanner/token.dart b/pkg/front_end/lib/src/scanner/token.dart
index 4e858ff..530b6f0 100644
--- a/pkg/front_end/lib/src/scanner/token.dart
+++ b/pkg/front_end/lib/src/scanner/token.dart
@@ -493,6 +493,14 @@
   int get charEnd => end;
 
   @override
+  Token get beforeSynthetic => null;
+
+  @override
+  set beforeSynthetic(Token previous) {
+    // ignored
+  }
+
+  @override
   int get end => offset + length;
 
   @override
@@ -581,6 +589,7 @@
   Token setNext(Token token) {
     next = token;
     token.previous = this;
+    token.beforeSynthetic = this;
     return token;
   }
 
@@ -712,6 +721,12 @@
   SyntheticToken(TokenType type, int offset) : super(type, offset);
 
   @override
+  Token beforeSynthetic;
+
+  @override
+  bool get isSynthetic => true;
+
+  @override
   int get length => 0;
 
   @override
@@ -757,6 +772,18 @@
    */
   int get charEnd;
 
+  /**
+   * The token before this synthetic token,
+   * or `null` if this is not a synthetic `)`, `]`, `}`, or `>` token.
+   */
+  Token get beforeSynthetic;
+
+  /**
+   * Set token before this synthetic `)`, `]`, `}`, or `>` token,
+   * and ignored otherwise.
+   */
+  set beforeSynthetic(Token previous);
+
   @override
   int get end;
 
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 25bcdaa..bf341d7 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -338,7 +338,7 @@
   analyzerCode: TYPEDEF_IN_CLASS
   dart2jsCode: "*fatal*"
   script:
-    - "class C { typedef int F(int x); }"
+    - "abstract class C { typedef int F(int x); }"
 
 CovariantMember:
   template: "Getters, setters and methods can't be declared to be 'covariant'."
@@ -1071,6 +1071,26 @@
   template: "Factory redirects to class '#name', which is abstract and can't be instantiated."
   severity: ERROR_LEGACY_WARNING
 
+MissingImplementationNotAbstract:
+  template: |
+    The non-abstract class '#name' is missing implementations for these members:
+      #string.
+  tip: |
+    Try to either
+     - provide an implementation,
+     - inherit an implementation from a superclass or mixin,
+     - mark the class as abstract, or
+     - provide a 'noSuchMethod' implementation.
+  severity: ERROR_LEGACY_WARNING
+  analyzerCode: CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+  dart2jsCode: "*fatal*"
+  script:
+    - "class C {foo();}"
+
+MissingImplementationCause:
+  template: "'#name' is defined here."
+  severity: CONTEXT
+
 ListLiteralTooManyTypeArguments:
   template: "Too many type arguments on List literal."
   severity: ERROR_LEGACY_WARNING
diff --git a/pkg/front_end/test/fasta/parser/token_stream_rewriter_test.dart b/pkg/front_end/test/fasta/parser/token_stream_rewriter_test.dart
index 6a5ddce..ed8df9c 100644
--- a/pkg/front_end/test/fasta/parser/token_stream_rewriter_test.dart
+++ b/pkg/front_end/test/fasta/parser/token_stream_rewriter_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:front_end/src/fasta/parser/token_stream_rewriter.dart';
+import 'package:front_end/src/fasta/scanner.dart'
+    show ScannerResult, scanString;
 import 'package:front_end/src/fasta/scanner/token.dart';
 import 'package:front_end/src/scanner/token.dart' show Token;
 import 'package:test/test.dart';
@@ -77,6 +79,23 @@
     expect(b.next, same(c));
   }
 
+  void test_moveSynthetic() {
+    ScannerResult scanResult = scanString('Foo(bar; baz=0;');
+    expect(scanResult.hasErrors, isTrue);
+    Token open = scanResult.tokens.next.next;
+    expect(open.lexeme, '(');
+    Token close = open.endGroup;
+    expect(close.isSynthetic, isTrue);
+    expect(close.next.isEof, isTrue);
+    var rewriter = new TokenStreamRewriter();
+
+    Token result = rewriter.moveSynthetic(open.next, close);
+    expect(result, close);
+    expect(open.endGroup, close);
+    expect(open.next.next, close);
+    expect(close.next.isEof, isFalse);
+  }
+
   void test_replaceTokenFollowing_multiple() {
     var a = _makeToken(0, 'a');
     var b = _makeToken(1, 'b');
diff --git a/pkg/front_end/test/fasta/parser/type_info_test.dart b/pkg/front_end/test/fasta/parser/type_info_test.dart
index b02c547..d09b895 100644
--- a/pkg/front_end/test/fasta/parser/type_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/type_info_test.dart
@@ -22,15 +22,15 @@
   void test_noType() {
     final Token start = scanString('before ;').tokens;
 
-    expect(noTypeInfo.couldBeExpression, isFalse);
-    expect(noTypeInfo.skipType(start), start);
+    expect(noType.couldBeExpression, isFalse);
+    expect(noType.skipType(start), start);
   }
 
   void test_noType_ensureTypeNotVoid() {
     final Token start = scanString('before ;').tokens;
     final TypeInfoListener listener = new TypeInfoListener();
 
-    expect(noTypeInfo.ensureTypeNotVoid(start, new Parser(listener)),
+    expect(noType.ensureTypeNotVoid(start, new Parser(listener)),
         new isInstanceOf<SyntheticStringToken>());
     expect(listener.calls, [
       'handleIdentifier  typeReference',
@@ -44,7 +44,7 @@
     final Token start = scanString('before ;').tokens;
     final TypeInfoListener listener = new TypeInfoListener();
 
-    expect(noTypeInfo.ensureTypeOrVoid(start, new Parser(listener)),
+    expect(noType.ensureTypeOrVoid(start, new Parser(listener)),
         new isInstanceOf<SyntheticStringToken>());
     expect(listener.calls, [
       'handleIdentifier  typeReference',
@@ -58,7 +58,7 @@
     final Token start = scanString('before ;').tokens;
     final TypeInfoListener listener = new TypeInfoListener();
 
-    expect(noTypeInfo.parseType(start, new Parser(listener)), start);
+    expect(noType.parseType(start, new Parser(listener)), start);
     expect(listener.calls, ['handleNoType before']);
     expect(listener.errors, isNull);
   }
@@ -67,7 +67,7 @@
     final Token start = scanString('before ;').tokens;
     final TypeInfoListener listener = new TypeInfoListener();
 
-    expect(noTypeInfo.parseTypeNotVoid(start, new Parser(listener)), start);
+    expect(noType.parseTypeNotVoid(start, new Parser(listener)), start);
     expect(listener.calls, ['handleNoType before']);
     expect(listener.errors, isNull);
   }
@@ -75,16 +75,15 @@
   void test_voidType() {
     final Token start = scanString('before void ;').tokens;
 
-    expect(voidTypeInfo.skipType(start), start.next);
-    expect(voidTypeInfo.couldBeExpression, isFalse);
+    expect(voidType.skipType(start), start.next);
+    expect(voidType.couldBeExpression, isFalse);
   }
 
   void test_voidType_ensureTypeNotVoid() {
     final Token start = scanString('before void ;').tokens;
     final TypeInfoListener listener = new TypeInfoListener();
 
-    expect(voidTypeInfo.ensureTypeNotVoid(start, new Parser(listener)),
-        start.next);
+    expect(voidType.ensureTypeNotVoid(start, new Parser(listener)), start.next);
     expect(listener.calls, [
       'handleIdentifier void typeReference',
       'handleNoTypeArguments ;',
@@ -97,7 +96,7 @@
     final Token start = scanString('before void ;').tokens;
     final TypeInfoListener listener = new TypeInfoListener();
 
-    expect(voidTypeInfo.parseType(start, new Parser(listener)), start.next);
+    expect(voidType.parseType(start, new Parser(listener)), start.next);
     expect(listener.calls, ['handleVoidKeyword void']);
     expect(listener.errors, isNull);
   }
@@ -106,7 +105,7 @@
     final Token start = scanString('before void ;').tokens;
     final TypeInfoListener listener = new TypeInfoListener();
 
-    expect(voidTypeInfo.parseType(start, new Parser(listener)), start.next);
+    expect(voidType.parseType(start, new Parser(listener)), start.next);
     expect(listener.calls, ['handleVoidKeyword void']);
     expect(listener.errors, isNull);
   }
@@ -115,8 +114,7 @@
     final Token start = scanString('before void ;').tokens;
     final TypeInfoListener listener = new TypeInfoListener();
 
-    expect(
-        voidTypeInfo.parseTypeNotVoid(start, new Parser(listener)), start.next);
+    expect(voidType.parseTypeNotVoid(start, new Parser(listener)), start.next);
     expect(listener.calls, [
       'handleIdentifier void typeReference',
       'handleNoTypeArguments ;',
@@ -129,8 +127,8 @@
     final Token start = scanString('before C.a ;').tokens;
     final Token expectedEnd = start.next.next.next;
 
-    expect(prefixedTypeInfo.skipType(start), expectedEnd);
-    expect(prefixedTypeInfo.couldBeExpression, isTrue);
+    expect(prefixedType.skipType(start), expectedEnd);
+    expect(prefixedType.couldBeExpression, isTrue);
 
     TypeInfoListener listener;
     assertResult(Token actualEnd) {
@@ -146,27 +144,24 @@
     }
 
     listener = new TypeInfoListener();
-    assertResult(
-        prefixedTypeInfo.ensureTypeNotVoid(start, new Parser(listener)));
+    assertResult(prefixedType.ensureTypeNotVoid(start, new Parser(listener)));
 
     listener = new TypeInfoListener();
-    assertResult(
-        prefixedTypeInfo.ensureTypeOrVoid(start, new Parser(listener)));
+    assertResult(prefixedType.ensureTypeOrVoid(start, new Parser(listener)));
 
     listener = new TypeInfoListener();
-    assertResult(
-        prefixedTypeInfo.parseTypeNotVoid(start, new Parser(listener)));
+    assertResult(prefixedType.parseTypeNotVoid(start, new Parser(listener)));
 
     listener = new TypeInfoListener();
-    assertResult(prefixedTypeInfo.parseType(start, new Parser(listener)));
+    assertResult(prefixedType.parseType(start, new Parser(listener)));
   }
 
   void test_simpleTypeInfo() {
     final Token start = scanString('before C ;').tokens;
     final Token expectedEnd = start.next;
 
-    expect(simpleTypeInfo.skipType(start), expectedEnd);
-    expect(simpleTypeInfo.couldBeExpression, isTrue);
+    expect(simpleType.skipType(start), expectedEnd);
+    expect(simpleType.couldBeExpression, isTrue);
 
     TypeInfoListener listener;
     assertResult(Token actualEnd) {
@@ -180,24 +175,24 @@
     }
 
     listener = new TypeInfoListener();
-    assertResult(simpleTypeInfo.ensureTypeNotVoid(start, new Parser(listener)));
+    assertResult(simpleType.ensureTypeNotVoid(start, new Parser(listener)));
 
     listener = new TypeInfoListener();
-    assertResult(simpleTypeInfo.ensureTypeOrVoid(start, new Parser(listener)));
+    assertResult(simpleType.ensureTypeOrVoid(start, new Parser(listener)));
 
     listener = new TypeInfoListener();
-    assertResult(simpleTypeInfo.parseTypeNotVoid(start, new Parser(listener)));
+    assertResult(simpleType.parseTypeNotVoid(start, new Parser(listener)));
 
     listener = new TypeInfoListener();
-    assertResult(simpleTypeInfo.parseType(start, new Parser(listener)));
+    assertResult(simpleType.parseType(start, new Parser(listener)));
   }
 
   void test_simpleTypeArgumentsInfo() {
     final Token start = scanString('before C<T> ;').tokens;
     final Token expectedEnd = start.next.next.next.next;
 
-    expect(simpleTypeArgumentsInfo.skipType(start), expectedEnd);
-    expect(simpleTypeArgumentsInfo.couldBeExpression, isFalse);
+    expect(simpleTypeWith1Argument.skipType(start), expectedEnd);
+    expect(simpleTypeWith1Argument.couldBeExpression, isFalse);
 
     TypeInfoListener listener;
     assertResult(Token actualEnd) {
@@ -216,32 +211,42 @@
 
     listener = new TypeInfoListener();
     assertResult(
-        simpleTypeArgumentsInfo.ensureTypeNotVoid(start, new Parser(listener)));
+        simpleTypeWith1Argument.ensureTypeNotVoid(start, new Parser(listener)));
 
     listener = new TypeInfoListener();
     assertResult(
-        simpleTypeArgumentsInfo.ensureTypeOrVoid(start, new Parser(listener)));
+        simpleTypeWith1Argument.ensureTypeOrVoid(start, new Parser(listener)));
 
     listener = new TypeInfoListener();
     assertResult(
-        simpleTypeArgumentsInfo.parseTypeNotVoid(start, new Parser(listener)));
+        simpleTypeWith1Argument.parseTypeNotVoid(start, new Parser(listener)));
 
     listener = new TypeInfoListener();
     assertResult(
-        simpleTypeArgumentsInfo.parseType(start, new Parser(listener)));
+        simpleTypeWith1Argument.parseType(start, new Parser(listener)));
   }
 
   void test_computeType_basic() {
-    expectInfo(noTypeInfo, '');
-    expectInfo(noTypeInfo, ';');
-    expectInfo(noTypeInfo, '( foo');
-    expectInfo(noTypeInfo, '< foo');
-    expectInfo(noTypeInfo, '= foo');
-    expectInfo(noTypeInfo, '* foo');
-    expectInfo(noTypeInfo, 'do foo');
-    expectInfo(noTypeInfo, 'get foo');
-    expectInfo(noTypeInfo, 'set foo');
-    expectInfo(noTypeInfo, 'operator *');
+    expectInfo(noType, '');
+    expectInfo(noType, ';');
+    expectInfo(noType, '( foo');
+    expectInfo(noType, '< foo');
+    expectInfo(noType, '= foo');
+    expectInfo(noType, '* foo');
+    expectInfo(noType, 'do foo');
+    expectInfo(noType, 'get foo');
+    expectInfo(noType, 'set foo');
+    expectInfo(noType, 'operator *');
+
+    expectInfo(noType, '.', required: false);
+    expectComplexInfo('.', required: true, expectedErrors: [
+      error(codeExpectedType, 0, 1),
+      error(codeExpectedType, 1, 0)
+    ]);
+
+    expectInfo(noType, '.Foo', required: false);
+    expectComplexInfo('.Foo',
+        required: true, expectedErrors: [error(codeExpectedType, 0, 1)]);
   }
 
   void test_computeType_builtin() {
@@ -330,8 +335,8 @@
       'endFunctionType Function m',
     ]);
 
-    expectInfo(noTypeInfo, 'Function(int x)', required: false);
-    expectInfo(noTypeInfo, 'Function<T>(int x)', required: false);
+    expectInfo(noType, 'Function(int x)', required: false);
+    expectInfo(noType, 'Function<T>(int x)', required: false);
 
     expectComplexInfo('Function(int x)', required: true);
     expectComplexInfo('Function<T>(int x)', required: true);
@@ -346,39 +351,40 @@
   }
 
   void test_computeType_identifier() {
-    expectInfo(noTypeInfo, 'C', required: false);
-    expectInfo(noTypeInfo, 'C;', required: false);
-    expectInfo(noTypeInfo, 'C(', required: false);
-    expectInfo(noTypeInfo, 'C<', required: false);
-    expectInfo(noTypeInfo, 'C.', required: false);
-    expectInfo(noTypeInfo, 'C=', required: false);
-    expectInfo(noTypeInfo, 'C*', required: false);
-    expectInfo(noTypeInfo, 'C do', required: false);
+    expectInfo(noType, 'C', required: false);
+    expectInfo(noType, 'C;', required: false);
+    expectInfo(noType, 'C(', required: false);
+    expectInfo(noType, 'C<', required: false);
+    expectInfo(noType, 'C.', required: false);
+    expectInfo(noType, 'C=', required: false);
+    expectInfo(noType, 'C*', required: false);
+    expectInfo(noType, 'C do', required: false);
 
-    expectInfo(simpleTypeInfo, 'C', required: true);
-    expectInfo(simpleTypeInfo, 'C;', required: true);
-    expectInfo(simpleTypeInfo, 'C(', required: true);
-    expectInfo(simpleTypeInfo, 'C<', required: true);
-    expectInfo(simpleTypeInfo, 'C.', required: true);
-    expectInfo(simpleTypeInfo, 'C=', required: true);
-    expectInfo(simpleTypeInfo, 'C*', required: true);
-    expectInfo(simpleTypeInfo, 'C do', required: true);
+    expectInfo(simpleType, 'C', required: true);
+    expectInfo(simpleType, 'C;', required: true);
+    expectInfo(simpleType, 'C(', required: true);
+    expectInfo(simpleType, 'C<', required: true);
+    expectComplexInfo('C.',
+        required: true, expectedErrors: [error(codeExpectedType, 2, 0)]);
+    expectInfo(simpleType, 'C=', required: true);
+    expectInfo(simpleType, 'C*', required: true);
+    expectInfo(simpleType, 'C do', required: true);
 
-    expectInfo(simpleTypeInfo, 'C foo');
-    expectInfo(simpleTypeInfo, 'C get');
-    expectInfo(simpleTypeInfo, 'C set');
-    expectInfo(simpleTypeInfo, 'C operator');
-    expectInfo(simpleTypeInfo, 'C this');
-    expectInfo(simpleTypeInfo, 'C Function');
+    expectInfo(simpleType, 'C foo');
+    expectInfo(simpleType, 'C get');
+    expectInfo(simpleType, 'C set');
+    expectInfo(simpleType, 'C operator');
+    expectInfo(simpleType, 'C this');
+    expectInfo(simpleType, 'C Function');
   }
 
   void test_computeType_identifierComplex() {
-    expectInfo(simpleTypeInfo, 'C Function()', required: false);
-    expectInfo(simpleTypeInfo, 'C Function<T>()', required: false);
-    expectInfo(simpleTypeInfo, 'C Function(int)', required: false);
-    expectInfo(simpleTypeInfo, 'C Function<T>(int)', required: false);
-    expectInfo(simpleTypeInfo, 'C Function(int x)', required: false);
-    expectInfo(simpleTypeInfo, 'C Function<T>(int x)', required: false);
+    expectInfo(simpleType, 'C Function()', required: false);
+    expectInfo(simpleType, 'C Function<T>()', required: false);
+    expectInfo(simpleType, 'C Function(int)', required: false);
+    expectInfo(simpleType, 'C Function<T>(int)', required: false);
+    expectInfo(simpleType, 'C Function(int x)', required: false);
+    expectInfo(simpleType, 'C Function<T>(int x)', required: false);
 
     expectComplexInfo('C Function()', required: true);
     expectComplexInfo('C Function<T>()', required: true);
@@ -405,16 +411,16 @@
   }
 
   void test_computeType_identifierTypeArg() {
-    expectInfo(noTypeInfo, 'C<T>', required: false);
-    expectInfo(noTypeInfo, 'C<T>;', required: false);
-    expectInfo(noTypeInfo, 'C<T>(', required: false);
-    expectInfo(noTypeInfo, 'C<T> do', required: false);
-    expectInfo(noTypeInfo, 'C<void>', required: false);
+    expectInfo(noType, 'C<T>', required: false);
+    expectInfo(noType, 'C<T>;', required: false);
+    expectInfo(noType, 'C<T>(', required: false);
+    expectInfo(noType, 'C<T> do', required: false);
+    expectInfo(noType, 'C<void>', required: false);
 
-    expectInfo(simpleTypeArgumentsInfo, 'C<T>', required: true);
-    expectInfo(simpleTypeArgumentsInfo, 'C<T>;', required: true);
-    expectInfo(simpleTypeArgumentsInfo, 'C<T>(', required: true);
-    expectInfo(simpleTypeArgumentsInfo, 'C<T> do', required: true);
+    expectInfo(simpleTypeWith1Argument, 'C<T>', required: true);
+    expectInfo(simpleTypeWith1Argument, 'C<T>;', required: true);
+    expectInfo(simpleTypeWith1Argument, 'C<T>(', required: true);
+    expectInfo(simpleTypeWith1Argument, 'C<T> do', required: true);
     expectComplexInfo('C<void>', required: true, expectedCalls: [
       'handleIdentifier C typeReference',
       'beginTypeArguments <',
@@ -423,17 +429,17 @@
       'handleType C ',
     ]);
 
-    expectInfo(simpleTypeArgumentsInfo, 'C<T> foo');
-    expectInfo(simpleTypeArgumentsInfo, 'C<T> get');
-    expectInfo(simpleTypeArgumentsInfo, 'C<T> set');
-    expectInfo(simpleTypeArgumentsInfo, 'C<T> operator');
-    expectInfo(simpleTypeArgumentsInfo, 'C<T> Function');
+    expectInfo(simpleTypeWith1Argument, 'C<T> foo');
+    expectInfo(simpleTypeWith1Argument, 'C<T> get');
+    expectInfo(simpleTypeWith1Argument, 'C<T> set');
+    expectInfo(simpleTypeWith1Argument, 'C<T> operator');
+    expectInfo(simpleTypeWith1Argument, 'C<T> Function');
   }
 
   void test_computeType_identifierTypeArgComplex() {
-    expectInfo(noTypeInfo, 'C<S,T>', required: false);
-    expectInfo(noTypeInfo, 'C<S<T>>', required: false);
-    expectInfo(noTypeInfo, 'C.a<T>', required: false);
+    expectInfo(noType, 'C<S,T>', required: false);
+    expectInfo(noType, 'C<S<T>>', required: false);
+    expectInfo(noType, 'C.a<T>', required: false);
 
     expectComplexInfo('C<S,T>', required: true, expectedCalls: [
       'handleIdentifier C typeReference',
@@ -530,7 +536,7 @@
           error(codeExpectedToken, 6, 6)
         ]);
 
-    expectInfo(noTypeInfo, 'C<>', required: false);
+    expectInfo(noType, 'C<>', required: false);
     expectComplexInfo('C<>', required: true, expectedCalls: [
       'handleIdentifier C typeReference',
       'beginTypeArguments <',
@@ -555,32 +561,32 @@
     ]);
 
     // Statements that should not have a type
-    expectInfo(noTypeInfo, 'C<T ; T>U;', required: false);
-    expectInfo(noTypeInfo, 'C<T && T>U;', required: false);
+    expectInfo(noType, 'C<T ; T>U;', required: false);
+    expectInfo(noType, 'C<T && T>U;', required: false);
   }
 
   void test_computeType_prefixed() {
-    expectInfo(noTypeInfo, 'C.a', required: false);
-    expectInfo(noTypeInfo, 'C.a;', required: false);
-    expectInfo(noTypeInfo, 'C.a(', required: false);
-    expectInfo(noTypeInfo, 'C.a<', required: false);
-    expectInfo(noTypeInfo, 'C.a=', required: false);
-    expectInfo(noTypeInfo, 'C.a*', required: false);
-    expectInfo(noTypeInfo, 'C.a do', required: false);
+    expectInfo(noType, 'C.a', required: false);
+    expectInfo(noType, 'C.a;', required: false);
+    expectInfo(noType, 'C.a(', required: false);
+    expectInfo(noType, 'C.a<', required: false);
+    expectInfo(noType, 'C.a=', required: false);
+    expectInfo(noType, 'C.a*', required: false);
+    expectInfo(noType, 'C.a do', required: false);
 
-    expectInfo(prefixedTypeInfo, 'C.a', required: true);
-    expectInfo(prefixedTypeInfo, 'C.a;', required: true);
-    expectInfo(prefixedTypeInfo, 'C.a(', required: true);
-    expectInfo(prefixedTypeInfo, 'C.a<', required: true);
-    expectInfo(prefixedTypeInfo, 'C.a=', required: true);
-    expectInfo(prefixedTypeInfo, 'C.a*', required: true);
-    expectInfo(prefixedTypeInfo, 'C.a do', required: true);
+    expectInfo(prefixedType, 'C.a', required: true);
+    expectInfo(prefixedType, 'C.a;', required: true);
+    expectInfo(prefixedType, 'C.a(', required: true);
+    expectInfo(prefixedType, 'C.a<', required: true);
+    expectInfo(prefixedType, 'C.a=', required: true);
+    expectInfo(prefixedType, 'C.a*', required: true);
+    expectInfo(prefixedType, 'C.a do', required: true);
 
-    expectInfo(prefixedTypeInfo, 'C.a foo');
-    expectInfo(prefixedTypeInfo, 'C.a get');
-    expectInfo(prefixedTypeInfo, 'C.a set');
-    expectInfo(prefixedTypeInfo, 'C.a operator');
-    expectInfo(prefixedTypeInfo, 'C.a Function');
+    expectInfo(prefixedType, 'C.a foo');
+    expectInfo(prefixedType, 'C.a get');
+    expectInfo(prefixedType, 'C.a set');
+    expectInfo(prefixedType, 'C.a operator');
+    expectInfo(prefixedType, 'C.a Function');
   }
 
   void test_computeType_prefixedGFT() {
@@ -691,19 +697,19 @@
   }
 
   void test_computeType_void() {
-    expectInfo(voidTypeInfo, 'void');
-    expectInfo(voidTypeInfo, 'void;');
-    expectInfo(voidTypeInfo, 'void(');
-    expectInfo(voidTypeInfo, 'void<');
-    expectInfo(voidTypeInfo, 'void=');
-    expectInfo(voidTypeInfo, 'void*');
-    expectInfo(voidTypeInfo, 'void<T>');
-    expectInfo(voidTypeInfo, 'void do');
-    expectInfo(voidTypeInfo, 'void foo');
-    expectInfo(voidTypeInfo, 'void get');
-    expectInfo(voidTypeInfo, 'void set');
-    expectInfo(voidTypeInfo, 'void operator');
-    expectInfo(voidTypeInfo, 'void Function');
+    expectInfo(voidType, 'void');
+    expectInfo(voidType, 'void;');
+    expectInfo(voidType, 'void(');
+    expectInfo(voidType, 'void<');
+    expectInfo(voidType, 'void=');
+    expectInfo(voidType, 'void*');
+    expectInfo(voidType, 'void<T>');
+    expectInfo(voidType, 'void do');
+    expectInfo(voidType, 'void foo');
+    expectInfo(voidType, 'void get');
+    expectInfo(voidType, 'void set');
+    expectInfo(voidType, 'void operator');
+    expectInfo(voidType, 'void Function');
     expectComplexInfo('void Function(', // Scanner inserts synthetic ')'.
         required: true,
         expectedCalls: [
@@ -717,7 +723,7 @@
   }
 
   void test_computeType_voidComplex() {
-    expectInfo(voidTypeInfo, 'void Function()', required: false);
+    expectInfo(voidType, 'void Function()', required: false);
     expectComplexInfo('void Function()', required: true, expectedCalls: [
       'handleNoTypeVariables (',
       'beginFunctionType void',
@@ -727,11 +733,11 @@
       'endFunctionType Function ',
     ]);
 
-    expectInfo(voidTypeInfo, 'void Function<T>()', required: false);
-    expectInfo(voidTypeInfo, 'void Function(int)', required: false);
-    expectInfo(voidTypeInfo, 'void Function<T>(int)', required: false);
-    expectInfo(voidTypeInfo, 'void Function(int x)', required: false);
-    expectInfo(voidTypeInfo, 'void Function<T>(int x)', required: false);
+    expectInfo(voidType, 'void Function<T>()', required: false);
+    expectInfo(voidType, 'void Function(int)', required: false);
+    expectInfo(voidType, 'void Function<T>(int)', required: false);
+    expectInfo(voidType, 'void Function(int x)', required: false);
+    expectInfo(voidType, 'void Function<T>(int x)', required: false);
 
     expectComplexInfo('void Function<T>()', required: true);
     expectComplexInfo('void Function(int)', required: true);
diff --git a/pkg/front_end/test/fasta/super_mixins_test.dart b/pkg/front_end/test/fasta/super_mixins_test.dart
index d0ad9eb..17a4f92 100644
--- a/pkg/front_end/test/fasta/super_mixins_test.dart
+++ b/pkg/front_end/test/fasta/super_mixins_test.dart
@@ -60,6 +60,8 @@
     super.foo(value);
     super.quux();
   }
+
+  void foo(String value) {}
 }
 
 void main() {
diff --git a/pkg/front_end/test/scanner_fasta_test.dart b/pkg/front_end/test/scanner_fasta_test.dart
index 0000f0c..2d01af9 100644
--- a/pkg/front_end/test/scanner_fasta_test.dart
+++ b/pkg/front_end/test/scanner_fasta_test.dart
@@ -727,7 +727,18 @@
 
   @override
   Token scan(String source) {
-    return createScanner(source, includeComments: true).tokenize();
+    final Token first = createScanner(source, includeComments: true).tokenize();
+    Token token = first;
+    while (!token.isEof) {
+      Token next = token.next;
+      expect(token.next, next);
+      expect(next.previous, token);
+      if (next.isSynthetic && [')', ']', '}'].contains(next.lexeme)) {
+        expect(next.beforeSynthetic, token);
+      }
+      token = next;
+    }
+    return first;
   }
 
   void test_linestarts() {
diff --git a/pkg/front_end/test/scanner_replacement_test.dart b/pkg/front_end/test/scanner_replacement_test.dart
index 984c877..c13663a 100644
--- a/pkg/front_end/test/scanner_replacement_test.dart
+++ b/pkg/front_end/test/scanner_replacement_test.dart
@@ -229,9 +229,7 @@
       token = token.next;
     }
     if (!token.previous.isEof) {
-      var head = new analyzer.Token.eof(-1);
-      token.previous = head;
-      head.next = token;
+      new analyzer.Token.eof(-1).setNext(token);
     }
     return token;
   }
diff --git a/pkg/front_end/testcases/inference/future_then.dart b/pkg/front_end/testcases/inference/future_then.dart
index 6b9527f..75782a4 100644
--- a/pkg/front_end/testcases/inference/future_then.dart
+++ b/pkg/front_end/testcases/inference/future_then.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_then.dart.direct.expect b/pkg/front_end/testcases/inference/future_then.dart.direct.expect
index 10b7eb2..d9c0e0e 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<dynamic> f;
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 2ea9110..80a20d3 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<dynamic> f;
diff --git a/pkg/front_end/testcases/inference/future_then.dart.outline.expect b/pkg/front_end/testcases/inference/future_then.dart.outline.expect
new file mode 100644
index 0000000..bf89d40
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then.dart.outline.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → void
+    ;
+  constructor value(self::MyFuture::T x) → void
+    ;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
+  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+    ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
+}
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_then.dart.strong.expect b/pkg/front_end/testcases/inference/future_then.dart.strong.expect
index 1089564..b7c6c22 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<dynamic> f;
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 82803df..5caa1e0 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<dynamic> f;
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart b/pkg/front_end/testcases/inference/future_then_2.dart
index b8dc5ff..f5f9def 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart
+++ b/pkg/front_end/testcases/inference/future_then_2.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_2.dart.direct.expect
index acb9122..3290595 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<dynamic> f;
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 920eb54..93b4078 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<dynamic> f;
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_2.dart.outline.expect
new file mode 100644
index 0000000..bf89d40
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.outline.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → void
+    ;
+  constructor value(self::MyFuture::T x) → void
+    ;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
+  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+    ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
+}
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_2.dart.strong.expect
index 6e10646..264f452 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<dynamic> f;
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 abf3ad2..8989332 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<dynamic> f;
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart b/pkg/front_end/testcases/inference/future_then_3.dart
index ca18c4f..1b4bfac 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart
+++ b/pkg/front_end/testcases/inference/future_then_3.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_3.dart.direct.expect
index 62054d0..fc2ec41 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<dynamic> f;
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 752fb03..a94ad9c 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<dynamic> f;
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_3.dart.outline.expect
new file mode 100644
index 0000000..bf89d40
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.outline.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → void
+    ;
+  constructor value(self::MyFuture::T x) → void
+    ;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
+  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+    ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
+}
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_3.dart.strong.expect
index 66f74c0..496a434 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<dynamic> f;
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 2678694..78a4a61 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<dynamic> f;
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart b/pkg/front_end/testcases/inference/future_then_4.dart
index 25a1a92..afc672d 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart
+++ b/pkg/front_end/testcases/inference/future_then_4.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_4.dart.direct.expect
index 6a85bd4..627469a9 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<dynamic> f;
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 c1da628..ee00df9 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<dynamic> f;
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_4.dart.outline.expect
new file mode 100644
index 0000000..bf89d40
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.outline.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → void
+    ;
+  constructor value(self::MyFuture::T x) → void
+    ;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
+  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+    ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
+}
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_4.dart.strong.expect
index 077aa15..0e9ab26 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<dynamic> f;
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 4b747e7..03446f5 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<dynamic> f;
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart b/pkg/front_end/testcases/inference/future_then_5.dart
index 84fbc39..2fa4ef8 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart
+++ b/pkg/front_end/testcases/inference/future_then_5.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_5.dart.direct.expect
index 49a21d8..cf8341b 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   asy::Future<dynamic> f;
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 e7a0114..2c79488 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   asy::Future<dynamic> f;
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_5.dart.outline.expect
new file mode 100644
index 0000000..bf89d40
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.outline.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → void
+    ;
+  constructor value(self::MyFuture::T x) → void
+    ;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
+  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+    ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
+}
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_5.dart.strong.expect
index 248c940..60a45b2 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   asy::Future<dynamic> f;
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 e8a77dc..495a584 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   asy::Future<dynamic> f;
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart b/pkg/front_end/testcases/inference/future_then_6.dart
index cd5877d..25cb27f 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart
+++ b/pkg/front_end/testcases/inference/future_then_6.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_6.dart.direct.expect
index 784211b..59eca7d 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   asy::Future<dynamic> f;
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 c04938b..470f6c1 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   asy::Future<dynamic> f;
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_6.dart.outline.expect
new file mode 100644
index 0000000..bf89d40
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.outline.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → void
+    ;
+  constructor value(self::MyFuture::T x) → void
+    ;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
+  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+    ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
+}
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_6.dart.strong.expect
index 6293827..03a4550 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   asy::Future<dynamic> f;
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 fba912b..01b2db8 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   asy::Future<dynamic> f;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart b/pkg/front_end/testcases/inference/future_then_conditional.dart
index 84451ed..32f7cf2 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.expect
index 2492740..6352e0d 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<core::bool> f;
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 61e4088..8b8e2a7 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<core::bool> f;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.outline.expect
new file mode 100644
index 0000000..bf89d40
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.outline.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → void
+    ;
+  constructor value(self::MyFuture::T x) → void
+    ;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
+  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+    ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
+}
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.expect
index b5a4ef4..08ec64a 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<core::bool> f;
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 d83bae2..ff77eeb 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<core::bool> f;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart b/pkg/front_end/testcases/inference/future_then_conditional_2.dart
index 2dcdf3f..9fb812d 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.expect
index c8a5b9b..4884c6c 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<core::bool> f;
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 bc86cdc..77323ea 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<core::bool> f;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect
new file mode 100644
index 0000000..bf89d40
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → void
+    ;
+  constructor value(self::MyFuture::T x) → void
+    ;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
+  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+    ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
+}
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.expect
index 213e538a..13b1486 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<core::bool> f;
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 27c0cd2..f272bfc 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<core::bool> f;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart b/pkg/front_end/testcases/inference/future_then_conditional_3.dart
index f06ef6b..6a68194 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.expect
index 6d9b472..477583e 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<core::bool> f;
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 88cca73..4fc92fe 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<core::bool> f;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect
new file mode 100644
index 0000000..bf89d40
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → void
+    ;
+  constructor value(self::MyFuture::T x) → void
+    ;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
+  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+    ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
+}
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.expect
index 95d159a..af297a2 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<core::bool> f;
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 008dad4..f2c3a2a 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<core::bool> f;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart b/pkg/front_end/testcases/inference/future_then_conditional_4.dart
index 8049974..f99855b 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.expect
index 1603dff..73ac5c0 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<core::bool> f;
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 c248a6d3..dc2f85e 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<core::bool> f;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect
new file mode 100644
index 0000000..bf89d40
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → void
+    ;
+  constructor value(self::MyFuture::T x) → void
+    ;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
+  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+    ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
+}
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.expect
index d84c298..b3e8ccc 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<core::bool> f;
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 5db216e..6c4ab09 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<core::bool> f;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart b/pkg/front_end/testcases/inference/future_then_conditional_5.dart
index 4660443..7520121 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.expect
index bd54b84..32dbcf8 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   asy::Future<core::bool> f;
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 eb4fbef..d7bf2f2 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   asy::Future<core::bool> f;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect
new file mode 100644
index 0000000..bf89d40
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → void
+    ;
+  constructor value(self::MyFuture::T x) → void
+    ;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
+  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+    ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
+}
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.expect
index d010e60..8425b11 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   asy::Future<core::bool> f;
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 4ab3d5f..f1cb720 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   asy::Future<core::bool> f;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart b/pkg/front_end/testcases/inference/future_then_conditional_6.dart
index e843c57..b5d6508 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.expect
index 82773ea..2fb57b2 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   asy::Future<core::bool> f;
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 ca97197..93c7048 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   asy::Future<core::bool> f;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect
new file mode 100644
index 0000000..bf89d40
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → void
+    ;
+  constructor value(self::MyFuture::T x) → void
+    ;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
+  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+    ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
+}
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.expect
index eb9edd0..47e72b3 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   asy::Future<core::bool> f;
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 14029ba..48d5198 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   asy::Future<core::bool> f;
diff --git a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.outline.expect
new file mode 100644
index 0000000..8e85697
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_then_explicit_future.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_explicit_future.dart.outline.expect
new file mode 100644
index 0000000..50d546c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_explicit_future.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method m1() → dynamic
+  ;
+static method m2() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart b/pkg/front_end/testcases/inference/future_then_ifNull.dart
index f79997e..96695d4 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.expect
index 2104ba8..3f7d35c 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<core::int> f;
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 98e506f..f0608c1 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<core::int> f;
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.outline.expect
index abbb36f..bf89d40 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.outline.expect
@@ -8,9 +8,14 @@
     ;
   constructor value(self::MyFuture::T x) → void
     ;
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
     ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.expect
index 636b65e..0b16167 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<core::int> f;
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 c0b8a92..186d1fe 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   self::MyFuture<core::int> f;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart b/pkg/front_end/testcases/inference/future_then_upwards.dart
index 34290072..1a770e9 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.expect
index ef2dc93..ad86cf9 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method main() → void {
   dynamic f = self::foo().then((dynamic _) → dynamic => 2.3);
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.transformed.expect
index ef2dc93..ad86cf9 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.transformed.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method main() → void {
   dynamic f = self::foo().then((dynamic _) → dynamic => 2.3);
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.outline.expect
new file mode 100644
index 0000000..dd8d84a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.outline.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → void
+    ;
+  constructor value(self::MyFuture::T x) → void
+    ;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
+  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+    ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
+}
+static method main() → void
+  ;
+static method foo() → self::MyFuture<dynamic>
+  ;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect
index 82a1eea..e70813f 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method main() → void {
   self::MyFuture<core::double> f = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3);
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect
index d15cb1a..5f33f15 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method main() → void {
   self::MyFuture<core::double> f = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3);
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart b/pkg/front_end/testcases/inference/future_then_upwards_2.dart
index 8db4acd..b9d340e 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.expect
index d4901ef..a47a67c 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method main() → void {
   dynamic f = self::foo().then((dynamic _) → dynamic => 2.3);
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.transformed.expect
index d4901ef..a47a67c 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.transformed.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method main() → void {
   dynamic f = self::foo().then((dynamic _) → dynamic => 2.3);
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect
new file mode 100644
index 0000000..dd8d84a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → void
+    ;
+  constructor value(self::MyFuture::T x) → void
+    ;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
+  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+    ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
+}
+static method main() → void
+  ;
+static method foo() → self::MyFuture<dynamic>
+  ;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect
index 93e4a01..7a3e3e5 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method main() → void {
   self::MyFuture<core::double> f = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3);
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect
index 3ff32da..c45f7a3 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method main() → void {
   self::MyFuture<core::double> f = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3);
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart b/pkg/front_end/testcases/inference/future_then_upwards_3.dart
index 809f9ce..f57ee71 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.expect
index 8be59eb..e107ab2 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   dynamic f = self::foo().then((dynamic _) → dynamic => 2.3);
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.transformed.expect
index 8be59eb..e107ab2 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.transformed.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   dynamic f = self::foo().then((dynamic _) → dynamic => 2.3);
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect
new file mode 100644
index 0000000..f9939e0
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect
@@ -0,0 +1,25 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → void
+    ;
+  constructor value(self::MyFuture::T x) → void
+    ;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
+  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+    ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
+}
+static method test() → void
+  ;
+static method foo() → asy::Future<dynamic>
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect
index d31aa187..d0de61c 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   asy::Future<core::double> f = self::foo().{asy::Future::then}<core::double>((dynamic _) → core::double => 2.3);
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect
index 87ba016..7784c77 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(self::MyFuture::T x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method test() → void {
   asy::Future<core::double> f = self::foo().{asy::Future::then}<core::double>((dynamic _) → core::double => 2.3);
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.outline.expect
new file mode 100644
index 0000000..8e85697
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart b/pkg/front_end/testcases/inference/future_union_async_conditional.dart
index 345ed22..e1f0f8c 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.expect
index ee695a6..2f01968 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(dynamic x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method g1(core::bool x) → asy::Future<core::int> async {
   return x ? 42 : asy::Future::value<dynamic>(42);
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 911e233..5fc5f19 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(dynamic x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → 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>();
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect
new file mode 100644
index 0000000..353c1be
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect
@@ -0,0 +1,27 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → void
+    ;
+  constructor value(dynamic x) → void
+    ;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
+  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+    ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
+}
+static method g1(core::bool x) → asy::Future<core::int>
+  ;
+static method g2(core::bool x) → asy::Future<core::int>
+  ;
+static method g3(core::bool x) → asy::Future<core::int>
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.expect
index 85ff010..722f2d6 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(dynamic x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method g1(core::bool x) → asy::Future<core::int> async {
   return (x ?{core::Object} 42 : asy::Future::value<core::int>(42)) as{TypeError} asy::FutureOr<core::int>;
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 7c803fd..260e803 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(dynamic x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → 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>();
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart
index 3523226..41e7cb0 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.expect
index 82e5e2a..e4c0c12 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(dynamic x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method g1(core::bool x) → asy::Future<core::int> async {
   return x ? 42 : new self::MyFuture::value<dynamic>(42);
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 00559fd..3010ada 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(dynamic x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → 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>();
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect
new file mode 100644
index 0000000..353c1be
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect
@@ -0,0 +1,27 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → void
+    ;
+  constructor value(dynamic x) → void
+    ;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
+  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+    ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
+}
+static method g1(core::bool x) → asy::Future<core::int>
+  ;
+static method g2(core::bool x) → asy::Future<core::int>
+  ;
+static method g3(core::bool x) → asy::Future<core::int>
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.expect
index b235cc7..c539bcd 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(dynamic x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static method g1(core::bool x) → asy::Future<core::int> async {
   return (x ?{core::Object} 42 : new self::MyFuture::value<core::int>(42)) as{TypeError} asy::FutureOr<core::int>;
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 10fb0f8..ee81fa3 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value(dynamic x) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → 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>();
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart b/pkg/front_end/testcases/inference/future_union_downwards.dart
index 75043bd..5622782 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value([x]) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.expect
index 23bf82d..2bdcc03 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static field self::MyFuture<dynamic> f;
 static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
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 859cda9..5db5ef3 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static field self::MyFuture<dynamic> f;
 static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.outline.expect
new file mode 100644
index 0000000..203722c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.outline.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → void
+    ;
+  constructor value([dynamic x]) → void
+    ;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
+  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+    ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
+}
+static field self::MyFuture<dynamic> f;
+static field asy::Future<core::int> t1;
+static field asy::Future<core::List<core::int>> t2;
+static method g2() → asy::Future<core::List<core::int>>
+  ;
+static method g3() → asy::Future<core::List<core::int>>
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
index 68b4bb8..c6c4632 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static field self::MyFuture<dynamic> f;
 static field asy::Future<core::int> t1 = self::f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::FutureOr<dart.core::int>'.
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 2081070..e8e745e 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static field self::MyFuture<dynamic> f;
 static field asy::Future<core::int> t1 = self::f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::FutureOr<dart.core::int>'.
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart b/pkg/front_end/testcases/inference/future_union_downwards_2.dart
index 8f83ae1..7ff20a9 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value([x]) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.expect
index 55196f7..c76f12a 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static field self::MyFuture<dynamic> f;
 static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
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 793eefb..87b4be0eb 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static field self::MyFuture<dynamic> f;
 static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect
new file mode 100644
index 0000000..203722c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → void
+    ;
+  constructor value([dynamic x]) → void
+    ;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
+  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+    ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
+}
+static field self::MyFuture<dynamic> f;
+static field asy::Future<core::int> t1;
+static field asy::Future<core::List<core::int>> t2;
+static method g2() → asy::Future<core::List<core::int>>
+  ;
+static method g3() → asy::Future<core::List<core::int>>
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.expect
index 7200164..5c9ecaf 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static field self::MyFuture<dynamic> f;
 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"));
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 d4ffd12..7eae3ec 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static field self::MyFuture<dynamic> f;
 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"));
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart b/pkg/front_end/testcases/inference/future_union_downwards_3.dart
index c00a4b5..3cd6687 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value([x]) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.expect
index b63f083..7e03996 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static field asy::Future<dynamic> f;
 static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
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 9d94cef..665f3ee 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static field asy::Future<dynamic> f;
 static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect
new file mode 100644
index 0000000..64f58e3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → void
+    ;
+  constructor value([dynamic x]) → void
+    ;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
+  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+    ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
+}
+static field asy::Future<dynamic> f;
+static field asy::Future<core::int> t1;
+static field asy::Future<core::List<core::int>> t2;
+static method g2() → asy::Future<core::List<core::int>>
+  ;
+static method g3() → asy::Future<core::List<core::int>>
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect
index 4faa367..a78fef7 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static field asy::Future<dynamic> f;
 static field asy::Future<core::int> t1 = self::f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::FutureOr<dart.core::int>'.
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 8f591b2..ff49091 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static field asy::Future<dynamic> f;
 static field asy::Future<core::int> t1 = self::f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::FutureOr<dart.core::int>'.
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart b/pkg/front_end/testcases/inference/future_union_downwards_4.dart
index 7fa2acf..0bf7b5c 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value([x]) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation);
+  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.expect
index 6eff123..a80ae91 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static field asy::Future<dynamic> f;
 static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
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 306af4b..b952431 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(dynamic invocation) → dynamic;
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static field asy::Future<dynamic> f;
 static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect
new file mode 100644
index 0000000..64f58e3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → void
+    ;
+  constructor value([dynamic x]) → void
+    ;
+  method noSuchMethod(dynamic invocation) → dynamic
+    ;
+  method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+    ;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
+}
+static field asy::Future<dynamic> f;
+static field asy::Future<core::int> t1;
+static field asy::Future<core::List<core::int>> t2;
+static method g2() → asy::Future<core::List<core::int>>
+  ;
+static method g3() → asy::Future<core::List<core::int>>
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.expect
index 1b9b482..d62bc1b 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.expect
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static field asy::Future<dynamic> f;
 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"));
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 58bf77e..f3bd417 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
@@ -8,9 +8,14 @@
     : super core::Object::•() {}
   constructor value([dynamic x = null]) → void
     : super core::Object::•() {}
-  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return null;
   method then<S extends core::Object>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
     return null;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl generic-covariant-interface () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>;
+  abstract no-such-method-forwarder method /* from org-dartlang-testcase-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>;
 }
 static field asy::Future<dynamic> f;
 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"));
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.outline.expect
new file mode 100644
index 0000000..5c21b43
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.outline.expect
new file mode 100644
index 0000000..a323d38
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.outline.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method id<T extends core::Object>(self::id::T x) → self::id::T
+  ;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.outline.expect
new file mode 100644
index 0000000..fbafd9f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → void
+    ;
+}
+class C extends self::A {
+  synthetic constructor •() → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart
index 1cd1300..185cb96 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart
@@ -7,7 +7,7 @@
 
 abstract class A {
   int get x;
-  void set x(double value);
+  void set x(double value) {}
 }
 
 class B extends A {
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.direct.expect
index ade9351..84b8120b 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.direct.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
   abstract get x() → core::int;
-  abstract set x(core::double value) → void;
+  set x(core::double value) → void {}
 }
 class B extends self::A {
   final field dynamic x;
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.direct.transformed.expect
index ade9351..84b8120b 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.direct.transformed.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
   abstract get x() → core::int;
-  abstract set x(core::double value) → void;
+  set x(core::double value) → void {}
 }
 class B extends self::A {
   final field dynamic x;
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.outline.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.outline.expect
index 4b932ab..e843722 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.outline.expect
@@ -6,7 +6,8 @@
   synthetic constructor •() → void
     ;
   abstract get x() → core::int;
-  abstract set x(core::double value) → void;
+  set x(core::double value) → void
+    ;
 }
 class B extends self::A {
   final field dynamic x;
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.strong.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.strong.expect
index e5bc744..f27336bc 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.strong.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
   abstract get x() → core::int;
-  abstract set x(core::double value) → void;
+  set x(core::double value) → void {}
 }
 class B extends self::A {
   final field core::int x;
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.strong.transformed.expect
index e5bc744..f27336bc 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
   abstract get x() → core::int;
-  abstract set x(core::double value) → void;
+  set x(core::double value) → void {}
 }
 class B extends self::A {
   final field core::int x;
diff --git a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart
index cf037f2..39ed20b 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart
+++ b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart
@@ -6,7 +6,7 @@
 library test;
 
 abstract class A {
-  void set x(double value);
+  void set x(double value) {}
 }
 
 class B extends A {
diff --git a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.direct.expect b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.direct.expect
index eaabbd8..1e77979 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.direct.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  abstract set x(core::double value) → void;
+  set x(core::double value) → void {}
 }
 class B extends self::A {
   final field dynamic x;
diff --git a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.direct.transformed.expect
index eaabbd8..1e77979 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  abstract set x(core::double value) → void;
+  set x(core::double value) → void {}
 }
 class B extends self::A {
   final field dynamic x;
diff --git a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.outline.expect b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.outline.expect
index b89d2f3..8c26438 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.outline.expect
@@ -5,7 +5,8 @@
 abstract class A extends core::Object {
   synthetic constructor •() → void
     ;
-  abstract set x(core::double value) → void;
+  set x(core::double value) → void
+    ;
 }
 class B extends self::A {
   final field dynamic x;
diff --git a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.strong.expect b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.strong.expect
index e666cdd..9054ebc 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.strong.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  abstract set x(core::double value) → void;
+  set x(core::double value) → void {}
 }
 class B extends self::A {
   final field core::double x;
diff --git a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.strong.transformed.expect
index e666cdd..9054ebc 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  abstract set x(core::double value) → void;
+  set x(core::double value) → void {}
 }
 class B extends self::A {
   final field core::double x;
diff --git a/pkg/front_end/testcases/native_as_name.dart b/pkg/front_end/testcases/native_as_name.dart
index 8bd1047..d4b6837 100644
--- a/pkg/front_end/testcases/native_as_name.dart
+++ b/pkg/front_end/testcases/native_as_name.dart
@@ -18,11 +18,11 @@
   String native() => "method";
 }
 
-class Y1 {
+abstract class Y1 {
   String get native;
 }
 
-class Y2 {
+class Y2 extends Y1 {
   @override
   String get native => "getter";
 }
diff --git a/pkg/front_end/testcases/native_as_name.dart.direct.expect b/pkg/front_end/testcases/native_as_name.dart.direct.expect
index 93e5e80..d982aee 100644
--- a/pkg/front_end/testcases/native_as_name.dart.direct.expect
+++ b/pkg/front_end/testcases/native_as_name.dart.direct.expect
@@ -15,15 +15,15 @@
   method native() → core::String
     return "method";
 }
-class Y1 extends core::Object {
+abstract class Y1 extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract get native() → core::String;
 }
-class Y2 extends core::Object {
+class Y2 extends self::Y1 {
   synthetic constructor •() → void
-    : super core::Object::•()
+    : super self::Y1::•()
     ;
   @core::override
   get native() → core::String
diff --git a/pkg/front_end/testcases/native_as_name.dart.direct.transformed.expect b/pkg/front_end/testcases/native_as_name.dart.direct.transformed.expect
index 93e5e80..d982aee 100644
--- a/pkg/front_end/testcases/native_as_name.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/native_as_name.dart.direct.transformed.expect
@@ -15,15 +15,15 @@
   method native() → core::String
     return "method";
 }
-class Y1 extends core::Object {
+abstract class Y1 extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract get native() → core::String;
 }
-class Y2 extends core::Object {
+class Y2 extends self::Y1 {
   synthetic constructor •() → void
-    : super core::Object::•()
+    : super self::Y1::•()
     ;
   @core::override
   get native() → core::String
diff --git a/pkg/front_end/testcases/native_as_name.dart.outline.expect b/pkg/front_end/testcases/native_as_name.dart.outline.expect
index 80a1780..0ee8d2d 100644
--- a/pkg/front_end/testcases/native_as_name.dart.outline.expect
+++ b/pkg/front_end/testcases/native_as_name.dart.outline.expect
@@ -13,12 +13,12 @@
   method native() → core::String
     ;
 }
-class Y1 extends core::Object {
+abstract class Y1 extends core::Object {
   synthetic constructor •() → void
     ;
   abstract get native() → core::String;
 }
-class Y2 extends core::Object {
+class Y2 extends self::Y1 {
   synthetic constructor •() → void
     ;
   get native() → core::String
diff --git a/pkg/front_end/testcases/native_as_name.dart.strong.expect b/pkg/front_end/testcases/native_as_name.dart.strong.expect
index 4b3cf16..e667fad 100644
--- a/pkg/front_end/testcases/native_as_name.dart.strong.expect
+++ b/pkg/front_end/testcases/native_as_name.dart.strong.expect
@@ -15,15 +15,15 @@
   method native() → core::String
     return "method";
 }
-class Y1 extends core::Object {
+abstract class Y1 extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract get native() → core::String;
 }
-class Y2 extends core::Object {
+class Y2 extends self::Y1 {
   synthetic constructor •() → void
-    : super core::Object::•()
+    : super self::Y1::•()
     ;
   @core::override
   get native() → core::String
diff --git a/pkg/front_end/testcases/native_as_name.dart.strong.transformed.expect b/pkg/front_end/testcases/native_as_name.dart.strong.transformed.expect
index 39a0b89..a502052 100644
--- a/pkg/front_end/testcases/native_as_name.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/native_as_name.dart.strong.transformed.expect
@@ -15,15 +15,15 @@
   method native() → core::String
     return "method";
 }
-class Y1 extends core::Object {
+abstract class Y1 extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   abstract get native() → core::String;
 }
-class Y2 extends core::Object {
+class Y2 extends self::Y1 {
   synthetic constructor •() → void
-    : super core::Object::•()
+    : super self::Y1::•()
     ;
   @core::override
   get native() → core::String
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart
index f461405..8879c0e 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart
@@ -6,7 +6,7 @@
 // non-implemented abstract method has all the references to the type variables
 // in its signature replaced with the appropriate types.
 
-class I<T> {
+abstract class I<T> {
   T foo();
 }
 
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.expect
index ffa2406..bf9c46c 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.transformed.expect
index 41aef5e..32ef81f 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
index 6a7ca94..969a34b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object> extends core::Object {
   synthetic constructor •() → void
     ;
   abstract method foo() → self::I::T;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect
index ffa2406..bf9c46c 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect
index 41aef5e..32ef81f 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class I<T extends core::Object> extends core::Object {
+abstract class I<T extends core::Object> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/outline.status b/pkg/front_end/testcases/outline.status
index 80f615e..ae45e4b 100644
--- a/pkg/front_end/testcases/outline.status
+++ b/pkg/front_end/testcases/outline.status
@@ -74,33 +74,6 @@
 inference/field_refers_to_static_getter: Fail
 inference/field_refers_to_top_level_getter: Fail
 inference/future_or_subtyping: Fail
-inference/future_then: Fail
-inference/future_then_2: Fail
-inference/future_then_3: Fail
-inference/future_then_4: Fail
-inference/future_then_5: Fail
-inference/future_then_6: Fail
-inference/future_then_conditional: Fail
-inference/future_then_conditional_2: Fail
-inference/future_then_conditional_3: Fail
-inference/future_then_conditional_4: Fail
-inference/future_then_conditional_5: Fail
-inference/future_then_conditional_6: Fail
-inference/future_then_downwards_method_target: Fail
-inference/future_then_explicit_future: Fail
-inference/future_then_upwards: Fail
-inference/future_then_upwards_2: Fail
-inference/future_then_upwards_3: Fail
-inference/future_then_upwards_from_block: Fail
-inference/future_union_async_conditional: Fail
-inference/future_union_async_conditional_2: Fail
-inference/future_union_downwards: Fail
-inference/future_union_downwards_2: Fail
-inference/future_union_downwards_3: Fail
-inference/future_union_downwards_4: Fail
-inference/future_union_downwards_generic_method_with_future_return: Fail
-inference/future_union_downwards_generic_method_with_generic_return: Fail
-inference/future_union_upwards_generic_methods: Fail
 inference/generic_functions_return_typedef: Fail
 inference/generic_methods_basic_downward_inference: Fail
 inference/generic_methods_correctly_recognize_generic_upper_bound: Fail
diff --git a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart
index eea4d0b..0030a53 100644
--- a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart
@@ -13,7 +13,7 @@
 // This class inherits genericImpl annotations from its superclass, but doesn't
 // have any members marked genericInterface because the inferred types of x and
 // y do not depend on the type parameter T.
-class C<T> implements B<num> {
+abstract class C<T> implements B<num> {
   var /*@covariance=genericImpl*/ x;
   get y;
   set y(/*@covariance=genericImpl*/ value);
@@ -21,7 +21,7 @@
 
 // This class also has members marked genericInterface, since the inferred types
 // of x and y *do* depend on the type parameter T.
-class D<T> implements B<T> {
+abstract class D<T> implements B<T> {
   var /*@covariance=genericInterface, genericImpl*/ x;
   get y;
   set y(/*@covariance=genericInterface, genericImpl*/ value);
diff --git a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.expect
index a69ba21..2582858 100644
--- a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.expect
@@ -9,7 +9,7 @@
     : super core::Object::•()
     ;
 }
-class C<T extends core::Object> extends core::Object implements self::B<core::num> {
+abstract class C<T extends core::Object> extends core::Object implements self::B<core::num> {
   field dynamic x = null;
   synthetic constructor •() → void
     : super core::Object::•()
@@ -17,7 +17,7 @@
   abstract get y() → dynamic;
   abstract set y(dynamic value) → dynamic;
 }
-class D<T extends core::Object> extends core::Object implements self::B<self::D::T> {
+abstract class D<T extends core::Object> extends core::Object implements self::B<self::D::T> {
   field dynamic x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.transformed.expect
index a69ba21..2582858 100644
--- a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.transformed.expect
@@ -9,7 +9,7 @@
     : super core::Object::•()
     ;
 }
-class C<T extends core::Object> extends core::Object implements self::B<core::num> {
+abstract class C<T extends core::Object> extends core::Object implements self::B<core::num> {
   field dynamic x = null;
   synthetic constructor •() → void
     : super core::Object::•()
@@ -17,7 +17,7 @@
   abstract get y() → dynamic;
   abstract set y(dynamic value) → dynamic;
 }
-class D<T extends core::Object> extends core::Object implements self::B<self::D::T> {
+abstract class D<T extends core::Object> extends core::Object implements self::B<self::D::T> {
   field dynamic x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.outline.expect
index 0c10d85..6ae5d4d 100644
--- a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.outline.expect
@@ -8,14 +8,14 @@
   synthetic constructor •() → void
     ;
 }
-class C<T extends core::Object> extends core::Object implements self::B<core::num> {
+abstract class C<T extends core::Object> extends core::Object implements self::B<core::num> {
   field dynamic x;
   synthetic constructor •() → void
     ;
   abstract get y() → dynamic;
   abstract set y(dynamic value) → dynamic;
 }
-class D<T extends core::Object> extends core::Object implements self::B<self::D::T> {
+abstract class D<T extends core::Object> extends core::Object implements self::B<self::D::T> {
   field dynamic x;
   synthetic constructor •() → void
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.expect
index 7a67ecc..d32e1ab 100644
--- a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.expect
@@ -9,7 +9,7 @@
     : super core::Object::•()
     ;
 }
-class C<T extends core::Object> extends core::Object implements self::B<core::num> {
+abstract class C<T extends core::Object> extends core::Object implements self::B<core::num> {
   generic-covariant-impl field core::num x = null;
   synthetic constructor •() → void
     : super core::Object::•()
@@ -17,7 +17,7 @@
   abstract get y() → core::num;
   abstract set y(generic-covariant-impl core::num value) → void;
 }
-class D<T extends core::Object> extends core::Object implements self::B<self::D::T> {
+abstract class D<T extends core::Object> extends core::Object implements self::B<self::D::T> {
   generic-covariant-impl generic-covariant-interface field self::D::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.transformed.expect
index 7a67ecc..d32e1ab 100644
--- a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
     : super core::Object::•()
     ;
 }
-class C<T extends core::Object> extends core::Object implements self::B<core::num> {
+abstract class C<T extends core::Object> extends core::Object implements self::B<core::num> {
   generic-covariant-impl field core::num x = null;
   synthetic constructor •() → void
     : super core::Object::•()
@@ -17,7 +17,7 @@
   abstract get y() → core::num;
   abstract set y(generic-covariant-impl core::num value) → void;
 }
-class D<T extends core::Object> extends core::Object implements self::B<self::D::T> {
+abstract class D<T extends core::Object> extends core::Object implements self::B<self::D::T> {
   generic-covariant-impl generic-covariant-interface field self::D::T x = null;
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart
index b107e62..1da15ad 100644
--- a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart
+++ b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=error*/
 
 class C {
-  void set x(value);
+  void set x(value) {}
 }
 
 void test(C c) {
diff --git a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.direct.expect b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.direct.expect
index ceea877..8fbca83 100644
--- a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.direct.expect
+++ b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.direct.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  abstract set x(dynamic value) → void;
+  set x(dynamic value) → void {}
 }
 static method test(self::C c) → void {
   c.x = 1;
diff --git a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.direct.transformed.expect b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.direct.transformed.expect
index ceea877..8fbca83 100644
--- a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  abstract set x(dynamic value) → void;
+  set x(dynamic value) → void {}
 }
 static method test(self::C c) → void {
   c.x = 1;
diff --git a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.outline.expect b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.outline.expect
index af37326..36f9321 100644
--- a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.outline.expect
+++ b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.outline.expect
@@ -5,7 +5,8 @@
 class C extends core::Object {
   synthetic constructor •() → void
     ;
-  abstract set x(dynamic value) → void;
+  set x(dynamic value) → void
+    ;
 }
 static method test(self::C c) → void
   ;
diff --git a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect
index 639d3c2..052b332 100644
--- a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect
+++ b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  abstract set x(dynamic value) → void;
+  set x(dynamic value) → void {}
 }
 static method test(self::C c) → void {
   c.{self::C::x} = 1;
diff --git a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.transformed.expect b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.transformed.expect
index c1dd51a..bb3271b 100644
--- a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  abstract set x(dynamic value) → void;
+  set x(dynamic value) → void {}
 }
 static method test(self::C c) → void {
   c.{self::C::x} = 1;
diff --git a/pkg/front_end/tool/_fasta/compile_platform.dart b/pkg/front_end/tool/_fasta/compile_platform.dart
index b2bf572..7dcf8b4 100644
--- a/pkg/front_end/tool/_fasta/compile_platform.dart
+++ b/pkg/front_end/tool/_fasta/compile_platform.dart
@@ -10,6 +10,9 @@
 
 import 'package:compiler/src/kernel/dart2js_target.dart' show Dart2jsTarget;
 
+import 'package:vm/bytecode/gen_bytecode.dart'
+    show generateBytecode, kEnableKernelBytecodeForPlatform;
+
 import 'package:vm/target/dart_runner.dart' show DartRunnerTarget;
 
 import 'package:vm/target/flutter_runner.dart' show FlutterRunnerTarget;
@@ -85,6 +88,11 @@
   }
   new File.fromUri(outlineOutput).writeAsBytesSync(result.summary);
   c.options.ticker.logMs("Wrote outline to ${outlineOutput.toFilePath()}");
+
+  if (kEnableKernelBytecodeForPlatform) {
+    generateBytecode(result.component, strongMode: c.options.strongMode);
+  }
+
   await writeComponentToFile(result.component, fullOutput,
       filter: (lib) => !lib.isExternal);
 
diff --git a/pkg/front_end/tool/perf.dart b/pkg/front_end/tool/perf.dart
index 02b9283..b25a5b6 100644
--- a/pkg/front_end/tool/perf.dart
+++ b/pkg/front_end/tool/perf.dart
@@ -20,12 +20,12 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/error/listener.dart';
-import 'package:analyzer/file_system/file_system.dart' show ResourceUriResolver;
 import 'package:analyzer/file_system/physical_file_system.dart'
     show PhysicalResourceProvider;
 import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart' show FolderBasedDartSdk;
+import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index e50b62d..d4983da 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -3650,9 +3650,23 @@
   }
 }
 
-/// Expression of the form `MakeClosure(f, c, t)` where `f` is a name of a
-/// closed top-level function, `c` is a Vector representing closure context, and
-/// `t` is the type of the resulting closure.
+/// Expression of the form `MakeClosure<T>(f, c, t)` where `f` is a name of a
+/// closed top-level function, `c` is a Vector representing closure context, `t`
+/// is the type of the resulting closure and `T` is a vector of type arguments
+/// to be passed to `f`.
+///
+/// Note these restrictions on its usage:
+///
+///   1. `f` must reference a statically-resolved top-level function.
+///
+///   2. The length of `T` must be less than or equal to the number of type
+///      parameters on `f`.
+///
+///   3. It is disallowed to use `MakeClosure` on the same function twice with
+///      different numbers of type arguments.
+///
+///   4. The type arguments `T` must be guaranteed to satisfy the bounds of the
+///      corresponding type parameters on `f`.
 class ClosureCreation extends Expression {
   Reference topLevelFunctionReference;
   Expression contextVector;
@@ -5103,6 +5117,8 @@
   /// Returns a possibly synthesized name for this type parameter, consistent
   /// with the names used across all [toString] calls.
   String toString() => debugQualifiedTypeParameterName(this);
+
+  bool get isFunctionTypeTypeParameter => parent == null;
 }
 
 class Supertype extends Node {
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index ae840c7..6749c74 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -182,7 +182,7 @@
         final DartType valueType = readDartType();
         final int length = readUInt();
         final List<ConstantMapEntry> entries =
-            new List<ConstantMapEntry>(length);
+            new List<ConstantMapEntry>.filled(length, null, growable: true);
         for (int i = 0; i < length; i++) {
           final Constant key = readConstantReference();
           final Constant value = readConstantReference();
@@ -192,7 +192,8 @@
       case ConstantTag.ListConstant:
         final DartType typeArgument = readDartType();
         final int length = readUInt();
-        final List<Constant> entries = new List<Constant>(length);
+        final List<Constant> entries =
+            new List<Constant>.filled(length, null, growable: true);
         for (int i = 0; i < length; i++) {
           entries[i] = readConstantReference();
         }
@@ -201,7 +202,7 @@
         final Reference classReference = readClassReference();
         final int typeArgumentCount = readUInt();
         final List<DartType> typeArguments =
-            new List<DartType>(typeArgumentCount);
+            new List<DartType>.filled(typeArgumentCount, null, growable: true);
         for (int i = 0; i < typeArgumentCount; i++) {
           typeArguments[i] = readDartType();
         }
@@ -242,7 +243,7 @@
 
   List<String> readStringReferenceList() {
     int length = readUInt();
-    List<String> result = new List<String>(length);
+    List<String> result = new List<String>.filled(length, null, growable: true);
     for (int i = 0; i < length; ++i) {
       result[i] = readStringReference();
     }
@@ -268,7 +269,8 @@
   List<Expression> readAnnotationList(TreeNode parent) {
     int length = readUInt();
     if (length == 0) return const <Expression>[];
-    List<Expression> list = new List<Expression>(length);
+    List<Expression> list =
+        new List<Expression>.filled(length, null, growable: true);
     for (int i = 0; i < length; ++i) {
       list[i] = readExpression()..parent = parent;
     }
@@ -699,7 +701,8 @@
 
   List<Combinator> readCombinatorList() {
     int length = readUInt();
-    List<Combinator> result = new List<Combinator>(length);
+    List<Combinator> result =
+        new List<Combinator>.filled(length, null, growable: true);
     for (int i = 0; i < length; ++i) {
       result[i] = readCombinator();
     }
@@ -1164,7 +1167,8 @@
 
   List<Expression> readExpressionList() {
     int length = readUInt();
-    List<Expression> result = new List<Expression>(length);
+    List<Expression> result =
+        new List<Expression>.filled(length, null, growable: true);
     for (int i = 0; i < length; ++i) {
       result[i] = readExpression();
     }
@@ -1418,7 +1422,8 @@
 
   List<MapEntry> readMapEntryList() {
     int length = readUInt();
-    List<MapEntry> result = new List<MapEntry>(length);
+    List<MapEntry> result =
+        new List<MapEntry>.filled(length, null, growable: true);
     for (int i = 0; i < length; ++i) {
       result[i] = readMapEntry();
     }
@@ -1431,8 +1436,8 @@
 
   List<Statement> readStatementList() {
     int length = readUInt();
-    List<Statement> result = <Statement>[];
-    result.length = length;
+    List<Statement> result =
+        new List<Statement>.filled(length, null, growable: true);
     for (int i = 0; i < length; ++i) {
       result[i] = readStatement();
     }
@@ -1514,7 +1519,8 @@
         var offset = readOffset();
         var expression = readExpression();
         int count = readUInt();
-        List<SwitchCase> cases = new List<SwitchCase>(count);
+        List<SwitchCase> cases =
+            new List<SwitchCase>.filled(count, null, growable: true);
         for (int i = 0; i < count; ++i) {
           cases[i] = new SwitchCase.empty();
         }
@@ -1579,7 +1585,7 @@
 
   List<Catch> readCatchList() {
     int length = readUInt();
-    List<Catch> result = new List<Catch>(length);
+    List<Catch> result = new List<Catch>.filled(length, null, growable: true);
     for (int i = 0; i < length; ++i) {
       result[i] = readCatch();
     }
@@ -1623,7 +1629,8 @@
 
   List<Supertype> readSupertypeList() {
     int length = readUInt();
-    List<Supertype> result = new List<Supertype>(length);
+    List<Supertype> result =
+        new List<Supertype>.filled(length, null, growable: true);
     for (int i = 0; i < length; ++i) {
       result[i] = readSupertype();
     }
@@ -1632,7 +1639,8 @@
 
   List<DartType> readDartTypeList() {
     int length = readUInt();
-    List<DartType> result = new List<DartType>(length);
+    List<DartType> result =
+        new List<DartType>.filled(length, null, growable: true);
     for (int i = 0; i < length; ++i) {
       result[i] = readDartType();
     }
@@ -1641,7 +1649,8 @@
 
   List<NamedType> readNamedTypeList() {
     int length = readUInt();
-    List<NamedType> result = new List<NamedType>(length);
+    List<NamedType> result =
+        new List<NamedType>.filled(length, null, growable: true);
     for (int i = 0; i < length; ++i) {
       result[i] = readNamedType();
     }
@@ -1716,7 +1725,7 @@
     int length = readUInt();
     if (length == 0) return list ?? <TypeParameter>[];
     if (list == null) {
-      list = new List<TypeParameter>(length);
+      list = new List<TypeParameter>.filled(length, null, growable: true);
       for (int i = 0; i < length; ++i) {
         list[i] = new TypeParameter(null, null)..parent = parent;
       }
@@ -1752,7 +1761,8 @@
 
   List<NamedExpression> readNamedExpressionList() {
     int length = readUInt();
-    List<NamedExpression> result = new List<NamedExpression>(length);
+    List<NamedExpression> result =
+        new List<NamedExpression>.filled(length, null, growable: true);
     for (int i = 0; i < length; ++i) {
       result[i] = readNamedExpression();
     }
@@ -1765,7 +1775,8 @@
 
   List<VariableDeclaration> readAndPushVariableDeclarationList() {
     int length = readUInt();
-    List<VariableDeclaration> result = new List<VariableDeclaration>(length);
+    List<VariableDeclaration> result =
+        new List<VariableDeclaration>.filled(length, null, growable: true);
     for (int i = 0; i < length; ++i) {
       result[i] = readAndPushVariableDeclaration();
     }
@@ -1860,7 +1871,8 @@
             final nodeOffset = readUint32();
             offsetToReferenceId[nodeOffset] = j;
           }
-          referencedNodes = new List<Node>(referencesLength);
+          referencedNodes =
+              new List<Node>.filled(referencesLength, null, growable: true);
           containsNodeReferences = true;
         }
 
diff --git a/pkg/kernel/lib/transformations/closure/info.dart b/pkg/kernel/lib/transformations/closure/info.dart
index 6d0a288..ffa5fd7 100644
--- a/pkg/kernel/lib/transformations/closure/info.dart
+++ b/pkg/kernel/lib/transformations/closure/info.dart
@@ -233,7 +233,9 @@
   }
 
   visitTypeParameterType(TypeParameterType node) {
-    if (!isOuterMostContext && node.parameter.parent != currentFunction) {
+    if (!isOuterMostContext &&
+        node.parameter.parent != currentFunction &&
+        !node.parameter.isFunctionTypeTypeParameter) {
       typeVariables
           .putIfAbsent(currentFunction, () => new Set<TypeParameter>())
           .add(node.parameter);
diff --git a/pkg/vm/bin/dump_kernel.dart b/pkg/vm/bin/dump_kernel.dart
index 0f95c9ce..2add763 100644
--- a/pkg/vm/bin/dump_kernel.dart
+++ b/pkg/vm/bin/dump_kernel.dart
@@ -8,6 +8,7 @@
 import 'package:kernel/binary/ast_from_binary.dart'
     show BinaryBuilderWithMetadata;
 
+import 'package:vm/metadata/bytecode.dart' show BytecodeMetadataRepository;
 import 'package:vm/metadata/direct_call.dart' show DirectCallMetadataRepository;
 import 'package:vm/metadata/inferred_type.dart'
     show InferredTypeMetadataRepository;
@@ -37,6 +38,7 @@
   component.addMetadataRepository(new InferredTypeMetadataRepository());
   component.addMetadataRepository(new ProcedureAttributesMetadataRepository());
   component.addMetadataRepository(new UnreachableNodeMetadataRepository());
+  component.addMetadataRepository(new BytecodeMetadataRepository());
 
   final List<int> bytes = new File(input).readAsBytesSync();
   new BinaryBuilderWithMetadata(bytes).readComponent(component);
diff --git a/pkg/vm/bin/gen_kernel.dart b/pkg/vm/bin/gen_kernel.dart
index 5c17f8f..d845a2d 100644
--- a/pkg/vm/bin/gen_kernel.dart
+++ b/pkg/vm/bin/gen_kernel.dart
@@ -14,6 +14,7 @@
 import 'package:kernel/target/vm.dart' show VmTarget;
 import 'package:kernel/text/ast_to_text.dart'
     show globalDebuggingNames, NameSystem;
+import 'package:vm/bytecode/gen_bytecode.dart' show kEnableKernelBytecode;
 import 'package:vm/kernel_front_end.dart' show compileToKernel, ErrorDetector;
 
 final ArgParser _argParser = new ArgParser(allowTrailingOptions: true)
@@ -36,7 +37,9 @@
           'Enable global type flow analysis and related transformations in AOT mode.',
       defaultsTo: true)
   ..addMultiOption('entry-points',
-      help: 'Path to JSON file with the list of entry points');
+      help: 'Path to JSON file with the list of entry points')
+  ..addFlag('gen-bytecode',
+      help: 'Generate bytecode', defaultsTo: kEnableKernelBytecode);
 
 final String _usage = '''
 Usage: dart pkg/vm/bin/gen_kernel.dart --platform vm_platform_strong.dill [options] input.dart
@@ -73,6 +76,7 @@
   final bool aot = options['aot'];
   final bool syncAsync = options['sync-async'];
   final bool tfa = options['tfa'];
+  final bool genBytecode = options['gen-bytecode'];
 
   final List<String> entryPoints = options['entry-points'] ?? <String>[];
   if (entryPoints.isEmpty) {
@@ -100,7 +104,10 @@
 
   Component component = await compileToKernel(
       Uri.base.resolveUri(new Uri.file(filename)), compilerOptions,
-      aot: aot, useGlobalTypeFlowAnalysis: tfa, entryPoints: entryPoints);
+      aot: aot,
+      useGlobalTypeFlowAnalysis: tfa,
+      entryPoints: entryPoints,
+      genBytecode: genBytecode);
 
   if (errorDetector.hasCompilationErrors || (component == null)) {
     return _compileTimeErrorExitCode;
diff --git a/pkg/vm/lib/bytecode/assembler.dart b/pkg/vm/lib/bytecode/assembler.dart
new file mode 100644
index 0000000..ac3b157
--- /dev/null
+++ b/pkg/vm/lib/bytecode/assembler.dart
@@ -0,0 +1,921 @@
+// 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 vm.bytecode.assembler;
+
+import 'dart:typed_data';
+
+import 'package:vm/bytecode/dbc.dart';
+
+class Label {
+  List<int> _jumps = <int>[];
+  int offset = -1;
+
+  Label();
+
+  bool get isBound => offset >= 0;
+
+  int jumpOperand(int jumpOffset) {
+    if (isBound) {
+      // Jump instruction takes an offset in DBC words.
+      return (offset - jumpOffset) >> BytecodeAssembler.kLog2BytesPerBytecode;
+    }
+    _jumps.add(jumpOffset);
+    return 0;
+  }
+
+  List<int> bind(int offset) {
+    assert(!isBound);
+    this.offset = offset;
+    final jumps = _jumps;
+    _jumps = null;
+    return jumps;
+  }
+}
+
+class BytecodeAssembler {
+  static const int kBitsPerInt = 64;
+  static const int kLog2BytesPerBytecode = 2;
+
+  // TODO(alexmarkov): figure out more efficient storage for generated bytecode.
+  final List<int> bytecode = new List<int>();
+  final Uint32List _encodeBufferIn;
+  final Uint8List _encodeBufferOut;
+
+  BytecodeAssembler._(this._encodeBufferIn, this._encodeBufferOut);
+
+  factory BytecodeAssembler() {
+    final buf = new Uint32List(1);
+    return new BytecodeAssembler._(buf, new Uint8List.view(buf.buffer));
+  }
+
+  int get offset => bytecode.length;
+
+  void bind(Label label) {
+    final List<int> jumps = label.bind(offset);
+    for (int jumpOffset in jumps) {
+      patchJump(jumpOffset, label.jumpOperand(jumpOffset));
+    }
+  }
+
+  void emitWord(int word) {
+    _encodeBufferIn[0] = word; // TODO(alexmarkov): Which endianness to use?
+    bytecode.addAll(_encodeBufferOut);
+  }
+
+  void _setWord(int pos, int word) {
+    _encodeBufferIn[0] = word; // TODO(alexmarkov): Which endianness to use?
+    bytecode.setRange(pos, pos + _encodeBufferOut.length, _encodeBufferOut);
+  }
+
+  int _unsigned(int v, int bits) {
+    assert(bits < kBitsPerInt);
+    final int mask = (1 << bits) - 1;
+    if ((v & mask) != v) {
+      throw 'Value $v is out of unsigned $bits-bit range';
+    }
+    return v;
+  }
+
+  int _signed(int v, int bits) {
+    assert(bits < kBitsPerInt);
+    final int shift = kBitsPerInt - bits;
+    if (((v << shift) >> shift) != v) {
+      throw 'Value $v is out of signed $bits-bit range';
+    }
+    final int mask = (1 << bits) - 1;
+    return v & mask;
+  }
+
+  int _uint8(int v) => _unsigned(v, 8);
+  int _uint16(int v) => _unsigned(v, 16);
+
+  int _int8(int v) => _signed(v, 8);
+  int _int16(int v) => _signed(v, 16);
+  int _int24(int v) => _signed(v, 24);
+
+  int _encode0(Opcode opcode) => _uint8(opcode.index);
+
+  int _encodeA(Opcode opcode, int ra) =>
+      _uint8(opcode.index) | (_uint8(ra) << 8);
+
+  int _encodeAD(Opcode opcode, int ra, int rd) =>
+      _uint8(opcode.index) | (_uint8(ra) << 8) | (_uint16(rd) << 16);
+
+  int _encodeAX(Opcode opcode, int ra, int rx) =>
+      _uint8(opcode.index) | (_uint8(ra) << 8) | (_int16(rx) << 16);
+
+  int _encodeD(Opcode opcode, int rd) =>
+      _uint8(opcode.index) | (_uint16(rd) << 16);
+
+  int _encodeX(Opcode opcode, int rx) =>
+      _uint8(opcode.index) | (_int16(rx) << 16);
+
+  int _encodeABC(Opcode opcode, int ra, int rb, int rc) =>
+      _uint8(opcode.index) |
+      (_uint8(ra) << 8) |
+      (_uint8(rb) << 16) |
+      (_uint8(rc) << 24);
+
+  int _encodeABY(Opcode opcode, int ra, int rb, int ry) =>
+      _uint8(opcode.index) |
+      (_uint8(ra) << 8) |
+      (_uint8(rb) << 16) |
+      (_int8(ry) << 24);
+
+  int _encodeT(Opcode opcode, int rt) =>
+      _uint8(opcode.index) | (_int24(rt) << 8);
+
+  void emitTrap() {
+    emitWord(_encode0(Opcode.kTrap));
+  }
+
+  void emitNop(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kNop, ra, rd));
+  }
+
+  void emitCompile() {
+    emitWord(_encode0(Opcode.kCompile));
+  }
+
+  void emitHotCheck(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kHotCheck, ra, rd));
+  }
+
+  void emitIntrinsic(int ra) {
+    emitWord(_encodeA(Opcode.kIntrinsic, ra));
+  }
+
+  void emitDrop1() {
+    emitWord(_encode0(Opcode.kDrop1));
+  }
+
+  void emitDropR(int ra) {
+    emitWord(_encodeA(Opcode.kDropR, ra));
+  }
+
+  void emitDrop(int ra) {
+    emitWord(_encodeA(Opcode.kDrop, ra));
+  }
+
+  void emitJump(Label label) {
+    emitWord(_encodeT(Opcode.kJump, label.jumpOperand(offset)));
+  }
+
+  void patchJump(int pos, int rt) {
+    _setWord(pos, _encodeT(Opcode.kJump, rt));
+  }
+
+  void emitReturn(int ra) {
+    emitWord(_encodeA(Opcode.kReturn, ra));
+  }
+
+  void emitReturnTOS() {
+    emitWord(_encode0(Opcode.kReturnTOS));
+  }
+
+  void emitMove(int ra, int rx) {
+    emitWord(_encodeAX(Opcode.kMove, ra, rx));
+  }
+
+  void emitSwap(int ra, int rx) {
+    emitWord(_encodeAX(Opcode.kSwap, ra, rx));
+  }
+
+  void emitPush(int rx) {
+    emitWord(_encodeX(Opcode.kPush, rx));
+  }
+
+  void emitLoadConstant(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kLoadConstant, ra, rd));
+  }
+
+  void emitLoadClassId(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kLoadClassId, ra, rd));
+  }
+
+  void emitLoadClassIdTOS() {
+    emitWord(_encode0(Opcode.kLoadClassIdTOS));
+  }
+
+  void emitPushConstant(int rd) {
+    emitWord(_encodeD(Opcode.kPushConstant, rd));
+  }
+
+  void emitStoreLocal(int rx) {
+    emitWord(_encodeX(Opcode.kStoreLocal, rx));
+  }
+
+  void emitPopLocal(int rx) {
+    emitWord(_encodeX(Opcode.kPopLocal, rx));
+  }
+
+  void emitIndirectStaticCall(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kIndirectStaticCall, ra, rd));
+  }
+
+  void emitStaticCall(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kStaticCall, ra, rd));
+  }
+
+  void emitInstanceCall1(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kInstanceCall1, ra, rd));
+  }
+
+  void emitInstanceCall2(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kInstanceCall2, ra, rd));
+  }
+
+  void emitInstanceCall1Opt(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kInstanceCall1Opt, ra, rd));
+  }
+
+  void emitInstanceCall2Opt(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kInstanceCall2Opt, ra, rd));
+  }
+
+  void emitPushPolymorphicInstanceCall(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kPushPolymorphicInstanceCall, ra, rd));
+  }
+
+  void emitPushPolymorphicInstanceCallByRange(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kPushPolymorphicInstanceCallByRange, ra, rd));
+  }
+
+  void emitNativeCall(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kNativeCall, ra, rb, rc));
+  }
+
+  void emitOneByteStringFromCharCode(int ra, int rx) {
+    emitWord(_encodeAX(Opcode.kOneByteStringFromCharCode, ra, rx));
+  }
+
+  void emitStringToCharCode(int ra, int rx) {
+    emitWord(_encodeAX(Opcode.kStringToCharCode, ra, rx));
+  }
+
+  void emitAddTOS() {
+    emitWord(_encode0(Opcode.kAddTOS));
+  }
+
+  void emitSubTOS() {
+    emitWord(_encode0(Opcode.kSubTOS));
+  }
+
+  void emitMulTOS() {
+    emitWord(_encode0(Opcode.kMulTOS));
+  }
+
+  void emitBitOrTOS() {
+    emitWord(_encode0(Opcode.kBitOrTOS));
+  }
+
+  void emitBitAndTOS() {
+    emitWord(_encode0(Opcode.kBitAndTOS));
+  }
+
+  void emitEqualTOS() {
+    emitWord(_encode0(Opcode.kEqualTOS));
+  }
+
+  void emitLessThanTOS() {
+    emitWord(_encode0(Opcode.kLessThanTOS));
+  }
+
+  void emitGreaterThanTOS() {
+    emitWord(_encode0(Opcode.kGreaterThanTOS));
+  }
+
+  void emitSmiAddTOS() {
+    emitWord(_encode0(Opcode.kSmiAddTOS));
+  }
+
+  void emitSmiSubTOS() {
+    emitWord(_encode0(Opcode.kSmiSubTOS));
+  }
+
+  void emitSmiMulTOS() {
+    emitWord(_encode0(Opcode.kSmiMulTOS));
+  }
+
+  void emitSmiBitAndTOS() {
+    emitWord(_encode0(Opcode.kSmiBitAndTOS));
+  }
+
+  void emitAdd(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kAdd, ra, rb, rc));
+  }
+
+  void emitSub(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kSub, ra, rb, rc));
+  }
+
+  void emitMul(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kMul, ra, rb, rc));
+  }
+
+  void emitDiv(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kDiv, ra, rb, rc));
+  }
+
+  void emitMod(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kMod, ra, rb, rc));
+  }
+
+  void emitShl(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kShl, ra, rb, rc));
+  }
+
+  void emitShr(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kShr, ra, rb, rc));
+  }
+
+  void emitShlImm(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kShlImm, ra, rb, rc));
+  }
+
+  void emitNeg(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kNeg, ra, rd));
+  }
+
+  void emitBitOr(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kBitOr, ra, rb, rc));
+  }
+
+  void emitBitAnd(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kBitAnd, ra, rb, rc));
+  }
+
+  void emitBitXor(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kBitXor, ra, rb, rc));
+  }
+
+  void emitBitNot(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kBitNot, ra, rd));
+  }
+
+  void emitMin(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kMin, ra, rb, rc));
+  }
+
+  void emitMax(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kMax, ra, rb, rc));
+  }
+
+  void emitWriteIntoDouble(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kWriteIntoDouble, ra, rd));
+  }
+
+  void emitUnboxDouble(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kUnboxDouble, ra, rd));
+  }
+
+  void emitCheckedUnboxDouble(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kCheckedUnboxDouble, ra, rd));
+  }
+
+  void emitUnboxInt32(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kUnboxInt32, ra, rb, rc));
+  }
+
+  void emitBoxInt32(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kBoxInt32, ra, rd));
+  }
+
+  void emitBoxUint32(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kBoxUint32, ra, rd));
+  }
+
+  void emitSmiToDouble(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kSmiToDouble, ra, rd));
+  }
+
+  void emitDoubleToSmi(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kDoubleToSmi, ra, rd));
+  }
+
+  void emitDAdd(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kDAdd, ra, rb, rc));
+  }
+
+  void emitDSub(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kDSub, ra, rb, rc));
+  }
+
+  void emitDMul(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kDMul, ra, rb, rc));
+  }
+
+  void emitDDiv(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kDDiv, ra, rb, rc));
+  }
+
+  void emitDNeg(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kDNeg, ra, rd));
+  }
+
+  void emitDSqrt(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kDSqrt, ra, rd));
+  }
+
+  void emitDMin(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kDMin, ra, rb, rc));
+  }
+
+  void emitDMax(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kDMax, ra, rb, rc));
+  }
+
+  void emitDCos(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kDCos, ra, rd));
+  }
+
+  void emitDSin(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kDSin, ra, rd));
+  }
+
+  void emitDPow(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kDPow, ra, rb, rc));
+  }
+
+  void emitDMod(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kDMod, ra, rb, rc));
+  }
+
+  void emitDTruncate(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kDTruncate, ra, rd));
+  }
+
+  void emitDFloor(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kDFloor, ra, rd));
+  }
+
+  void emitDCeil(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kDCeil, ra, rd));
+  }
+
+  void emitDoubleToFloat(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kDoubleToFloat, ra, rd));
+  }
+
+  void emitFloatToDouble(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kFloatToDouble, ra, rd));
+  }
+
+  void emitDoubleIsNaN(int ra) {
+    emitWord(_encodeA(Opcode.kDoubleIsNaN, ra));
+  }
+
+  void emitDoubleIsInfinite(int ra) {
+    emitWord(_encodeA(Opcode.kDoubleIsInfinite, ra));
+  }
+
+  void emitStoreStaticTOS(int rd) {
+    emitWord(_encodeD(Opcode.kStoreStaticTOS, rd));
+  }
+
+  void emitPushStatic(int rd) {
+    emitWord(_encodeD(Opcode.kPushStatic, rd));
+  }
+
+  void emitInitStaticTOS() {
+    emitWord(_encode0(Opcode.kInitStaticTOS));
+  }
+
+  void emitIfNeStrictTOS() {
+    emitWord(_encode0(Opcode.kIfNeStrictTOS));
+  }
+
+  void emitIfEqStrictTOS() {
+    emitWord(_encode0(Opcode.kIfEqStrictTOS));
+  }
+
+  void emitIfNeStrictNumTOS() {
+    emitWord(_encode0(Opcode.kIfNeStrictNumTOS));
+  }
+
+  void emitIfEqStrictNumTOS() {
+    emitWord(_encode0(Opcode.kIfEqStrictNumTOS));
+  }
+
+  void emitIfSmiLtTOS() {
+    emitWord(_encode0(Opcode.kIfSmiLtTOS));
+  }
+
+  void emitIfSmiLeTOS() {
+    emitWord(_encode0(Opcode.kIfSmiLeTOS));
+  }
+
+  void emitIfSmiGeTOS() {
+    emitWord(_encode0(Opcode.kIfSmiGeTOS));
+  }
+
+  void emitIfSmiGtTOS() {
+    emitWord(_encode0(Opcode.kIfSmiGtTOS));
+  }
+
+  void emitIfNeStrict(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kIfNeStrict, ra, rd));
+  }
+
+  void emitIfEqStrict(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kIfEqStrict, ra, rd));
+  }
+
+  void emitIfLe(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kIfLe, ra, rd));
+  }
+
+  void emitIfLt(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kIfLt, ra, rd));
+  }
+
+  void emitIfGe(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kIfGe, ra, rd));
+  }
+
+  void emitIfGt(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kIfGt, ra, rd));
+  }
+
+  void emitIfULe(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kIfULe, ra, rd));
+  }
+
+  void emitIfULt(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kIfULt, ra, rd));
+  }
+
+  void emitIfUGe(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kIfUGe, ra, rd));
+  }
+
+  void emitIfUGt(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kIfUGt, ra, rd));
+  }
+
+  void emitIfDNe(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kIfDNe, ra, rd));
+  }
+
+  void emitIfDEq(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kIfDEq, ra, rd));
+  }
+
+  void emitIfDLe(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kIfDLe, ra, rd));
+  }
+
+  void emitIfDLt(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kIfDLt, ra, rd));
+  }
+
+  void emitIfDGe(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kIfDGe, ra, rd));
+  }
+
+  void emitIfDGt(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kIfDGt, ra, rd));
+  }
+
+  void emitIfNeStrictNum(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kIfNeStrictNum, ra, rd));
+  }
+
+  void emitIfEqStrictNum(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kIfEqStrictNum, ra, rd));
+  }
+
+  void emitIfEqNull(int ra) {
+    emitWord(_encodeA(Opcode.kIfEqNull, ra));
+  }
+
+  void emitIfNeNull(int ra) {
+    emitWord(_encodeA(Opcode.kIfNeNull, ra));
+  }
+
+  void emitCreateArrayTOS() {
+    emitWord(_encode0(Opcode.kCreateArrayTOS));
+  }
+
+  void emitCreateArrayOpt(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kCreateArrayOpt, ra, rb, rc));
+  }
+
+  void emitAllocate(int rd) {
+    emitWord(_encodeD(Opcode.kAllocate, rd));
+  }
+
+  void emitAllocateT() {
+    emitWord(_encode0(Opcode.kAllocateT));
+  }
+
+  void emitAllocateOpt(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kAllocateOpt, ra, rd));
+  }
+
+  void emitAllocateTOpt(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kAllocateTOpt, ra, rd));
+  }
+
+  void emitStoreIndexedTOS() {
+    emitWord(_encode0(Opcode.kStoreIndexedTOS));
+  }
+
+  void emitStoreIndexed(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kStoreIndexed, ra, rb, rc));
+  }
+
+  void emitStoreIndexedUint8(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kStoreIndexedUint8, ra, rb, rc));
+  }
+
+  void emitStoreIndexedExternalUint8(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kStoreIndexedExternalUint8, ra, rb, rc));
+  }
+
+  void emitStoreIndexedOneByteString(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kStoreIndexedOneByteString, ra, rb, rc));
+  }
+
+  void emitStoreIndexedUint32(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kStoreIndexedUint32, ra, rb, rc));
+  }
+
+  void emitStoreIndexedFloat32(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kStoreIndexedFloat32, ra, rb, rc));
+  }
+
+  void emitStoreIndexed4Float32(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kStoreIndexed4Float32, ra, rb, rc));
+  }
+
+  void emitStoreIndexedFloat64(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kStoreIndexedFloat64, ra, rb, rc));
+  }
+
+  void emitStoreIndexed8Float64(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kStoreIndexed8Float64, ra, rb, rc));
+  }
+
+  void emitNoSuchMethod() {
+    emitWord(_encode0(Opcode.kNoSuchMethod));
+  }
+
+  void emitTailCall() {
+    emitWord(_encode0(Opcode.kTailCall));
+  }
+
+  void emitTailCallOpt(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kTailCallOpt, ra, rd));
+  }
+
+  void emitLoadArgDescriptor() {
+    emitWord(_encode0(Opcode.kLoadArgDescriptor));
+  }
+
+  void emitLoadArgDescriptorOpt(int ra) {
+    emitWord(_encodeA(Opcode.kLoadArgDescriptorOpt, ra));
+  }
+
+  void emitLoadFpRelativeSlot(int rx) {
+    emitWord(_encodeX(Opcode.kLoadFpRelativeSlot, rx));
+  }
+
+  void emitLoadFpRelativeSlotOpt(int ra, int rb, int ry) {
+    emitWord(_encodeABY(Opcode.kLoadFpRelativeSlotOpt, ra, rb, ry));
+  }
+
+  void emitStoreFpRelativeSlot(int rx) {
+    emitWord(_encodeX(Opcode.kStoreFpRelativeSlot, rx));
+  }
+
+  void emitStoreFpRelativeSlotOpt(int ra, int rb, int ry) {
+    emitWord(_encodeABY(Opcode.kStoreFpRelativeSlotOpt, ra, rb, ry));
+  }
+
+  void emitLoadIndexedTOS() {
+    emitWord(_encode0(Opcode.kLoadIndexedTOS));
+  }
+
+  void emitLoadIndexed(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kLoadIndexed, ra, rb, rc));
+  }
+
+  void emitLoadIndexedUint8(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kLoadIndexedUint8, ra, rb, rc));
+  }
+
+  void emitLoadIndexedInt8(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kLoadIndexedInt8, ra, rb, rc));
+  }
+
+  void emitLoadIndexedInt32(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kLoadIndexedInt32, ra, rb, rc));
+  }
+
+  void emitLoadIndexedUint32(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kLoadIndexedUint32, ra, rb, rc));
+  }
+
+  void emitLoadIndexedExternalUint8(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kLoadIndexedExternalUint8, ra, rb, rc));
+  }
+
+  void emitLoadIndexedExternalInt8(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kLoadIndexedExternalInt8, ra, rb, rc));
+  }
+
+  void emitLoadIndexedFloat32(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kLoadIndexedFloat32, ra, rb, rc));
+  }
+
+  void emitLoadIndexed4Float32(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kLoadIndexed4Float32, ra, rb, rc));
+  }
+
+  void emitLoadIndexedFloat64(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kLoadIndexedFloat64, ra, rb, rc));
+  }
+
+  void emitLoadIndexed8Float64(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kLoadIndexed8Float64, ra, rb, rc));
+  }
+
+  void emitLoadIndexedOneByteString(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kLoadIndexedOneByteString, ra, rb, rc));
+  }
+
+  void emitLoadIndexedTwoByteString(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kLoadIndexedTwoByteString, ra, rb, rc));
+  }
+
+  void emitStoreField(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kStoreField, ra, rb, rc));
+  }
+
+  void emitStoreFieldExt(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kStoreFieldExt, ra, rd));
+  }
+
+  void emitStoreFieldTOS(int rd) {
+    emitWord(_encodeD(Opcode.kStoreFieldTOS, rd));
+  }
+
+  void emitLoadField(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kLoadField, ra, rb, rc));
+  }
+
+  void emitLoadFieldExt(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kLoadFieldExt, ra, rd));
+  }
+
+  void emitLoadUntagged(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kLoadUntagged, ra, rb, rc));
+  }
+
+  void emitLoadFieldTOS(int rd) {
+    emitWord(_encodeD(Opcode.kLoadFieldTOS, rd));
+  }
+
+  void emitBooleanNegateTOS() {
+    emitWord(_encode0(Opcode.kBooleanNegateTOS));
+  }
+
+  void emitBooleanNegate(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kBooleanNegate, ra, rd));
+  }
+
+  void emitThrow(int ra) {
+    emitWord(_encodeA(Opcode.kThrow, ra));
+  }
+
+  void emitEntry(int rd) {
+    emitWord(_encodeD(Opcode.kEntry, rd));
+  }
+
+  void emitEntryOptimized(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kEntryOptimized, ra, rd));
+  }
+
+  void emitFrame(int rd) {
+    emitWord(_encodeD(Opcode.kFrame, rd));
+  }
+
+  void emitSetFrame(int ra) {
+    emitWord(_encodeA(Opcode.kSetFrame, ra));
+  }
+
+  void emitAllocateContext(int rd) {
+    emitWord(_encodeD(Opcode.kAllocateContext, rd));
+  }
+
+  void emitAllocateUninitializedContext(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kAllocateUninitializedContext, ra, rd));
+  }
+
+  void emitCloneContext() {
+    emitWord(_encode0(Opcode.kCloneContext));
+  }
+
+  void emitMoveSpecial(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kMoveSpecial, ra, rd));
+  }
+
+  void emitInstantiateType(int rd) {
+    emitWord(_encodeD(Opcode.kInstantiateType, rd));
+  }
+
+  void emitInstantiateTypeArgumentsTOS(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kInstantiateTypeArgumentsTOS, ra, rd));
+  }
+
+  void emitInstanceOf() {
+    emitWord(_encode0(Opcode.kInstanceOf));
+  }
+
+  void emitBadTypeError() {
+    emitWord(_encode0(Opcode.kBadTypeError));
+  }
+
+  void emitAssertAssignable(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kAssertAssignable, ra, rd));
+  }
+
+  void emitAssertSubtype() {
+    emitWord(_encode0(Opcode.kAssertSubtype));
+  }
+
+  void emitAssertBoolean(int ra) {
+    emitWord(_encodeA(Opcode.kAssertBoolean, ra));
+  }
+
+  void emitTestSmi(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kTestSmi, ra, rd));
+  }
+
+  void emitTestCids(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kTestCids, ra, rd));
+  }
+
+  void emitCheckSmi(int ra) {
+    emitWord(_encodeA(Opcode.kCheckSmi, ra));
+  }
+
+  void emitCheckEitherNonSmi(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kCheckEitherNonSmi, ra, rd));
+  }
+
+  void emitCheckClassId(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kCheckClassId, ra, rd));
+  }
+
+  void emitCheckClassIdRange(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kCheckClassIdRange, ra, rd));
+  }
+
+  void emitCheckBitTest(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kCheckBitTest, ra, rd));
+  }
+
+  void emitCheckCids(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kCheckCids, ra, rb, rc));
+  }
+
+  void emitCheckCidsByRange(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kCheckCidsByRange, ra, rb, rc));
+  }
+
+  void emitCheckStack() {
+    emitWord(_encode0(Opcode.kCheckStack));
+  }
+
+  void emitCheckStackAlwaysExit() {
+    emitWord(_encode0(Opcode.kCheckStackAlwaysExit));
+  }
+
+  void emitCheckFunctionTypeArgs(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kCheckFunctionTypeArgs, ra, rd));
+  }
+
+  void emitDebugStep() {
+    emitWord(_encode0(Opcode.kDebugStep));
+  }
+
+  void emitDebugBreak(int ra) {
+    emitWord(_encodeA(Opcode.kDebugBreak, ra));
+  }
+
+  void emitDeopt(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kDeopt, ra, rd));
+  }
+
+  void emitDeoptRewind() {
+    emitWord(_encode0(Opcode.kDeoptRewind));
+  }
+
+  void emitEntryOptional(int ra, int rb, int rc) {
+    emitWord(_encodeABC(Opcode.kEntryOptional, ra, rb, rc));
+  }
+}
diff --git a/pkg/vm/lib/bytecode/constant_pool.dart b/pkg/vm/lib/bytecode/constant_pool.dart
new file mode 100644
index 0000000..770ff55
--- /dev/null
+++ b/pkg/vm/lib/bytecode/constant_pool.dart
@@ -0,0 +1,840 @@
+// 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 vm.bytecode.constant_pool;
+
+import 'dart:typed_data';
+
+import 'package:kernel/ast.dart' hide MapEntry;
+
+/*
+
+In kernel binary, constant pool is encoded in the following way
+(using notation from pkg/kernel/binary.md):
+
+type ConstantPool {
+  List<ConstantPoolEntry>
+}
+
+abstract type ConstantPoolEntry {
+  Byte tag;
+}
+
+type ConstantNull extends ConstantPoolEntry {
+  Byte tag = 1;
+}
+
+type ConstantString extends ConstantPoolEntry {
+  Byte tag = 2;
+  StringReference value;
+}
+
+type ConstantInt extends ConstantPoolEntry {
+  Byte tag = 3;
+  UInt32 low;
+  UInt32 high;
+}
+
+type ConstantDouble extends ConstantPoolEntry {
+  Byte tag = 4;
+  UInt32 low;
+  UInt32 high;
+}
+
+type ConstantBool extends ConstantPoolEntry {
+  Byte tag = 5;
+  UInt flag;
+}
+
+type ConstantArgDesc extends ConstantPoolEntry {
+  Byte tag = 6;
+  UInt numArguments;
+  UInt numTypeArgs;
+  List<StringReference> names;
+}
+
+type ConstantICData extends ConstantPoolEntry {
+  Byte tag = 7;
+  StringReference targetName;
+  UInt argDescConstantIndex;
+}
+
+type ConstantStaticICData extends ConstantPoolEntry {
+  Byte tag = 8;
+  CanonicalNameReference target;
+  UInt argDescConstantIndex;
+}
+
+type ConstantField extends ConstantPoolEntry {
+  Byte tag = 9;
+  CanonicalNameReference field;
+}
+
+type ConstantFieldOffset extends ConstantPoolEntry {
+  Byte tag = 10;
+  CanonicalNameReference field;
+}
+
+type ConstantClass extends ConstantPoolEntry {
+  Byte tag = 11;
+  CanonicalNameReference class;
+}
+
+type ConstantTypeArgumentsFieldOffset extends ConstantPoolEntry {
+  Byte tag = 12;
+  CanonicalNameReference class;
+}
+
+type ConstantTearOff extends ConstantPoolEntry {
+  Byte tag = 13;
+  CanonicalNameReference target;
+}
+
+type ConstantType extends ConstantPoolEntry {
+  Byte tag = 14;
+  NodeReference type;
+}
+
+type ConstantTypeArguments extends ConstantPoolEntry {
+  Byte tag = 15;
+  List<NodeReference> types;
+}
+
+type ConstantList extends ConstantPoolEntry {
+  Byte tag = 16;
+  NodeReference typeArg;
+  List<UInt> entries;
+}
+
+type ConstantInstance extends ConstantPoolEntry {
+  Byte tag = 17;
+  CanonicalNameReference class;
+  UInt typeArgumentsConstantIndex;
+  List<Pair<CanonicalNameReference, UInt>> fieldValues;
+}
+
+type ConstantSymbol extends ConstantPoolEntry {
+  Byte tag = 18;
+  StringReference value;
+}
+
+*/
+
+enum ConstantTag {
+  kInvalid,
+  kNull,
+  kString,
+  kInt,
+  kDouble,
+  kBool,
+  kArgDesc,
+  kICData,
+  kStaticICData,
+  kField,
+  kFieldOffset,
+  kClass,
+  kTypeArgumentsFieldOffset,
+  kTearOff,
+  kType,
+  kTypeArguments,
+  kList,
+  kInstance,
+  kSymbol,
+}
+
+abstract class ConstantPoolEntry {
+  const ConstantPoolEntry();
+
+  ConstantTag get tag;
+
+  void writeToBinary(BinarySink sink) {
+    sink.writeUInt30(tag.index);
+    writeValueToBinary(sink);
+  }
+
+  void writeValueToBinary(BinarySink sink);
+
+  factory ConstantPoolEntry.readFromBinary(BinarySource source) {
+    ConstantTag tag = ConstantTag.values[source.readUInt()];
+    switch (tag) {
+      case ConstantTag.kInvalid:
+        break;
+      case ConstantTag.kNull:
+        return new ConstantNull.readFromBinary(source);
+      case ConstantTag.kString:
+        return new ConstantString.readFromBinary(source);
+      case ConstantTag.kInt:
+        return new ConstantInt.readFromBinary(source);
+      case ConstantTag.kDouble:
+        return new ConstantDouble.readFromBinary(source);
+      case ConstantTag.kBool:
+        return new ConstantBool.readFromBinary(source);
+      case ConstantTag.kICData:
+        return new ConstantICData.readFromBinary(source);
+      case ConstantTag.kStaticICData:
+        return new ConstantStaticICData.readFromBinary(source);
+      case ConstantTag.kArgDesc:
+        return new ConstantArgDesc.readFromBinary(source);
+      case ConstantTag.kField:
+        return new ConstantField.readFromBinary(source);
+      case ConstantTag.kFieldOffset:
+        return new ConstantFieldOffset.readFromBinary(source);
+      case ConstantTag.kClass:
+        return new ConstantClass.readFromBinary(source);
+      case ConstantTag.kTypeArgumentsFieldOffset:
+        return new ConstantTypeArgumentsFieldOffset.readFromBinary(source);
+      case ConstantTag.kTearOff:
+        return new ConstantTearOff.readFromBinary(source);
+      case ConstantTag.kType:
+        return new ConstantType.readFromBinary(source);
+      case ConstantTag.kTypeArguments:
+        return new ConstantTypeArguments.readFromBinary(source);
+      case ConstantTag.kList:
+        return new ConstantList.readFromBinary(source);
+      case ConstantTag.kInstance:
+        return new ConstantInstance.readFromBinary(source);
+      case ConstantTag.kSymbol:
+        return new ConstantSymbol.readFromBinary(source);
+    }
+    throw 'Unexpected constant tag $tag';
+  }
+}
+
+class ConstantNull extends ConstantPoolEntry {
+  const ConstantNull();
+
+  @override
+  ConstantTag get tag => ConstantTag.kNull;
+
+  @override
+  void writeValueToBinary(BinarySink sink) {}
+
+  ConstantNull.readFromBinary(BinarySource source);
+
+  @override
+  String toString() => 'Null';
+
+  @override
+  int get hashCode => 1961;
+
+  @override
+  bool operator ==(other) => other is ConstantNull;
+}
+
+class ConstantString extends ConstantPoolEntry {
+  final String value;
+
+  ConstantString(this.value);
+  ConstantString.fromLiteral(StringLiteral literal) : this(literal.value);
+
+  @override
+  ConstantTag get tag => ConstantTag.kString;
+
+  @override
+  void writeValueToBinary(BinarySink sink) {
+    sink.writeStringReference(value);
+  }
+
+  ConstantString.readFromBinary(BinarySource source)
+      : value = source.readStringReference();
+
+  @override
+  String toString() => 'String \'$value\'';
+
+  @override
+  int get hashCode => value.hashCode;
+
+  @override
+  bool operator ==(other) =>
+      other is ConstantString && this.value == other.value;
+}
+
+class ConstantInt extends ConstantPoolEntry {
+  final int value;
+
+  ConstantInt(this.value);
+  ConstantInt.fromLiteral(IntLiteral literal) : this(literal.value);
+
+  @override
+  ConstantTag get tag => ConstantTag.kInt;
+
+  @override
+  void writeValueToBinary(BinarySink sink) {
+    // TODO(alexmarkov): more efficient encoding
+    sink.writeUInt32(value & 0xffffffff);
+    sink.writeUInt32((value >> 32) & 0xffffffff);
+  }
+
+  ConstantInt.readFromBinary(BinarySource source)
+      : value = source.readUint32() | (source.readUint32() << 32);
+
+  @override
+  String toString() => 'Int $value';
+
+  @override
+  int get hashCode => value;
+
+  @override
+  bool operator ==(other) => other is ConstantInt && this.value == other.value;
+}
+
+class ConstantDouble extends ConstantPoolEntry {
+  final double value;
+
+  ConstantDouble(this.value);
+  ConstantDouble.fromLiteral(DoubleLiteral literal) : this(literal.value);
+
+  @override
+  ConstantTag get tag => ConstantTag.kDouble;
+
+  static int doubleToIntBits(double value) {
+    final buf = new ByteData(8);
+    buf.setFloat64(0, value, Endian.host);
+    return buf.getInt64(0, Endian.host);
+  }
+
+  static double intBitsToDouble(int bits) {
+    final buf = new ByteData(8);
+    buf.setInt64(0, bits, Endian.host);
+    return buf.getFloat64(0, Endian.host);
+  }
+
+  @override
+  void writeValueToBinary(BinarySink sink) {
+    // TODO(alexmarkov): more efficient encoding
+    int bits = doubleToIntBits(value);
+    sink.writeUInt32(bits & 0xffffffff);
+    sink.writeUInt32((bits >> 32) & 0xffffffff);
+  }
+
+  ConstantDouble.readFromBinary(BinarySource source)
+      : value =
+            intBitsToDouble(source.readUint32() | (source.readUint32() << 32));
+
+  @override
+  String toString() => 'Double $value';
+
+  @override
+  int get hashCode => value.hashCode;
+
+  @override
+  bool operator ==(other) =>
+      other is ConstantDouble && value.compareTo(other.value) == 0;
+}
+
+class ConstantBool extends ConstantPoolEntry {
+  final bool value;
+
+  ConstantBool(this.value);
+  ConstantBool.fromLiteral(BoolLiteral literal) : this(literal.value);
+
+  @override
+  ConstantTag get tag => ConstantTag.kBool;
+
+  @override
+  void writeValueToBinary(BinarySink sink) {
+    sink.writeUInt30(value ? 1 : 0);
+  }
+
+  ConstantBool.readFromBinary(BinarySource source)
+      : value = source.readUInt() != 0;
+
+  @override
+  String toString() => 'Bool $value';
+
+  @override
+  int get hashCode => value.hashCode;
+
+  @override
+  bool operator ==(other) => other is ConstantBool && this.value == other.value;
+}
+
+class ConstantArgDesc extends ConstantPoolEntry {
+  final int numArguments;
+  final int numTypeArgs;
+  final List<String> argNames;
+
+  ConstantArgDesc(this.numArguments,
+      {this.numTypeArgs = 0, this.argNames = const <String>[]});
+
+  ConstantArgDesc.fromArguments(Arguments args, {bool hasReceiver: false})
+      : this(args.positional.length + args.named.length + (hasReceiver ? 1 : 0),
+            numTypeArgs: args.types.length,
+            argNames: new List<String>.from(args.named.map((ne) => ne.name)));
+
+  @override
+  ConstantTag get tag => ConstantTag.kArgDesc;
+
+  @override
+  void writeValueToBinary(BinarySink sink) {
+    sink.writeUInt30(numArguments);
+    sink.writeUInt30(numTypeArgs);
+    sink.writeUInt30(argNames.length);
+    argNames.forEach(sink.writeStringReference);
+  }
+
+  ConstantArgDesc.readFromBinary(BinarySource source)
+      : numArguments = source.readUInt(),
+        numTypeArgs = source.readUInt(),
+        argNames = new List<String>.generate(
+            source.readUInt(), (_) => source.readStringReference());
+
+  @override
+  String toString() =>
+      'ArgDesc num-args $numArguments, num-type-args $numTypeArgs, names $argNames';
+
+  @override
+  int get hashCode =>
+      (numArguments * 31 + numTypeArgs) * 31 + listHashCode(argNames);
+
+  @override
+  bool operator ==(other) =>
+      other is ConstantArgDesc &&
+      this.numArguments == other.numArguments &&
+      this.numTypeArgs == other.numTypeArgs &&
+      listEquals(this.argNames, other.argNames);
+}
+
+class ConstantICData extends ConstantPoolEntry {
+  final String targetName;
+  final int argDescConstantIndex;
+
+  ConstantICData(this.targetName, this.argDescConstantIndex);
+
+  @override
+  ConstantTag get tag => ConstantTag.kICData;
+
+  @override
+  void writeValueToBinary(BinarySink sink) {
+    sink.writeStringReference(targetName);
+    sink.writeUInt30(argDescConstantIndex);
+  }
+
+  ConstantICData.readFromBinary(BinarySource source)
+      : targetName = source.readStringReference(),
+        argDescConstantIndex = source.readUInt();
+
+  @override
+  String toString() =>
+      'ICData target-name \'$targetName\', arg-desc CP#$argDescConstantIndex';
+
+  // ConstantICData entries are created per call site and should not be merged,
+  // so ConstantICData class uses identity [hashCode] and [operator ==].
+
+  @override
+  int get hashCode => identityHashCode(this);
+
+  @override
+  bool operator ==(other) => identical(this, other);
+}
+
+class ConstantStaticICData extends ConstantPoolEntry {
+  final Reference _reference;
+  final int argDescConstantIndex;
+
+  ConstantStaticICData(Member member, int argDescConstantIndex)
+      : this.byReference(member.reference, argDescConstantIndex);
+  ConstantStaticICData.byReference(this._reference, this.argDescConstantIndex);
+
+  Member get target => _reference.asMember;
+
+  @override
+  ConstantTag get tag => ConstantTag.kStaticICData;
+
+  @override
+  void writeValueToBinary(BinarySink sink) {
+    sink.writeCanonicalNameReference(getCanonicalNameOfMember(target));
+    sink.writeUInt30(argDescConstantIndex);
+  }
+
+  ConstantStaticICData.readFromBinary(BinarySource source)
+      : _reference = source.readCanonicalNameReference().getReference(),
+        argDescConstantIndex = source.readUInt();
+
+  @override
+  String toString() =>
+      'StaticICData 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
+  // [operator ==].
+
+  @override
+  int get hashCode => identityHashCode(this);
+
+  @override
+  bool operator ==(other) => identical(this, other);
+}
+
+class ConstantField extends ConstantPoolEntry {
+  final Reference _reference;
+
+  Field get field => _reference.asField;
+
+  ConstantField(Field field) : this.byReference(field.reference);
+  ConstantField.byReference(this._reference);
+
+  @override
+  ConstantTag get tag => ConstantTag.kField;
+
+  @override
+  void writeValueToBinary(BinarySink sink) {
+    sink.writeCanonicalNameReference(getCanonicalNameOfMember(field));
+  }
+
+  ConstantField.readFromBinary(BinarySource source)
+      : _reference = source.readCanonicalNameReference().getReference();
+
+  @override
+  String toString() => 'Field $field';
+
+  @override
+  int get hashCode => field.hashCode;
+
+  @override
+  bool operator ==(other) =>
+      other is ConstantField && this.field == other.field;
+}
+
+class ConstantFieldOffset extends ConstantPoolEntry {
+  final Reference _reference;
+
+  Field get field => _reference.asField;
+
+  ConstantFieldOffset(Field field) : this.byReference(field.reference);
+  ConstantFieldOffset.byReference(this._reference);
+
+  @override
+  ConstantTag get tag => ConstantTag.kFieldOffset;
+
+  @override
+  void writeValueToBinary(BinarySink sink) {
+    sink.writeCanonicalNameReference(getCanonicalNameOfMember(field));
+  }
+
+  ConstantFieldOffset.readFromBinary(BinarySource source)
+      : _reference = source.readCanonicalNameReference().getReference();
+
+  @override
+  String toString() => 'FieldOffset $field';
+
+  @override
+  int get hashCode => field.hashCode;
+
+  @override
+  bool operator ==(other) =>
+      other is ConstantFieldOffset && this.field == other.field;
+}
+
+class ConstantClass extends ConstantPoolEntry {
+  final Reference _reference;
+
+  Class get classNode => _reference.asClass;
+
+  ConstantClass(Class class_) : this.byReference(class_.reference);
+  ConstantClass.byReference(this._reference);
+
+  @override
+  ConstantTag get tag => ConstantTag.kClass;
+
+  @override
+  void writeValueToBinary(BinarySink sink) {
+    sink.writeCanonicalNameReference(getCanonicalNameOfClass(classNode));
+  }
+
+  ConstantClass.readFromBinary(BinarySource source)
+      : _reference = source.readCanonicalNameReference().getReference();
+
+  @override
+  String toString() => 'Class $classNode';
+
+  @override
+  int get hashCode => classNode.hashCode;
+
+  @override
+  bool operator ==(other) =>
+      other is ConstantClass && this.classNode == other.classNode;
+}
+
+class ConstantTypeArgumentsFieldOffset extends ConstantPoolEntry {
+  final Reference _reference;
+
+  Class get classNode => _reference.asClass;
+
+  ConstantTypeArgumentsFieldOffset(Class class_)
+      : this.byReference(class_.reference);
+  ConstantTypeArgumentsFieldOffset.byReference(this._reference);
+
+  @override
+  ConstantTag get tag => ConstantTag.kTypeArgumentsFieldOffset;
+
+  @override
+  void writeValueToBinary(BinarySink sink) {
+    sink.writeCanonicalNameReference(getCanonicalNameOfClass(classNode));
+  }
+
+  ConstantTypeArgumentsFieldOffset.readFromBinary(BinarySource source)
+      : _reference = source.readCanonicalNameReference().getReference();
+
+  @override
+  String toString() => 'TypeArgumentsFieldOffset $classNode';
+
+  @override
+  int get hashCode => classNode.hashCode;
+
+  @override
+  bool operator ==(other) =>
+      other is ConstantTypeArgumentsFieldOffset &&
+      this.classNode == other.classNode;
+}
+
+class ConstantTearOff extends ConstantPoolEntry {
+  final Reference _reference;
+
+  Procedure get procedure => _reference.asProcedure;
+
+  ConstantTearOff(Procedure procedure) : this.byReference(procedure.reference);
+  ConstantTearOff.byReference(this._reference);
+
+  @override
+  ConstantTag get tag => ConstantTag.kTearOff;
+
+  @override
+  void writeValueToBinary(BinarySink sink) {
+    sink.writeCanonicalNameReference(getCanonicalNameOfMember(procedure));
+  }
+
+  ConstantTearOff.readFromBinary(BinarySource source)
+      : _reference = source.readCanonicalNameReference().getReference();
+
+  @override
+  String toString() => 'TearOff $procedure';
+
+  @override
+  int get hashCode => procedure.hashCode;
+
+  @override
+  bool operator ==(other) =>
+      other is ConstantTearOff && this.procedure == other.procedure;
+}
+
+class ConstantType extends ConstantPoolEntry {
+  final DartType type;
+
+  ConstantType(this.type);
+
+  @override
+  ConstantTag get tag => ConstantTag.kType;
+
+  @override
+  void writeValueToBinary(BinarySink sink) {
+    sink.writeNodeReference(type);
+  }
+
+  ConstantType.readFromBinary(BinarySource source)
+      : type = source.readNodeReference() as DartType;
+
+  @override
+  String toString() => 'Type $type';
+
+  @override
+  int get hashCode => type.hashCode;
+
+  @override
+  bool operator ==(other) => other is ConstantType && this.type == other.type;
+}
+
+class ConstantTypeArguments extends ConstantPoolEntry {
+  final List<DartType> typeArgs;
+
+  ConstantTypeArguments(this.typeArgs);
+
+  @override
+  ConstantTag get tag => ConstantTag.kTypeArguments;
+
+  @override
+  void writeValueToBinary(BinarySink sink) {
+    sink.writeUInt30(typeArgs.length);
+    typeArgs.forEach(sink.writeNodeReference);
+  }
+
+  ConstantTypeArguments.readFromBinary(BinarySource source)
+      : typeArgs = new List<DartType>.generate(
+            source.readUInt(), (_) => source.readNodeReference() as DartType);
+
+  @override
+  String toString() => 'TypeArgs $typeArgs';
+
+  @override
+  int get hashCode => listHashCode(typeArgs);
+
+  @override
+  bool operator ==(other) =>
+      other is ConstantTypeArguments &&
+      listEquals(this.typeArgs, other.typeArgs);
+}
+
+class ConstantList extends ConstantPoolEntry {
+  final DartType typeArg;
+  final List<int> entries;
+
+  ConstantList(this.typeArg, this.entries);
+
+  @override
+  ConstantTag get tag => ConstantTag.kList;
+
+  @override
+  void writeValueToBinary(BinarySink sink) {
+    sink.writeNodeReference(typeArg);
+    sink.writeUInt30(entries.length);
+    entries.forEach(sink.writeUInt30);
+  }
+
+  ConstantList.readFromBinary(BinarySource source)
+      : typeArg = source.readNodeReference() as DartType,
+        entries =
+            new List<int>.generate(source.readUInt(), (_) => source.readUInt());
+
+  @override
+  String toString() => 'List type-arg $typeArg, entries CP# $entries';
+
+  @override
+  int get hashCode => typeArg.hashCode ^ listHashCode(entries);
+
+  @override
+  bool operator ==(other) =>
+      other is ConstantList &&
+      this.typeArg == other.typeArg &&
+      listEquals(this.entries, other.entries);
+}
+
+class ConstantInstance extends ConstantPoolEntry {
+  final Reference _classReference;
+  final int _typeArgumentsConstantIndex;
+  final Map<Reference, int> _fieldValues;
+
+  ConstantInstance(Class class_, int typeArgumentsConstantIndex,
+      Map<Reference, int> fieldValues)
+      : this.byReference(
+            class_.reference, typeArgumentsConstantIndex, fieldValues);
+
+  ConstantInstance.byReference(this._classReference,
+      this._typeArgumentsConstantIndex, this._fieldValues);
+
+  @override
+  ConstantTag get tag => ConstantTag.kInstance;
+
+  Class get classNode => _classReference.asClass;
+
+  @override
+  void writeValueToBinary(BinarySink sink) {
+    sink.writeCanonicalNameReference(getCanonicalNameOfClass(classNode));
+    sink.writeUInt30(_typeArgumentsConstantIndex);
+    sink.writeUInt30(_fieldValues.length);
+    _fieldValues.forEach((Reference fieldRef, int valueIndex) {
+      sink.writeCanonicalNameReference(
+          getCanonicalNameOfMember(fieldRef.asField));
+      sink.writeUInt30(valueIndex);
+    });
+  }
+
+  ConstantInstance.readFromBinary(BinarySource source)
+      : _classReference = source.readCanonicalNameReference().getReference(),
+        _typeArgumentsConstantIndex = source.readUInt(),
+        _fieldValues = new Map<Reference, int>() {
+    final fieldValuesLen = source.readUInt();
+    for (int i = 0; i < fieldValuesLen; i++) {
+      final fieldRef = source.readCanonicalNameReference().getReference();
+      final valueIndex = source.readUInt();
+      _fieldValues[fieldRef] = valueIndex;
+    }
+  }
+
+  @override
+  String toString() =>
+      'Instance $classNode type-args CP#$_typeArgumentsConstantIndex'
+      ' ${_fieldValues.map<String, int>((Reference fieldRef, int valueIndex) =>
+              new MapEntry(fieldRef.asField.name.name, valueIndex))}';
+
+  @override
+  int get hashCode =>
+      (classNode.hashCode * 31 + _typeArgumentsConstantIndex) * 31 +
+      mapHashCode(_fieldValues);
+
+  @override
+  bool operator ==(other) =>
+      other is ConstantInstance &&
+      this.classNode == other.classNode &&
+      this._typeArgumentsConstantIndex == other._typeArgumentsConstantIndex &&
+      mapEquals(this._fieldValues, other._fieldValues);
+}
+
+class ConstantSymbol extends ConstantPoolEntry {
+  final String value;
+
+  ConstantSymbol(this.value);
+  ConstantSymbol.fromLiteral(SymbolLiteral literal) : this(literal.value);
+
+  @override
+  ConstantTag get tag => ConstantTag.kSymbol;
+
+  @override
+  void writeValueToBinary(BinarySink sink) {
+    sink.writeStringReference(value);
+  }
+
+  ConstantSymbol.readFromBinary(BinarySource source)
+      : value = source.readStringReference();
+
+  @override
+  String toString() => 'Symbol \'$value\'';
+
+  @override
+  int get hashCode => value.hashCode;
+
+  @override
+  bool operator ==(other) =>
+      other is ConstantSymbol && this.value == other.value;
+}
+
+class ConstantPool {
+  final List<ConstantPoolEntry> entries = <ConstantPoolEntry>[];
+  final Map<ConstantPoolEntry, int> _canonicalizationCache =
+      <ConstantPoolEntry, int>{};
+
+  ConstantPool();
+
+  int add(ConstantPoolEntry entry) {
+    return _canonicalizationCache.putIfAbsent(entry, () {
+      int index = entries.length;
+      entries.add(entry);
+      return index;
+    });
+  }
+
+  void writeToBinary(BinarySink sink) {
+    sink.writeUInt30(entries.length);
+    entries.forEach((e) {
+      e.writeToBinary(sink);
+    });
+  }
+
+  ConstantPool.readFromBinary(BinarySource source) {
+    int len = source.readUInt();
+    for (int i = 0; i < len; i++) {
+      entries.add(new ConstantPoolEntry.readFromBinary(source));
+    }
+  }
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.writeln('ConstantPool {');
+    for (int i = 0; i < entries.length; i++) {
+      sb.writeln('  [$i] = ${entries[i]}');
+    }
+    sb.writeln('}');
+    return sb.toString();
+  }
+}
diff --git a/pkg/vm/lib/bytecode/dbc.dart b/pkg/vm/lib/bytecode/dbc.dart
new file mode 100644
index 0000000..17c68c3
--- /dev/null
+++ b/pkg/vm/lib/bytecode/dbc.dart
@@ -0,0 +1,651 @@
+// 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 vm.bytecode.dbc;
+
+// List of changes from original DBC (described in runtime/vm/constants_dbc.h):
+//
+// 1. StoreFieldTOS, LoadFieldTOS instructions:
+//    D = index of constant pool entry with FieldOffset or
+//    TypeArgumentsFieldOffset tags (instead of field offset in words).
+//
+// 2. EntryOptional instruction is revived in order to re-shuffle optional
+//    parameters. This DBC instruction was removed at
+//    https://github.com/dart-lang/sdk/commit/cf1de7d46cd88e204380e8f96a993439be56b24c
+//
+
+enum Opcode {
+  kTrap,
+  kNop,
+  kCompile,
+  kHotCheck,
+  kIntrinsic,
+  kDrop1,
+  kDropR,
+  kDrop,
+  kJump,
+  kReturn,
+  kReturnTOS,
+  kMove,
+  kSwap,
+  kPush,
+  kLoadConstant,
+  kLoadClassId,
+  kLoadClassIdTOS,
+  kPushConstant,
+  kStoreLocal,
+  kPopLocal,
+  kIndirectStaticCall,
+  kStaticCall,
+  kInstanceCall1,
+  kInstanceCall2,
+  kInstanceCall1Opt,
+  kInstanceCall2Opt,
+  kPushPolymorphicInstanceCall,
+  kPushPolymorphicInstanceCallByRange,
+  kNativeCall,
+  kOneByteStringFromCharCode,
+  kStringToCharCode,
+  kAddTOS,
+  kSubTOS,
+  kMulTOS,
+  kBitOrTOS,
+  kBitAndTOS,
+  kEqualTOS,
+  kLessThanTOS,
+  kGreaterThanTOS,
+  kSmiAddTOS,
+  kSmiSubTOS,
+  kSmiMulTOS,
+  kSmiBitAndTOS,
+  kAdd,
+  kSub,
+  kMul,
+  kDiv,
+  kMod,
+  kShl,
+  kShr,
+  kShlImm,
+  kNeg,
+  kBitOr,
+  kBitAnd,
+  kBitXor,
+  kBitNot,
+  kMin,
+  kMax,
+  kWriteIntoDouble,
+  kUnboxDouble,
+  kCheckedUnboxDouble,
+  kUnboxInt32,
+  kBoxInt32,
+  kBoxUint32,
+  kSmiToDouble,
+  kDoubleToSmi,
+  kDAdd,
+  kDSub,
+  kDMul,
+  kDDiv,
+  kDNeg,
+  kDSqrt,
+  kDMin,
+  kDMax,
+  kDCos,
+  kDSin,
+  kDPow,
+  kDMod,
+  kDTruncate,
+  kDFloor,
+  kDCeil,
+  kDoubleToFloat,
+  kFloatToDouble,
+  kDoubleIsNaN,
+  kDoubleIsInfinite,
+  kStoreStaticTOS,
+  kPushStatic,
+  kInitStaticTOS,
+  kIfNeStrictTOS,
+  kIfEqStrictTOS,
+  kIfNeStrictNumTOS,
+  kIfEqStrictNumTOS,
+  kIfSmiLtTOS,
+  kIfSmiLeTOS,
+  kIfSmiGeTOS,
+  kIfSmiGtTOS,
+  kIfNeStrict,
+  kIfEqStrict,
+  kIfLe,
+  kIfLt,
+  kIfGe,
+  kIfGt,
+  kIfULe,
+  kIfULt,
+  kIfUGe,
+  kIfUGt,
+  kIfDNe,
+  kIfDEq,
+  kIfDLe,
+  kIfDLt,
+  kIfDGe,
+  kIfDGt,
+  kIfNeStrictNum,
+  kIfEqStrictNum,
+  kIfEqNull,
+  kIfNeNull,
+  kCreateArrayTOS,
+  kCreateArrayOpt,
+  kAllocate,
+  kAllocateT,
+  kAllocateOpt,
+  kAllocateTOpt,
+  kStoreIndexedTOS,
+  kStoreIndexed,
+  kStoreIndexedUint8,
+  kStoreIndexedExternalUint8,
+  kStoreIndexedOneByteString,
+  kStoreIndexedUint32,
+  kStoreIndexedFloat32,
+  kStoreIndexed4Float32,
+  kStoreIndexedFloat64,
+  kStoreIndexed8Float64,
+  kNoSuchMethod,
+  kTailCall,
+  kTailCallOpt,
+  kLoadArgDescriptor,
+  kLoadArgDescriptorOpt,
+  kLoadFpRelativeSlot,
+  kLoadFpRelativeSlotOpt,
+  kStoreFpRelativeSlot,
+  kStoreFpRelativeSlotOpt,
+  kLoadIndexedTOS,
+  kLoadIndexed,
+  kLoadIndexedUint8,
+  kLoadIndexedInt8,
+  kLoadIndexedInt32,
+  kLoadIndexedUint32,
+  kLoadIndexedExternalUint8,
+  kLoadIndexedExternalInt8,
+  kLoadIndexedFloat32,
+  kLoadIndexed4Float32,
+  kLoadIndexedFloat64,
+  kLoadIndexed8Float64,
+  kLoadIndexedOneByteString,
+  kLoadIndexedTwoByteString,
+  kStoreField,
+  kStoreFieldExt,
+  kStoreFieldTOS,
+  kLoadField,
+  kLoadFieldExt,
+  kLoadUntagged,
+  kLoadFieldTOS,
+  kBooleanNegateTOS,
+  kBooleanNegate,
+  kThrow,
+  kEntry,
+  kEntryOptimized,
+  kFrame,
+  kSetFrame,
+  kAllocateContext,
+  kAllocateUninitializedContext,
+  kCloneContext,
+  kMoveSpecial,
+  kInstantiateType,
+  kInstantiateTypeArgumentsTOS,
+  kInstanceOf,
+  kBadTypeError,
+  kAssertAssignable,
+  kAssertSubtype,
+  kAssertBoolean,
+  kTestSmi,
+  kTestCids,
+  kCheckSmi,
+  kCheckEitherNonSmi,
+  kCheckClassId,
+  kCheckClassIdRange,
+  kCheckBitTest,
+  kCheckCids,
+  kCheckCidsByRange,
+  kCheckStack,
+  kCheckStackAlwaysExit,
+  kCheckFunctionTypeArgs,
+  kDebugStep,
+  kDebugBreak,
+  kDeopt,
+  kDeoptRewind,
+  kEntryOptional,
+}
+
+enum Encoding {
+  k0,
+  kA,
+  kAD,
+  kAX,
+  kD,
+  kX,
+  kABC,
+  kABY,
+  kT,
+}
+
+enum Operand {
+  none, // ignored / non-existent operand
+  imm, // immediate operand
+  lit, // constant literal from object pool
+  reg, // register (unsigned FP relative local)
+  xeg, // x-register (signed FP relative local)
+  tgt, // jump target relative to the PC of the current instruction
+}
+
+class Format {
+  final Encoding encoding;
+  final List<Operand> operands;
+  const Format(this.encoding, this.operands);
+}
+
+const Map<Opcode, Format> BytecodeFormats = const {
+  Opcode.kTrap: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kNop: const Format(
+      Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
+  Opcode.kCompile: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kHotCheck: const Format(
+      Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
+  Opcode.kIntrinsic: const Format(
+      Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
+  Opcode.kDrop1: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kDropR: const Format(
+      Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
+  Opcode.kDrop: const Format(
+      Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
+  Opcode.kJump: const Format(
+      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
+  Opcode.kReturn: const Format(
+      Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
+  Opcode.kReturnTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kMove: const Format(
+      Encoding.kAX, const [Operand.reg, Operand.xeg, Operand.none]),
+  Opcode.kSwap: const Format(
+      Encoding.kAX, const [Operand.reg, Operand.xeg, Operand.none]),
+  Opcode.kPush: const Format(
+      Encoding.kX, const [Operand.xeg, Operand.none, Operand.none]),
+  Opcode.kLoadConstant: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.lit, Operand.none]),
+  Opcode.kLoadClassId: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kLoadClassIdTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kPushConstant: const Format(
+      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
+  Opcode.kStoreLocal: const Format(
+      Encoding.kX, const [Operand.xeg, Operand.none, Operand.none]),
+  Opcode.kPopLocal: const Format(
+      Encoding.kX, const [Operand.xeg, Operand.none, Operand.none]),
+  Opcode.kIndirectStaticCall: const Format(
+      Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
+  Opcode.kStaticCall: const Format(
+      Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
+  Opcode.kInstanceCall1: const Format(
+      Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
+  Opcode.kInstanceCall2: const Format(
+      Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
+  Opcode.kInstanceCall1Opt: const Format(
+      Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
+  Opcode.kInstanceCall2Opt: const Format(
+      Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
+  Opcode.kPushPolymorphicInstanceCall: const Format(
+      Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
+  Opcode.kPushPolymorphicInstanceCallByRange: const Format(
+      Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
+  Opcode.kNativeCall: const Format(
+      Encoding.kABC, const [Operand.imm, Operand.imm, Operand.imm]),
+  Opcode.kOneByteStringFromCharCode: const Format(
+      Encoding.kAX, const [Operand.reg, Operand.xeg, Operand.none]),
+  Opcode.kStringToCharCode: const Format(
+      Encoding.kAX, const [Operand.reg, Operand.xeg, Operand.none]),
+  Opcode.kAddTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kSubTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kMulTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kBitOrTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kBitAndTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kEqualTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kLessThanTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kGreaterThanTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kSmiAddTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kSmiSubTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kSmiMulTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kSmiBitAndTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kAdd: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kSub: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kMul: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kDiv: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kMod: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kShl: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kShr: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kShlImm: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.imm]),
+  Opcode.kNeg: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kBitOr: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kBitAnd: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kBitXor: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kBitNot: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kMin: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kMax: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kWriteIntoDouble: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kUnboxDouble: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kCheckedUnboxDouble: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kUnboxInt32: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.imm]),
+  Opcode.kBoxInt32: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kBoxUint32: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kSmiToDouble: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kDoubleToSmi: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kDAdd: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kDSub: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kDMul: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kDDiv: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kDNeg: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kDSqrt: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kDMin: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kDMax: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kDCos: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kDSin: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kDPow: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kDMod: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kDTruncate: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kDFloor: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kDCeil: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kDoubleToFloat: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kFloatToDouble: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kDoubleIsNaN: const Format(
+      Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
+  Opcode.kDoubleIsInfinite: const Format(
+      Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
+  Opcode.kStoreStaticTOS: const Format(
+      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
+  Opcode.kPushStatic: const Format(
+      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
+  Opcode.kInitStaticTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kIfNeStrictTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kIfEqStrictTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kIfNeStrictNumTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kIfEqStrictNumTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kIfSmiLtTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kIfSmiLeTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kIfSmiGeTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kIfSmiGtTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kIfNeStrict: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kIfEqStrict: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kIfLe: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kIfLt: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kIfGe: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kIfGt: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kIfULe: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kIfULt: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kIfUGe: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kIfUGt: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kIfDNe: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kIfDEq: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kIfDLe: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kIfDLt: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kIfDGe: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kIfDGt: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kIfNeStrictNum: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kIfEqStrictNum: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kIfEqNull: const Format(
+      Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
+  Opcode.kIfNeNull: const Format(
+      Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
+  Opcode.kCreateArrayTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kCreateArrayOpt: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kAllocate: const Format(
+      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
+  Opcode.kAllocateT: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kAllocateOpt: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.lit, Operand.none]),
+  Opcode.kAllocateTOpt: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.lit, Operand.none]),
+  Opcode.kStoreIndexedTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kStoreIndexed: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kStoreIndexedUint8: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kStoreIndexedExternalUint8: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kStoreIndexedOneByteString: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kStoreIndexedUint32: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kStoreIndexedFloat32: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kStoreIndexed4Float32: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kStoreIndexedFloat64: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kStoreIndexed8Float64: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kNoSuchMethod: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kTailCall: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kTailCallOpt: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kLoadArgDescriptor: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kLoadArgDescriptorOpt: const Format(
+      Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
+  Opcode.kLoadFpRelativeSlot: const Format(
+      Encoding.kX, const [Operand.reg, Operand.none, Operand.none]),
+  Opcode.kLoadFpRelativeSlotOpt: const Format(
+      Encoding.kABY, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kStoreFpRelativeSlot: const Format(
+      Encoding.kX, const [Operand.reg, Operand.none, Operand.none]),
+  Opcode.kStoreFpRelativeSlotOpt: const Format(
+      Encoding.kABY, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kLoadIndexedTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kLoadIndexed: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kLoadIndexedUint8: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kLoadIndexedInt8: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kLoadIndexedInt32: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kLoadIndexedUint32: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kLoadIndexedExternalUint8: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kLoadIndexedExternalInt8: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kLoadIndexedFloat32: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kLoadIndexed4Float32: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kLoadIndexedFloat64: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kLoadIndexed8Float64: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kLoadIndexedOneByteString: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kLoadIndexedTwoByteString: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
+  Opcode.kStoreField: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.imm, Operand.reg]),
+  Opcode.kStoreFieldExt: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kStoreFieldTOS: const Format(
+      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
+  Opcode.kLoadField: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.imm]),
+  Opcode.kLoadFieldExt: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kLoadUntagged: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.reg, Operand.imm]),
+  Opcode.kLoadFieldTOS: const Format(
+      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
+  Opcode.kBooleanNegateTOS: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kBooleanNegate: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kThrow: const Format(
+      Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
+  Opcode.kEntry: const Format(
+      Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
+  Opcode.kEntryOptimized: const Format(
+      Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
+  Opcode.kFrame: const Format(
+      Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
+  Opcode.kSetFrame: const Format(
+      Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
+  Opcode.kAllocateContext: const Format(
+      Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
+  Opcode.kAllocateUninitializedContext: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.imm, Operand.none]),
+  Opcode.kCloneContext: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kMoveSpecial: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.imm, Operand.none]),
+  Opcode.kInstantiateType: const Format(
+      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
+  Opcode.kInstantiateTypeArgumentsTOS: const Format(
+      Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
+  Opcode.kInstanceOf: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kBadTypeError: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kAssertAssignable: const Format(
+      Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
+  Opcode.kAssertSubtype: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kAssertBoolean: const Format(
+      Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
+  Opcode.kTestSmi: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kTestCids: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.imm, Operand.none]),
+  Opcode.kCheckSmi: const Format(
+      Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
+  Opcode.kCheckEitherNonSmi: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
+  Opcode.kCheckClassId: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.imm, Operand.none]),
+  Opcode.kCheckClassIdRange: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.imm, Operand.none]),
+  Opcode.kCheckBitTest: const Format(
+      Encoding.kAD, const [Operand.reg, Operand.imm, Operand.none]),
+  Opcode.kCheckCids: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.imm, Operand.imm]),
+  Opcode.kCheckCidsByRange: const Format(
+      Encoding.kABC, const [Operand.reg, Operand.imm, Operand.imm]),
+  Opcode.kCheckStack: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kCheckStackAlwaysExit: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kCheckFunctionTypeArgs: const Format(
+      Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
+  Opcode.kDebugStep: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kDebugBreak: const Format(
+      Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
+  Opcode.kDeopt: const Format(
+      Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
+  Opcode.kDeoptRewind: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kEntryOptional: const Format(
+      Encoding.kABC, const [Operand.imm, Operand.imm, Operand.imm]),
+};
+
+// Should match constant in runtime/vm/stack_frame_dbc.h.
+const int kParamEndSlotFromFp = 4;
+
+// Prefix used to distinguish getters in ICData target names.
+// Should match constant in runtime/vm/object.cc.
+const String kGetterPrefix = 'get:';
+
+// Prefix used to distinguish setters in ICData target names.
+// Should match constant in runtime/vm/object.cc.
+const String kSetterPrefix = 'set:';
diff --git a/pkg/vm/lib/bytecode/disassembler.dart b/pkg/vm/lib/bytecode/disassembler.dart
new file mode 100644
index 0000000..9230268
--- /dev/null
+++ b/pkg/vm/lib/bytecode/disassembler.dart
@@ -0,0 +1,165 @@
+// 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 vm.bytecode.disassembler;
+
+import 'dart:typed_data';
+
+import 'package:vm/bytecode/dbc.dart';
+
+class _Instruction {
+  final Opcode opcode;
+  final List<int> operands;
+  _Instruction(this.opcode, this.operands);
+}
+
+class BytecodeDisassembler {
+  static const int kOpcodeMask = 0xFF;
+  static const int kBitsPerInt = 64;
+
+  List<_Instruction> _instructions;
+  int _labelCount;
+  Map<int, int> _labels;
+
+  String disassemble(List<int> bytecode) {
+    _init(bytecode);
+    _scanForJumpTargets();
+    return _disasm();
+  }
+
+  void _init(List<int> bytecode) {
+    final uint8list = new Uint8List.fromList(bytecode);
+    // TODO(alexmarkov): endianness?
+    Uint32List words = uint8list.buffer.asUint32List();
+
+    _instructions = new List<_Instruction>(words.length);
+    for (int i = 0; i < words.length; i++) {
+      _instructions[i] = _decodeInstruction(words[i]);
+    }
+
+    _labelCount = 0;
+    _labels = <int, int>{};
+  }
+
+  _Instruction _decodeInstruction(int word) {
+    final opcode = Opcode.values[word & kOpcodeMask];
+    final format = BytecodeFormats[opcode];
+    return new _Instruction(opcode, _decodeOperands(format, word));
+  }
+
+  List<int> _decodeOperands(Format format, int word) {
+    switch (format.encoding) {
+      case Encoding.k0:
+        return const [];
+      case Encoding.kA:
+        return [_unsigned(word, 8, 8)];
+      case Encoding.kAD:
+        return [_unsigned(word, 8, 8), _unsigned(word, 16, 16)];
+      case Encoding.kAX:
+        return [_unsigned(word, 8, 8), _signed(word, 16, 16)];
+      case Encoding.kD:
+        return [_unsigned(word, 16, 16)];
+      case Encoding.kX:
+        return [_signed(word, 16, 16)];
+      case Encoding.kABC:
+        return [
+          _unsigned(word, 8, 8),
+          _unsigned(word, 16, 8),
+          _unsigned(word, 24, 8)
+        ];
+      case Encoding.kABY:
+        return [
+          _unsigned(word, 8, 8),
+          _unsigned(word, 16, 8),
+          _signed(word, 24, 8)
+        ];
+      case Encoding.kT:
+        return [_signed(word, 8, 24)];
+    }
+    throw 'Unexpected format $format';
+  }
+
+  int _unsigned(int word, int pos, int bits) =>
+      (word >> pos) & ((1 << bits) - 1);
+
+  int _signed(int word, int pos, int bits) =>
+      _unsigned(word, pos, bits) <<
+      (kBitsPerInt - bits) >>
+      (kBitsPerInt - bits);
+
+  void _scanForJumpTargets() {
+    for (int i = 0; i < _instructions.length; i++) {
+      final instr = _instructions[i];
+      if (instr.opcode == Opcode.kJump) {
+        final target = i + instr.operands[0];
+        assert(0 <= target && target < _instructions.length);
+        _labels[target] ??= (++_labelCount);
+      }
+    }
+  }
+
+  String _disasm() {
+    StringBuffer out = new StringBuffer();
+    for (int i = 0; i < _instructions.length; i++) {
+      int label = _labels[i];
+      if (label != null) {
+        out.writeln('L$label:');
+      }
+      _writeInstruction(out, i, _instructions[i]);
+    }
+    return out.toString();
+  }
+
+  void _writeInstruction(StringBuffer out, int bci, _Instruction instr) {
+    final format = BytecodeFormats[instr.opcode];
+    assert(format != null);
+
+    out.write('  ');
+
+    const int kOpcodeWidth = 20;
+    const String kOpcodePrefix = 'Opcode.k';
+
+    String opcode = instr.opcode.toString();
+    assert(opcode.startsWith(kOpcodePrefix));
+    opcode = opcode.substring(kOpcodePrefix.length);
+
+    if (instr.operands.isEmpty) {
+      out.writeln(opcode);
+      return;
+    }
+
+    out.write(opcode.padRight(kOpcodeWidth));
+
+    for (int i = 0; i < instr.operands.length; i++) {
+      if (i == 0) {
+        out.write(' ');
+      } else {
+        out.write(', ');
+      }
+      final operand =
+          _formatOperand(bci, format.operands[i], instr.operands[i]);
+      out.write(operand);
+    }
+
+    out.writeln();
+  }
+
+  String _formatOperand(int bci, Operand fmt, int value) {
+    switch (fmt) {
+      case Operand.none:
+        break;
+      case Operand.imm:
+        return '$value';
+      case Operand.lit:
+        return 'CP#$value';
+      case Operand.reg:
+        return 'r$value';
+      case Operand.xeg:
+        return (value < 0) ? 'FP[$value]' : 'r$value';
+      case Operand.tgt:
+        return 'L${_labels[bci + value] ?? (throw 'Label not found')}';
+    }
+    throw 'Unexpected operand format $fmt';
+  }
+}
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
new file mode 100644
index 0000000..1fd4ebe
--- /dev/null
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -0,0 +1,1332 @@
+// 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 vm.bytecode.gen_bytecode;
+
+import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
+import 'package:kernel/core_types.dart' show CoreTypes;
+import 'package:kernel/library_index.dart' show LibraryIndex;
+import 'package:kernel/transformations/constants.dart'
+    show ConstantEvaluator, ConstantsBackend, EvaluationEnvironment;
+import 'package:kernel/type_algebra.dart' show Substitution;
+import 'package:kernel/type_environment.dart' show TypeEnvironment;
+import 'package:kernel/vm/constants_native_effects.dart'
+    show VmConstantsBackend;
+import 'package:vm/bytecode/assembler.dart';
+import 'package:vm/bytecode/constant_pool.dart';
+import 'package:vm/bytecode/dbc.dart';
+import 'package:vm/bytecode/local_vars.dart' show LocalVariables;
+import 'package:vm/metadata/bytecode.dart';
+
+/// Flag to toggle generation of bytecode in kernel files.
+const bool kEnableKernelBytecode = false;
+
+/// Flag to toggle generation of bytecode in platform kernel files.
+const bool kEnableKernelBytecodeForPlatform = kEnableKernelBytecode;
+
+const bool kTrace = false;
+
+void generateBytecode(Component component, {bool strongMode: true}) {
+  final coreTypes = new CoreTypes(component);
+  void ignoreAmbiguousSupertypes(Class cls, Supertype a, Supertype b) {}
+  final hierarchy = new ClassHierarchy(component,
+      onAmbiguousSupertypes: ignoreAmbiguousSupertypes);
+  final typeEnvironment =
+      new TypeEnvironment(coreTypes, hierarchy, strongMode: strongMode);
+  final constantsBackend = new VmConstantsBackend(null, coreTypes);
+  new BytecodeGenerator(component, coreTypes, hierarchy, typeEnvironment,
+          constantsBackend, strongMode)
+      .visitComponent(component);
+}
+
+class BytecodeGenerator extends RecursiveVisitor<Null> {
+  final Component component;
+  final CoreTypes coreTypes;
+  final ClassHierarchy hierarchy;
+  final TypeEnvironment typeEnvironment;
+  final ConstantsBackend constantsBackend;
+  final bool strongMode;
+  final BytecodeMetadataRepository metadata = new BytecodeMetadataRepository();
+
+  Class enclosingClass;
+  Member enclosingMember;
+  BytecodeAssembler asm;
+  ConstantPool cp;
+  LocalVariables locals;
+  ConstantEmitter constantEmitter;
+  ConstantEvaluator constantEvaluator;
+  Map<LabeledStatement, Label> labeledStatements;
+  Map<SwitchCase, Label> switchCases;
+
+  BytecodeGenerator(this.component, this.coreTypes, this.hierarchy,
+      this.typeEnvironment, this.constantsBackend, this.strongMode) {
+    component.addMetadataRepository(metadata);
+  }
+
+  @override
+  visitComponent(Component node) => node.visitChildren(this);
+
+  @override
+  visitLibrary(Library node) {
+    if (node.isExternal) {
+      return;
+    }
+    visitList(node.classes, this);
+    visitList(node.procedures, this);
+    visitList(node.fields, this);
+  }
+
+  @override
+  visitClass(Class node) {
+    visitList(node.constructors, this);
+    visitList(node.procedures, this);
+    visitList(node.fields, this);
+  }
+
+  @override
+  defaultMember(Member node) {
+    if (node.isAbstract) {
+      return;
+    }
+    try {
+      if (node is Field) {
+        if (node.isStatic && node.initializer != null) {
+          start(node);
+          if (node.isConst) {
+            _genPushConstExpr(node.initializer);
+          } else {
+            node.initializer.accept(this);
+          }
+          _genReturnTOS();
+          end(node);
+        }
+      } else if ((node is Procedure && !node.isRedirectingFactoryConstructor) ||
+          (node is Constructor)) {
+        start(node);
+        if (node is Constructor) {
+          _genConstructorInitializers(node);
+        }
+        node.function?.body?.accept(this);
+        // TODO(alexmarkov): figure out when 'return null' should be generated.
+        _genPushNull();
+        _genReturnTOS();
+        end(node);
+      }
+    } on UnsupportedOperationError catch (e) {
+      if (kTrace) {
+        print('Unable to generate bytecode for $node: $e');
+      }
+    }
+  }
+
+  LibraryIndex _libraryIndex;
+  LibraryIndex get libraryIndex =>
+      _libraryIndex ??= new LibraryIndex.coreLibraries(component);
+
+  Procedure _listFromLiteral;
+  Procedure get listFromLiteral => _listFromLiteral ??=
+      libraryIndex.getMember('dart:core', 'List', '_fromLiteral');
+
+  Procedure _mapFromLiteral;
+  Procedure get mapFromLiteral => _mapFromLiteral ??=
+      libraryIndex.getMember('dart:core', 'Map', '_fromLiteral');
+
+  Procedure _interpolateSingle;
+  Procedure get interpolateSingle => _interpolateSingle ??=
+      libraryIndex.getMember('dart:core', '_StringBase', '_interpolateSingle');
+
+  Procedure _interpolate;
+  Procedure get interpolate => _interpolate ??=
+      libraryIndex.getMember('dart:core', '_StringBase', '_interpolate');
+
+  void _genConstructorInitializers(Constructor node) {
+    bool isRedirecting =
+        node.initializers.any((init) => init is RedirectingInitializer);
+    if (!isRedirecting) {
+      for (var field in node.enclosingClass.fields) {
+        if (!field.isStatic &&
+            field.initializer != null &&
+            !node.initializers.any(
+                (init) => init is FieldInitializer && init.field == field)) {
+          _genFieldInitializer(field, field.initializer);
+        }
+      }
+    }
+    visitList(node.initializers, this);
+  }
+
+  void _genFieldInitializer(Field field, Expression initializer) {
+    if (initializer is NullLiteral) {
+      return;
+    }
+
+    asm.emitPush(locals.thisVarIndex);
+    initializer.accept(this);
+
+    // TODO(alexmarkov): field guards?
+    // TODO(alexmarkov): assignability check
+
+    final int cpIndex = cp.add(new ConstantFieldOffset(field));
+    asm.emitStoreFieldTOS(cpIndex);
+  }
+
+  void _genArguments(Expression receiver, Arguments arguments) {
+    if (arguments.types.isNotEmpty) {
+      _genTypeArguments(arguments.types);
+    }
+    receiver?.accept(this);
+    visitList(arguments.positional, this);
+    arguments.named.forEach((NamedExpression ne) => ne.value.accept(this));
+  }
+
+  void _genPushNull() {
+    final cpIndex = cp.add(const ConstantNull());
+    asm.emitPushConstant(cpIndex);
+  }
+
+  void _genPushInt(int value) {
+    int cpIndex = cp.add(new ConstantInt(value));
+    asm.emitPushConstant(cpIndex);
+  }
+
+  void _genPushConstExpr(Expression expr) {
+    final constant = constantEvaluator.evaluate(expr);
+    asm.emitPushConstant(constant.accept(constantEmitter));
+  }
+
+  void _genReturnTOS() {
+    asm.emitReturnTOS();
+  }
+
+  void _genStaticCall(
+      Member target, ConstantArgDesc argDesc, int totalArgCount) {
+    final argDescIndex = cp.add(argDesc);
+    final icdataIndex = cp.add(new ConstantStaticICData(target, argDescIndex));
+
+    asm.emitPushConstant(icdataIndex);
+    asm.emitIndirectStaticCall(totalArgCount, argDescIndex);
+  }
+
+  void _genStaticCallWithArgs(Member target, Arguments args,
+      {bool hasReceiver: false, bool alwaysPassTypeArgs: false}) {
+    final ConstantArgDesc argDesc =
+        new ConstantArgDesc.fromArguments(args, hasReceiver: hasReceiver);
+
+    int totalArgCount = args.positional.length + args.named.length;
+    if (hasReceiver) {
+      totalArgCount++;
+    }
+    if (args.types.isNotEmpty || alwaysPassTypeArgs) {
+      totalArgCount++;
+    }
+
+    _genStaticCall(target, argDesc, totalArgCount);
+  }
+
+  bool hasTypeParameters(List<DartType> typeArgs) {
+    final findTypeParams = new FindTypeParametersVisitor();
+    return typeArgs.any((t) => t.accept(findTypeParams));
+  }
+
+  bool hasInstantiatorTypeArguments(Class c) {
+    return c.typeParameters.isNotEmpty ||
+        (c.superclass != null && hasInstantiatorTypeArguments(c.superclass));
+  }
+
+  bool isGenericFunction(Member member) {
+    final function = member.function;
+    return function != null && function.typeParameters.isNotEmpty;
+  }
+
+  void _genTypeArguments(List<DartType> typeArgs) {
+    final int typeArgsCPIndex = cp.add(new ConstantTypeArguments(typeArgs));
+    if (typeArgs.isEmpty || !hasTypeParameters(typeArgs)) {
+      asm.emitPushConstant(typeArgsCPIndex);
+    } else {
+      // TODO(alexmarkov): try to reuse instantiator type arguments
+      // TODO(alexmarkov): do not load instantiator type arguments / function type
+      // arguments if they are not needed for these particular [typeArgs].
+      _genPushInstantiatorTypeArguments();
+      _genPushFunctionTypeArguments();
+      asm.emitInstantiateTypeArgumentsTOS(1, typeArgsCPIndex);
+    }
+  }
+
+  void _genPushInstantiatorTypeArguments() {
+    // TODO(alexmarkov): access from closures to up-level type arguments.
+    if ((enclosingMember.isInstanceMember || enclosingMember is Constructor) &&
+        hasInstantiatorTypeArguments(enclosingClass)) {
+      asm.emitPush(locals.thisVarIndex);
+      final int cpIndex =
+          cp.add(new ConstantTypeArgumentsFieldOffset(enclosingClass));
+      asm.emitLoadFieldTOS(cpIndex);
+    } else {
+      _genPushNull();
+    }
+  }
+
+  void _genPushFunctionTypeArguments() {
+    // TODO(alexmarkov): closures
+    if (isGenericFunction(enclosingMember)) {
+      asm.emitPush(locals.functionTypeArgsVarIndex);
+    } else {
+      _genPushNull();
+    }
+  }
+
+  List<DartType> _flattenTypeArgumentsForInstantiation(
+      Class instantiatedClass, List<DartType> typeArgs) {
+    assert(typeArgs.length == instantiatedClass.typeParameters.length);
+
+    List<DartType> flatTypeArgs;
+    final supertype = instantiatedClass.supertype;
+    if (supertype == null) {
+      flatTypeArgs = <DartType>[];
+    } else {
+      final substitution =
+          Substitution.fromPairs(instantiatedClass.typeParameters, typeArgs);
+      flatTypeArgs = _flattenTypeArgumentsForInstantiation(supertype.classNode,
+          substitution.substituteSupertype(supertype).typeArguments);
+    }
+    flatTypeArgs.addAll(typeArgs);
+    return flatTypeArgs;
+  }
+
+  /// Generates bool condition. Returns `true` if condition is negated.
+  bool _genCondition(Node condition) {
+    bool negated = false;
+    if (condition is Not) {
+      condition = (condition as Not).operand;
+      negated = true;
+    }
+    condition.accept(this);
+    // TODO(alexmarkov): bool check
+    return negated;
+  }
+
+  void _genJumpIfFalse(bool negated, Label dest) {
+    asm.emitPushConstant(cp.add(new ConstantBool(true)));
+    if (negated) {
+      asm.emitIfEqStrictTOS(); // if ((!condition) == true) ...
+    } else {
+      asm.emitIfNeStrictTOS(); // if (condition != true) ...
+    }
+    asm.emitJump(dest); // ... then jump dest
+  }
+
+  // Duplicates value on top of the stack using temporary variable
+  // corresponding to [node].
+  void _genDupTOS(TreeNode node) {
+    // TODO(alexmarkov): Consider introducing Dup bytecode or keeping track of
+    // expression stack depth.
+    final int temp = locals.tempIndex(node);
+    asm.emitStoreLocal(temp);
+    asm.emitPush(temp);
+  }
+
+  void start(Member node) {
+    enclosingMember = node;
+    enclosingClass = node.enclosingClass;
+    asm = new BytecodeAssembler();
+    cp = new ConstantPool();
+    locals = new LocalVariables();
+    constantEmitter = new ConstantEmitter(cp);
+    // TODO(alexmarkov): improve caching in ConstantEvaluator and reuse it
+    constantEvaluator = new ConstantEvaluator(constantsBackend, typeEnvironment,
+        coreTypes, strongMode, /* enableAsserts = */ true)
+      ..env = new EvaluationEnvironment();
+    labeledStatements = <LabeledStatement, Label>{};
+    switchCases = <SwitchCase, Label>{};
+
+    node.accept(locals);
+
+    if (locals.hasOptionalParameters) {
+      final function = node.function;
+      final int numOptionalPositional = function.positionalParameters.length -
+          function.requiredParameterCount;
+      final int numOptionalNamed = function.namedParameters.length;
+      final int numFixed =
+          locals.numParameters - (numOptionalPositional + numOptionalNamed);
+
+      asm.emitEntryOptional(numFixed, numOptionalPositional, numOptionalNamed);
+
+      if (numOptionalPositional != 0) {
+        assert(numOptionalNamed == 0);
+        for (int i = 0; i < numOptionalPositional; i++) {
+          final param = function
+              .positionalParameters[function.requiredParameterCount + i];
+          asm.emitLoadConstant(numFixed + i, _getDefaultParamConstIndex(param));
+        }
+      } else {
+        assert(numOptionalNamed != 0);
+        for (int i = 0; i < numOptionalNamed; i++) {
+          final param = function.namedParameters[i];
+          asm.emitLoadConstant(
+              numFixed + i, cp.add(new ConstantString(param.name)));
+          asm.emitLoadConstant(numFixed + i, _getDefaultParamConstIndex(param));
+        }
+      }
+
+      asm.emitFrame(locals.frameSize - locals.numParameters);
+    } else {
+      asm.emitEntry(locals.frameSize);
+    }
+    asm.emitCheckStack();
+
+    // TODO(alexmarkov): add type checks for parameters
+  }
+
+  int _getDefaultParamConstIndex(VariableDeclaration param) {
+    if (param.initializer == null) {
+      return cp.add(const ConstantNull());
+    }
+    final constant = constantEvaluator.evaluate(param.initializer);
+    return constant.accept(constantEmitter);
+  }
+
+  void _genJumpIfTrue(bool negated, Label dest) {
+    _genJumpIfFalse(!negated, dest);
+  }
+
+  void end(Member node) {
+    enclosingMember = null;
+    enclosingClass = null;
+    metadata.mapping[node] = new BytecodeMetadata(asm.bytecode, cp);
+    if (kTrace) {
+      print('Generated bytecode for $node');
+    }
+  }
+
+  @override
+  defaultTreeNode(Node node) => throw new UnsupportedOperationError(
+      'Unsupported node ${node.runtimeType}');
+
+  @override
+  visitAsExpression(AsExpression node) {
+    node.operand.accept(this);
+
+    if (node.type == const DynamicType()) {
+      return;
+    }
+    if (node.isTypeError) {
+      // TODO(alexmarkov): type checks
+      return;
+    }
+    if (hasTypeParameters([node.type])) {
+      // TODO(alexmarkov): do not load instantiator type arguments / function
+      // type arguments if they are not needed for this particular type.
+      _genPushInstantiatorTypeArguments();
+      _genPushFunctionTypeArguments();
+    } else {
+      _genPushNull(); // Instantiator type arguments.
+      _genPushNull(); // Function type arguments.
+    }
+    final typeIndex = cp.add(new ConstantType(node.type));
+    asm.emitPushConstant(typeIndex);
+    final argDescIndex = cp.add(new ConstantArgDesc(4));
+    final icdataIndex = cp.add(new ConstantICData('_as', argDescIndex));
+    asm.emitInstanceCall1(4, icdataIndex);
+  }
+
+  @override
+  visitBoolLiteral(BoolLiteral node) {
+    final cpIndex = cp.add(new ConstantBool.fromLiteral(node));
+    asm.emitPushConstant(cpIndex);
+  }
+
+  @override
+  visitIntLiteral(IntLiteral node) {
+    final cpIndex = cp.add(new ConstantInt.fromLiteral(node));
+    asm.emitPushConstant(cpIndex);
+  }
+
+  @override
+  visitDoubleLiteral(DoubleLiteral node) {
+    final cpIndex = cp.add(new ConstantDouble.fromLiteral(node));
+    asm.emitPushConstant(cpIndex);
+  }
+
+  @override
+  visitConditionalExpression(ConditionalExpression node) {
+    final Label otherwisePart = new Label();
+    final Label done = new Label();
+    final int temp = locals.tempIndex(node);
+
+    final bool negated = _genCondition(node.condition);
+    _genJumpIfFalse(negated, otherwisePart);
+
+    node.then.accept(this);
+    asm.emitPopLocal(temp);
+    asm.emitJump(done);
+
+    asm.bind(otherwisePart);
+    node.otherwise.accept(this);
+    asm.emitPopLocal(temp);
+
+    asm.bind(done);
+    asm.emitPush(temp);
+  }
+
+  @override
+  visitConstructorInvocation(ConstructorInvocation node) {
+    if (node.isConst) {
+      _genPushConstExpr(node);
+      return;
+    }
+
+    final constructedClass = node.constructedType.classNode;
+    final classIndex = cp.add(new ConstantClass(constructedClass));
+
+    if (hasInstantiatorTypeArguments(constructedClass)) {
+      List<DartType> flatTypeArgs = _flattenTypeArgumentsForInstantiation(
+          constructedClass, node.arguments.types);
+      _genTypeArguments(flatTypeArgs);
+      asm.emitPushConstant(cp.add(new ConstantClass(constructedClass)));
+      asm.emitAllocateT();
+    } else {
+      assert(node.arguments.types.isEmpty);
+      asm.emitAllocate(classIndex);
+    }
+
+    _genDupTOS(node);
+
+    // Remove type arguments as they are only passed to instance allocation,
+    // and not passed to a constructor.
+    final args =
+        new Arguments(node.arguments.positional, named: node.arguments.named);
+    _genArguments(null, args);
+    _genStaticCallWithArgs(node.target, args, hasReceiver: true);
+    asm.emitDrop1();
+  }
+
+//  @override
+//  visitDirectMethodInvocation(DirectMethodInvocation node) {
+//  }
+
+  @override
+  visitDirectPropertyGet(DirectPropertyGet node) {
+    node.receiver.accept(this);
+    final target = node.target;
+    if (target is Field || (target is Procedure && target.isGetter)) {
+      _genStaticCall(target, new ConstantArgDesc(1), 1);
+    } else {
+      throw new UnsupportedOperationError(
+          'Unsupported DirectPropertyGet with ${target.runtimeType} $target');
+    }
+  }
+
+//  @override
+//  visitDirectPropertySet(DirectPropertySet node) {
+//  }
+//
+//  @override
+//  visitFunctionExpression(FunctionExpression node) {
+//  }
+//
+//  @override
+//  visitInstantiation(Instantiation node) {
+//  }
+//
+//  @override
+//  visitInvalidExpression(InvalidExpression node) {
+//  }
+
+  @override
+  visitIsExpression(IsExpression node) {
+    node.operand.accept(this);
+
+    // TODO(alexmarkov): generate _simpleInstanceOf if possible
+
+    if (hasTypeParameters([node.type])) {
+      // TODO(alexmarkov): do not load instantiator type arguments / function type
+      // arguments if they are not needed for this particular type.
+      _genPushInstantiatorTypeArguments();
+      _genPushFunctionTypeArguments();
+    } else {
+      _genPushNull(); // Instantiator type arguments.
+      _genPushNull(); // Function type arguments.
+    }
+    final typeIndex = cp.add(new ConstantType(node.type));
+    asm.emitPushConstant(typeIndex);
+    final argDescIndex = cp.add(new ConstantArgDesc(4));
+    final icdataIndex = cp.add(new ConstantICData('_instanceOf', argDescIndex));
+    asm.emitInstanceCall1(4, icdataIndex);
+  }
+
+  @override
+  visitLet(Let node) {
+    node.variable.accept(this);
+    node.body.accept(this);
+  }
+
+  @override
+  visitListLiteral(ListLiteral node) {
+    if (node.isConst) {
+      _genPushConstExpr(node);
+      return;
+    }
+
+    _genTypeArguments([node.typeArgument]);
+
+    _genDupTOS(node);
+
+    // TODO(alexmarkov): gen more efficient code for empty array
+    _genPushInt(node.expressions.length);
+    asm.emitCreateArrayTOS();
+    final int temp = locals.tempIndex(node);
+    asm.emitStoreLocal(temp);
+
+    for (int i = 0; i < node.expressions.length; i++) {
+      asm.emitPush(temp);
+      _genPushInt(i);
+      node.expressions[i].accept(this);
+      // TODO(alexmarkov): assignable check
+      asm.emitStoreIndexedTOS();
+    }
+
+    _genStaticCall(listFromLiteral, new ConstantArgDesc(1, numTypeArgs: 1), 2);
+  }
+
+  @override
+  visitLogicalExpression(LogicalExpression node) {
+    assert(node.operator == '||' || node.operator == '&&');
+
+    final Label shortCircuit = new Label();
+    final Label done = new Label();
+    final int temp = locals.tempIndex(node);
+    final isOR = (node.operator == '||');
+
+    bool negated = _genCondition(node.left);
+    asm.emitPushConstant(cp.add(new ConstantBool(true)));
+    if (negated != isOR) {
+      // OR: if (condition == true)
+      // AND: if ((!condition) == true)
+      asm.emitIfEqStrictTOS();
+    } else {
+      // OR: if ((!condition) != true)
+      // AND: if (condition != true)
+      asm.emitIfNeStrictTOS();
+    }
+    asm.emitJump(shortCircuit);
+
+    negated = _genCondition(node.right);
+    if (negated) {
+      asm.emitBooleanNegateTOS();
+    }
+    asm.emitPopLocal(temp);
+    asm.emitJump(done);
+
+    asm.bind(shortCircuit);
+    asm.emitPushConstant(cp.add(new ConstantBool(isOR)));
+    asm.emitPopLocal(temp);
+
+    asm.bind(done);
+    asm.emitPush(temp);
+  }
+
+  @override
+  visitMapLiteral(MapLiteral node) {
+    if (node.isConst) {
+      _genPushConstExpr(node);
+      return;
+    }
+
+    _genTypeArguments([node.keyType, node.valueType]);
+
+    if (node.entries.isEmpty) {
+      asm.emitPushConstant(
+          cp.add(new ConstantList(const DynamicType(), const [])));
+    } else {
+      _genTypeArguments([const DynamicType()]);
+      _genPushInt(node.entries.length * 2);
+      asm.emitCreateArrayTOS();
+
+      final int temp = locals.tempIndex(node);
+      asm.emitStoreLocal(temp);
+
+      for (int i = 0; i < node.entries.length; i++) {
+        // key
+        asm.emitPush(temp);
+        _genPushInt(i * 2);
+        node.entries[i].key.accept(this);
+        asm.emitStoreIndexedTOS();
+        // value
+        asm.emitPush(temp);
+        _genPushInt(i * 2 + 1);
+        node.entries[i].value.accept(this);
+        asm.emitStoreIndexedTOS();
+      }
+    }
+
+    _genStaticCall(mapFromLiteral, new ConstantArgDesc(1, numTypeArgs: 1), 2);
+  }
+
+  @override
+  visitMethodInvocation(MethodInvocation node) {
+    final args = node.arguments;
+    _genArguments(node.receiver, args);
+    // TODO(alexmarkov): fast path smi ops
+    final argDescIndex =
+        cp.add(new ConstantArgDesc.fromArguments(args, hasReceiver: true));
+    final icdataIndex =
+        cp.add(new ConstantICData(node.name.name, argDescIndex));
+    // TODO(alexmarkov): figure out when generate InstanceCall2 (2 checked arguments).
+    asm.emitInstanceCall1(
+        args.positional.length + args.named.length + 1, icdataIndex);
+  }
+
+  @override
+  visitPropertyGet(PropertyGet node) {
+    node.receiver.accept(this);
+    final argDescIndex = cp.add(new ConstantArgDesc(1));
+    final icdataIndex = cp.add(
+        new ConstantICData('$kGetterPrefix${node.name.name}', argDescIndex));
+    asm.emitInstanceCall1(1, icdataIndex);
+  }
+
+  @override
+  visitPropertySet(PropertySet node) {
+    final int temp = locals.tempIndex(node);
+    node.receiver.accept(this);
+    node.value.accept(this);
+    asm.emitStoreLocal(temp);
+    final argDescIndex = cp.add(new ConstantArgDesc(2));
+    final icdataIndex = cp.add(
+        new ConstantICData('$kSetterPrefix${node.name.name}', argDescIndex));
+    asm.emitInstanceCall1(2, icdataIndex);
+    asm.emitDrop1();
+    asm.emitPush(temp);
+  }
+
+  @override
+  visitSuperMethodInvocation(SuperMethodInvocation node) {
+    final args = node.arguments;
+    _genArguments(new ThisExpression(), args);
+    Member target =
+        hierarchy.getDispatchTarget(enclosingClass.superclass, node.name);
+    if (target == null) {
+      throw new UnsupportedOperationError(
+          'Unsupported SuperMethodInvocation without target');
+    }
+    if (target is Procedure && !target.isGetter) {
+      _genStaticCallWithArgs(target, args);
+    } else {
+      throw new UnsupportedOperationError(
+          'Unsupported SuperMethodInvocation with target ${target.runtimeType} $target');
+    }
+  }
+
+  @override
+  visitSuperPropertyGet(SuperPropertyGet node) {
+    asm.emitPush(locals.thisVarIndex);
+    Member target =
+        hierarchy.getDispatchTarget(enclosingClass.superclass, node.name);
+    if (target == null) {
+      throw new UnsupportedOperationError(
+          'Unsupported SuperPropertyGet without target');
+    }
+    if (target is Field || (target is Procedure && target.isGetter)) {
+      _genStaticCall(target, new ConstantArgDesc(1), 1);
+    } else {
+      throw new UnsupportedOperationError(
+          'Unsupported SuperPropertyGet with target ${target.runtimeType} $target');
+    }
+  }
+
+//  @override
+//  visitSuperPropertySet(SuperPropertySet node) {
+//  }
+
+  @override
+  visitNot(Not node) {
+    bool negated = _genCondition(node.operand);
+    if (!negated) {
+      asm.emitBooleanNegateTOS();
+    }
+  }
+
+  @override
+  visitNullLiteral(NullLiteral node) {
+    final cpIndex = cp.add(const ConstantNull());
+    asm.emitPushConstant(cpIndex);
+  }
+
+//  @override
+//  visitRethrow(Rethrow node) {
+//  }
+
+  bool _hasTrivialInitializer(Field field) =>
+      (field.initializer == null) ||
+      (field.initializer is StringLiteral) ||
+      (field.initializer is BoolLiteral) ||
+      (field.initializer is IntLiteral) ||
+      (field.initializer is NullLiteral);
+
+  @override
+  visitStaticGet(StaticGet node) {
+    final target = node.target;
+    if (target is Field) {
+      if (target.isConst) {
+        _genPushConstExpr(target.initializer);
+      } else if (_hasTrivialInitializer(target)) {
+        final fieldIndex = cp.add(new ConstantField(target));
+        asm.emitPushConstant(
+            fieldIndex); // TODO(alexmarkov): do we really need this?
+        asm.emitPushStatic(fieldIndex);
+      } else {
+        _genStaticCall(target, new ConstantArgDesc(0), 0);
+      }
+    } else if (target is Procedure) {
+      if (target.isGetter) {
+        _genStaticCall(target, new ConstantArgDesc(0), 0);
+      } else {
+        final tearOffIndex = cp.add(new ConstantTearOff(target));
+        asm.emitPushConstant(tearOffIndex);
+      }
+    } else {
+      throw 'Unexpected target for StaticGet: ${target.runtimeType} $target';
+    }
+  }
+
+  @override
+  visitStaticInvocation(StaticInvocation node) {
+    final args = node.arguments;
+    bool alwaysPassTypeArgs = false;
+    if (node.target.isFactory && args.types.isEmpty) {
+      // VM needs type arguments for every invocation of a factory constructor.
+      // TODO(alexmarkov): Why? Clean this up.
+      _genPushNull();
+      alwaysPassTypeArgs = true;
+    }
+    _genArguments(null, args);
+    _genStaticCallWithArgs(node.target, args,
+        alwaysPassTypeArgs: alwaysPassTypeArgs);
+  }
+
+  @override
+  visitStaticSet(StaticSet node) {
+    node.value.accept(this);
+    final target = node.target;
+    if (target is Field) {
+      // TODO(alexmarkov): assignable check
+      int cpIndex = cp.add(new ConstantField(target));
+      asm.emitStoreStaticTOS(cpIndex);
+    } else {
+      _genStaticCall(target, new ConstantArgDesc(1), 1);
+    }
+  }
+
+  @override
+  visitStringConcatenation(StringConcatenation node) {
+    if (node.expressions.length == 1) {
+      node.expressions.single.accept(this);
+      _genStaticCall(interpolateSingle, new ConstantArgDesc(1), 1);
+    } else {
+      _genPushNull();
+      _genPushInt(node.expressions.length);
+      asm.emitCreateArrayTOS();
+
+      final int temp = locals.tempIndex(node);
+      asm.emitStoreLocal(temp);
+
+      for (int i = 0; i < node.expressions.length; i++) {
+        asm.emitPush(temp);
+        _genPushInt(i);
+        node.expressions[i].accept(this);
+        asm.emitStoreIndexedTOS();
+      }
+
+      _genStaticCall(interpolate, new ConstantArgDesc(1), 1);
+    }
+  }
+
+  @override
+  visitStringLiteral(StringLiteral node) {
+    final cpIndex = cp.add(new ConstantString.fromLiteral(node));
+    asm.emitPushConstant(cpIndex);
+  }
+
+  @override
+  visitSymbolLiteral(SymbolLiteral node) {
+    final cpIndex = cp.add(new ConstantSymbol.fromLiteral(node));
+    asm.emitPushConstant(cpIndex);
+  }
+
+  @override
+  visitThisExpression(ThisExpression node) {
+    // TODO(alexmarkov): access to captured this from closures.
+    asm.emitPush(locals.thisVarIndex);
+  }
+
+  @override
+  visitThrow(Throw node) {
+    node.expression.accept(this);
+    asm.emitThrow(0);
+  }
+
+  @override
+  visitTypeLiteral(TypeLiteral node) {
+    final DartType type = node.type;
+    final int typeCPIndex = cp.add(new ConstantType(type));
+    if (!hasTypeParameters([type])) {
+      asm.emitPushConstant(typeCPIndex);
+    } else {
+      // TODO(alexmarkov): do not load instantiator type arguments / function type
+      // arguments if they are not needed for this particular [type].
+      _genPushInstantiatorTypeArguments();
+      _genPushFunctionTypeArguments();
+      asm.emitInstantiateType(typeCPIndex);
+    }
+  }
+
+  @override
+  visitVariableGet(VariableGet node) {
+    if (node.variable.isConst) {
+      _genPushConstExpr(node.variable.initializer);
+    } else {
+      // TODO(alexmarkov): access to captured variables.
+      asm.emitPush(locals.varIndex(node.variable));
+    }
+  }
+
+  @override
+  visitVariableSet(VariableSet node) {
+    node.value.accept(this);
+    // TODO(alexmarkov): access to captured variables.
+    asm.emitStoreLocal(locals.varIndex(node.variable));
+  }
+
+//  @override
+//  visitLoadLibrary(LoadLibrary node) {
+//  }
+//
+//  @override
+//  visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) {
+//  }
+//
+//  @override
+//  visitVectorCreation(VectorCreation node) {
+//  }
+//
+//  @override
+//  visitVectorGet(VectorGet node) {
+//  }
+//
+//  @override
+//  visitVectorSet(VectorSet node) {
+//  }
+//
+//  @override
+//  visitVectorCopy(VectorCopy node) {
+//  }
+//
+//  @override
+//  visitClosureCreation(ClosureCreation node) {
+//  }
+
+  @override
+  visitAssertStatement(AssertStatement node) {
+    // TODO(alexmarkov): support asserts
+  }
+
+  @override
+  visitBlock(Block node) {
+    visitList(node.statements, this);
+  }
+
+  @override
+  visitAssertBlock(AssertBlock node) {
+    // TODO(alexmarkov): support asserts
+  }
+
+  @override
+  visitBreakStatement(BreakStatement node) {
+    // TODO(alexmarkov): execute all finally blocks on the way out.
+    final label = labeledStatements[node.target] ??
+        (throw 'Target label ${node.target} was not registered for break $node');
+    asm.emitJump(label);
+  }
+
+  @override
+  visitContinueSwitchStatement(ContinueSwitchStatement node) {
+    // TODO(alexmarkov): execute all finally blocks on the way out.
+    final label = switchCases[node.target] ??
+        (throw 'Target label ${node.target} was not registered for continue-switch $node');
+    asm.emitJump(label);
+  }
+
+  @override
+  visitDoStatement(DoStatement node) {
+    final Label join = new Label();
+    asm.bind(join);
+
+    asm.emitCheckStack();
+
+    node.body.accept(this);
+
+    // TODO(alexmarkov): do we need to break this critical edge in CFG?
+    bool negated = _genCondition(node.condition);
+    _genJumpIfTrue(negated, join);
+  }
+
+  @override
+  visitEmptyStatement(EmptyStatement node) {
+    // no-op
+  }
+
+  @override
+  visitExpressionStatement(ExpressionStatement node) {
+    node.expression.accept(this);
+    asm.emitDrop1();
+  }
+
+  @override
+  visitForInStatement(ForInStatement node) {
+    node.iterable.accept(this);
+
+    const kIterator = 'iterator'; // Iterable.iterator
+    const kMoveNext = 'moveNext'; // Iterator.moveNext
+    const kCurrent = 'current'; // Iterator.current
+
+    asm.emitInstanceCall1(
+        1,
+        cp.add(new ConstantICData(
+            '$kGetterPrefix$kIterator', cp.add(new ConstantArgDesc(1)))));
+
+    final iteratorTemp = locals.tempIndex(node);
+    asm.emitPopLocal(iteratorTemp);
+
+    final Label done = new Label();
+    final Label join = new Label();
+    asm.bind(join);
+
+    asm.emitCheckStack();
+
+    asm.emitPush(iteratorTemp);
+    asm.emitInstanceCall1(1,
+        cp.add(new ConstantICData(kMoveNext, cp.add(new ConstantArgDesc(1)))));
+    _genJumpIfFalse(/* negated = */ false, done);
+
+    asm.emitPush(iteratorTemp);
+    asm.emitInstanceCall1(1,
+        cp.add(new ConstantICData(kCurrent, cp.add(new ConstantArgDesc(1)))));
+    asm.emitPopLocal(locals.varIndex(node.variable));
+
+    node.body.accept(this);
+
+    asm.emitJump(join);
+
+    asm.bind(done);
+  }
+
+  @override
+  visitForStatement(ForStatement node) {
+    visitList(node.variables, this);
+
+    final Label done = new Label();
+    final Label join = new Label();
+    asm.bind(join);
+
+    asm.emitCheckStack();
+
+    if (node.condition != null) {
+      bool negated = _genCondition(node.condition);
+      _genJumpIfFalse(negated, done);
+    }
+
+    node.body.accept(this);
+
+    for (var update in node.updates) {
+      update.accept(this);
+      asm.emitDrop1();
+    }
+
+    asm.emitJump(join);
+
+    asm.bind(done);
+  }
+
+//  @override
+//  visitFunctionDeclaration(FunctionDeclaration node) {
+//  }
+
+  @override
+  visitIfStatement(IfStatement node) {
+    final Label otherwisePart = new Label();
+
+    final bool negated = _genCondition(node.condition);
+    _genJumpIfFalse(negated, otherwisePart);
+
+    node.then.accept(this);
+
+    if (node.otherwise != null) {
+      final Label done = new Label();
+      asm.emitJump(done);
+      asm.bind(otherwisePart);
+      node.otherwise.accept(this);
+      asm.bind(done);
+    } else {
+      asm.bind(otherwisePart);
+    }
+  }
+
+  @override
+  visitLabeledStatement(LabeledStatement node) {
+    final label = new Label();
+    labeledStatements[node] = label;
+    node.body.accept(this);
+    asm.bind(label);
+    labeledStatements[node] = null;
+  }
+
+  @override
+  visitReturnStatement(ReturnStatement node) {
+    if (node.expression != null) {
+      node.expression.accept(this);
+    } else {
+      _genPushNull();
+    }
+    asm.emitReturnTOS();
+  }
+
+  @override
+  visitSwitchStatement(SwitchStatement node) {
+    node.expression.accept(this);
+
+    final int temp = locals.tempIndex(node);
+    asm.emitPopLocal(temp);
+
+    final Label done = new Label();
+    final List<Label> caseLabels =
+        new List<Label>.generate(node.cases.length, (_) => new Label());
+    final equalsArgDesc = cp.add(new ConstantArgDesc(2));
+
+    Label defaultLabel = done;
+    for (int i = 0; i < node.cases.length; i++) {
+      final SwitchCase switchCase = node.cases[i];
+      final Label caseLabel = caseLabels[i];
+      switchCases[switchCase] = caseLabel;
+
+      if (switchCase.isDefault) {
+        defaultLabel = caseLabel;
+      } else {
+        for (var expr in switchCase.expressions) {
+          asm.emitPush(temp);
+          _genPushConstExpr(expr);
+          asm.emitInstanceCall2(
+              2, cp.add(new ConstantICData('==', equalsArgDesc)));
+          _genJumpIfTrue(/* negated = */ false, caseLabel);
+        }
+      }
+    }
+
+    asm.emitJump(defaultLabel);
+
+    for (int i = 0; i < node.cases.length; i++) {
+      final SwitchCase switchCase = node.cases[i];
+      final Label caseLabel = caseLabels[i];
+
+      asm.bind(caseLabel);
+      switchCase.body.accept(this);
+
+      // Front-end issues a compile-time error if there is a fallthrough
+      // between cases. Also, default case should be the last one.
+    }
+
+    asm.bind(done);
+    node.cases.forEach(switchCases.remove);
+  }
+
+//  @override
+//  visitTryCatch(TryCatch node) {
+//  }
+//
+//  @override
+//  visitTryFinally(TryFinally node) {
+//  }
+
+  @override
+  visitVariableDeclaration(VariableDeclaration node) {
+    if (node.isConst) {
+      final Constant constant = constantEvaluator.evaluate(node.initializer);
+      constantEvaluator.env.addVariableValue(node, constant);
+    } else {
+      if (node.initializer != null) {
+        node.initializer.accept(this);
+      } else {
+        _genPushNull();
+      }
+      asm.emitPopLocal(locals.varIndex(node));
+    }
+  }
+
+  @override
+  visitWhileStatement(WhileStatement node) {
+    final Label done = new Label();
+    final Label join = new Label();
+    asm.bind(join);
+
+    asm.emitCheckStack();
+
+    bool negated = _genCondition(node.condition);
+    _genJumpIfFalse(negated, done);
+
+    node.body.accept(this);
+
+    asm.emitJump(join);
+
+    asm.bind(done);
+  }
+
+//  @override
+//  visitYieldStatement(YieldStatement node) {
+//  }
+
+  @override
+  visitFieldInitializer(FieldInitializer node) {
+    _genFieldInitializer(node.field, node.value);
+  }
+
+  @override
+  visitRedirectingInitializer(RedirectingInitializer node) {
+    final args = node.arguments;
+    assert(args.types.isEmpty);
+    _genArguments(new ThisExpression(), args);
+    _genStaticCallWithArgs(node.target, args, hasReceiver: true);
+    asm.emitDrop1();
+  }
+
+  @override
+  visitSuperInitializer(SuperInitializer node) {
+    final args = node.arguments;
+    assert(args.types.isEmpty);
+    _genArguments(new ThisExpression(), args);
+    // Re-resolve target due to partial mixin resolution.
+    Member target;
+    for (var replacement in enclosingClass.superclass.constructors) {
+      if (node.target.name == replacement.name) {
+        target = replacement;
+        break;
+      }
+    }
+    assert(target != null);
+    _genStaticCallWithArgs(target, args, hasReceiver: true);
+    asm.emitDrop1();
+  }
+
+//  @override
+//  visitLocalInitializer(LocalInitializer node) {
+//  }
+//
+//  @override
+//  visitAssertInitializer(AssertInitializer node) {
+//  }
+//
+//  @override
+//  visitInvalidInitializer(InvalidInitializer node) {}
+
+  @override
+  visitConstantExpression(ConstantExpression node) {
+    int cpIndex = node.constant.accept(constantEmitter);
+    asm.emitPushConstant(cpIndex);
+  }
+}
+
+class ConstantEmitter extends ConstantVisitor<int> {
+  final ConstantPool cp;
+
+  ConstantEmitter(this.cp);
+
+  @override
+  int defaultConstant(Constant node) => throw new UnsupportedOperationError(
+      'Unsupported constant node ${node.runtimeType}');
+
+  @override
+  int visitNullConstant(NullConstant node) => cp.add(const ConstantNull());
+
+  @override
+  int visitBoolConstant(BoolConstant node) =>
+      cp.add(new ConstantBool(node.value));
+
+  @override
+  int visitIntConstant(IntConstant node) => cp.add(new ConstantInt(node.value));
+
+  @override
+  int visitDoubleConstant(DoubleConstant node) =>
+      cp.add(new ConstantDouble(node.value));
+
+  @override
+  int visitStringConstant(StringConstant node) =>
+      cp.add(new ConstantString(node.value));
+
+  @override
+  int visitListConstant(ListConstant node) => cp.add(new ConstantList(
+      node.typeArgument,
+      new List<int>.from(node.entries.map((Constant c) => c.accept(this)))));
+
+  @override
+  int visitInstanceConstant(InstanceConstant node) =>
+      cp.add(new ConstantInstance(
+          node.klass,
+          cp.add(new ConstantTypeArguments(node.typeArguments)),
+          node.fieldValues.map<Reference, int>(
+              (Reference fieldRef, Constant value) =>
+                  new MapEntry(fieldRef, value.accept(this)))));
+
+  @override
+  int visitTearOffConstant(TearOffConstant node) =>
+      cp.add(new ConstantTearOff(node.procedure));
+
+//  @override
+//  int visitTypeLiteralConstant(TypeLiteralConstant node) => defaultConstant(node);
+}
+
+class UnsupportedOperationError {
+  final String message;
+  UnsupportedOperationError(this.message);
+
+  @override
+  String toString() => message;
+}
+
+class FindTypeParametersVisitor extends DartTypeVisitor<bool> {
+  bool visit(DartType type) => type.accept(this);
+
+  @override
+  bool defaultDartType(DartType node) =>
+      throw 'Unexpected type ${node.runtimeType} $node';
+
+  @override
+  bool visitInvalidType(InvalidType node) => false;
+
+  @override
+  bool visitDynamicType(DynamicType node) => false;
+
+  @override
+  bool visitVoidType(VoidType node) => false;
+
+  @override
+  bool visitBottomType(BottomType node) => false;
+
+  @override
+  bool visitVectorType(VectorType node) => false;
+
+  @override
+  bool visitTypeParameterType(TypeParameterType node) => true;
+
+  @override
+  bool visitInterfaceType(InterfaceType node) =>
+      node.typeArguments.any((t) => t.accept(this));
+
+  @override
+  bool visitTypedefType(TypedefType node) =>
+      node.typeArguments.any((t) => t.accept(this));
+
+  @override
+  bool visitFunctionType(FunctionType node) =>
+      node.typeParameters.isNotEmpty ||
+      node.positionalParameters.any((t) => t.accept(this)) ||
+      node.namedParameters.any((p) => p.type.accept(this));
+}
diff --git a/pkg/vm/lib/bytecode/local_vars.dart b/pkg/vm/lib/bytecode/local_vars.dart
new file mode 100644
index 0000000..578cbc6
--- /dev/null
+++ b/pkg/vm/lib/bytecode/local_vars.dart
@@ -0,0 +1,238 @@
+// 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 vm.bytecode.local_vars;
+
+import 'dart:math' show max;
+
+import 'package:kernel/ast.dart';
+import 'package:vm/bytecode/dbc.dart';
+
+class LocalVariables extends RecursiveVisitor<Null> {
+  final Map<VariableDeclaration, int> _vars = <VariableDeclaration, int>{};
+  final Map<TreeNode, int> _temps = <TreeNode, int>{};
+  final List<int> _scopes = <int>[];
+  int _localVars = 0;
+  int _frameSize = 0;
+  int _numParameters = 0;
+  bool _hasOptionalParameters = false;
+  int _thisVarIndex;
+  int _functionTypeArgsVarIndex;
+
+  int get thisVarIndex =>
+      _thisVarIndex ?? (throw '\'this\' variable is not allocated');
+
+  int get functionTypeArgsVarIndex =>
+      _functionTypeArgsVarIndex ??
+      (throw '\'functionTypeArgs\' variable is not allocated');
+
+  int get frameSize => _frameSize;
+
+  int get numParameters => _numParameters;
+
+  bool get hasOptionalParameters => _hasOptionalParameters;
+
+  int varIndex(VariableDeclaration variable) =>
+      _vars[variable] ?? (throw '\'$variable\' variable is not allocated');
+
+  int tempIndex(TreeNode node) =>
+      _temps[node] ??
+      (throw 'Temp is not allocated for node ${node.runtimeType} $node');
+
+  int _allocateVar(VariableDeclaration node, {int index}) {
+    if (index == null) {
+      index = _localVars++;
+    } else {
+      // Should be a parameter.
+      assert(index < 0 || (_hasOptionalParameters && index < _numParameters));
+    }
+    _frameSize = max(_frameSize, _localVars);
+    if (node != null) {
+      assert(_vars[node] == null);
+      _vars[node] = index;
+    }
+    return index;
+  }
+
+  // TODO(alexmarkov): allocate temporaries more efficiently.
+  void _allocateTemp(TreeNode node) {
+    _temps[node] = _allocateVar(null);
+  }
+
+  int _allocateParameter(VariableDeclaration node, int i) {
+    assert(0 <= i && i < _numParameters);
+    int paramSlotIndex =
+        _hasOptionalParameters ? i : -kParamEndSlotFromFp - _numParameters + i;
+    return _allocateVar(node, index: paramSlotIndex);
+  }
+
+  void _enterScope() {
+    _scopes.add(_localVars);
+  }
+
+  void _leaveScope() {
+    final int enclosingScopeLocalVars = _scopes.removeLast();
+    assert(_localVars >= enclosingScopeLocalVars);
+    _localVars = enclosingScopeLocalVars;
+  }
+
+  @override
+  visitField(Field node) {
+    if (node.initializer != null) {
+      assert(_vars.isEmpty);
+      assert(_localVars == 0);
+
+      _enterScope();
+      node.initializer.accept(this);
+      _leaveScope();
+
+      assert(_scopes.isEmpty);
+    }
+  }
+
+  @override
+  defaultMember(Member node) {
+    assert(_vars.isEmpty);
+    assert(_localVars == 0);
+
+    final function = node.function;
+    final bool hasTypeArgs = function.typeParameters.isNotEmpty;
+    final bool hasReceiver =
+        node is Constructor || ((node is Procedure) && !node.isStatic);
+    _numParameters = function.positionalParameters.length +
+        function.namedParameters.length +
+        (hasTypeArgs ? 1 : 0) +
+        (hasReceiver ? 1 : 0);
+    _hasOptionalParameters = function.requiredParameterCount <
+            function.positionalParameters.length ||
+        function.namedParameters.isNotEmpty;
+    int count = 0;
+
+    if (hasTypeArgs) {
+      _functionTypeArgsVarIndex = _allocateParameter(null, count++);
+    }
+
+    if (hasReceiver) {
+      _thisVarIndex = _allocateParameter(null, count++);
+    }
+
+    for (var param in function.positionalParameters) {
+      _allocateParameter(param, count++);
+    }
+
+    List<VariableDeclaration> namedParams = function.namedParameters;
+    namedParams.sort((VariableDeclaration a, VariableDeclaration b) =>
+        a.name.compareTo(b.name));
+    for (var param in namedParams) {
+      _allocateParameter(param, count++);
+    }
+
+    if (_hasOptionalParameters) {
+      _localVars = _numParameters;
+      _frameSize = _numParameters;
+    }
+
+    _enterScope();
+    if (node is Constructor) {
+      _enterScope();
+      for (var field in node.enclosingClass.fields) {
+        if (!field.isStatic && field.initializer != null) {
+          field.initializer.accept(this);
+        }
+      }
+      visitList(node.initializers, this);
+      _leaveScope();
+    }
+    function.body?.accept(this);
+    _leaveScope();
+
+    assert(_scopes.isEmpty);
+  }
+
+  @override
+  visitBlock(Block node) {
+    _enterScope();
+    node.visitChildren(this);
+    _leaveScope();
+  }
+
+  @override
+  visitVariableDeclaration(VariableDeclaration node) {
+    _allocateVar(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  visitLet(Let node) {
+    _enterScope();
+    node.variable.accept(this);
+    node.body.accept(this);
+    _leaveScope();
+  }
+
+  // -------------- Allocation of temporaries --------------
+
+  @override
+  visitConstructorInvocation(ConstructorInvocation node) {
+    if (node.isConst) {
+      return;
+    }
+    _allocateTemp(node);
+    super.visitConstructorInvocation(node);
+  }
+
+  @override
+  visitListLiteral(ListLiteral node) {
+    if (node.isConst) {
+      return;
+    }
+    _allocateTemp(node);
+    super.visitListLiteral(node);
+  }
+
+  @override
+  visitMapLiteral(MapLiteral node) {
+    if (node.isConst) {
+      return;
+    }
+    _allocateTemp(node);
+    super.visitMapLiteral(node);
+  }
+
+  @override
+  visitStringConcatenation(StringConcatenation node) {
+    _allocateTemp(node);
+    super.visitStringConcatenation(node);
+  }
+
+  @override
+  visitConditionalExpression(ConditionalExpression node) {
+    _allocateTemp(node);
+    super.visitConditionalExpression(node);
+  }
+
+  @override
+  visitLogicalExpression(LogicalExpression node) {
+    _allocateTemp(node);
+    super.visitLogicalExpression(node);
+  }
+
+  @override
+  visitPropertySet(PropertySet node) {
+    _allocateTemp(node);
+    super.visitPropertySet(node);
+  }
+
+  @override
+  visitForInStatement(ForInStatement node) {
+    _allocateTemp(node);
+    super.visitForInStatement(node);
+  }
+
+  @override
+  visitSwitchStatement(SwitchStatement node) {
+    _allocateTemp(node);
+    super.visitSwitchStatement(node);
+  }
+}
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index 026a99e..8bf56e0 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -16,6 +16,7 @@
 import 'package:front_end/src/fasta/severity.dart' show Severity;
 import 'package:kernel/ast.dart' show Component, StaticGet, Field;
 import 'package:kernel/core_types.dart' show CoreTypes;
+import 'package:vm/bytecode/gen_bytecode.dart' show generateBytecode;
 
 import 'transformations/devirtualization.dart' as devirtualization
     show transformComponent;
@@ -34,7 +35,8 @@
 Future<Component> compileToKernel(Uri source, CompilerOptions options,
     {bool aot: false,
     bool useGlobalTypeFlowAnalysis: false,
-    List<String> entryPoints}) async {
+    List<String> entryPoints,
+    bool genBytecode: false}) async {
   // Replace error handler to detect if there are compilation errors.
   final errorDetector =
       new ErrorDetector(previousErrorHandler: options.onError);
@@ -51,6 +53,10 @@
         component, options.strongMode, useGlobalTypeFlowAnalysis, entryPoints);
   }
 
+  if (genBytecode && component != null) {
+    generateBytecode(component, strongMode: options.strongMode);
+  }
+
   return component;
 }
 
diff --git a/pkg/vm/lib/metadata/bytecode.dart b/pkg/vm/lib/metadata/bytecode.dart
new file mode 100644
index 0000000..1c28c0e
--- /dev/null
+++ b/pkg/vm/lib/metadata/bytecode.dart
@@ -0,0 +1,44 @@
+// 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 vm.metadata.bytecode;
+
+import 'package:kernel/ast.dart';
+import 'package:vm/bytecode/constant_pool.dart' show ConstantPool;
+import 'package:vm/bytecode/disassembler.dart' show BytecodeDisassembler;
+
+/// Metadata containing bytecode.
+class BytecodeMetadata {
+  final List<int> bytecodes;
+  final ConstantPool constantPool;
+
+  BytecodeMetadata(this.bytecodes, this.constantPool);
+
+  @override
+  String toString() =>
+      "\nBytecode {\n${new BytecodeDisassembler().disassemble(bytecodes)}}\n$constantPool";
+}
+
+/// Repository for [BytecodeMetadata].
+class BytecodeMetadataRepository extends MetadataRepository<BytecodeMetadata> {
+  @override
+  final String tag = 'vm.bytecode';
+
+  @override
+  final Map<TreeNode, BytecodeMetadata> mapping =
+      <TreeNode, BytecodeMetadata>{};
+
+  @override
+  void writeToBinary(BytecodeMetadata metadata, BinarySink sink) {
+    sink.writeByteList(metadata.bytecodes);
+    metadata.constantPool.writeToBinary(sink);
+  }
+
+  @override
+  BytecodeMetadata readFromBinary(BinarySource source) {
+    final List<int> bytecodes = source.readByteList();
+    final ConstantPool constantPool = new ConstantPool.readFromBinary(source);
+    return new BytecodeMetadata(bytecodes, constantPool);
+  }
+}
diff --git a/pkg/vm/lib/transformations/type_flow/entry_points_extra.json b/pkg/vm/lib/transformations/type_flow/entry_points_extra.json
index 4d4ce33..0ff8ba4 100644
--- a/pkg/vm/lib/transformations/type_flow/entry_points_extra.json
+++ b/pkg/vm/lib/transformations/type_flow/entry_points_extra.json
@@ -95,6 +95,12 @@
     {
       "library": "dart:core",
       "class": "_Closure",
+      "name": "_delayed_type_arguments",
+      "action": "get"
+    },
+    {
+      "library": "dart:core",
+      "class": "_Closure",
       "name": "_function",
       "action": "get"
     },
diff --git a/pkg/vm/test/bytecode/gen_bytecode_test.dart b/pkg/vm/test/bytecode/gen_bytecode_test.dart
new file mode 100644
index 0000000..3ee9d45
--- /dev/null
+++ b/pkg/vm/test/bytecode/gen_bytecode_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/kernel.dart';
+import 'package:test/test.dart';
+import 'package:vm/bytecode/gen_bytecode.dart' show generateBytecode;
+
+import '../common_test_utils.dart';
+
+final String pkgVmDir = Platform.script.resolve('../..').toFilePath();
+
+runTestCase(Uri source) async {
+  Component component = await compileTestCaseToKernelProgram(source);
+
+  generateBytecode(component, strongMode: true);
+
+  final actual = kernelLibraryToString(component.mainMethod.enclosingLibrary);
+  compareResultWithExpectationsFile(source, actual);
+}
+
+main() {
+  group('gen-bytecode', () {
+    final testCasesDir = new Directory(pkgVmDir + '/testcases/bytecode');
+
+    for (var entry
+        in testCasesDir.listSync(recursive: true, followLinks: false)) {
+      if (entry.path.endsWith(".dart")) {
+        test(entry.path, () => runTestCase(entry.uri));
+      }
+    }
+  });
+}
diff --git a/pkg/vm/test/transformations/type_flow/common_test_utils.dart b/pkg/vm/test/common_test_utils.dart
similarity index 74%
rename from pkg/vm/test/transformations/type_flow/common_test_utils.dart
rename to pkg/vm/test/common_test_utils.dart
index cdac3b9..20b0126 100644
--- a/pkg/vm/test/transformations/type_flow/common_test_utils.dart
+++ b/pkg/vm/test/common_test_utils.dart
@@ -9,6 +9,7 @@
 import 'package:front_end/src/compute_platform_binaries_location.dart'
     show computePlatformBinariesLocation;
 import 'package:kernel/ast.dart';
+import 'package:kernel/text/ast_to_text.dart' show Printer;
 import 'package:kernel/target/targets.dart';
 import 'package:kernel/target/vm.dart';
 import 'package:test/test.dart';
@@ -26,7 +27,21 @@
     ..onError = (CompilationMessage error) {
       fail("Compilation error: ${error}");
     };
-  return kernelForProgram(sourceUri, options);
+
+  final Component component = await kernelForProgram(sourceUri, options);
+
+  // Make sure the library name is the same and does not depend on the order
+  // of test cases.
+  component.mainMethod.enclosingLibrary.name = '#lib';
+
+  return component;
+}
+
+String kernelLibraryToString(Library library) {
+  final StringBuffer buffer = new StringBuffer();
+  new Printer(buffer, showExternal: false, showMetadata: true)
+      .writeLibraryFile(library);
+  return buffer.toString();
 }
 
 void compareResultWithExpectationsFile(Uri source, String actual) {
diff --git a/pkg/vm/test/transformations/type_flow/summary_collector_test.dart b/pkg/vm/test/transformations/type_flow/summary_collector_test.dart
index 9d4499b..369c421 100644
--- a/pkg/vm/test/transformations/type_flow/summary_collector_test.dart
+++ b/pkg/vm/test/transformations/type_flow/summary_collector_test.dart
@@ -12,7 +12,7 @@
 import 'package:vm/transformations/type_flow/native_code.dart';
 import 'package:vm/transformations/type_flow/summary_collector.dart';
 
-import 'common_test_utils.dart';
+import '../../common_test_utils.dart';
 
 final String pkgVmDir = Platform.script.resolve('../../..').toFilePath();
 
@@ -43,10 +43,6 @@
   final Component component = await compileTestCaseToKernelProgram(source);
   final Library library = component.mainMethod.enclosingLibrary;
 
-  // Make sure the library name is the same and does not depend on the order
-  // of test cases.
-  library.name = '#lib';
-
   final typeEnvironment = new TypeEnvironment(
       new CoreTypes(component), new ClassHierarchy(component));
 
diff --git a/pkg/vm/test/transformations/type_flow/transformer_test.dart b/pkg/vm/test/transformations/type_flow/transformer_test.dart
index 45a1855..07dcb37 100644
--- a/pkg/vm/test/transformations/type_flow/transformer_test.dart
+++ b/pkg/vm/test/transformations/type_flow/transformer_test.dart
@@ -7,22 +7,17 @@
 import 'package:kernel/ast.dart';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart';
-import 'package:kernel/text/ast_to_text.dart';
 import 'package:test/test.dart';
 import 'package:vm/transformations/type_flow/transformer.dart'
     show transformComponent;
 
-import 'common_test_utils.dart';
+import '../../common_test_utils.dart';
 
 final String pkgVmDir = Platform.script.resolve('../../..').toFilePath();
 
 runTestCase(Uri source) async {
   Component component = await compileTestCaseToKernelProgram(source);
 
-  // Make sure the library name is the same and does not depend on the order
-  // of test cases.
-  component.mainMethod.enclosingLibrary.name = '#lib';
-
   final coreTypes = new CoreTypes(component);
 
   final entryPoints = [
@@ -32,10 +27,7 @@
 
   component = transformComponent(coreTypes, component, entryPoints);
 
-  final StringBuffer buffer = new StringBuffer();
-  new Printer(buffer, showExternal: false, showMetadata: true)
-      .writeLibraryFile(component.mainMethod.enclosingLibrary);
-  final actual = buffer.toString();
+  final actual = kernelLibraryToString(component.mainMethod.enclosingLibrary);
 
   compareResultWithExpectationsFile(source, actual);
 }
diff --git a/pkg/vm/testcases/bytecode/boostrapping.dart b/pkg/vm/testcases/bytecode/boostrapping.dart
new file mode 100644
index 0000000..8f79be8
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/boostrapping.dart
@@ -0,0 +1,142 @@
+// 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.
+
+// Selection of methods used during bootstrapping.
+
+// ignore_for_file: native_function_body_in_non_sdk_code
+// ignore_for_file: unused_element, unused_field
+
+// -----------------------------------------------------------------
+
+void _printString(String s) native "Builtin_PrintString";
+
+void _print(arg) {
+  _printString(arg.toString());
+}
+
+_getPrintClosure() => _print;
+
+// -----------------------------------------------------------------
+
+typedef void _ScheduleImmediateClosure(void callback());
+
+class _ScheduleImmediate {
+  static _ScheduleImmediateClosure _closure;
+}
+
+void _setScheduleImmediateClosure(_ScheduleImmediateClosure closure) {
+  _ScheduleImmediate._closure = closure;
+}
+
+// -----------------------------------------------------------------
+
+class _NamespaceImpl implements _Namespace {
+  _NamespaceImpl._();
+
+  static _NamespaceImpl _create(_NamespaceImpl namespace, var n)
+      native "Namespace_Create";
+  static int _getPointer(_NamespaceImpl namespace)
+      native "Namespace_GetPointer";
+  static int _getDefault() native "Namespace_GetDefault";
+
+  // If the platform supports "namespaces", this method is called by the
+  // embedder with the platform-specific namespace information.
+  static _NamespaceImpl _cachedNamespace = null;
+  static void _setupNamespace(var namespace) {
+    _cachedNamespace = _create(new _NamespaceImpl._(), namespace);
+  }
+
+  static _NamespaceImpl get _namespace {
+    if (_cachedNamespace == null) {
+      // The embedder has not supplied a namespace before one is needed, so
+      // instead use a safe-ish default value.
+      _cachedNamespace = _create(new _NamespaceImpl._(), _getDefault());
+    }
+    return _cachedNamespace;
+  }
+
+  static int get _namespacePointer => _getPointer(_namespace);
+}
+
+class _Namespace {
+  static void _setupNamespace(var namespace) {
+    _NamespaceImpl._setupNamespace(namespace);
+  }
+
+  static _Namespace get _namespace => _NamespaceImpl._namespace;
+
+  static int get _namespacePointer => _NamespaceImpl._namespacePointer;
+}
+
+// -----------------------------------------------------------------
+
+// These may be set to different values by the embedder by calling
+// _setStdioFDs when initializing dart:io.
+int _stdinFD = 0;
+int _stdoutFD = 1;
+int _stderrFD = 2;
+
+// This is an embedder entrypoint.
+void _setStdioFDs(int stdin, int stdout, int stderr) {
+  _stdinFD = stdin;
+  _stdoutFD = stdout;
+  _stderrFD = stderr;
+}
+
+// -----------------------------------------------------------------
+
+class VMLibraryHooks {
+  // Example: "dart:isolate _Timer._factory"
+  static var timerFactory;
+
+  // Example: "dart:io _EventHandler._sendData"
+  static var eventHandlerSendData;
+
+  // A nullary closure that answers the current clock value in milliseconds.
+  // Example: "dart:io _EventHandler._timerMillisecondClock"
+  static var timerMillisecondClock;
+
+  // Implementation of Resource.readAsBytes.
+  static var resourceReadAsBytes;
+
+  // Implementation of package root/map provision.
+  static var packageRootString;
+  static var packageConfigString;
+  static var packageRootUriFuture;
+  static var packageConfigUriFuture;
+  static var resolvePackageUriFuture;
+
+  static var _computeScriptUri;
+  static var _cachedScript;
+  static set platformScript(var f) {
+    _computeScriptUri = f;
+    _cachedScript = null;
+  }
+
+  static get platformScript {
+    if (_cachedScript == null && _computeScriptUri != null) {
+      _cachedScript = _computeScriptUri();
+    }
+    return _cachedScript;
+  }
+}
+
+String _rawScript;
+Uri _scriptUri() {
+  if (_rawScript.startsWith('http:') ||
+      _rawScript.startsWith('https:') ||
+      _rawScript.startsWith('file:')) {
+    return Uri.parse(_rawScript);
+  } else {
+    return Uri.base.resolveUri(new Uri.file(_rawScript));
+  }
+}
+
+_setupHooks() {
+  VMLibraryHooks.platformScript = _scriptUri;
+}
+
+// -----------------------------------------------------------------
+
+main() {}
diff --git a/pkg/vm/testcases/bytecode/boostrapping.dart.expect b/pkg/vm/testcases/bytecode/boostrapping.dart.expect
new file mode 100644
index 0000000..8070f3e
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/boostrapping.dart.expect
@@ -0,0 +1,742 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+typedef _ScheduleImmediateClosure = (() → void) → void;
+class _ScheduleImmediate extends core::Object {
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]  static field (() → void) → void _closure = null;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  PushConstant         CP#1
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [2] = Null
+}
+]  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class _NamespaceImpl extends core::Object implements self::_Namespace {
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]  static field self::_NamespaceImpl _cachedNamespace = null;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  PushConstant         CP#1
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [2] = Null
+}
+]  constructor _() → void
+    : super core::Object::•()
+    ;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]  @_in::ExternalName::•("Namespace_Create")
+  external static method _create(self::_NamespaceImpl namespace, dynamic n) → self::_NamespaceImpl;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]  @_in::ExternalName::•("Namespace_GetPointer")
+  external static method _getPointer(self::_NamespaceImpl namespace) → core::int;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]  @_in::ExternalName::•("Namespace_GetDefault")
+  external static method _getDefault() → core::int;
+[@vm.bytecode=
+Bytecode {
+  Entry                1
+  CheckStack
+  Allocate             CP#0
+  StoreLocal           r0
+  Push                 r0
+  PushConstant         CP#2
+  IndirectStaticCall   1, CP#1
+  Drop1
+  Push                 FP[-5]
+  PushConstant         CP#4
+  IndirectStaticCall   2, CP#3
+  StoreStaticTOS       CP#5
+  Drop1
+  PushConstant         CP#6
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Class #lib::_NamespaceImpl
+  [1] = ArgDesc num-args 1, num-type-args 0, names []
+  [2] = StaticICData target '#lib::_NamespaceImpl::_', arg-desc CP#1
+  [3] = ArgDesc num-args 2, num-type-args 0, names []
+  [4] = StaticICData target '#lib::_NamespaceImpl::_create', arg-desc CP#3
+  [5] = Field #lib::_NamespaceImpl::_cachedNamespace
+  [6] = Null
+}
+]  static method _setupNamespace(dynamic namespace) → void {
+    self::_NamespaceImpl::_cachedNamespace = self::_NamespaceImpl::_create(new self::_NamespaceImpl::_(), namespace);
+  }
+[@vm.bytecode=
+Bytecode {
+  Entry                1
+  CheckStack
+  PushConstant         CP#0
+  PushStatic           CP#0
+  PushConstant         CP#1
+  InstanceCall1        2, CP#3
+  PushConstant         CP#4
+  IfNeStrictTOS
+  Jump                 L1
+  Allocate             CP#5
+  StoreLocal           r0
+  Push                 r0
+  PushConstant         CP#7
+  IndirectStaticCall   1, CP#6
+  Drop1
+  PushConstant         CP#9
+  IndirectStaticCall   0, CP#8
+  PushConstant         CP#10
+  IndirectStaticCall   2, CP#2
+  StoreStaticTOS       CP#0
+  Drop1
+L1:
+  PushConstant         CP#0
+  PushStatic           CP#0
+  ReturnTOS
+  PushConstant         CP#1
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Field #lib::_NamespaceImpl::_cachedNamespace
+  [1] = Null
+  [2] = ArgDesc num-args 2, num-type-args 0, names []
+  [3] = ICData target-name '==', arg-desc CP#2
+  [4] = Bool true
+  [5] = Class #lib::_NamespaceImpl
+  [6] = ArgDesc num-args 1, num-type-args 0, names []
+  [7] = StaticICData target '#lib::_NamespaceImpl::_', arg-desc CP#6
+  [8] = ArgDesc num-args 0, num-type-args 0, names []
+  [9] = StaticICData target '#lib::_NamespaceImpl::_getDefault', arg-desc CP#8
+  [10] = StaticICData target '#lib::_NamespaceImpl::_create', arg-desc CP#2
+}
+]  static get _namespace() → self::_NamespaceImpl {
+    if(self::_NamespaceImpl::_cachedNamespace.{core::Object::==}(null)) {
+      self::_NamespaceImpl::_cachedNamespace = self::_NamespaceImpl::_create(new self::_NamespaceImpl::_(), self::_NamespaceImpl::_getDefault());
+    }
+    return self::_NamespaceImpl::_cachedNamespace;
+  }
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#1
+  IndirectStaticCall   0, CP#0
+  PushConstant         CP#3
+  IndirectStaticCall   1, CP#2
+  ReturnTOS
+  PushConstant         CP#4
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 0, num-type-args 0, names []
+  [1] = StaticICData 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
+}
+]  static get _namespacePointer() → core::int
+    return self::_NamespaceImpl::_getPointer(self::_NamespaceImpl::_namespace);
+}
+class _Namespace extends core::Object {
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  PushConstant         CP#1
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [2] = Null
+}
+]  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  PushConstant         CP#1
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = StaticICData target '#lib::_NamespaceImpl::_setupNamespace', arg-desc CP#0
+  [2] = Null
+}
+]  static method _setupNamespace(dynamic namespace) → void {
+    self::_NamespaceImpl::_setupNamespace(namespace);
+  }
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#1
+  IndirectStaticCall   0, CP#0
+  ReturnTOS
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 0, num-type-args 0, names []
+  [1] = StaticICData target '#lib::_NamespaceImpl::_namespace', arg-desc CP#0
+  [2] = Null
+}
+]  static get _namespace() → self::_Namespace
+    return self::_NamespaceImpl::_namespace;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#1
+  IndirectStaticCall   0, CP#0
+  ReturnTOS
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 0, num-type-args 0, names []
+  [1] = StaticICData target '#lib::_NamespaceImpl::_namespacePointer', arg-desc CP#0
+  [2] = Null
+}
+]  static get _namespacePointer() → core::int
+    return self::_NamespaceImpl::_namespacePointer;
+}
+class VMLibraryHooks extends core::Object {
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]  static field dynamic timerFactory = null;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]  static field dynamic eventHandlerSendData = null;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]  static field dynamic timerMillisecondClock = null;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]  static field dynamic resourceReadAsBytes = null;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]  static field dynamic packageRootString = null;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]  static field dynamic packageConfigString = null;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]  static field dynamic packageRootUriFuture = null;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]  static field dynamic packageConfigUriFuture = null;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]  static field dynamic resolvePackageUriFuture = null;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]  static field dynamic _computeScriptUri = null;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]  static field dynamic _cachedScript = null;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  PushConstant         CP#1
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [2] = Null
+}
+]  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  StoreStaticTOS       CP#0
+  Drop1
+  PushConstant         CP#1
+  StoreStaticTOS       CP#2
+  Drop1
+  PushConstant         CP#1
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Field #lib::VMLibraryHooks::_computeScriptUri
+  [1] = Null
+  [2] = Field #lib::VMLibraryHooks::_cachedScript
+}
+]  static set platformScript(dynamic f) → void {
+    self::VMLibraryHooks::_computeScriptUri = f;
+    self::VMLibraryHooks::_cachedScript = null;
+  }
+[@vm.bytecode=
+Bytecode {
+  Entry                1
+  CheckStack
+  PushConstant         CP#0
+  PushStatic           CP#0
+  PushConstant         CP#1
+  InstanceCall1        2, CP#3
+  PushConstant         CP#4
+  IfNeStrictTOS
+  Jump                 L1
+  PushConstant         CP#5
+  PushStatic           CP#5
+  PushConstant         CP#1
+  InstanceCall1        2, CP#6
+  BooleanNegateTOS
+  PopLocal             r0
+  Jump                 L2
+L1:
+  PushConstant         CP#7
+  PopLocal             r0
+L2:
+  Push                 r0
+  PushConstant         CP#4
+  IfNeStrictTOS
+  Jump                 L3
+  PushConstant         CP#5
+  PushStatic           CP#5
+  InstanceCall1        1, CP#9
+  StoreStaticTOS       CP#0
+  Drop1
+L3:
+  PushConstant         CP#0
+  PushStatic           CP#0
+  ReturnTOS
+  PushConstant         CP#1
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Field #lib::VMLibraryHooks::_cachedScript
+  [1] = Null
+  [2] = ArgDesc num-args 2, num-type-args 0, names []
+  [3] = ICData target-name '==', arg-desc CP#2
+  [4] = Bool true
+  [5] = Field #lib::VMLibraryHooks::_computeScriptUri
+  [6] = ICData target-name '==', arg-desc CP#2
+  [7] = Bool false
+  [8] = ArgDesc num-args 1, num-type-args 0, names []
+  [9] = ICData target-name 'call', arg-desc CP#8
+}
+]  static get platformScript() → dynamic {
+    if(self::VMLibraryHooks::_cachedScript.==(null) && !self::VMLibraryHooks::_computeScriptUri.==(null)) {
+      self::VMLibraryHooks::_cachedScript = self::VMLibraryHooks::_computeScriptUri.call();
+    }
+    return self::VMLibraryHooks::_cachedScript;
+  }
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Int 0
+}
+]static field core::int _stdinFD = 0;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Int 1
+}
+]static field core::int _stdoutFD = 1;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Int 2
+}
+]static field core::int _stderrFD = 2;
+static field core::String _rawScript;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]@_in::ExternalName::•("Builtin_PrintString")
+external static method _printString(core::String s) → void;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  InstanceCall1        1, CP#1
+  PushConstant         CP#2
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#3
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = ICData target-name 'toString', arg-desc CP#0
+  [2] = StaticICData target '#lib::_printString', arg-desc CP#0
+  [3] = Null
+}
+]static method _print(dynamic arg) → void {
+  self::_printString(arg.toString() as{TypeError} core::String);
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+  PushConstant         CP#1
+  ReturnTOS
+}
+ConstantPool {
+  [0] = TearOff #lib::_print
+  [1] = Null
+}
+]static method _getPrintClosure() → dynamic
+  return self::_print;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  StoreStaticTOS       CP#0
+  Drop1
+  PushConstant         CP#1
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Field #lib::_ScheduleImmediate::_closure
+  [1] = Null
+}
+]static method _setScheduleImmediateClosure((() → void) → void closure) → void {
+  self::_ScheduleImmediate::_closure = closure;
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-7]
+  StoreStaticTOS       CP#0
+  Drop1
+  Push                 FP[-6]
+  StoreStaticTOS       CP#1
+  Drop1
+  Push                 FP[-5]
+  StoreStaticTOS       CP#2
+  Drop1
+  PushConstant         CP#3
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Field #lib::_stdinFD
+  [1] = Field #lib::_stdoutFD
+  [2] = Field #lib::_stderrFD
+  [3] = Null
+}
+]static method _setStdioFDs(core::int stdin, core::int stdout, core::int stderr) → void {
+  self::_stdinFD = stdin;
+  self::_stdoutFD = stdout;
+  self::_stderrFD = stderr;
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                2
+  CheckStack
+  PushConstant         CP#0
+  PushStatic           CP#0
+  PushConstant         CP#1
+  InstanceCall1        2, CP#3
+  PushConstant         CP#4
+  IfEqStrictTOS
+  Jump                 L1
+  PushConstant         CP#0
+  PushStatic           CP#0
+  PushConstant         CP#5
+  InstanceCall1        2, CP#6
+  PopLocal             r1
+  Jump                 L2
+L1:
+  PushConstant         CP#4
+  PopLocal             r1
+L2:
+  Push                 r1
+  PushConstant         CP#4
+  IfEqStrictTOS
+  Jump                 L3
+  PushConstant         CP#0
+  PushStatic           CP#0
+  PushConstant         CP#7
+  InstanceCall1        2, CP#8
+  PopLocal             r0
+  Jump                 L4
+L3:
+  PushConstant         CP#4
+  PopLocal             r0
+L4:
+  Push                 r0
+  PushConstant         CP#4
+  IfNeStrictTOS
+  Jump                 L5
+  PushConstant         CP#0
+  PushStatic           CP#0
+  PushConstant         CP#10
+  IndirectStaticCall   1, CP#9
+  ReturnTOS
+  Jump                 L6
+L5:
+  PushConstant         CP#12
+  IndirectStaticCall   0, CP#11
+  PushConstant         CP#13
+  PushConstant         CP#0
+  PushStatic           CP#0
+  PushConstant         CP#14
+  IndirectStaticCall   2, CP#9
+  InstanceCall1        2, CP#15
+  ReturnTOS
+L6:
+  PushConstant         CP#13
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Field #lib::_rawScript
+  [1] = String 'http:'
+  [2] = ArgDesc num-args 2, num-type-args 0, names []
+  [3] = ICData target-name 'startsWith', arg-desc CP#2
+  [4] = Bool true
+  [5] = String 'https:'
+  [6] = ICData target-name 'startsWith', arg-desc CP#2
+  [7] = String 'file:'
+  [8] = ICData target-name 'startsWith', arg-desc CP#2
+  [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
+  [13] = Null
+  [14] = StaticICData target 'dart.core::_Uri::file', arg-desc CP#9
+  [15] = ICData target-name 'resolveUri', arg-desc CP#2
+}
+]static method _scriptUri() → core::Uri {
+  if(self::_rawScript.{core::String::startsWith}("http:") || self::_rawScript.{core::String::startsWith}("https:") || self::_rawScript.{core::String::startsWith}("file:")) {
+    return core::Uri::parse(self::_rawScript);
+  }
+  else {
+    return core::Uri::base.{core::Uri::resolveUri}(core::_Uri::file(self::_rawScript));
+  }
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  PushConstant         CP#2
+  IndirectStaticCall   1, CP#1
+  Drop1
+  PushConstant         CP#3
+  ReturnTOS
+}
+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
+  [3] = Null
+}
+]static method _setupHooks() → dynamic {
+  self::VMLibraryHooks::platformScript = self::_scriptUri;
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]static method main() → dynamic {}
diff --git a/pkg/vm/testcases/bytecode/field_initializers.dart b/pkg/vm/testcases/bytecode/field_initializers.dart
new file mode 100644
index 0000000..6d9f57e
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/field_initializers.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {
+  int foo1;
+  int foo2 = null;
+  int foo3 = 42;
+  int foo4;
+  int foo5 = 43;
+
+  A(this.foo4) : foo5 = 44;
+  A.constr2(int x, int y)
+      : foo1 = x,
+        foo5 = y + 1;
+
+  A.redirecting1() : this(45);
+  A.redirecting2(int a, int b, int c) : this.constr2(a, b * c);
+}
+
+class B extends A {
+  int foo6 = 46;
+  static int foo7 = 47;
+  static const int foo8 = 48;
+
+  B() : super(49);
+  B.c2(int i, int j)
+      : foo6 = 50,
+        super.redirecting2(i, j, 51);
+}
+
+main() {}
diff --git a/pkg/vm/testcases/bytecode/field_initializers.dart.expect b/pkg/vm/testcases/bytecode/field_initializers.dart.expect
new file mode 100644
index 0000000..b11ce7f
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/field_initializers.dart.expect
@@ -0,0 +1,217 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int foo1;
+  field core::int foo2 = null;
+  field core::int foo3 = 42;
+  field core::int foo4;
+  field core::int foo5 = 43;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-6]
+  PushConstant         CP#0
+  StoreFieldTOS        CP#1
+  Push                 FP[-6]
+  Push                 FP[-5]
+  StoreFieldTOS        CP#2
+  Push                 FP[-6]
+  PushConstant         CP#3
+  StoreFieldTOS        CP#4
+  Push                 FP[-6]
+  PushConstant         CP#6
+  IndirectStaticCall   1, CP#5
+  Drop1
+  PushConstant         CP#7
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Int 42
+  [1] = FieldOffset #lib::A::foo3
+  [2] = FieldOffset #lib::A::foo4
+  [3] = Int 44
+  [4] = FieldOffset #lib::A::foo5
+  [5] = ArgDesc num-args 1, num-type-args 0, names []
+  [6] = StaticICData target 'dart.core::Object::', arg-desc CP#5
+  [7] = Null
+}
+]  constructor •(core::int foo4) → void
+    : self::A::foo1 = null, self::A::foo4 = foo4, self::A::foo5 = 44, super core::Object::•()
+    ;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-7]
+  PushConstant         CP#0
+  StoreFieldTOS        CP#1
+  Push                 FP[-7]
+  Push                 FP[-6]
+  StoreFieldTOS        CP#2
+  Push                 FP[-7]
+  Push                 FP[-5]
+  PushConstant         CP#3
+  InstanceCall1        2, CP#5
+  StoreFieldTOS        CP#6
+  Push                 FP[-7]
+  PushConstant         CP#8
+  IndirectStaticCall   1, CP#7
+  Drop1
+  PushConstant         CP#9
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Int 42
+  [1] = FieldOffset #lib::A::foo3
+  [2] = FieldOffset #lib::A::foo1
+  [3] = Int 1
+  [4] = ArgDesc num-args 2, num-type-args 0, names []
+  [5] = ICData target-name '+', arg-desc CP#4
+  [6] = FieldOffset #lib::A::foo5
+  [7] = ArgDesc num-args 1, num-type-args 0, names []
+  [8] = StaticICData target 'dart.core::Object::', arg-desc CP#7
+  [9] = Null
+}
+]  constructor constr2(core::int x, core::int y) → void
+    : self::A::foo4 = null, self::A::foo1 = x, self::A::foo5 = y.{core::num::+}(1), super core::Object::•()
+    ;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  PushConstant         CP#0
+  PushConstant         CP#2
+  IndirectStaticCall   2, CP#1
+  Drop1
+  PushConstant         CP#3
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Int 45
+  [1] = ArgDesc num-args 2, num-type-args 0, names []
+  [2] = StaticICData target '#lib::A::', arg-desc CP#1
+  [3] = Null
+}
+]  constructor redirecting1() → void
+    : this self::A::•(45)
+    ;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-8]
+  Push                 FP[-7]
+  Push                 FP[-6]
+  Push                 FP[-5]
+  InstanceCall1        2, CP#1
+  PushConstant         CP#3
+  IndirectStaticCall   3, CP#2
+  Drop1
+  PushConstant         CP#4
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 2, num-type-args 0, names []
+  [1] = ICData target-name '*', arg-desc CP#0
+  [2] = ArgDesc num-args 3, num-type-args 0, names []
+  [3] = StaticICData target '#lib::A::constr2', arg-desc CP#2
+  [4] = Null
+}
+]  constructor redirecting2(core::int a, core::int b, core::int c) → void
+    : this self::A::constr2(a, b.{core::num::*}(c))
+    ;
+}
+class B extends self::A {
+  field core::int foo6 = 46;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Int 47
+}
+]  static field core::int foo7 = 47;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Int 48
+}
+]  static const field core::int foo8 = 48;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  PushConstant         CP#0
+  StoreFieldTOS        CP#1
+  Push                 FP[-5]
+  PushConstant         CP#2
+  PushConstant         CP#4
+  IndirectStaticCall   2, CP#3
+  Drop1
+  PushConstant         CP#5
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Int 46
+  [1] = FieldOffset #lib::B::foo6
+  [2] = Int 49
+  [3] = ArgDesc num-args 2, num-type-args 0, names []
+  [4] = StaticICData target '#lib::A::', arg-desc CP#3
+  [5] = Null
+}
+]  constructor •() → void
+    : super self::A::•(49)
+    ;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-7]
+  PushConstant         CP#0
+  StoreFieldTOS        CP#1
+  Push                 FP[-7]
+  Push                 FP[-6]
+  Push                 FP[-5]
+  PushConstant         CP#2
+  PushConstant         CP#4
+  IndirectStaticCall   4, CP#3
+  Drop1
+  PushConstant         CP#5
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Int 50
+  [1] = FieldOffset #lib::B::foo6
+  [2] = Int 51
+  [3] = ArgDesc num-args 4, num-type-args 0, names []
+  [4] = StaticICData target '#lib::A::redirecting2', arg-desc CP#3
+  [5] = Null
+}
+]  constructor c2(core::int i, core::int j) → void
+    : self::B::foo6 = 50, super self::A::redirecting2(i, j, 51)
+    ;
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]static method main() → dynamic {}
diff --git a/pkg/vm/testcases/bytecode/hello.dart b/pkg/vm/testcases/bytecode/hello.dart
new file mode 100644
index 0000000..65a1a2a
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/hello.dart
@@ -0,0 +1,7 @@
+// 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() {
+  print('Hello, Dart Bytecode!');
+}
diff --git a/pkg/vm/testcases/bytecode/hello.dart.expect b/pkg/vm/testcases/bytecode/hello.dart.expect
new file mode 100644
index 0000000..7147dbc
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/hello.dart.expect
@@ -0,0 +1,24 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  PushConstant         CP#2
+  IndirectStaticCall   1, CP#1
+  Drop1
+  PushConstant         CP#3
+  ReturnTOS
+}
+ConstantPool {
+  [0] = String 'Hello, Dart Bytecode!'
+  [1] = ArgDesc num-args 1, num-type-args 0, names []
+  [2] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [3] = Null
+}
+]static method main() → dynamic {
+  core::print("Hello, Dart Bytecode!");
+}
diff --git a/pkg/vm/testcases/bytecode/instance_creation.dart b/pkg/vm/testcases/bytecode/instance_creation.dart
new file mode 100644
index 0000000..98259da
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/instance_creation.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Base<T1, T2> {
+  T1 t1;
+  T2 t2;
+
+  Base() {
+    print('Base: $T1, $T2');
+  }
+}
+
+class A extends Base<int, String> {
+  A(String s);
+}
+
+class B<T> extends Base<List<T>, String> {
+  B() {
+    print('B: $T');
+  }
+}
+
+class C {
+  C(String s) {
+    print('C: $s');
+  }
+}
+
+foo1() => new C('hello');
+
+void foo2() {
+  new A('hi');
+  new B<int>();
+}
+
+void foo3<T>() {
+  new B<List<T>>();
+}
+
+main() {
+  foo1();
+  foo2();
+  foo3<String>();
+}
diff --git a/pkg/vm/testcases/bytecode/instance_creation.dart.expect b/pkg/vm/testcases/bytecode/instance_creation.dart.expect
new file mode 100644
index 0000000..e4dca47
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/instance_creation.dart.expect
@@ -0,0 +1,315 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+
+class Base<T1 extends core::Object, T2 extends core::Object> extends core::Object {
+  generic-covariant-impl generic-covariant-interface field self::Base::T1 t1 = null;
+  generic-covariant-impl generic-covariant-interface field self::Base::T2 t2 = null;
+[@vm.bytecode=
+Bytecode {
+  Entry                1
+  CheckStack
+  Push                 FP[-5]
+  PushConstant         CP#1
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#2
+  PushConstant         CP#3
+  CreateArrayTOS
+  StoreLocal           r0
+  Push                 r0
+  PushConstant         CP#4
+  PushConstant         CP#5
+  StoreIndexedTOS
+  Push                 r0
+  PushConstant         CP#6
+  Push                 FP[-5]
+  LoadFieldTOS         CP#8
+  PushConstant         CP#2
+  InstantiateType      CP#7
+  StoreIndexedTOS
+  Push                 r0
+  PushConstant         CP#9
+  PushConstant         CP#10
+  StoreIndexedTOS
+  Push                 r0
+  PushConstant         CP#11
+  Push                 FP[-5]
+  LoadFieldTOS         CP#8
+  PushConstant         CP#2
+  InstantiateType      CP#12
+  StoreIndexedTOS
+  PushConstant         CP#13
+  IndirectStaticCall   1, CP#0
+  PushConstant         CP#14
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [2] = Null
+  [3] = Int 4
+  [4] = Int 0
+  [5] = String 'Base: '
+  [6] = Int 1
+  [7] = Type #lib::Base::T1
+  [8] = TypeArgumentsFieldOffset #lib::Base
+  [9] = Int 2
+  [10] = String ', '
+  [11] = Int 3
+  [12] = Type #lib::Base::T2
+  [13] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#0
+  [14] = StaticICData target 'dart.core::print', arg-desc CP#0
+}
+]  constructor •() → void
+    : super core::Object::•() {
+    core::print("Base: ${self::Base::T1}, ${self::Base::T2}");
+  }
+}
+class A extends self::Base<core::int, core::String> {
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-6]
+  PushConstant         CP#1
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = StaticICData target '#lib::Base::', arg-desc CP#0
+  [2] = Null
+}
+]  constructor •(core::String s) → void
+    : super self::Base::•()
+    ;
+  abstract forwarding-stub set t1(generic-covariant-impl core::int _) → void;
+  abstract forwarding-stub set t2(generic-covariant-impl core::String _) → void;
+}
+class B<T extends core::Object> extends self::Base<core::List<self::B::T>, core::String> {
+[@vm.bytecode=
+Bytecode {
+  Entry                1
+  CheckStack
+  Push                 FP[-5]
+  PushConstant         CP#1
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#2
+  PushConstant         CP#3
+  CreateArrayTOS
+  StoreLocal           r0
+  Push                 r0
+  PushConstant         CP#4
+  PushConstant         CP#5
+  StoreIndexedTOS
+  Push                 r0
+  PushConstant         CP#6
+  Push                 FP[-5]
+  LoadFieldTOS         CP#8
+  PushConstant         CP#2
+  InstantiateType      CP#7
+  StoreIndexedTOS
+  PushConstant         CP#9
+  IndirectStaticCall   1, CP#0
+  PushConstant         CP#10
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = StaticICData target '#lib::Base::', arg-desc CP#0
+  [2] = Null
+  [3] = Int 2
+  [4] = Int 0
+  [5] = String 'B: '
+  [6] = Int 1
+  [7] = Type #lib::B::T
+  [8] = TypeArgumentsFieldOffset #lib::B
+  [9] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#0
+  [10] = StaticICData target 'dart.core::print', arg-desc CP#0
+}
+]  constructor •() → void
+    : super self::Base::•() {
+    core::print("B: ${self::B::T}");
+  }
+  abstract forwarding-stub set t2(generic-covariant-impl core::String _) → void;
+}
+class C extends core::Object {
+[@vm.bytecode=
+Bytecode {
+  Entry                1
+  CheckStack
+  Push                 FP[-6]
+  PushConstant         CP#1
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#2
+  PushConstant         CP#3
+  CreateArrayTOS
+  StoreLocal           r0
+  Push                 r0
+  PushConstant         CP#4
+  PushConstant         CP#5
+  StoreIndexedTOS
+  Push                 r0
+  PushConstant         CP#6
+  Push                 FP[-5]
+  StoreIndexedTOS
+  PushConstant         CP#7
+  IndirectStaticCall   1, CP#0
+  PushConstant         CP#8
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [2] = Null
+  [3] = Int 2
+  [4] = Int 0
+  [5] = String 'C: '
+  [6] = Int 1
+  [7] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#0
+  [8] = StaticICData target 'dart.core::print', arg-desc CP#0
+}
+]  constructor •(core::String s) → void
+    : super core::Object::•() {
+    core::print("C: ${s}");
+  }
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                1
+  CheckStack
+  Allocate             CP#0
+  StoreLocal           r0
+  Push                 r0
+  PushConstant         CP#1
+  PushConstant         CP#3
+  IndirectStaticCall   2, CP#2
+  Drop1
+  ReturnTOS
+  PushConstant         CP#4
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Class #lib::C
+  [1] = String 'hello'
+  [2] = ArgDesc num-args 2, num-type-args 0, names []
+  [3] = StaticICData target '#lib::C::', arg-desc CP#2
+  [4] = Null
+}
+]static method foo1() → dynamic
+  return new self::C::•("hello");
+[@vm.bytecode=
+Bytecode {
+  Entry                2
+  CheckStack
+  PushConstant         CP#1
+  PushConstant         CP#0
+  AllocateT
+  StoreLocal           r0
+  Push                 r0
+  PushConstant         CP#2
+  PushConstant         CP#4
+  IndirectStaticCall   2, CP#3
+  Drop1
+  Drop1
+  PushConstant         CP#6
+  PushConstant         CP#5
+  AllocateT
+  StoreLocal           r1
+  Push                 r1
+  PushConstant         CP#8
+  IndirectStaticCall   1, CP#7
+  Drop1
+  Drop1
+  PushConstant         CP#9
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Class #lib::A
+  [1] = TypeArgs [dart.core::int, dart.core::String]
+  [2] = String 'hi'
+  [3] = ArgDesc num-args 2, num-type-args 0, names []
+  [4] = StaticICData target '#lib::A::', arg-desc CP#3
+  [5] = Class #lib::B
+  [6] = TypeArgs [dart.core::List<dart.core::int>, dart.core::String, dart.core::int]
+  [7] = ArgDesc num-args 1, num-type-args 0, names []
+  [8] = StaticICData target '#lib::B::', arg-desc CP#7
+  [9] = Null
+}
+]static method foo2() → void {
+  new self::A::•("hi");
+  new self::B::•<core::int>();
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                1
+  CheckStack
+  PushConstant         CP#2
+  Push                 FP[-5]
+  InstantiateTypeArgumentsTOS 1, CP#1
+  PushConstant         CP#0
+  AllocateT
+  StoreLocal           r0
+  Push                 r0
+  PushConstant         CP#4
+  IndirectStaticCall   1, CP#3
+  Drop1
+  Drop1
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Class #lib::B
+  [1] = TypeArgs [dart.core::List<dart.core::List<#lib::foo3::T>>, dart.core::String, dart.core::List<#lib::foo3::T>]
+  [2] = Null
+  [3] = ArgDesc num-args 1, num-type-args 0, names []
+  [4] = StaticICData target '#lib::B::', arg-desc CP#3
+}
+]static method foo3<T extends core::Object>() → void {
+  new self::B::•<core::List<self::foo3::T>>();
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#1
+  IndirectStaticCall   0, CP#0
+  Drop1
+  PushConstant         CP#2
+  IndirectStaticCall   0, CP#0
+  Drop1
+  PushConstant         CP#3
+  PushConstant         CP#5
+  IndirectStaticCall   1, CP#4
+  Drop1
+  PushConstant         CP#6
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 0, num-type-args 0, names []
+  [1] = StaticICData target '#lib::foo1', arg-desc CP#0
+  [2] = StaticICData target '#lib::foo2', arg-desc CP#0
+  [3] = TypeArgs [dart.core::String]
+  [4] = ArgDesc num-args 0, num-type-args 1, names []
+  [5] = StaticICData target '#lib::foo3', arg-desc CP#4
+  [6] = Null
+}
+]static method main() → dynamic {
+  self::foo1();
+  self::foo2();
+  self::foo3<core::String>();
+}
diff --git a/pkg/vm/testcases/bytecode/literals.dart b/pkg/vm/testcases/bytecode/literals.dart
new file mode 100644
index 0000000..69a0e85
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/literals.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+enum A {
+  elem1,
+  elem2,
+  elem3,
+  elem4,
+}
+
+class B {
+  final int i;
+  const B(this.i);
+}
+
+class C extends B {
+  final int j;
+  const C(int a, int b, int c)
+      : j = a + b,
+        super(c * 5);
+}
+
+class D {
+  final x;
+  final y;
+  const D(this.x, [this.y]);
+}
+
+const c1 = A.elem3;
+const c2 = 'hello!';
+const c3 = c2.length;
+const c4 = const C(1, 2, 3);
+const c5 = const D(const B(4));
+
+void test_constants1() {
+  print(c1);
+  print(c2);
+  print(c3);
+  print(c4);
+  print(c5);
+}
+
+void test_constants2() {
+  print(42);
+  print('foo');
+  print(A.elem2);
+  print(const [42, 'foo']);
+  print(const <String, A>{'E2': A.elem2, 'E4': A.elem4});
+  print(
+      const D(const C(4, 5, 6), const {'foo': 42, 'bar': const B(c2.length)}));
+}
+
+void test_list_literal(int a) {
+  print([1, a, 3]);
+  print(<String>['a', a.toString(), 'b']);
+}
+
+void test_map_literal<T>(int a, int b, T c) {
+  print({1: a, b: 2});
+  print(<String, int>{'foo': a, b.toString(): 3});
+  print(<String, T>{});
+  print(<T, int>{c: 4});
+}
+
+void test_symbol() {
+  print(#test_symbol);
+}
+
+void test_type_literal<T>() {
+  print(String);
+  print(T);
+}
+
+main() {}
diff --git a/pkg/vm/testcases/bytecode/literals.dart.expect b/pkg/vm/testcases/bytecode/literals.dart.expect
new file mode 100644
index 0000000..b56cae6
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/literals.dart.expect
@@ -0,0 +1,677 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int index;
+  final field core::String _name;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#13
+  ReturnTOS
+}
+ConstantPool {
+  [0] = TypeArgs []
+  [1] = Int 0
+  [2] = String 'A.elem1'
+  [3] = Instance #lib::A type-args CP#0 {index: 1, _name: 2}
+  [4] = Int 1
+  [5] = String 'A.elem2'
+  [6] = Instance #lib::A type-args CP#0 {index: 4, _name: 5}
+  [7] = Int 2
+  [8] = String 'A.elem3'
+  [9] = Instance #lib::A type-args CP#0 {index: 7, _name: 8}
+  [10] = Int 3
+  [11] = String 'A.elem4'
+  [12] = Instance #lib::A type-args CP#0 {index: 10, _name: 11}
+  [13] = List type-arg #lib::A, entries CP# [3, 6, 9, 12]
+}
+]  static const field core::List<self::A> values = const <self::A>[self::A::elem1, self::A::elem2, self::A::elem3, self::A::elem4];
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#3
+  ReturnTOS
+}
+ConstantPool {
+  [0] = TypeArgs []
+  [1] = Int 0
+  [2] = String 'A.elem1'
+  [3] = Instance #lib::A type-args CP#0 {index: 1, _name: 2}
+}
+]  static const field self::A elem1 = const self::A::•(0, "A.elem1");
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#3
+  ReturnTOS
+}
+ConstantPool {
+  [0] = TypeArgs []
+  [1] = Int 1
+  [2] = String 'A.elem2'
+  [3] = Instance #lib::A type-args CP#0 {index: 1, _name: 2}
+}
+]  static const field self::A elem2 = const self::A::•(1, "A.elem2");
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#3
+  ReturnTOS
+}
+ConstantPool {
+  [0] = TypeArgs []
+  [1] = Int 2
+  [2] = String 'A.elem3'
+  [3] = Instance #lib::A type-args CP#0 {index: 1, _name: 2}
+}
+]  static const field self::A elem3 = const self::A::•(2, "A.elem3");
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#3
+  ReturnTOS
+}
+ConstantPool {
+  [0] = TypeArgs []
+  [1] = Int 3
+  [2] = String 'A.elem4'
+  [3] = Instance #lib::A type-args CP#0 {index: 1, _name: 2}
+}
+]  static const field self::A elem4 = const self::A::•(3, "A.elem4");
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-7]
+  Push                 FP[-6]
+  StoreFieldTOS        CP#0
+  Push                 FP[-7]
+  Push                 FP[-5]
+  StoreFieldTOS        CP#1
+  Push                 FP[-7]
+  PushConstant         CP#3
+  IndirectStaticCall   1, CP#2
+  Drop1
+  PushConstant         CP#4
+  ReturnTOS
+}
+ConstantPool {
+  [0] = FieldOffset #lib::A::index
+  [1] = FieldOffset #lib::A::_name
+  [2] = ArgDesc num-args 1, num-type-args 0, names []
+  [3] = StaticICData target 'dart.core::Object::', arg-desc CP#2
+  [4] = Null
+}
+]  const constructor •(core::int index, core::String _name) → void
+    : self::A::index = index, self::A::_name = _name, super core::Object::•()
+    ;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  PushConstant         CP#1
+  IndirectStaticCall   1, CP#0
+  ReturnTOS
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = StaticICData target '#lib::A::_name', arg-desc CP#0
+  [2] = Null
+}
+]  method toString() → core::String
+    return this.{=self::A::_name};
+}
+class B extends core::Object {
+  final field core::int i;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-6]
+  Push                 FP[-5]
+  StoreFieldTOS        CP#0
+  Push                 FP[-6]
+  PushConstant         CP#2
+  IndirectStaticCall   1, CP#1
+  Drop1
+  PushConstant         CP#3
+  ReturnTOS
+}
+ConstantPool {
+  [0] = FieldOffset #lib::B::i
+  [1] = ArgDesc num-args 1, num-type-args 0, names []
+  [2] = StaticICData target 'dart.core::Object::', arg-desc CP#1
+  [3] = Null
+}
+]  const constructor •(core::int i) → void
+    : self::B::i = i, super core::Object::•()
+    ;
+}
+class C extends self::B {
+  final field core::int j;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-8]
+  Push                 FP[-7]
+  Push                 FP[-6]
+  InstanceCall1        2, CP#1
+  StoreFieldTOS        CP#2
+  Push                 FP[-8]
+  Push                 FP[-5]
+  PushConstant         CP#3
+  InstanceCall1        2, CP#4
+  PushConstant         CP#5
+  IndirectStaticCall   2, CP#0
+  Drop1
+  PushConstant         CP#6
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 2, num-type-args 0, names []
+  [1] = ICData target-name '+', arg-desc CP#0
+  [2] = FieldOffset #lib::C::j
+  [3] = Int 5
+  [4] = ICData target-name '*', arg-desc CP#0
+  [5] = StaticICData target '#lib::B::', arg-desc CP#0
+  [6] = Null
+}
+]  const constructor •(core::int a, core::int b, core::int c) → void
+    : self::C::j = a.{core::num::+}(b), super self::B::•(c.{core::num::*}(5))
+    ;
+}
+class D extends core::Object {
+  final field dynamic x;
+  final field dynamic y;
+[@vm.bytecode=
+Bytecode {
+  EntryOptional        2, 1, 0
+  LoadConstant         r2, CP#0
+  Frame                0
+  CheckStack
+  Push                 r0
+  Push                 r1
+  StoreFieldTOS        CP#1
+  Push                 r0
+  Push                 r2
+  StoreFieldTOS        CP#2
+  Push                 r0
+  PushConstant         CP#4
+  IndirectStaticCall   1, CP#3
+  Drop1
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+  [1] = FieldOffset #lib::D::x
+  [2] = FieldOffset #lib::D::y
+  [3] = ArgDesc num-args 1, num-type-args 0, names []
+  [4] = StaticICData target 'dart.core::Object::', arg-desc CP#3
+}
+]  const constructor •(dynamic x, [dynamic y = null]) → void
+    : self::D::x = x, self::D::y = y, super core::Object::•()
+    ;
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#3
+  ReturnTOS
+}
+ConstantPool {
+  [0] = TypeArgs []
+  [1] = Int 2
+  [2] = String 'A.elem3'
+  [3] = Instance #lib::A type-args CP#0 {index: 1, _name: 2}
+}
+]static const field self::A c1 = self::A::elem3;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = String 'hello!'
+}
+]static const field core::String c2 = "hello!";
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Int 6
+}
+]static const field core::int c3 = self::c2.{core::String::length};
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#3
+  ReturnTOS
+}
+ConstantPool {
+  [0] = TypeArgs []
+  [1] = Int 3
+  [2] = Int 15
+  [3] = Instance #lib::C type-args CP#0 {j: 1, i: 2}
+}
+]static const field self::C c4 = const self::C::•(1, 2, 3);
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#4
+  ReturnTOS
+}
+ConstantPool {
+  [0] = TypeArgs []
+  [1] = Int 4
+  [2] = Instance #lib::B type-args CP#0 {i: 1}
+  [3] = Null
+  [4] = Instance #lib::D type-args CP#0 {x: 2, y: 3}
+}
+]static const field self::D c5 = const self::D::•(const self::B::•(4));
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#3
+  PushConstant         CP#5
+  IndirectStaticCall   1, CP#4
+  Drop1
+  PushConstant         CP#6
+  PushConstant         CP#7
+  IndirectStaticCall   1, CP#4
+  Drop1
+  PushConstant         CP#8
+  PushConstant         CP#9
+  IndirectStaticCall   1, CP#4
+  Drop1
+  PushConstant         CP#12
+  PushConstant         CP#13
+  IndirectStaticCall   1, CP#4
+  Drop1
+  PushConstant         CP#17
+  PushConstant         CP#18
+  IndirectStaticCall   1, CP#4
+  Drop1
+  PushConstant         CP#16
+  ReturnTOS
+}
+ConstantPool {
+  [0] = TypeArgs []
+  [1] = Int 2
+  [2] = String 'A.elem3'
+  [3] = Instance #lib::A type-args CP#0 {index: 1, _name: 2}
+  [4] = ArgDesc num-args 1, num-type-args 0, names []
+  [5] = StaticICData target 'dart.core::print', arg-desc CP#4
+  [6] = String 'hello!'
+  [7] = StaticICData target 'dart.core::print', arg-desc CP#4
+  [8] = Int 6
+  [9] = StaticICData target 'dart.core::print', arg-desc CP#4
+  [10] = Int 3
+  [11] = Int 15
+  [12] = Instance #lib::C type-args CP#0 {j: 10, i: 11}
+  [13] = StaticICData target 'dart.core::print', arg-desc CP#4
+  [14] = Int 4
+  [15] = Instance #lib::B type-args CP#0 {i: 14}
+  [16] = Null
+  [17] = Instance #lib::D type-args CP#0 {x: 15, y: 16}
+  [18] = StaticICData target 'dart.core::print', arg-desc CP#4
+}
+]static method test_constants1() → void {
+  core::print(self::c1);
+  core::print(self::c2);
+  core::print(self::c3);
+  core::print(self::c4);
+  core::print(self::c5);
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  PushConstant         CP#2
+  IndirectStaticCall   1, CP#1
+  Drop1
+  PushConstant         CP#3
+  PushConstant         CP#4
+  IndirectStaticCall   1, CP#1
+  Drop1
+  PushConstant         CP#8
+  PushConstant         CP#9
+  IndirectStaticCall   1, CP#1
+  Drop1
+  PushConstant         CP#10
+  PushConstant         CP#11
+  IndirectStaticCall   1, CP#1
+  Drop1
+  PushConstant         CP#19
+  PushConstant         CP#20
+  IndirectStaticCall   1, CP#1
+  Drop1
+  PushConstant         CP#30
+  PushConstant         CP#31
+  IndirectStaticCall   1, CP#1
+  Drop1
+  PushConstant         CP#32
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Int 42
+  [1] = ArgDesc num-args 1, num-type-args 0, names []
+  [2] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [3] = String 'foo'
+  [4] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [5] = TypeArgs []
+  [6] = Int 1
+  [7] = String 'A.elem2'
+  [8] = Instance #lib::A type-args CP#5 {index: 6, _name: 7}
+  [9] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [10] = List type-arg dart.core::Object, entries CP# [0, 3]
+  [11] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [12] = TypeArgs [dart.core::String, #lib::A]
+  [13] = String 'E2'
+  [14] = String 'E4'
+  [15] = Int 3
+  [16] = String 'A.elem4'
+  [17] = Instance #lib::A type-args CP#5 {index: 15, _name: 16}
+  [18] = List type-arg dynamic, entries CP# [13, 8, 14, 17]
+  [19] = Instance dart.core::_ImmutableMap type-args CP#12 {_kvPairs: 18}
+  [20] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [21] = Int 9
+  [22] = Int 30
+  [23] = Instance #lib::C type-args CP#5 {j: 21, i: 22}
+  [24] = TypeArgs [dart.core::String, dart.core::Object]
+  [25] = String 'bar'
+  [26] = Int 6
+  [27] = Instance #lib::B type-args CP#5 {i: 26}
+  [28] = List type-arg dynamic, entries CP# [3, 0, 25, 27]
+  [29] = Instance dart.core::_ImmutableMap type-args CP#24 {_kvPairs: 28}
+  [30] = Instance #lib::D type-args CP#5 {x: 23, y: 29}
+  [31] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [32] = Null
+}
+]static method test_constants2() → void {
+  core::print(42);
+  core::print("foo");
+  core::print(self::A::elem2);
+  core::print(const <core::Object>[42, "foo"]);
+  core::print(const <core::String, self::A>{"E2": self::A::elem2, "E4": self::A::elem4});
+  core::print(const self::D::•(const self::C::•(4, 5, 6), const <core::String, core::Object>{"foo": 42, "bar": const self::B::•(self::c2.{core::String::length})}));
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                2
+  CheckStack
+  PushConstant         CP#0
+  StoreLocal           r0
+  Push                 r0
+  PushConstant         CP#1
+  CreateArrayTOS
+  StoreLocal           r0
+  Push                 r0
+  PushConstant         CP#2
+  PushConstant         CP#3
+  StoreIndexedTOS
+  Push                 r0
+  PushConstant         CP#3
+  Push                 FP[-5]
+  StoreIndexedTOS
+  Push                 r0
+  PushConstant         CP#4
+  PushConstant         CP#1
+  StoreIndexedTOS
+  PushConstant         CP#6
+  IndirectStaticCall   2, CP#5
+  PushConstant         CP#8
+  IndirectStaticCall   1, CP#7
+  Drop1
+  PushConstant         CP#9
+  StoreLocal           r1
+  Push                 r1
+  PushConstant         CP#1
+  CreateArrayTOS
+  StoreLocal           r1
+  Push                 r1
+  PushConstant         CP#2
+  PushConstant         CP#10
+  StoreIndexedTOS
+  Push                 r1
+  PushConstant         CP#3
+  Push                 FP[-5]
+  InstanceCall1        1, CP#11
+  StoreIndexedTOS
+  Push                 r1
+  PushConstant         CP#4
+  PushConstant         CP#12
+  StoreIndexedTOS
+  PushConstant         CP#13
+  IndirectStaticCall   2, CP#5
+  PushConstant         CP#14
+  IndirectStaticCall   1, CP#7
+  Drop1
+  PushConstant         CP#15
+  ReturnTOS
+}
+ConstantPool {
+  [0] = TypeArgs [dart.core::int]
+  [1] = Int 3
+  [2] = Int 0
+  [3] = Int 1
+  [4] = Int 2
+  [5] = ArgDesc num-args 1, num-type-args 1, names []
+  [6] = StaticICData target 'dart.core::List::_fromLiteral', arg-desc CP#5
+  [7] = ArgDesc num-args 1, num-type-args 0, names []
+  [8] = StaticICData target 'dart.core::print', arg-desc CP#7
+  [9] = TypeArgs [dart.core::String]
+  [10] = String 'a'
+  [11] = ICData target-name 'toString', arg-desc CP#7
+  [12] = String 'b'
+  [13] = StaticICData target 'dart.core::List::_fromLiteral', arg-desc CP#5
+  [14] = StaticICData target 'dart.core::print', arg-desc CP#7
+  [15] = Null
+}
+]static method test_list_literal(core::int a) → void {
+  core::print(<core::int>[1, a, 3]);
+  core::print(<core::String>["a", a.{core::int::toString}(), "b"]);
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                4
+  CheckStack
+  PushConstant         CP#0
+  PushConstant         CP#1
+  PushConstant         CP#2
+  CreateArrayTOS
+  StoreLocal           r0
+  Push                 r0
+  PushConstant         CP#3
+  PushConstant         CP#4
+  StoreIndexedTOS
+  Push                 r0
+  PushConstant         CP#4
+  Push                 FP[-7]
+  StoreIndexedTOS
+  Push                 r0
+  PushConstant         CP#5
+  Push                 FP[-6]
+  StoreIndexedTOS
+  Push                 r0
+  PushConstant         CP#6
+  PushConstant         CP#5
+  StoreIndexedTOS
+  PushConstant         CP#8
+  IndirectStaticCall   2, CP#7
+  PushConstant         CP#10
+  IndirectStaticCall   1, CP#9
+  Drop1
+  PushConstant         CP#11
+  PushConstant         CP#1
+  PushConstant         CP#2
+  CreateArrayTOS
+  StoreLocal           r1
+  Push                 r1
+  PushConstant         CP#3
+  PushConstant         CP#12
+  StoreIndexedTOS
+  Push                 r1
+  PushConstant         CP#4
+  Push                 FP[-7]
+  StoreIndexedTOS
+  Push                 r1
+  PushConstant         CP#5
+  Push                 FP[-6]
+  InstanceCall1        1, CP#13
+  StoreIndexedTOS
+  Push                 r1
+  PushConstant         CP#6
+  PushConstant         CP#6
+  StoreIndexedTOS
+  PushConstant         CP#14
+  IndirectStaticCall   2, CP#7
+  PushConstant         CP#15
+  IndirectStaticCall   1, CP#9
+  Drop1
+  PushConstant         CP#17
+  Push                 FP[-8]
+  InstantiateTypeArgumentsTOS 1, CP#16
+  PushConstant         CP#18
+  PushConstant         CP#19
+  IndirectStaticCall   2, CP#7
+  PushConstant         CP#20
+  IndirectStaticCall   1, CP#9
+  Drop1
+  PushConstant         CP#17
+  Push                 FP[-8]
+  InstantiateTypeArgumentsTOS 1, CP#21
+  PushConstant         CP#1
+  PushConstant         CP#5
+  CreateArrayTOS
+  StoreLocal           r3
+  Push                 r3
+  PushConstant         CP#3
+  Push                 FP[-5]
+  StoreIndexedTOS
+  Push                 r3
+  PushConstant         CP#4
+  PushConstant         CP#2
+  StoreIndexedTOS
+  PushConstant         CP#22
+  IndirectStaticCall   2, CP#7
+  PushConstant         CP#23
+  IndirectStaticCall   1, CP#9
+  Drop1
+  PushConstant         CP#17
+  ReturnTOS
+}
+ConstantPool {
+  [0] = TypeArgs [dart.core::int, dart.core::int]
+  [1] = TypeArgs [dynamic]
+  [2] = Int 4
+  [3] = Int 0
+  [4] = Int 1
+  [5] = Int 2
+  [6] = Int 3
+  [7] = ArgDesc num-args 1, num-type-args 1, names []
+  [8] = StaticICData target 'dart.core::Map::_fromLiteral', arg-desc CP#7
+  [9] = ArgDesc num-args 1, num-type-args 0, names []
+  [10] = StaticICData target 'dart.core::print', arg-desc CP#9
+  [11] = TypeArgs [dart.core::String, dart.core::int]
+  [12] = String 'foo'
+  [13] = ICData target-name 'toString', arg-desc CP#9
+  [14] = StaticICData target 'dart.core::Map::_fromLiteral', arg-desc CP#7
+  [15] = StaticICData target 'dart.core::print', arg-desc CP#9
+  [16] = TypeArgs [dart.core::String, #lib::test_map_literal::T]
+  [17] = Null
+  [18] = List type-arg dynamic, entries CP# []
+  [19] = StaticICData target 'dart.core::Map::_fromLiteral', arg-desc CP#7
+  [20] = StaticICData target 'dart.core::print', arg-desc CP#9
+  [21] = TypeArgs [#lib::test_map_literal::T, dart.core::int]
+  [22] = StaticICData target 'dart.core::Map::_fromLiteral', arg-desc CP#7
+  [23] = StaticICData target 'dart.core::print', arg-desc CP#9
+}
+]static method test_map_literal<T extends core::Object>(core::int a, core::int b, self::test_map_literal::T c) → void {
+  core::print(<core::int, core::int>{1: a, b: 2});
+  core::print(<core::String, core::int>{"foo": a, b.{core::int::toString}(): 3});
+  core::print(<core::String, self::test_map_literal::T>{});
+  core::print(<self::test_map_literal::T, core::int>{c: 4});
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  PushConstant         CP#2
+  IndirectStaticCall   1, CP#1
+  Drop1
+  PushConstant         CP#3
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Symbol 'test_symbol'
+  [1] = ArgDesc num-args 1, num-type-args 0, names []
+  [2] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [3] = Null
+}
+]static method test_symbol() → void {
+  core::print(#test_symbol);
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  PushConstant         CP#2
+  IndirectStaticCall   1, CP#1
+  Drop1
+  PushConstant         CP#4
+  Push                 FP[-5]
+  InstantiateType      CP#3
+  PushConstant         CP#5
+  IndirectStaticCall   1, CP#1
+  Drop1
+  PushConstant         CP#4
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Type dart.core::String
+  [1] = ArgDesc num-args 1, num-type-args 0, names []
+  [2] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [3] = Type #lib::test_type_literal::T
+  [4] = Null
+  [5] = StaticICData target 'dart.core::print', arg-desc CP#1
+}
+]static method test_type_literal<T extends core::Object>() → void {
+  core::print(core::String);
+  core::print(self::test_type_literal::T);
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]static method main() → dynamic {}
diff --git a/pkg/vm/testcases/bytecode/loops.dart b/pkg/vm/testcases/bytecode/loops.dart
new file mode 100644
index 0000000..a2d2d10
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/loops.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+int test_for(List<int> list) {
+  int sum = 0;
+  for (int i = 0; i < list.length; i++) {
+    sum = sum + list[i];
+  }
+  return sum;
+}
+
+int test_for_break(List<int> list) {
+  int sum = 0;
+  for (int i = 0; i >= 0; i++) {
+    if (i >= list.length) {
+      break;
+    }
+    sum = sum + list[i];
+  }
+  return sum;
+}
+
+int test_for_continue(List<int> list) {
+  int sum = 0;
+  for (int i = -100; i < list.length; i++) {
+    if (i < 0) {
+      continue;
+    }
+    sum = sum + list[i];
+  }
+  return sum;
+}
+
+int test_while(List<int> list) {
+  int sum = 0;
+  int i = 0;
+  while (i < list.length) {
+    sum = sum + list[i++];
+  }
+  return sum;
+}
+
+int test_do_while(List<int> list) {
+  int sum = 0;
+  int i = 0;
+  do {
+    sum = sum + list[i];
+    ++i;
+  } while (i < list.length);
+  return sum;
+}
+
+int test_for_in(List<int> list) {
+  int sum = 0;
+  for (var e in list) {
+    sum = sum + e;
+  }
+  return sum;
+}
+
+main() {}
diff --git a/pkg/vm/testcases/bytecode/loops.dart.expect b/pkg/vm/testcases/bytecode/loops.dart.expect
new file mode 100644
index 0000000..a23aa00
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/loops.dart.expect
@@ -0,0 +1,379 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+
+[@vm.bytecode=
+Bytecode {
+  Entry                2
+  CheckStack
+  PushConstant         CP#0
+  PopLocal             r0
+  PushConstant         CP#0
+  PopLocal             r1
+L2:
+  CheckStack
+  Push                 r1
+  Push                 FP[-5]
+  InstanceCall1        1, CP#2
+  InstanceCall1        2, CP#4
+  PushConstant         CP#5
+  IfNeStrictTOS
+  Jump                 L1
+  Push                 r0
+  Push                 FP[-5]
+  Push                 r1
+  InstanceCall1        2, CP#6
+  InstanceCall1        2, CP#7
+  StoreLocal           r0
+  Drop1
+  Push                 r1
+  PushConstant         CP#8
+  InstanceCall1        2, CP#9
+  StoreLocal           r1
+  Drop1
+  Jump                 L2
+L1:
+  Push                 r0
+  ReturnTOS
+  PushConstant         CP#10
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Int 0
+  [1] = ArgDesc num-args 1, num-type-args 0, names []
+  [2] = ICData target-name 'get:length', arg-desc CP#1
+  [3] = ArgDesc num-args 2, num-type-args 0, names []
+  [4] = ICData target-name '<', arg-desc CP#3
+  [5] = Bool true
+  [6] = ICData target-name '[]', arg-desc CP#3
+  [7] = ICData target-name '+', arg-desc CP#3
+  [8] = Int 1
+  [9] = ICData target-name '+', arg-desc CP#3
+  [10] = Null
+}
+]static method test_for(core::List<core::int> list) → core::int {
+  core::int sum = 0;
+  for (core::int i = 0; i.{core::num::<}(list.{core::List::length}); i = i.{core::num::+}(1)) {
+    sum = sum.{core::num::+}(list.{core::List::[]}(i));
+  }
+  return sum;
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                2
+  CheckStack
+  PushConstant         CP#0
+  PopLocal             r0
+  PushConstant         CP#0
+  PopLocal             r1
+L3:
+  CheckStack
+  Push                 r1
+  PushConstant         CP#0
+  InstanceCall1        2, CP#2
+  PushConstant         CP#3
+  IfNeStrictTOS
+  Jump                 L1
+  Push                 r1
+  Push                 FP[-5]
+  InstanceCall1        1, CP#5
+  InstanceCall1        2, CP#6
+  PushConstant         CP#3
+  IfNeStrictTOS
+  Jump                 L2
+  Jump                 L1
+L2:
+  Push                 r0
+  Push                 FP[-5]
+  Push                 r1
+  InstanceCall1        2, CP#7
+  InstanceCall1        2, CP#8
+  StoreLocal           r0
+  Drop1
+  Push                 r1
+  PushConstant         CP#9
+  InstanceCall1        2, CP#10
+  StoreLocal           r1
+  Drop1
+  Jump                 L3
+L1:
+  Push                 r0
+  ReturnTOS
+  PushConstant         CP#11
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Int 0
+  [1] = ArgDesc num-args 2, num-type-args 0, names []
+  [2] = ICData target-name '>=', arg-desc CP#1
+  [3] = Bool true
+  [4] = ArgDesc num-args 1, num-type-args 0, names []
+  [5] = ICData target-name 'get:length', arg-desc CP#4
+  [6] = ICData target-name '>=', arg-desc CP#1
+  [7] = ICData target-name '[]', arg-desc CP#1
+  [8] = ICData target-name '+', arg-desc CP#1
+  [9] = Int 1
+  [10] = ICData target-name '+', arg-desc CP#1
+  [11] = Null
+}
+]static method test_for_break(core::List<core::int> list) → core::int {
+  core::int sum = 0;
+  #L1:
+  for (core::int i = 0; i.{core::num::>=}(0); i = i.{core::num::+}(1)) {
+    if(i.{core::num::>=}(list.{core::List::length})) {
+      break #L1;
+    }
+    sum = sum.{core::num::+}(list.{core::List::[]}(i));
+  }
+  return sum;
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                2
+  CheckStack
+  PushConstant         CP#0
+  PopLocal             r0
+  PushConstant         CP#1
+  InstanceCall1        1, CP#3
+  PopLocal             r1
+L4:
+  CheckStack
+  Push                 r1
+  Push                 FP[-5]
+  InstanceCall1        1, CP#4
+  InstanceCall1        2, CP#6
+  PushConstant         CP#7
+  IfNeStrictTOS
+  Jump                 L1
+  Push                 r1
+  PushConstant         CP#0
+  InstanceCall1        2, CP#8
+  PushConstant         CP#7
+  IfNeStrictTOS
+  Jump                 L2
+  Jump                 L3
+L2:
+  Push                 r0
+  Push                 FP[-5]
+  Push                 r1
+  InstanceCall1        2, CP#9
+  InstanceCall1        2, CP#10
+  StoreLocal           r0
+  Drop1
+L3:
+  Push                 r1
+  PushConstant         CP#11
+  InstanceCall1        2, CP#12
+  StoreLocal           r1
+  Drop1
+  Jump                 L4
+L1:
+  Push                 r0
+  ReturnTOS
+  PushConstant         CP#13
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Int 0
+  [1] = Int 100
+  [2] = ArgDesc num-args 1, num-type-args 0, names []
+  [3] = ICData target-name 'unary-', arg-desc CP#2
+  [4] = ICData target-name 'get:length', arg-desc CP#2
+  [5] = ArgDesc num-args 2, num-type-args 0, names []
+  [6] = ICData target-name '<', arg-desc CP#5
+  [7] = Bool true
+  [8] = ICData target-name '<', arg-desc CP#5
+  [9] = ICData target-name '[]', arg-desc CP#5
+  [10] = ICData target-name '+', arg-desc CP#5
+  [11] = Int 1
+  [12] = ICData target-name '+', arg-desc CP#5
+  [13] = Null
+}
+]static method test_for_continue(core::List<core::int> list) → core::int {
+  core::int sum = 0;
+  for (core::int i = 100.{core::int::unary-}(); i.{core::num::<}(list.{core::List::length}); i = i.{core::num::+}(1))
+    #L2:
+    {
+      if(i.{core::num::<}(0)) {
+        break #L2;
+      }
+      sum = sum.{core::num::+}(list.{core::List::[]}(i));
+    }
+  return sum;
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                4
+  CheckStack
+  PushConstant         CP#0
+  PopLocal             r0
+  PushConstant         CP#0
+  PopLocal             r1
+L2:
+  CheckStack
+  Push                 r1
+  Push                 FP[-5]
+  InstanceCall1        1, CP#2
+  InstanceCall1        2, CP#4
+  PushConstant         CP#5
+  IfNeStrictTOS
+  Jump                 L1
+  Push                 r0
+  Push                 FP[-5]
+  Push                 r1
+  PopLocal             r2
+  Push                 r2
+  PushConstant         CP#6
+  InstanceCall1        2, CP#7
+  StoreLocal           r1
+  PopLocal             r3
+  Push                 r2
+  InstanceCall1        2, CP#8
+  InstanceCall1        2, CP#9
+  StoreLocal           r0
+  Drop1
+  Jump                 L2
+L1:
+  Push                 r0
+  ReturnTOS
+  PushConstant         CP#10
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Int 0
+  [1] = ArgDesc num-args 1, num-type-args 0, names []
+  [2] = ICData target-name 'get:length', arg-desc CP#1
+  [3] = ArgDesc num-args 2, num-type-args 0, names []
+  [4] = ICData target-name '<', arg-desc CP#3
+  [5] = Bool true
+  [6] = Int 1
+  [7] = ICData target-name '+', arg-desc CP#3
+  [8] = ICData target-name '[]', arg-desc CP#3
+  [9] = ICData target-name '+', arg-desc CP#3
+  [10] = Null
+}
+]static method test_while(core::List<core::int> list) → core::int {
+  core::int sum = 0;
+  core::int i = 0;
+  while (i.{core::num::<}(list.{core::List::length})) {
+    sum = sum.{core::num::+}(list.{core::List::[]}(let final core::int #t1 = i in let final core::int #t2 = i = #t1.{core::num::+}(1) in #t1));
+  }
+  return sum;
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                2
+  CheckStack
+  PushConstant         CP#0
+  PopLocal             r0
+  PushConstant         CP#0
+  PopLocal             r1
+L1:
+  CheckStack
+  Push                 r0
+  Push                 FP[-5]
+  Push                 r1
+  InstanceCall1        2, CP#2
+  InstanceCall1        2, CP#3
+  StoreLocal           r0
+  Drop1
+  Push                 r1
+  PushConstant         CP#4
+  InstanceCall1        2, CP#5
+  StoreLocal           r1
+  Drop1
+  Push                 r1
+  Push                 FP[-5]
+  InstanceCall1        1, CP#7
+  InstanceCall1        2, CP#8
+  PushConstant         CP#9
+  IfEqStrictTOS
+  Jump                 L1
+  Push                 r0
+  ReturnTOS
+  PushConstant         CP#10
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Int 0
+  [1] = ArgDesc num-args 2, num-type-args 0, names []
+  [2] = ICData target-name '[]', arg-desc CP#1
+  [3] = ICData target-name '+', arg-desc CP#1
+  [4] = Int 1
+  [5] = ICData target-name '+', arg-desc CP#1
+  [6] = ArgDesc num-args 1, num-type-args 0, names []
+  [7] = ICData target-name 'get:length', arg-desc CP#6
+  [8] = ICData target-name '<', arg-desc CP#1
+  [9] = Bool true
+  [10] = Null
+}
+]static method test_do_while(core::List<core::int> list) → core::int {
+  core::int sum = 0;
+  core::int i = 0;
+  do {
+    sum = sum.{core::num::+}(list.{core::List::[]}(i));
+    i = i.{core::num::+}(1);
+  }
+  while (i.{core::num::<}(list.{core::List::length}))
+  return sum;
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                3
+  CheckStack
+  PushConstant         CP#0
+  PopLocal             r0
+  Push                 FP[-5]
+  InstanceCall1        1, CP#2
+  PopLocal             r1
+L2:
+  CheckStack
+  Push                 r1
+  InstanceCall1        1, CP#3
+  PushConstant         CP#4
+  IfNeStrictTOS
+  Jump                 L1
+  Push                 r1
+  InstanceCall1        1, CP#5
+  PopLocal             r2
+  Push                 r0
+  Push                 r2
+  InstanceCall1        2, CP#7
+  StoreLocal           r0
+  Drop1
+  Jump                 L2
+L1:
+  Push                 r0
+  ReturnTOS
+  PushConstant         CP#8
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Int 0
+  [1] = ArgDesc num-args 1, num-type-args 0, names []
+  [2] = ICData target-name 'get:iterator', arg-desc CP#1
+  [3] = ICData target-name 'moveNext', arg-desc CP#1
+  [4] = Bool true
+  [5] = ICData target-name 'current', arg-desc CP#1
+  [6] = ArgDesc num-args 2, num-type-args 0, names []
+  [7] = ICData target-name '+', arg-desc CP#6
+  [8] = Null
+}
+]static method test_for_in(core::List<core::int> list) → core::int {
+  core::int sum = 0;
+  for (core::int e in list) {
+    sum = sum.{core::num::+}(e);
+  }
+  return sum;
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]static method main() → dynamic {}
diff --git a/pkg/vm/testcases/bytecode/optional_params.dart b/pkg/vm/testcases/bytecode/optional_params.dart
new file mode 100644
index 0000000..b41298a
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/optional_params.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+void foo1(x, [a = 'default_a', b = 'default_b']) {
+  print('x = $x');
+  print('a = $a');
+  print('b = $b');
+}
+
+void foo2(y, z, {c = 'default_c', a = 42, b = const ['default_b']}) {
+  print('y = $y');
+  print('z = $z');
+  print('a = $a');
+  print('b = $b');
+  print('c = $c');
+}
+
+main() {
+  foo1('fixed_x', 'concrete_a');
+  foo2('fixed_y', 'fixed_z', a: 'concrete_a');
+}
diff --git a/pkg/vm/testcases/bytecode/optional_params.dart.expect b/pkg/vm/testcases/bytecode/optional_params.dart.expect
new file mode 100644
index 0000000..36b3b1a
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/optional_params.dart.expect
@@ -0,0 +1,256 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+
+[@vm.bytecode=
+Bytecode {
+  EntryOptional        1, 2, 0
+  LoadConstant         r1, CP#0
+  LoadConstant         r2, CP#1
+  Frame                3
+  CheckStack
+  PushConstant         CP#2
+  PushConstant         CP#3
+  CreateArrayTOS
+  StoreLocal           r3
+  Push                 r3
+  PushConstant         CP#4
+  PushConstant         CP#5
+  StoreIndexedTOS
+  Push                 r3
+  PushConstant         CP#6
+  Push                 r0
+  StoreIndexedTOS
+  PushConstant         CP#8
+  IndirectStaticCall   1, CP#7
+  PushConstant         CP#9
+  IndirectStaticCall   1, CP#7
+  Drop1
+  PushConstant         CP#2
+  PushConstant         CP#3
+  CreateArrayTOS
+  StoreLocal           r4
+  Push                 r4
+  PushConstant         CP#4
+  PushConstant         CP#10
+  StoreIndexedTOS
+  Push                 r4
+  PushConstant         CP#6
+  Push                 r1
+  StoreIndexedTOS
+  PushConstant         CP#11
+  IndirectStaticCall   1, CP#7
+  PushConstant         CP#12
+  IndirectStaticCall   1, CP#7
+  Drop1
+  PushConstant         CP#2
+  PushConstant         CP#3
+  CreateArrayTOS
+  StoreLocal           r5
+  Push                 r5
+  PushConstant         CP#4
+  PushConstant         CP#13
+  StoreIndexedTOS
+  Push                 r5
+  PushConstant         CP#6
+  Push                 r2
+  StoreIndexedTOS
+  PushConstant         CP#14
+  IndirectStaticCall   1, CP#7
+  PushConstant         CP#15
+  IndirectStaticCall   1, CP#7
+  Drop1
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = String 'default_a'
+  [1] = String 'default_b'
+  [2] = Null
+  [3] = Int 2
+  [4] = Int 0
+  [5] = String 'x = '
+  [6] = Int 1
+  [7] = ArgDesc num-args 1, num-type-args 0, names []
+  [8] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#7
+  [9] = StaticICData target 'dart.core::print', arg-desc CP#7
+  [10] = String 'a = '
+  [11] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#7
+  [12] = StaticICData target 'dart.core::print', arg-desc CP#7
+  [13] = String 'b = '
+  [14] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#7
+  [15] = StaticICData target 'dart.core::print', arg-desc CP#7
+}
+]static method foo1(dynamic x, [dynamic a = "default_a", dynamic b = "default_b"]) → void {
+  core::print("x = ${x}");
+  core::print("a = ${a}");
+  core::print("b = ${b}");
+}
+[@vm.bytecode=
+Bytecode {
+  EntryOptional        2, 0, 3
+  LoadConstant         r2, CP#0
+  LoadConstant         r2, CP#1
+  LoadConstant         r3, CP#2
+  LoadConstant         r3, CP#4
+  LoadConstant         r4, CP#5
+  LoadConstant         r4, CP#6
+  Frame                5
+  CheckStack
+  PushConstant         CP#7
+  PushConstant         CP#8
+  CreateArrayTOS
+  StoreLocal           r5
+  Push                 r5
+  PushConstant         CP#9
+  PushConstant         CP#10
+  StoreIndexedTOS
+  Push                 r5
+  PushConstant         CP#11
+  Push                 r0
+  StoreIndexedTOS
+  PushConstant         CP#13
+  IndirectStaticCall   1, CP#12
+  PushConstant         CP#14
+  IndirectStaticCall   1, CP#12
+  Drop1
+  PushConstant         CP#7
+  PushConstant         CP#8
+  CreateArrayTOS
+  StoreLocal           r6
+  Push                 r6
+  PushConstant         CP#9
+  PushConstant         CP#15
+  StoreIndexedTOS
+  Push                 r6
+  PushConstant         CP#11
+  Push                 r1
+  StoreIndexedTOS
+  PushConstant         CP#16
+  IndirectStaticCall   1, CP#12
+  PushConstant         CP#17
+  IndirectStaticCall   1, CP#12
+  Drop1
+  PushConstant         CP#7
+  PushConstant         CP#8
+  CreateArrayTOS
+  StoreLocal           r7
+  Push                 r7
+  PushConstant         CP#9
+  PushConstant         CP#18
+  StoreIndexedTOS
+  Push                 r7
+  PushConstant         CP#11
+  Push                 r2
+  StoreIndexedTOS
+  PushConstant         CP#19
+  IndirectStaticCall   1, CP#12
+  PushConstant         CP#20
+  IndirectStaticCall   1, CP#12
+  Drop1
+  PushConstant         CP#7
+  PushConstant         CP#8
+  CreateArrayTOS
+  StoreLocal           r8
+  Push                 r8
+  PushConstant         CP#9
+  PushConstant         CP#21
+  StoreIndexedTOS
+  Push                 r8
+  PushConstant         CP#11
+  Push                 r3
+  StoreIndexedTOS
+  PushConstant         CP#22
+  IndirectStaticCall   1, CP#12
+  PushConstant         CP#23
+  IndirectStaticCall   1, CP#12
+  Drop1
+  PushConstant         CP#7
+  PushConstant         CP#8
+  CreateArrayTOS
+  StoreLocal           r9
+  Push                 r9
+  PushConstant         CP#9
+  PushConstant         CP#24
+  StoreIndexedTOS
+  Push                 r9
+  PushConstant         CP#11
+  Push                 r4
+  StoreIndexedTOS
+  PushConstant         CP#25
+  IndirectStaticCall   1, CP#12
+  PushConstant         CP#26
+  IndirectStaticCall   1, CP#12
+  Drop1
+  PushConstant         CP#7
+  ReturnTOS
+}
+ConstantPool {
+  [0] = String 'a'
+  [1] = Int 42
+  [2] = String 'b'
+  [3] = String 'default_b'
+  [4] = List type-arg dart.core::String, entries CP# [3]
+  [5] = String 'c'
+  [6] = String 'default_c'
+  [7] = Null
+  [8] = Int 2
+  [9] = Int 0
+  [10] = String 'y = '
+  [11] = Int 1
+  [12] = ArgDesc num-args 1, num-type-args 0, names []
+  [13] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#12
+  [14] = StaticICData target 'dart.core::print', arg-desc CP#12
+  [15] = String 'z = '
+  [16] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#12
+  [17] = StaticICData target 'dart.core::print', arg-desc CP#12
+  [18] = String 'a = '
+  [19] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#12
+  [20] = StaticICData target 'dart.core::print', arg-desc CP#12
+  [21] = String 'b = '
+  [22] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#12
+  [23] = StaticICData target 'dart.core::print', arg-desc CP#12
+  [24] = String 'c = '
+  [25] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#12
+  [26] = StaticICData target 'dart.core::print', arg-desc CP#12
+}
+]static method foo2(dynamic y, dynamic z, {dynamic a = 42, dynamic b = const <core::String>["default_b"], dynamic c = "default_c"}) → void {
+  core::print("y = ${y}");
+  core::print("z = ${z}");
+  core::print("a = ${a}");
+  core::print("b = ${b}");
+  core::print("c = ${c}");
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  PushConstant         CP#1
+  PushConstant         CP#3
+  IndirectStaticCall   2, CP#2
+  Drop1
+  PushConstant         CP#4
+  PushConstant         CP#5
+  PushConstant         CP#1
+  PushConstant         CP#7
+  IndirectStaticCall   3, CP#6
+  Drop1
+  PushConstant         CP#8
+  ReturnTOS
+}
+ConstantPool {
+  [0] = String 'fixed_x'
+  [1] = String 'concrete_a'
+  [2] = ArgDesc num-args 2, num-type-args 0, names []
+  [3] = StaticICData target '#lib::foo1', arg-desc CP#2
+  [4] = String 'fixed_y'
+  [5] = String 'fixed_z'
+  [6] = ArgDesc num-args 3, num-type-args 0, names [a]
+  [7] = StaticICData target '#lib::foo2', arg-desc CP#6
+  [8] = Null
+}
+]static method main() → dynamic {
+  self::foo1("fixed_x", "concrete_a");
+  self::foo2("fixed_y", "fixed_z", a: "concrete_a");
+}
diff --git a/pkg/vm/testcases/bytecode/switch.dart b/pkg/vm/testcases/bytecode/switch.dart
new file mode 100644
index 0000000..da20adb
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/switch.dart
@@ -0,0 +1,60 @@
+// 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.
+
+int foo1(int x) {
+  int y;
+  switch (x) {
+    case 1:
+      y = 11;
+      break;
+    case 2:
+      y = 22;
+      break;
+    case 3:
+      y = 33;
+      break;
+  }
+  return y;
+}
+
+int foo2(int x) {
+  int y;
+  switch (x) {
+    case 1:
+    case 2:
+    case 3:
+      y = 11;
+      break;
+    case 4:
+    case 5:
+    case 6:
+      y = 22;
+      break;
+    default:
+      y = 33;
+  }
+  return y;
+}
+
+int foo3(int x) {
+  int y;
+  switch (x) {
+    case 1:
+    case 2:
+    case 3:
+      y = 11;
+      continue L5;
+    case 4:
+    L5:
+    case 5:
+    case 6:
+      y = 22;
+      return 42;
+    default:
+      y = 33;
+  }
+  return y;
+}
+
+main() {}
diff --git a/pkg/vm/testcases/bytecode/switch.dart.expect b/pkg/vm/testcases/bytecode/switch.dart.expect
new file mode 100644
index 0000000..cf87dfd
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/switch.dart.expect
@@ -0,0 +1,328 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+
+[@vm.bytecode=
+Bytecode {
+  Entry                2
+  CheckStack
+  PushConstant         CP#0
+  PopLocal             r0
+  Push                 FP[-5]
+  PopLocal             r1
+  Push                 r1
+  PushConstant         CP#2
+  InstanceCall2        2, CP#3
+  PushConstant         CP#4
+  IfEqStrictTOS
+  Jump                 L1
+  Push                 r1
+  PushConstant         CP#5
+  InstanceCall2        2, CP#6
+  PushConstant         CP#4
+  IfEqStrictTOS
+  Jump                 L2
+  Push                 r1
+  PushConstant         CP#7
+  InstanceCall2        2, CP#8
+  PushConstant         CP#4
+  IfEqStrictTOS
+  Jump                 L3
+  Jump                 L4
+L1:
+  PushConstant         CP#9
+  StoreLocal           r0
+  Drop1
+  Jump                 L4
+L2:
+  PushConstant         CP#10
+  StoreLocal           r0
+  Drop1
+  Jump                 L4
+L3:
+  PushConstant         CP#11
+  StoreLocal           r0
+  Drop1
+  Jump                 L4
+L4:
+  Push                 r0
+  ReturnTOS
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+  [1] = ArgDesc num-args 2, num-type-args 0, names []
+  [2] = Int 1
+  [3] = ICData target-name '==', arg-desc CP#1
+  [4] = Bool true
+  [5] = Int 2
+  [6] = ICData target-name '==', arg-desc CP#1
+  [7] = Int 3
+  [8] = ICData target-name '==', arg-desc CP#1
+  [9] = Int 11
+  [10] = Int 22
+  [11] = Int 33
+}
+]static method foo1(core::int x) → core::int {
+  core::int y;
+  #L1:
+  switch(x) {
+    #L2:
+    case 1:
+      {
+        y = 11;
+        break #L1;
+      }
+    #L3:
+    case 2:
+      {
+        y = 22;
+        break #L1;
+      }
+    #L4:
+    case 3:
+      {
+        y = 33;
+        break #L1;
+      }
+  }
+  return y;
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                2
+  CheckStack
+  PushConstant         CP#0
+  PopLocal             r0
+  Push                 FP[-5]
+  PopLocal             r1
+  Push                 r1
+  PushConstant         CP#2
+  InstanceCall2        2, CP#3
+  PushConstant         CP#4
+  IfEqStrictTOS
+  Jump                 L1
+  Push                 r1
+  PushConstant         CP#5
+  InstanceCall2        2, CP#6
+  PushConstant         CP#4
+  IfEqStrictTOS
+  Jump                 L1
+  Push                 r1
+  PushConstant         CP#7
+  InstanceCall2        2, CP#8
+  PushConstant         CP#4
+  IfEqStrictTOS
+  Jump                 L1
+  Push                 r1
+  PushConstant         CP#9
+  InstanceCall2        2, CP#10
+  PushConstant         CP#4
+  IfEqStrictTOS
+  Jump                 L2
+  Push                 r1
+  PushConstant         CP#11
+  InstanceCall2        2, CP#12
+  PushConstant         CP#4
+  IfEqStrictTOS
+  Jump                 L2
+  Push                 r1
+  PushConstant         CP#13
+  InstanceCall2        2, CP#14
+  PushConstant         CP#4
+  IfEqStrictTOS
+  Jump                 L2
+  Jump                 L3
+L1:
+  PushConstant         CP#15
+  StoreLocal           r0
+  Drop1
+  Jump                 L4
+L2:
+  PushConstant         CP#16
+  StoreLocal           r0
+  Drop1
+  Jump                 L4
+L3:
+  PushConstant         CP#17
+  StoreLocal           r0
+  Drop1
+L4:
+  Push                 r0
+  ReturnTOS
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+  [1] = ArgDesc num-args 2, num-type-args 0, names []
+  [2] = Int 1
+  [3] = ICData target-name '==', arg-desc CP#1
+  [4] = Bool true
+  [5] = Int 2
+  [6] = ICData target-name '==', arg-desc CP#1
+  [7] = Int 3
+  [8] = ICData target-name '==', arg-desc CP#1
+  [9] = Int 4
+  [10] = ICData target-name '==', arg-desc CP#1
+  [11] = Int 5
+  [12] = ICData target-name '==', arg-desc CP#1
+  [13] = Int 6
+  [14] = ICData target-name '==', arg-desc CP#1
+  [15] = Int 11
+  [16] = Int 22
+  [17] = Int 33
+}
+]static method foo2(core::int x) → core::int {
+  core::int y;
+  #L5:
+  switch(x) {
+    #L6:
+    case 1:
+    case 2:
+    case 3:
+      {
+        y = 11;
+        break #L5;
+      }
+    #L7:
+    case 4:
+    case 5:
+    case 6:
+      {
+        y = 22;
+        break #L5;
+      }
+    #L8:
+    default:
+      {
+        y = 33;
+      }
+  }
+  return y;
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                2
+  CheckStack
+  PushConstant         CP#0
+  PopLocal             r0
+  Push                 FP[-5]
+  PopLocal             r1
+  Push                 r1
+  PushConstant         CP#2
+  InstanceCall2        2, CP#3
+  PushConstant         CP#4
+  IfEqStrictTOS
+  Jump                 L1
+  Push                 r1
+  PushConstant         CP#5
+  InstanceCall2        2, CP#6
+  PushConstant         CP#4
+  IfEqStrictTOS
+  Jump                 L1
+  Push                 r1
+  PushConstant         CP#7
+  InstanceCall2        2, CP#8
+  PushConstant         CP#4
+  IfEqStrictTOS
+  Jump                 L1
+  Push                 r1
+  PushConstant         CP#9
+  InstanceCall2        2, CP#10
+  PushConstant         CP#4
+  IfEqStrictTOS
+  Jump                 L2
+  Push                 r1
+  PushConstant         CP#11
+  InstanceCall2        2, CP#12
+  PushConstant         CP#4
+  IfEqStrictTOS
+  Jump                 L2
+  Push                 r1
+  PushConstant         CP#13
+  InstanceCall2        2, CP#14
+  PushConstant         CP#4
+  IfEqStrictTOS
+  Jump                 L2
+  Jump                 L3
+L1:
+  PushConstant         CP#15
+  StoreLocal           r0
+  Drop1
+  Jump                 L2
+L2:
+  PushConstant         CP#16
+  StoreLocal           r0
+  Drop1
+  PushConstant         CP#17
+  ReturnTOS
+L3:
+  PushConstant         CP#18
+  StoreLocal           r0
+  Drop1
+  Push                 r0
+  ReturnTOS
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+  [1] = ArgDesc num-args 2, num-type-args 0, names []
+  [2] = Int 1
+  [3] = ICData target-name '==', arg-desc CP#1
+  [4] = Bool true
+  [5] = Int 2
+  [6] = ICData target-name '==', arg-desc CP#1
+  [7] = Int 3
+  [8] = ICData target-name '==', arg-desc CP#1
+  [9] = Int 4
+  [10] = ICData target-name '==', arg-desc CP#1
+  [11] = Int 5
+  [12] = ICData target-name '==', arg-desc CP#1
+  [13] = Int 6
+  [14] = ICData target-name '==', arg-desc CP#1
+  [15] = Int 11
+  [16] = Int 22
+  [17] = Int 42
+  [18] = Int 33
+}
+]static method foo3(core::int x) → core::int {
+  core::int y;
+  switch(x) {
+    #L9:
+    case 1:
+    case 2:
+    case 3:
+      {
+        y = 11;
+        continue #L10;
+      }
+    #L10:
+    case 4:
+    case 5:
+    case 6:
+      {
+        y = 22;
+        return 42;
+      }
+    #L11:
+    default:
+      {
+        y = 33;
+      }
+  }
+  return y;
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]static method main() → dynamic {}
diff --git a/pkg/vm/testcases/bytecode/type_ops.dart b/pkg/vm/testcases/bytecode/type_ops.dart
new file mode 100644
index 0000000..664dc6e
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/type_ops.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A<T> {}
+
+class B extends A<String> {}
+
+class C<T1, T2, T3> extends B {}
+
+foo1(x) {
+  if (x is B) {
+    print('11');
+  }
+  if (x is C<int, Object, dynamic>) {
+    print('12');
+  }
+  return x as A<int>;
+}
+
+class D<P, Q> extends C<int, Q, P> {
+  Map<P, Q> foo;
+
+  foo2(y) {
+    if (y is A<P>) {
+      print('21');
+    }
+    if (y is C<dynamic, Q, List<P>>) {
+      print('22');
+    }
+    foo = y;
+  }
+
+  foo3<T1, T2>(z) {
+    if (z is A<T1>) {
+      print('31');
+    }
+    if (z is C<Map<T1, P>, List<T2>, Q>) {
+      print('32');
+    }
+    return (z as Map<T2, Q>).values;
+  }
+}
+
+main() {}
diff --git a/pkg/vm/testcases/bytecode/type_ops.dart.expect b/pkg/vm/testcases/bytecode/type_ops.dart.expect
new file mode 100644
index 0000000..f53ec42
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/type_ops.dart.expect
@@ -0,0 +1,302 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object> extends core::Object {
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  PushConstant         CP#1
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [2] = Null
+}
+]  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends self::A<core::String> {
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  PushConstant         CP#1
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = StaticICData target '#lib::A::', arg-desc CP#0
+  [2] = Null
+}
+]  synthetic constructor •() → void
+    : super self::A::•()
+    ;
+}
+class C<T1 extends core::Object, T2 extends core::Object, T3 extends core::Object> extends self::B {
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  PushConstant         CP#1
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = StaticICData target '#lib::B::', arg-desc CP#0
+  [2] = Null
+}
+]  synthetic constructor •() → void
+    : super self::B::•()
+    ;
+}
+class D<P extends core::Object, Q extends core::Object> extends self::C<core::int, self::D::Q, self::D::P> {
+  generic-covariant-impl generic-covariant-interface field core::Map<self::D::P, self::D::Q> foo = null;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  PushConstant         CP#1
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushConstant         CP#2
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = StaticICData target '#lib::C::', arg-desc CP#0
+  [2] = Null
+}
+]  synthetic constructor •() → void
+    : super self::C::•()
+    ;
+[@vm.bytecode=
+Bytecode {
+  Entry                1
+  CheckStack
+  Push                 FP[-5]
+  Push                 FP[-6]
+  LoadFieldTOS         CP#0
+  PushConstant         CP#1
+  PushConstant         CP#2
+  InstanceCall1        4, CP#4
+  PushConstant         CP#5
+  IfNeStrictTOS
+  Jump                 L1
+  PushConstant         CP#6
+  PushConstant         CP#8
+  IndirectStaticCall   1, CP#7
+  Drop1
+L1:
+  Push                 FP[-5]
+  Push                 FP[-6]
+  LoadFieldTOS         CP#0
+  PushConstant         CP#1
+  PushConstant         CP#9
+  InstanceCall1        4, CP#10
+  PushConstant         CP#5
+  IfNeStrictTOS
+  Jump                 L2
+  PushConstant         CP#11
+  PushConstant         CP#12
+  IndirectStaticCall   1, CP#7
+  Drop1
+L2:
+  Push                 FP[-6]
+  Push                 FP[-5]
+  StoreLocal           r0
+  InstanceCall1        2, CP#14
+  Drop1
+  Push                 r0
+  Drop1
+  PushConstant         CP#1
+  ReturnTOS
+}
+ConstantPool {
+  [0] = TypeArgumentsFieldOffset #lib::D
+  [1] = Null
+  [2] = Type #lib::A<#lib::D::P>
+  [3] = ArgDesc num-args 4, num-type-args 0, names []
+  [4] = ICData target-name '_instanceOf', arg-desc CP#3
+  [5] = Bool true
+  [6] = String '21'
+  [7] = ArgDesc num-args 1, num-type-args 0, names []
+  [8] = StaticICData target 'dart.core::print', arg-desc CP#7
+  [9] = Type #lib::C<dynamic, #lib::D::Q, dart.core::List<#lib::D::P>>
+  [10] = ICData target-name '_instanceOf', arg-desc CP#3
+  [11] = String '22'
+  [12] = StaticICData target 'dart.core::print', arg-desc CP#7
+  [13] = ArgDesc num-args 2, num-type-args 0, names []
+  [14] = ICData target-name 'set:foo', arg-desc CP#13
+}
+]  method foo2(dynamic y) → dynamic {
+    if(y is self::A<self::D::P>) {
+      core::print("21");
+    }
+    if(y is self::C<dynamic, self::D::Q, core::List<self::D::P>>) {
+      core::print("22");
+    }
+    this.{self::D::foo} = y as{TypeError} core::Map<self::D::P, self::D::Q>;
+  }
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  Push                 FP[-6]
+  LoadFieldTOS         CP#0
+  Push                 FP[-7]
+  PushConstant         CP#1
+  InstanceCall1        4, CP#3
+  PushConstant         CP#4
+  IfNeStrictTOS
+  Jump                 L1
+  PushConstant         CP#5
+  PushConstant         CP#7
+  IndirectStaticCall   1, CP#6
+  Drop1
+L1:
+  Push                 FP[-5]
+  Push                 FP[-6]
+  LoadFieldTOS         CP#0
+  Push                 FP[-7]
+  PushConstant         CP#8
+  InstanceCall1        4, CP#9
+  PushConstant         CP#4
+  IfNeStrictTOS
+  Jump                 L2
+  PushConstant         CP#10
+  PushConstant         CP#11
+  IndirectStaticCall   1, CP#6
+  Drop1
+L2:
+  Push                 FP[-5]
+  Push                 FP[-6]
+  LoadFieldTOS         CP#0
+  Push                 FP[-7]
+  PushConstant         CP#12
+  InstanceCall1        4, CP#13
+  InstanceCall1        1, CP#14
+  ReturnTOS
+  PushConstant         CP#15
+  ReturnTOS
+}
+ConstantPool {
+  [0] = TypeArgumentsFieldOffset #lib::D
+  [1] = Type #lib::A<#lib::D::foo3::T1>
+  [2] = ArgDesc num-args 4, num-type-args 0, names []
+  [3] = ICData target-name '_instanceOf', arg-desc CP#2
+  [4] = Bool true
+  [5] = String '31'
+  [6] = ArgDesc num-args 1, num-type-args 0, names []
+  [7] = StaticICData target 'dart.core::print', arg-desc CP#6
+  [8] = Type #lib::C<dart.core::Map<#lib::D::foo3::T1, #lib::D::P>, dart.core::List<#lib::D::foo3::T2>, #lib::D::Q>
+  [9] = ICData target-name '_instanceOf', arg-desc CP#2
+  [10] = String '32'
+  [11] = StaticICData target 'dart.core::print', arg-desc CP#6
+  [12] = Type dart.core::Map<#lib::D::foo3::T2, #lib::D::Q>
+  [13] = ICData target-name '_as', arg-desc CP#2
+  [14] = ICData target-name 'get:values', arg-desc CP#6
+  [15] = Null
+}
+]  method foo3<T1 extends core::Object, T2 extends core::Object>(dynamic z) → dynamic {
+    if(z is self::A<self::D::foo3::T1>) {
+      core::print("31");
+    }
+    if(z is self::C<core::Map<self::D::foo3::T1, self::D::P>, core::List<self::D::foo3::T2>, self::D::Q>) {
+      core::print("32");
+    }
+    return (z as core::Map<self::D::foo3::T2, self::D::Q>).{core::Map::values};
+  }
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-5]
+  PushConstant         CP#0
+  PushConstant         CP#0
+  PushConstant         CP#1
+  InstanceCall1        4, CP#3
+  PushConstant         CP#4
+  IfNeStrictTOS
+  Jump                 L1
+  PushConstant         CP#5
+  PushConstant         CP#7
+  IndirectStaticCall   1, CP#6
+  Drop1
+L1:
+  Push                 FP[-5]
+  PushConstant         CP#0
+  PushConstant         CP#0
+  PushConstant         CP#8
+  InstanceCall1        4, CP#9
+  PushConstant         CP#4
+  IfNeStrictTOS
+  Jump                 L2
+  PushConstant         CP#10
+  PushConstant         CP#11
+  IndirectStaticCall   1, CP#6
+  Drop1
+L2:
+  Push                 FP[-5]
+  PushConstant         CP#0
+  PushConstant         CP#0
+  PushConstant         CP#12
+  InstanceCall1        4, CP#13
+  ReturnTOS
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+  [1] = Type #lib::B
+  [2] = ArgDesc num-args 4, num-type-args 0, names []
+  [3] = ICData target-name '_instanceOf', arg-desc CP#2
+  [4] = Bool true
+  [5] = String '11'
+  [6] = ArgDesc num-args 1, num-type-args 0, names []
+  [7] = StaticICData target 'dart.core::print', arg-desc CP#6
+  [8] = Type #lib::C<dart.core::int, dart.core::Object, dynamic>
+  [9] = ICData target-name '_instanceOf', arg-desc CP#2
+  [10] = String '12'
+  [11] = StaticICData target 'dart.core::print', arg-desc CP#6
+  [12] = Type #lib::A<dart.core::int>
+  [13] = ICData target-name '_as', arg-desc CP#2
+}
+]static method foo1(dynamic x) → dynamic {
+  if(x is self::B) {
+    core::print("11");
+  }
+  if(x is self::C<core::int, core::Object, dynamic>) {
+    core::print("12");
+  }
+  return x as self::A<core::int>;
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]static method main() → dynamic {}
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index a735862..db2fa71 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -1132,7 +1132,7 @@
   import("//build/package.gni")
 
   package("package") {
-    system_image = true
+    deprecated_system_image = true
 
     package_name = "dart"
 
@@ -1152,7 +1152,7 @@
   }
 
   package("dart_tests") {
-    system_image = true
+    deprecated_system_image = true
 
     deps = [
       ":hello_fuchsia",
diff --git a/runtime/bin/namespace_fuchsia.cc b/runtime/bin/namespace_fuchsia.cc
index b8bb20a..384aa9d 100644
--- a/runtime/bin/namespace_fuchsia.cc
+++ b/runtime/bin/namespace_fuchsia.cc
@@ -11,6 +11,7 @@
 #include <fcntl.h>
 #include <fdio/namespace.h>
 #include <fdio/private.h>
+#include <zircon/status.h>
 
 #include "bin/file.h"
 #include "platform/signal_blocker.h"
@@ -42,7 +43,9 @@
   ~NamespaceImpl() {
     if (fdio_ns_ != NULL) {
       zx_status_t status = fdio_ns_destroy(fdio_ns_);
-      ASSERT(status == ZX_OK);
+      if (status != ZX_OK) {
+        Log::PrintErr("fdio_ns_destroy: %s\n", zx_status_get_string(status));
+      }
     }
     NO_RETRY_EXPECTED(close(rootfd_));
     free(cwd_);
diff --git a/runtime/bin/platform_android.cc b/runtime/bin/platform_android.cc
index b14fb90..a7afafe 100644
--- a/runtime/bin/platform_android.cc
+++ b/runtime/bin/platform_android.cc
@@ -26,7 +26,7 @@
 
 static void segv_handler(int signal, siginfo_t* siginfo, void* context) {
   Log::PrintErr(
-      "\n===== DART STANDALONE VM CRASH =====\n"
+      "\n===== CRASH =====\n"
       "version=%s\n"
       "si_signo=%s(%d), si_code=%d, si_addr=%p\n",
       Dart_VersionString(), strsignal(siginfo->si_signo), siginfo->si_signo,
diff --git a/runtime/bin/platform_linux.cc b/runtime/bin/platform_linux.cc
index 9cd4f71..a8dccc5 100644
--- a/runtime/bin/platform_linux.cc
+++ b/runtime/bin/platform_linux.cc
@@ -26,7 +26,7 @@
 
 static void segv_handler(int signal, siginfo_t* siginfo, void* context) {
   Log::PrintErr(
-      "\n===== DART STANDALONE VM CRASH =====\n"
+      "\n===== CRASH =====\n"
       "version=%s\n"
       "si_signo=%s(%d), si_code=%d, si_addr=%p\n",
       Dart_VersionString(), strsignal(siginfo->si_signo), siginfo->si_signo,
diff --git a/runtime/bin/platform_macos.cc b/runtime/bin/platform_macos.cc
index 3dfe9e5..1cf7f46 100644
--- a/runtime/bin/platform_macos.cc
+++ b/runtime/bin/platform_macos.cc
@@ -34,7 +34,7 @@
 
 static void segv_handler(int signal, siginfo_t* siginfo, void* context) {
   Log::PrintErr(
-      "\n===== DART STANDALONE VM CRASH =====\n"
+      "\n===== CRASH =====\n"
       "version=%s\n"
       "si_signo=%s(%d), si_code=%d, si_addr=%p\n",
       Dart_VersionString(), strsignal(siginfo->si_signo), siginfo->si_signo,
diff --git a/runtime/bin/platform_win.cc b/runtime/bin/platform_win.cc
index 796f250..069b9e5 100644
--- a/runtime/bin/platform_win.cc
+++ b/runtime/bin/platform_win.cc
@@ -64,7 +64,7 @@
         (ExceptionInfo->ExceptionRecord->ExceptionCode ==
          EXCEPTION_ILLEGAL_INSTRUCTION)) {
       Log::PrintErr(
-          "\n===== DART STANDALONE VM CRASH =====\n"
+          "\n===== CRASH =====\n"
           "version=%s\n"
           "ExceptionCode=%d, ExceptionFlags=%d, ExceptionAddress=%p\n",
           Dart_VersionString(), ExceptionInfo->ExceptionRecord->ExceptionCode,
diff --git a/runtime/bin/secure_socket_filter.h b/runtime/bin/secure_socket_filter.h
index dda69eb..e09f0e6 100644
--- a/runtime/bin/secure_socket_filter.h
+++ b/runtime/bin/secure_socket_filter.h
@@ -49,6 +49,10 @@
 
   ~SSLFilter();
 
+  char* hostname() const { return hostname_; }
+  bool is_server() const { return is_server_; }
+  bool is_client() const { return !is_server_; }
+
   Dart_Handle Init(Dart_Handle dart_this);
   void Connect(const char* hostname,
                SSLCertContext* context,
diff --git a/runtime/bin/security_context.cc b/runtime/bin/security_context.cc
index 397ed30..56d99e4 100644
--- a/runtime/bin/security_context.cc
+++ b/runtime/bin/security_context.cc
@@ -661,7 +661,6 @@
 }
 
 Dart_Handle X509Helper::GetIssuer(Dart_NativeArguments args) {
-  fprintf(stdout, "Getting issuer!\n");
   X509* certificate = GetX509Certificate(args);
   X509_NAME* issuer = X509_get_issuer_name(certificate);
   char* issuer_string = X509_NAME_oneline(issuer, NULL, 0);
diff --git a/runtime/bin/security_context_macos.cc b/runtime/bin/security_context_macos.cc
index 1f7a3bb..8dbb43e 100644
--- a/runtime/bin/security_context_macos.cc
+++ b/runtime/bin/security_context_macos.cc
@@ -28,7 +28,11 @@
  public:
   explicit ScopedCFType(T obj) : obj_(obj) {}
 
-  ~ScopedCFType() { CFRelease(obj_); }
+  ~ScopedCFType() {
+    if (obj_ != NULL) {
+      CFRelease(obj_);
+    }
+  }
 
   T get() { return obj_; }
   T* ptr() { return &obj_; }
@@ -45,6 +49,7 @@
 
 typedef ScopedCFType<CFMutableArrayRef> ScopedCFMutableArrayRef;
 typedef ScopedCFType<CFDataRef> ScopedCFDataRef;
+typedef ScopedCFType<CFStringRef> ScopedCFStringRef;
 typedef ScopedCFType<SecPolicyRef> ScopedSecPolicyRef;
 typedef ScopedCFType<SecCertificateRef> ScopedSecCertificateRef;
 typedef ScopedCFType<SecTrustRef> ScopedSecTrustRef;
@@ -112,8 +117,19 @@
     }
   }
 
-  // Generate a generic X509 verification policy.
-  ScopedSecPolicyRef policy(SecPolicyCreateBasicX509());
+  // Generate a policy for validating chains for SSL.
+  const int ssl_index = SSL_get_ex_data_X509_STORE_CTX_idx();
+  SSL* ssl = static_cast<SSL*>(X509_STORE_CTX_get_ex_data(ctx, ssl_index));
+  SSLFilter* filter = static_cast<SSLFilter*>(
+      SSL_get_ex_data(ssl, SSLFilter::filter_ssl_index));
+  CFStringRef cfhostname = NULL;
+  if (filter->hostname() != NULL) {
+    cfhostname = CFStringCreateWithCString(NULL, filter->hostname(),
+                                           kCFStringEncodingUTF8);
+  }
+  ScopedCFStringRef hostname(cfhostname);
+  ScopedSecPolicyRef policy(
+      SecPolicyCreateSSL(filter->is_client(), hostname.get()));
 
   // Create the trust object with the certificates provided by the user.
   ScopedSecTrustRef trust(NULL);
diff --git a/runtime/lib/function.dart b/runtime/lib/function.dart
index ebaa3ec..341758e 100644
--- a/runtime/lib/function.dart
+++ b/runtime/lib/function.dart
@@ -20,7 +20,7 @@
 
   int _computeHash() native "Closure_computeHash";
 
-  // No instance fields should be declared before the following 4 fields whose
+  // No instance fields should be declared before the following fields whose
   // offsets must be identical in Dart and C++.
 
   // The following fields are declared both in raw_object.h (for direct access
@@ -30,6 +30,7 @@
   // names do not need to match the C++ names, but they must be private.
   var _instantiator_type_arguments;
   var _function_type_arguments;
+  var _delayed_type_arguments;
   var _function;
   var _context;
 
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index 43ff9094..5e29999 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -199,7 +199,7 @@
 #if defined(DEBUG)
       Context& ctx = Context::Handle();
       ctx = Closure::Cast(closure).context();
-      ASSERT(ctx.num_variables() == 0);
+      ASSERT(ctx.IsNull());
 #endif
       // Get the parent function so that we get the right function name.
       func = func.parent_function();
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index d586dc0..fe0711f 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -462,29 +462,9 @@
       TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0));
   const TypeArguments& parent_type_arguments =
       TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(1));
-  if (function_type_arguments.IsNull() && parent_type_arguments.IsNull()) {
-    return TypeArguments::null();
-  }
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, smi_len, arguments->NativeArgAt(2));
   const intptr_t len = smi_len.Value();
-  const TypeArguments& result =
-      TypeArguments::Handle(zone, TypeArguments::New(len, Heap::kNew));
-  AbstractType& type = AbstractType::Handle(zone);
-  const intptr_t split = parent_type_arguments.IsNull()
-                             ? len - function_type_arguments.Length()
-                             : parent_type_arguments.Length();
-  for (intptr_t i = 0; i < split; i++) {
-    type = parent_type_arguments.IsNull() ? Type::DynamicType()
-                                          : parent_type_arguments.TypeAt(i);
-    result.SetTypeAt(i, type);
-  }
-  for (intptr_t i = split; i < len; i++) {
-    type = function_type_arguments.IsNull()
-               ? Type::DynamicType()
-               : function_type_arguments.TypeAt(i - split);
-    result.SetTypeAt(i, type);
-  }
-  return result.Canonicalize();
+  return function_type_arguments.Prepend(zone, parent_type_arguments, len);
 }
 
 DEFINE_NATIVE_ENTRY(InvocationMirror_unpackTypeArguments, 1) {
diff --git a/runtime/lib/typed_data_patch.dart b/runtime/lib/typed_data_patch.dart
index 83a4f54..383bfcd 100644
--- a/runtime/lib/typed_data_patch.dart
+++ b/runtime/lib/typed_data_patch.dart
@@ -3487,7 +3487,7 @@
   E get current => _current;
 }
 
-class _TypedListView extends _TypedListBase implements TypedData {
+abstract class _TypedListView extends _TypedListBase implements TypedData {
   _TypedListView(_ByteBuffer _buffer, int _offset, int _length)
       : _typedData = _buffer._data,
         offsetInBytes = _offset,
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index a10cfaa..29800f7 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -2073,6 +2073,9 @@
   Iterable get values => _map.values;
   int get length => _map.length;
 
+  // Suppress compile-time error about missing Map methods.
+  noSuchMethod(_) => throw "Unimplemented ServiceMap method";
+
   String toString() => "ServiceMap($_map)";
 }
 
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 35c3305..07ba355 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -155,7 +155,6 @@
 cc/Debugger_PrintBreakpointsToJSONArray: Fail
 cc/Debugger_Rewind_Optimized: SkipSlow
 cc/Debugger_SetBreakpointInPartOfLibrary: Crash
-cc/FunctionSourceFingerprint: Fail # Issue 30756
 cc/IsolateReload_NotTypedefToTypedef: Fail
 cc/IsolateReload_TypedefToNotTypedef: Fail
 cc/Profiler_BasicSourcePositionOptimized: Skip
@@ -208,6 +207,9 @@
 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
+cc/ScriptSnapshotsUpdateSubclasses: Fail, Crash, OK # Script snapshots not supported in Dart 2
 
 # Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
 # are to be triaged.  Isolate tests are skipped on purpose due to the usage of
diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
index 52b7a3b..2bd04fa 100644
--- a/runtime/vm/bootstrap.cc
+++ b/runtime/vm/bootstrap.cc
@@ -239,17 +239,19 @@
 #if defined(DEBUG)
   // Verify that closure field offsets are identical in Dart and C++.
   const Array& fields = Array::Handle(zone, cls.fields());
-  ASSERT(fields.Length() == 5);
+  ASSERT(fields.Length() == 6);
   Field& field = Field::Handle(zone);
   field ^= fields.At(0);
   ASSERT(field.Offset() == Closure::instantiator_type_arguments_offset());
   field ^= fields.At(1);
   ASSERT(field.Offset() == Closure::function_type_arguments_offset());
   field ^= fields.At(2);
-  ASSERT(field.Offset() == Closure::function_offset());
+  ASSERT(field.Offset() == Closure::delayed_type_arguments_offset());
   field ^= fields.At(3);
-  ASSERT(field.Offset() == Closure::context_offset());
+  ASSERT(field.Offset() == Closure::function_offset());
   field ^= fields.At(4);
+  ASSERT(field.Offset() == Closure::context_offset());
+  field ^= fields.At(5);
   ASSERT(field.Offset() == Closure::hash_offset());
 #endif  // defined(DEBUG)
 
diff --git a/runtime/vm/bootstrap_nocore.cc b/runtime/vm/bootstrap_nocore.cc
index 2a3e095..679c41f 100644
--- a/runtime/vm/bootstrap_nocore.cc
+++ b/runtime/vm/bootstrap_nocore.cc
@@ -49,17 +49,19 @@
 #if defined(DEBUG)
   // Verify that closure field offsets are identical in Dart and C++.
   const Array& fields = Array::Handle(zone, cls.fields());
-  ASSERT(fields.Length() == 5);
+  ASSERT(fields.Length() == 6);
   Field& field = Field::Handle(zone);
   field ^= fields.At(0);
   ASSERT(field.Offset() == Closure::instantiator_type_arguments_offset());
   field ^= fields.At(1);
   ASSERT(field.Offset() == Closure::function_type_arguments_offset());
   field ^= fields.At(2);
-  ASSERT(field.Offset() == Closure::function_offset());
+  ASSERT(field.Offset() == Closure::delayed_type_arguments_offset());
   field ^= fields.At(3);
-  ASSERT(field.Offset() == Closure::context_offset());
+  ASSERT(field.Offset() == Closure::function_offset());
   field ^= fields.At(4);
+  ASSERT(field.Offset() == Closure::context_offset());
+  field ^= fields.At(5);
   ASSERT(field.Offset() == Closure::hash_offset());
 #endif  // defined(DEBUG)
 
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 03dbd3b..6243d52 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -5062,13 +5062,13 @@
   AddBaseObject(Object::zero_array().raw());
   AddBaseObject(Object::dynamic_type().raw());
   AddBaseObject(Object::void_type().raw());
+  AddBaseObject(Object::empty_type_arguments().raw());
   AddBaseObject(Bool::True().raw());
   AddBaseObject(Bool::False().raw());
   ASSERT(Object::extractor_parameter_types().raw() != Object::null());
   AddBaseObject(Object::extractor_parameter_types().raw());
   ASSERT(Object::extractor_parameter_names().raw() != Object::null());
   AddBaseObject(Object::extractor_parameter_names().raw());
-  AddBaseObject(Object::empty_context().raw());
   AddBaseObject(Object::empty_context_scope().raw());
   AddBaseObject(Object::empty_descriptors().raw());
   AddBaseObject(Object::empty_var_descriptors().raw());
@@ -5507,13 +5507,13 @@
   AddBaseObject(Object::zero_array().raw());
   AddBaseObject(Object::dynamic_type().raw());
   AddBaseObject(Object::void_type().raw());
+  AddBaseObject(Object::empty_type_arguments().raw());
   AddBaseObject(Bool::True().raw());
   AddBaseObject(Bool::False().raw());
   ASSERT(Object::extractor_parameter_types().raw() != Object::null());
   AddBaseObject(Object::extractor_parameter_types().raw());
   ASSERT(Object::extractor_parameter_names().raw() != Object::null());
   AddBaseObject(Object::extractor_parameter_names().raw());
-  AddBaseObject(Object::empty_context().raw());
   AddBaseObject(Object::empty_context_scope().raw());
   AddBaseObject(Object::empty_descriptors().raw());
   AddBaseObject(Object::empty_var_descriptors().raw());
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index 5d30eda..66f0543 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -26,6 +26,7 @@
 // Quick access to the current zone and isolate.
 #define I (isolate())
 #define Z (graph_->zone())
+#define T (graph_->thread())
 
 ConstantPropagator::ConstantPropagator(
     FlowGraph* graph,
@@ -1321,6 +1322,7 @@
   // instructions, previous pointers, predecessors, etc. after eliminating
   // unreachable code.  We do not maintain those properties during the
   // transformation.
+  auto& value = Object::Handle(Z);
   for (BlockIterator b = graph_->reverse_postorder_iterator(); !b.Done();
        b.Advance()) {
     BlockEntryInstr* block = b.Current();
@@ -1398,7 +1400,14 @@
           THR_Print("Constant v%" Pd " = %s\n", defn->ssa_temp_index(),
                     defn->constant_value().ToCString());
         }
-        ConstantInstr* constant = graph_->GetConstant(defn->constant_value());
+        value = defn->constant_value().raw();
+        if ((value.IsString() || value.IsMint() || value.IsDouble()) &&
+            !value.IsCanonical()) {
+          const char* error_str = nullptr;
+          value = Instance::Cast(value).CheckAndCanonicalize(T, &error_str);
+          ASSERT(!value.IsNull() && (error_str == nullptr));
+        }
+        ConstantInstr* constant = graph_->GetConstant(value);
         defn->ReplaceUsesWith(constant);
         i.RemoveCurrentFromGraph();
       }
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index cd4d8f0..9b5729c 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -2898,21 +2898,21 @@
 
     LocalVariable* closure_parameter = scope->VariableAt(0);
     ASSERT(!closure_parameter->is_captured());
-    __ LoadFromOffset(kWord, CTX, FP, closure_parameter->index() * kWordSize);
-    __ LoadFieldFromOffset(kWord, CTX, CTX, Closure::context_offset());
+    __ LoadFromOffset(kWord, R6, FP, closure_parameter->index() * kWordSize);
+    __ LoadFieldFromOffset(kWord, R6, R6, Closure::context_offset());
 
     const intptr_t context_index =
         parsed_function.current_context_var()->index();
-    __ StoreToOffset(kWord, CTX, FP, context_index * kWordSize);
+    __ StoreToOffset(kWord, R6, FP, context_index * kWordSize);
   }
 
   // Initialize exception and stack trace variables.
   if (exception_var().is_captured()) {
     ASSERT(stacktrace_var().is_captured());
-    __ StoreIntoObjectOffset(CTX,
+    __ StoreIntoObjectOffset(R6,
                              Context::variable_offset(exception_var().index()),
                              kExceptionObjectReg);
-    __ StoreIntoObjectOffset(CTX,
+    __ StoreIntoObjectOffset(R6,
                              Context::variable_offset(stacktrace_var().index()),
                              kStackTraceObjectReg);
   } else {
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 595c61a..9c0a698 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -2647,21 +2647,21 @@
 
     LocalVariable* closure_parameter = scope->VariableAt(0);
     ASSERT(!closure_parameter->is_captured());
-    __ LoadFromOffset(CTX, FP, closure_parameter->index() * kWordSize);
-    __ LoadFieldFromOffset(CTX, CTX, Closure::context_offset());
+    __ LoadFromOffset(R28, FP, closure_parameter->index() * kWordSize);
+    __ LoadFieldFromOffset(R28, R28, Closure::context_offset());
 
     const intptr_t context_index =
         parsed_function.current_context_var()->index();
-    __ StoreToOffset(CTX, FP, context_index * kWordSize);
+    __ StoreToOffset(R28, FP, context_index * kWordSize);
   }
 
   // Initialize exception and stack trace variables.
   if (exception_var().is_captured()) {
     ASSERT(stacktrace_var().is_captured());
-    __ StoreIntoObjectOffset(CTX,
+    __ StoreIntoObjectOffset(R28,
                              Context::variable_offset(exception_var().index()),
                              kExceptionObjectReg);
-    __ StoreIntoObjectOffset(CTX,
+    __ StoreIntoObjectOffset(R28,
                              Context::variable_offset(stacktrace_var().index()),
                              kStackTraceObjectReg);
   } else {
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index 68ba62f..c92b517 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -2506,12 +2506,12 @@
 
     LocalVariable* closure_parameter = scope->VariableAt(0);
     ASSERT(!closure_parameter->is_captured());
-    __ movl(CTX, Address(EBP, closure_parameter->index() * kWordSize));
-    __ movl(CTX, FieldAddress(CTX, Closure::context_offset()));
+    __ movl(EDI, Address(EBP, closure_parameter->index() * kWordSize));
+    __ movl(EDI, FieldAddress(EDI, Closure::context_offset()));
 
 #ifdef DEBUG
     Label ok;
-    __ LoadClassId(EBX, CTX);
+    __ LoadClassId(EBX, EDI);
     __ cmpl(EBX, Immediate(kContextCid));
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Incorrect context at entry");
@@ -2520,19 +2520,19 @@
 
     const intptr_t context_index =
         parsed_function.current_context_var()->index();
-    __ movl(Address(EBP, context_index * kWordSize), CTX);
+    __ movl(Address(EBP, context_index * kWordSize), EDI);
   }
 
   // Initialize exception and stack trace variables.
   if (exception_var().is_captured()) {
     ASSERT(stacktrace_var().is_captured());
     __ StoreIntoObject(
-        CTX,
-        FieldAddress(CTX, Context::variable_offset(exception_var().index())),
+        EDI,
+        FieldAddress(EDI, Context::variable_offset(exception_var().index())),
         kExceptionObjectReg);
     __ StoreIntoObject(
-        CTX,
-        FieldAddress(CTX, Context::variable_offset(stacktrace_var().index())),
+        EDI,
+        FieldAddress(EDI, Context::variable_offset(stacktrace_var().index())),
         kStackTraceObjectReg);
   } else {
     // Restore stack and initialize the two exception variables:
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 20495f3..b44d650 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -2581,12 +2581,12 @@
 
     LocalVariable* closure_parameter = scope->VariableAt(0);
     ASSERT(!closure_parameter->is_captured());
-    __ movq(CTX, Address(RBP, closure_parameter->index() * kWordSize));
-    __ movq(CTX, FieldAddress(CTX, Closure::context_offset()));
+    __ movq(R12, Address(RBP, closure_parameter->index() * kWordSize));
+    __ movq(R12, FieldAddress(R12, Closure::context_offset()));
 
 #ifdef DEBUG
     Label ok;
-    __ LoadClassId(RBX, CTX);
+    __ LoadClassId(RBX, R12);
     __ cmpq(RBX, Immediate(kContextCid));
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Incorrect context at entry");
@@ -2595,19 +2595,19 @@
 
     const intptr_t context_index =
         parsed_function.current_context_var()->index();
-    __ movq(Address(RBP, context_index * kWordSize), CTX);
+    __ movq(Address(RBP, context_index * kWordSize), R12);
   }
 
   // Initialize exception and stack trace variables.
   if (exception_var().is_captured()) {
     ASSERT(stacktrace_var().is_captured());
     __ StoreIntoObject(
-        CTX,
-        FieldAddress(CTX, Context::variable_offset(exception_var().index())),
+        R12,
+        FieldAddress(R12, Context::variable_offset(exception_var().index())),
         kExceptionObjectReg);
     __ StoreIntoObject(
-        CTX,
-        FieldAddress(CTX, Context::variable_offset(stacktrace_var().index())),
+        R12,
+        FieldAddress(R12, Context::variable_offset(stacktrace_var().index())),
         kStackTraceObjectReg);
   } else {
     __ movq(Address(RBP, exception_var().index() * kWordSize),
diff --git a/runtime/vm/compiler/frontend/flow_graph_builder.cc b/runtime/vm/compiler/frontend/flow_graph_builder.cc
index 7ddfd0c..5c82158 100644
--- a/runtime/vm/compiler/frontend/flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/flow_graph_builder.cc
@@ -2318,6 +2318,17 @@
           type_arguments, kEmitStoreBarrier, node->token_pos()));
     }
 
+    // Mark that there are no delayed type arguments.
+    {
+      Value* closure_tmp_val =
+          Bind(new (Z) LoadLocalInstr(*closure_tmp_var, node->token_pos()));
+      Value* type_arguments =
+          Bind(new (Z) ConstantInstr(Object::empty_type_arguments()));
+      Do(new (Z) StoreInstanceFieldInstr(
+          Closure::delayed_type_arguments_offset(), closure_tmp_val,
+          type_arguments, kEmitStoreBarrier, node->token_pos()));
+    }
+
     // Store function.
     Value* closure_tmp_val =
         Bind(new (Z) LoadLocalInstr(*closure_tmp_var, node->token_pos()));
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index a0cb2ef..4b86b49 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -34,46 +34,46 @@
   // Ordered with fall-through.
   switch (next_read_) {
     case kStart: {
-      Tag tag = builder_->ReadTag();  // read tag.
+      Tag tag = helper_->ReadTag();  // read tag.
       ASSERT(tag == kFunctionNode);
       if (++next_read_ == field) return;
     }
     case kPosition:
-      position_ = builder_->ReadPosition();  // read position.
+      position_ = helper_->ReadPosition();  // read position.
       if (++next_read_ == field) return;
     case kEndPosition:
-      end_position_ = builder_->ReadPosition();  // read end position.
+      end_position_ = helper_->ReadPosition();  // read end position.
       if (++next_read_ == field) return;
     case kAsyncMarker:
-      async_marker_ = static_cast<AsyncMarker>(builder_->ReadByte());
+      async_marker_ = static_cast<AsyncMarker>(helper_->ReadByte());
       if (++next_read_ == field) return;
     case kDartAsyncMarker:
       dart_async_marker_ = static_cast<AsyncMarker>(
-          builder_->ReadByte());  // read dart async marker.
+          helper_->ReadByte());  // read dart async marker.
       if (++next_read_ == field) return;
     case kTypeParameters:
-      builder_->SkipTypeParametersList();  // read type parameters.
+      helper_->SkipTypeParametersList();  // read type parameters.
       if (++next_read_ == field) return;
     case kTotalParameterCount:
       total_parameter_count_ =
-          builder_->ReadUInt();  // read total parameter count.
+          helper_->ReadUInt();  // read total parameter count.
       if (++next_read_ == field) return;
     case kRequiredParameterCount:
       required_parameter_count_ =
-          builder_->ReadUInt();  // read required parameter count.
+          helper_->ReadUInt();  // read required parameter count.
       if (++next_read_ == field) return;
     case kPositionalParameters:
-      builder_->SkipListOfVariableDeclarations();  // read positionals.
+      helper_->SkipListOfVariableDeclarations();  // read positionals.
       if (++next_read_ == field) return;
     case kNamedParameters:
-      builder_->SkipListOfVariableDeclarations();  // read named.
+      helper_->SkipListOfVariableDeclarations();  // read named.
       if (++next_read_ == field) return;
     case kReturnType:
-      builder_->SkipDartType();  // read return type.
+      helper_->SkipDartType();  // read return type.
       if (++next_read_ == field) return;
     case kBody:
-      if (builder_->ReadTag() == kSomething)
-        builder_->SkipStatement();  // read body.
+      if (helper_->ReadTag() == kSomething)
+        helper_->SkipStatement();  // read body.
       if (++next_read_ == field) return;
     case kEnd:
       return;
@@ -84,20 +84,20 @@
   for (; next_read_ < field; ++next_read_) {
     switch (next_read_) {
       case kFlags:
-        flags_ = builder_->ReadFlags();
+        flags_ = helper_->ReadFlags();
         break;
       case kAnnotations:
-        builder_->SkipListOfExpressions();  // read annotations.
+        helper_->SkipListOfExpressions();  // read annotations.
         break;
       case kName:
-        name_index_ = builder_->ReadStringReference();  // read name index.
+        name_index_ = helper_->ReadStringReference();  // read name index.
         break;
       case kBound:
-        builder_->SkipDartType();
+        helper_->SkipDartType();
         break;
       case kDefaultType:
-        if (builder_->ReadTag() == kSomething) {
-          builder_->SkipDartType();
+        if (helper_->ReadTag() == kSomething) {
+          helper_->SkipDartType();
         }
         break;
       case kEnd:
@@ -112,37 +112,37 @@
   // Ordered with fall-through.
   switch (next_read_) {
     case kPosition:
-      position_ = builder_->ReadPosition();  // read position.
+      position_ = helper_->ReadPosition();  // read position.
       if (++next_read_ == field) return;
     case kEqualPosition:
-      equals_position_ = builder_->ReadPosition();  // read equals position.
+      equals_position_ = helper_->ReadPosition();  // read equals position.
       if (++next_read_ == field) return;
     case kAnnotations:
-      builder_->SkipListOfExpressions();  // read annotations.
+      helper_->SkipListOfExpressions();  // read annotations.
       if (++next_read_ == field) return;
     case kFlags:
-      flags_ = builder_->ReadFlags();
+      flags_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
     case kNameIndex:
-      name_index_ = builder_->ReadStringReference();  // read name index.
+      name_index_ = helper_->ReadStringReference();  // read name index.
       if (++next_read_ == field) return;
     case kType:
-      builder_->SkipDartType();  // read type.
+      helper_->SkipDartType();  // read type.
       if (++next_read_ == field) return;
     case kInitializer:
-      if (builder_->ReadTag() == kSomething)
-        builder_->SkipExpression();  // read initializer.
+      if (helper_->ReadTag() == kSomething)
+        helper_->SkipExpression();  // read initializer.
       if (++next_read_ == field) return;
     case kEnd:
       return;
   }
 }
 
-FieldHelper::FieldHelper(StreamingFlowGraphBuilder* builder, intptr_t offset)
-    : builder_(builder),
+FieldHelper::FieldHelper(KernelReaderHelper* helper, intptr_t offset)
+    : helper_(helper),
       next_read_(kStart),
       has_function_literal_initializer_(false) {
-  builder_->SetOffset(offset);
+  helper_->SetOffset(offset);
 }
 
 void FieldHelper::ReadUntilExcluding(Field field,
@@ -152,62 +152,62 @@
   // Ordered with fall-through.
   switch (next_read_) {
     case kStart: {
-      Tag tag = builder_->ReadTag();  // read tag.
+      Tag tag = helper_->ReadTag();  // read tag.
       ASSERT(tag == kField);
       if (++next_read_ == field) return;
     }
     case kCanonicalName:
       canonical_name_ =
-          builder_->ReadCanonicalNameReference();  // read canonical_name.
+          helper_->ReadCanonicalNameReference();  // read canonical_name.
       if (++next_read_ == field) return;
     case kSourceUriIndex:
-      source_uri_index_ = builder_->ReadUInt();  // read source_uri_index.
-      builder_->current_script_id_ = source_uri_index_;
+      source_uri_index_ = helper_->ReadUInt();  // read source_uri_index.
+      helper_->set_current_script_id(source_uri_index_);
       if (++next_read_ == field) return;
     case kPosition:
-      position_ = builder_->ReadPosition(false);  // read position.
-      builder_->record_token_position(position_);
+      position_ = helper_->ReadPosition(false);  // read position.
+      helper_->RecordTokenPosition(position_);
       if (++next_read_ == field) return;
     case kEndPosition:
-      end_position_ = builder_->ReadPosition(false);  // read end position.
-      builder_->record_token_position(end_position_);
+      end_position_ = helper_->ReadPosition(false);  // read end position.
+      helper_->RecordTokenPosition(end_position_);
       if (++next_read_ == field) return;
     case kFlags:
-      flags_ = builder_->ReadFlags();
+      flags_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
     case kFlags2:
-      builder_->ReadFlags();
+      secondary_flags_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
     case kName:
-      builder_->SkipName();  // read name.
+      helper_->SkipName();  // read name.
       if (++next_read_ == field) return;
     case kAnnotations: {
-      annotation_count_ = builder_->ReadListLength();  // read list length.
+      annotation_count_ = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < annotation_count_; ++i) {
-        builder_->SkipExpression();  // read ith expression.
+        helper_->SkipExpression();  // read ith expression.
       }
       if (++next_read_ == field) return;
     }
     case kType:
-      builder_->SkipDartType();  // read type.
+      helper_->SkipDartType();  // read type.
       if (++next_read_ == field) return;
     case kInitializer:
-      if (builder_->ReadTag() == kSomething) {
+      if (helper_->ReadTag() == kSomething) {
         if (detect_function_literal_initializer &&
-            builder_->PeekTag() == kFunctionExpression) {
-          AlternativeReadingScope alt(&builder_->reader_);
-          Tag tag = builder_->ReadTag();
+            helper_->PeekTag() == kFunctionExpression) {
+          AlternativeReadingScope alt(&helper_->reader_);
+          Tag tag = helper_->ReadTag();
           ASSERT(tag == kFunctionExpression);
-          builder_->ReadPosition();  // read position.
+          helper_->ReadPosition();  // read position.
 
-          FunctionNodeHelper helper(builder_);
+          FunctionNodeHelper helper(helper_);
           helper.ReadUntilIncluding(FunctionNodeHelper::kEndPosition);
 
           has_function_literal_initializer_ = true;
           function_literal_start_ = helper.position_;
           function_literal_end_ = helper.end_position_;
         }
-        builder_->SkipExpression();  // read initializer.
+        helper_->SkipExpression();  // read initializer.
       }
       if (++next_read_ == field) return;
     case kEnd:
@@ -221,56 +221,56 @@
   // Ordered with fall-through.
   switch (next_read_) {
     case kStart: {
-      Tag tag = builder_->ReadTag();  // read tag.
+      Tag tag = helper_->ReadTag();  // read tag.
       ASSERT(tag == kProcedure);
       if (++next_read_ == field) return;
     }
     case kCanonicalName:
       canonical_name_ =
-          builder_->ReadCanonicalNameReference();  // read canonical_name.
+          helper_->ReadCanonicalNameReference();  // read canonical_name.
       if (++next_read_ == field) return;
     case kSourceUriIndex:
-      source_uri_index_ = builder_->ReadUInt();  // read source_uri_index.
-      builder_->current_script_id_ = source_uri_index_;
+      source_uri_index_ = helper_->ReadUInt();  // read source_uri_index.
+      helper_->set_current_script_id(source_uri_index_);
       if (++next_read_ == field) return;
     case kPosition:
-      position_ = builder_->ReadPosition(false);  // read position.
-      builder_->record_token_position(position_);
+      position_ = helper_->ReadPosition(false);  // read position.
+      helper_->RecordTokenPosition(position_);
       if (++next_read_ == field) return;
     case kEndPosition:
-      end_position_ = builder_->ReadPosition(false);  // read end position.
-      builder_->record_token_position(end_position_);
+      end_position_ = helper_->ReadPosition(false);  // read end position.
+      helper_->RecordTokenPosition(end_position_);
       if (++next_read_ == field) return;
     case kKind:
-      kind_ = static_cast<Kind>(builder_->ReadByte());
+      kind_ = static_cast<Kind>(helper_->ReadByte());
       if (++next_read_ == field) return;
     case kFlags:
-      flags_ = builder_->ReadFlags();
-      flags2_ = builder_->ReadFlags();
+      flags_ = helper_->ReadFlags();
+      flags2_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
     case kName:
-      builder_->SkipName();  // read name.
+      helper_->SkipName();  // read name.
       if (++next_read_ == field) return;
     case kAnnotations: {
-      annotation_count_ = builder_->ReadListLength();  // read list length.
+      annotation_count_ = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < annotation_count_; ++i) {
-        builder_->SkipExpression();  // read ith expression.
+        helper_->SkipExpression();  // read ith expression.
       }
       if (++next_read_ == field) return;
     }
     case kForwardingStubSuperTarget:
-      if (builder_->ReadTag() == kSomething) {
-        forwarding_stub_super_target_ = builder_->ReadCanonicalNameReference();
+      if (helper_->ReadTag() == kSomething) {
+        forwarding_stub_super_target_ = helper_->ReadCanonicalNameReference();
       }
       if (++next_read_ == field) return;
     case kForwardingStubInterfaceTarget:
-      if (builder_->ReadTag() == kSomething) {
-        builder_->ReadCanonicalNameReference();
+      if (helper_->ReadTag() == kSomething) {
+        helper_->ReadCanonicalNameReference();
       }
       if (++next_read_ == field) return;
     case kFunction:
-      if (builder_->ReadTag() == kSomething)
-        builder_->SkipFunctionNode();  // read function node.
+      if (helper_->ReadTag() == kSomething)
+        helper_->SkipFunctionNode();  // read function node.
       if (++next_read_ == field) return;
     case kEnd:
       return;
@@ -283,47 +283,47 @@
   // Ordered with fall-through.
   switch (next_read_) {
     case kStart: {
-      Tag tag = builder_->ReadTag();  // read tag.
+      Tag tag = helper_->ReadTag();  // read tag.
       ASSERT(tag == kConstructor);
       if (++next_read_ == field) return;
     }
     case kCanonicalName:
       canonical_name_ =
-          builder_->ReadCanonicalNameReference();  // read canonical_name.
+          helper_->ReadCanonicalNameReference();  // read canonical_name.
       if (++next_read_ == field) return;
     case kSourceUriIndex:
-      source_uri_index_ = builder_->ReadUInt();  // read source_uri_index.
-      builder_->current_script_id_ = source_uri_index_;
+      source_uri_index_ = helper_->ReadUInt();  // read source_uri_index.
+      helper_->set_current_script_id(source_uri_index_);
       if (++next_read_ == field) return;
     case kPosition:
-      position_ = builder_->ReadPosition();  // read position.
-      builder_->record_token_position(position_);
+      position_ = helper_->ReadPosition();  // read position.
+      helper_->RecordTokenPosition(position_);
       if (++next_read_ == field) return;
     case kEndPosition:
-      end_position_ = builder_->ReadPosition();  // read end position.
-      builder_->record_token_position(end_position_);
+      end_position_ = helper_->ReadPosition();  // read end position.
+      helper_->RecordTokenPosition(end_position_);
       if (++next_read_ == field) return;
     case kFlags:
-      flags_ = builder_->ReadFlags();
+      flags_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
     case kName:
-      builder_->SkipName();  // read name.
+      helper_->SkipName();  // read name.
       if (++next_read_ == field) return;
     case kAnnotations: {
-      annotation_count_ = builder_->ReadListLength();  // read list length.
+      annotation_count_ = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < annotation_count_; ++i) {
-        builder_->SkipExpression();  // read ith expression.
+        helper_->SkipExpression();  // read ith expression.
       }
       if (++next_read_ == field) return;
     }
     case kFunction:
-      builder_->SkipFunctionNode();  // read function.
+      helper_->SkipFunctionNode();  // read function.
       if (++next_read_ == field) return;
     case kInitializers: {
       intptr_t list_length =
-          builder_->ReadListLength();  // read initializers list length.
+          helper_->ReadListLength();  // read initializers list length.
       for (intptr_t i = 0; i < list_length; i++) {
-        builder_->SkipInitializer();
+        helper_->SkipInitializer();
       }
       if (++next_read_ == field) return;
     }
@@ -338,82 +338,82 @@
   // Ordered with fall-through.
   switch (next_read_) {
     case kStart: {
-      Tag tag = builder_->ReadTag();  // read tag.
+      Tag tag = helper_->ReadTag();  // read tag.
       ASSERT(tag == kClass);
       if (++next_read_ == field) return;
     }
     case kCanonicalName:
       canonical_name_ =
-          builder_->ReadCanonicalNameReference();  // read canonical_name.
+          helper_->ReadCanonicalNameReference();  // read canonical_name.
       if (++next_read_ == field) return;
     case kSourceUriIndex:
-      source_uri_index_ = builder_->ReadUInt();  // read source_uri_index.
-      builder_->current_script_id_ = source_uri_index_;
+      source_uri_index_ = helper_->ReadUInt();  // read source_uri_index.
+      helper_->set_current_script_id(source_uri_index_);
       if (++next_read_ == field) return;
     case kPosition:
-      position_ = builder_->ReadPosition(false);  // read position.
-      builder_->record_token_position(position_);
+      position_ = helper_->ReadPosition(false);  // read position.
+      helper_->RecordTokenPosition(position_);
       if (++next_read_ == field) return;
     case kEndPosition:
-      end_position_ = builder_->ReadPosition();  // read end position.
-      builder_->record_token_position(end_position_);
+      end_position_ = helper_->ReadPosition();  // read end position.
+      helper_->RecordTokenPosition(end_position_);
       if (++next_read_ == field) return;
     case kFlags:
-      flags_ = builder_->ReadFlags();  // read flags.
+      flags_ = helper_->ReadFlags();  // read flags.
       if (++next_read_ == field) return;
     case kNameIndex:
-      name_index_ = builder_->ReadStringReference();  // read name index.
+      name_index_ = helper_->ReadStringReference();  // read name index.
       if (++next_read_ == field) return;
     case kAnnotations: {
-      annotation_count_ = builder_->ReadListLength();  // read list length.
+      annotation_count_ = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < annotation_count_; ++i) {
-        builder_->SkipExpression();  // read ith expression.
+        helper_->SkipExpression();  // read ith expression.
       }
       if (++next_read_ == field) return;
     }
     case kTypeParameters:
-      builder_->SkipTypeParametersList();  // read type parameters.
+      helper_->SkipTypeParametersList();  // read type parameters.
       if (++next_read_ == field) return;
     case kSuperClass: {
-      Tag type_tag = builder_->ReadTag();  // read super class type (part 1).
+      Tag type_tag = helper_->ReadTag();  // read super class type (part 1).
       if (type_tag == kSomething) {
-        builder_->SkipDartType();  // read super class type (part 2).
+        helper_->SkipDartType();  // read super class type (part 2).
       }
       if (++next_read_ == field) return;
     }
     case kMixinType: {
-      Tag type_tag = builder_->ReadTag();  // read mixin type (part 1).
+      Tag type_tag = helper_->ReadTag();  // read mixin type (part 1).
       if (type_tag == kSomething) {
-        builder_->SkipDartType();  // read mixin type (part 2).
+        helper_->SkipDartType();  // read mixin type (part 2).
       }
       if (++next_read_ == field) return;
     }
     case kImplementedClasses:
-      builder_->SkipListOfDartTypes();  // read implemented_classes.
+      helper_->SkipListOfDartTypes();  // read implemented_classes.
       if (++next_read_ == field) return;
     case kFields: {
       intptr_t list_length =
-          builder_->ReadListLength();  // read fields list length.
+          helper_->ReadListLength();  // read fields list length.
       for (intptr_t i = 0; i < list_length; i++) {
-        FieldHelper field_helper(builder_);
+        FieldHelper field_helper(helper_);
         field_helper.ReadUntilExcluding(FieldHelper::kEnd);  // read field.
       }
       if (++next_read_ == field) return;
     }
     case kConstructors: {
       intptr_t list_length =
-          builder_->ReadListLength();  // read constructors list length.
+          helper_->ReadListLength();  // read constructors list length.
       for (intptr_t i = 0; i < list_length; i++) {
-        ConstructorHelper constructor_helper(builder_);
+        ConstructorHelper constructor_helper(helper_);
         constructor_helper.ReadUntilExcluding(
             ConstructorHelper::kEnd);  // read constructor.
       }
       if (++next_read_ == field) return;
     }
     case kProcedures: {
-      procedure_count_ = builder_->ReadListLength();  // read procedures #.
+      procedure_count_ = helper_->ReadListLength();  // read procedures #.
       for (intptr_t i = 0; i < procedure_count_; i++) {
-        ProcedureHelper procedure_helper(builder_);
+        ProcedureHelper procedure_helper(helper_);
         procedure_helper.ReadUntilExcluding(
             ProcedureHelper::kEnd);  // read procedure.
       }
@@ -422,10 +422,10 @@
     case kClassIndex:
       // Read class index.
       for (intptr_t i = 0; i < procedure_count_; ++i) {
-        builder_->reader_.ReadUInt32();
+        helper_->reader_.ReadUInt32();
       }
-      builder_->reader_.ReadUInt32();
-      builder_->reader_.ReadUInt32();
+      helper_->reader_.ReadUInt32();
+      helper_->reader_.ReadUInt32();
       if (++next_read_ == field) return;
     case kEnd:
       return;
@@ -438,71 +438,71 @@
   // Ordered with fall-through.
   switch (next_read_) {
     case kFlags: {
-      flags_ = builder_->ReadFlags();
+      flags_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
     }
     case kCanonicalName:
       canonical_name_ =
-          builder_->ReadCanonicalNameReference();  // read canonical_name.
+          helper_->ReadCanonicalNameReference();  // read canonical_name.
       if (++next_read_ == field) return;
     case kName:
-      name_index_ = builder_->ReadStringReference();  // read name index.
+      name_index_ = helper_->ReadStringReference();  // read name index.
       if (++next_read_ == field) return;
     case kSourceUriIndex:
-      source_uri_index_ = builder_->ReadUInt();  // read source_uri_index.
-      builder_->current_script_id_ = source_uri_index_;
+      source_uri_index_ = helper_->ReadUInt();  // read source_uri_index.
+      helper_->set_current_script_id(source_uri_index_);
       if (++next_read_ == field) return;
     case kAnnotations:
-      builder_->SkipListOfExpressions();  // read annotations.
+      helper_->SkipListOfExpressions();  // read annotations.
       if (++next_read_ == field) return;
     case kDependencies: {
-      intptr_t dependency_count = builder_->ReadUInt();  // read list length.
+      intptr_t dependency_count = helper_->ReadUInt();  // read list length.
       for (intptr_t i = 0; i < dependency_count; ++i) {
-        builder_->SkipLibraryDependency();
+        helper_->SkipLibraryDependency();
       }
       if (++next_read_ == field) return;
     }
     case kAdditionalExports: {
-      intptr_t name_count = builder_->ReadUInt();
+      intptr_t name_count = helper_->ReadUInt();
       for (intptr_t i = 0; i < name_count; ++i) {
-        builder_->SkipCanonicalNameReference();
+        helper_->SkipCanonicalNameReference();
       }
       if (++next_read_ == field) return;
     }
     case kParts: {
-      intptr_t part_count = builder_->ReadUInt();  // read list length.
+      intptr_t part_count = helper_->ReadUInt();  // read list length.
       for (intptr_t i = 0; i < part_count; ++i) {
-        builder_->SkipLibraryPart();
+        helper_->SkipLibraryPart();
       }
       if (++next_read_ == field) return;
     }
     case kTypedefs: {
-      intptr_t typedef_count = builder_->ReadListLength();  // read list length.
+      intptr_t typedef_count = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < typedef_count; i++) {
-        builder_->SkipLibraryTypedef();
+        helper_->SkipLibraryTypedef();
       }
       if (++next_read_ == field) return;
     }
     case kClasses: {
-      class_count_ = builder_->ReadListLength();  // read list length.
+      class_count_ = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < class_count_; ++i) {
-        ClassHelper class_helper(builder_);
+        ClassHelper class_helper(helper_);
         class_helper.ReadUntilExcluding(ClassHelper::kEnd);
       }
       if (++next_read_ == field) return;
     }
     case kToplevelField: {
-      intptr_t field_count = builder_->ReadListLength();  // read list length.
+      intptr_t field_count = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < field_count; ++i) {
-        FieldHelper field_helper(builder_);
+        FieldHelper field_helper(helper_);
         field_helper.ReadUntilExcluding(FieldHelper::kEnd);
       }
       if (++next_read_ == field) return;
     }
     case kToplevelProcedures: {
-      procedure_count_ = builder_->ReadListLength();  // read list length.
+      procedure_count_ = helper_->ReadListLength();  // read list length.
       for (intptr_t i = 0; i < procedure_count_; ++i) {
-        ProcedureHelper procedure_helper(builder_);
+        ProcedureHelper procedure_helper(helper_);
         procedure_helper.ReadUntilExcluding(ProcedureHelper::kEnd);
       }
       if (++next_read_ == field) return;
@@ -510,15 +510,15 @@
     case kLibraryIndex:
       // Read library index.
       for (intptr_t i = 0; i < class_count_; ++i) {
-        builder_->reader_.ReadUInt32();
+        helper_->reader_.ReadUInt32();
       }
-      builder_->reader_.ReadUInt32();
-      builder_->reader_.ReadUInt32();
+      helper_->reader_.ReadUInt32();
+      helper_->reader_.ReadUInt32();
       for (intptr_t i = 0; i < procedure_count_; ++i) {
-        builder_->reader_.ReadUInt32();
+        helper_->reader_.ReadUInt32();
       }
-      builder_->reader_.ReadUInt32();
-      builder_->reader_.ReadUInt32();
+      helper_->reader_.ReadUInt32();
+      helper_->reader_.ReadUInt32();
       if (++next_read_ == field) return;
     case kEnd:
       return;
@@ -531,32 +531,32 @@
   // Ordered with fall-through.
   switch (next_read_) {
     case kFileOffset: {
-      builder_->ReadPosition();
+      helper_->ReadPosition();
       if (++next_read_ == field) return;
     }
     case kFlags: {
-      flags_ = builder_->ReadFlags();
+      flags_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
     }
     case kAnnotations: {
-      builder_->SkipListOfExpressions();
+      helper_->SkipListOfExpressions();
       if (++next_read_ == field) return;
     }
     case kTargetLibrary: {
-      target_library_canonical_name_ = builder_->ReadCanonicalNameReference();
+      target_library_canonical_name_ = helper_->ReadCanonicalNameReference();
       if (++next_read_ == field) return;
     }
     case kName: {
-      name_index_ = builder_->ReadStringReference();
+      name_index_ = helper_->ReadStringReference();
       if (++next_read_ == field) return;
     }
     case kCombinators: {
-      intptr_t count = builder_->ReadListLength();
+      intptr_t count = helper_->ReadListLength();
       for (intptr_t i = 0; i < count; ++i) {
         // Skip flags
-        builder_->SkipBytes(1);
+        helper_->SkipBytes(1);
         // Skip list of names.
-        builder_->SkipListOfStrings();
+        helper_->SkipListOfStrings();
       }
       if (++next_read_ == field) return;
     }
@@ -894,7 +894,8 @@
   scope_->set_end_token_pos(function.end_token_pos());
 
   // Add function type arguments variable before current context variable.
-  if (I->reify_generic_functions() && function.IsGeneric()) {
+  if (I->reify_generic_functions() &&
+      (function.IsGeneric() || function.HasGenericParent())) {
     LocalVariable* type_args_var = MakeVariable(
         TokenPosition::kNoSource, TokenPosition::kNoSource,
         Symbols::FunctionTypeArgumentsVar(), AbstractType::dynamic_type());
@@ -3775,6 +3776,705 @@
   }
 }
 
+void KernelFingerprintHelper::BuildHash(uint32_t val) {
+  hash_ = CalculateHash(hash_, val);
+}
+
+void KernelFingerprintHelper::CalculateConstructorFingerprint() {
+  ConstructorHelper helper(this);
+
+  helper.ReadUntilExcluding(ConstructorHelper::kAnnotations);
+  CalculateListOfExpressionsFingerprint();
+  CalculateFunctionNodeFingerprint();
+  intptr_t len = ReadListLength();
+  for (intptr_t i = 0; i < len; ++i) {
+    CalculateInitializerFingerprint();
+  }
+  helper.SetJustRead(ConstructorHelper::kInitializers);
+  BuildHash(helper.flags_);
+  BuildHash(helper.annotation_count_);
+}
+
+void KernelFingerprintHelper::CalculateArgumentsFingerprint() {
+  BuildHash(ReadUInt());  // read argument count.
+
+  CalculateListOfDartTypesFingerprint();    // read list of types.
+  CalculateListOfExpressionsFingerprint();  // read positionals.
+
+  // List of named.
+  intptr_t list_length = ReadListLength();  // read list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    CalculateStringReferenceFingerprint();  // read ith name index.
+    CalculateExpressionFingerprint();       // read ith expression.
+  }
+}
+
+void KernelFingerprintHelper::CalculateVariableDeclarationFingerprint() {
+  VariableDeclarationHelper helper(this);
+
+  helper.ReadUntilExcluding(VariableDeclarationHelper::kAnnotations);
+  CalculateListOfExpressionsFingerprint();
+  helper.SetJustRead(VariableDeclarationHelper::kAnnotations);
+
+  helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
+  // We don't need to use the helper after this point.
+  CalculateDartTypeFingerprint();
+  if (ReadTag() == kSomething) {
+    CalculateExpressionFingerprint();
+  }
+
+  BuildHash(helper.flags_);
+}
+
+void KernelFingerprintHelper::CalculateStatementListFingerprint() {
+  intptr_t list_length = ReadListLength();  // read list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    CalculateStatementFingerprint();  // read ith expression.
+  }
+}
+
+void KernelFingerprintHelper::CalculateListOfExpressionsFingerprint() {
+  intptr_t list_length = ReadListLength();  // read list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    CalculateExpressionFingerprint();  // read ith expression.
+  }
+}
+
+void KernelFingerprintHelper::CalculateListOfDartTypesFingerprint() {
+  intptr_t list_length = ReadListLength();  // read list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    CalculateDartTypeFingerprint();  // read ith type.
+  }
+}
+
+void KernelFingerprintHelper::CalculateStringReferenceFingerprint() {
+  BuildHash(
+      H.DartString(ReadStringReference()).Hash());  // read ith string index.
+}
+
+void KernelFingerprintHelper::CalculateListOfStringsFingerprint() {
+  intptr_t list_length = ReadListLength();  // read list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    CalculateStringReferenceFingerprint();  // read ith string index.
+  }
+}
+
+void KernelFingerprintHelper::CalculateListOfVariableDeclarationsFingerprint() {
+  intptr_t list_length = ReadListLength();  // read list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    // read ith variable declaration.
+    CalculateVariableDeclarationFingerprint();
+  }
+}
+
+void KernelFingerprintHelper::CalculateTypeParameterFingerprint() {
+  TypeParameterHelper helper(this);
+
+  helper.ReadUntilExcluding(TypeParameterHelper::kAnnotations);
+  CalculateListOfExpressionsFingerprint();
+  helper.SetJustRead(TypeParameterHelper::kAnnotations);
+
+  helper.ReadUntilExcluding(TypeParameterHelper::kBound);
+  // The helper isn't needed after this point.
+  CalculateDartTypeFingerprint();
+  if (ReadTag() == kSomething) {
+    CalculateDartTypeFingerprint();
+  }
+  BuildHash(helper.flags_);
+}
+
+void KernelFingerprintHelper::CalculateTypeParametersListFingerprint() {
+  intptr_t list_length = ReadListLength();  // read list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    CalculateTypeParameterFingerprint();
+  }
+}
+
+void KernelFingerprintHelper::CalculateCanonicalNameFingerprint() {
+  const StringIndex i = H.CanonicalNameString(ReadCanonicalNameReference());
+  BuildHash(H.DartString(i).Hash());
+}
+
+void KernelFingerprintHelper::CalculateInitializerFingerprint() {
+  Tag tag = ReadTag();
+  ReadByte();  // read isSynthetic flag.
+  switch (tag) {
+    case kInvalidInitializer:
+      return;
+    case kFieldInitializer:
+      BuildHash(H.DartFieldName(ReadCanonicalNameReference()).Hash());
+      CalculateExpressionFingerprint();  // read value.
+      return;
+    case kSuperInitializer:
+      CalculateCanonicalNameFingerprint();  // read target_reference
+      CalculateArgumentsFingerprint();      // read arguments.
+      return;
+    case kRedirectingInitializer:
+      CalculateCanonicalNameFingerprint();  // read target_reference
+      CalculateArgumentsFingerprint();      // read arguments.
+      return;
+    case kLocalInitializer:
+      CalculateVariableDeclarationFingerprint();  // read variable.
+      return;
+    case kAssertInitializer:
+      CalculateStatementFingerprint();
+      return;
+    default:
+      ReportUnexpectedTag("initializer", tag);
+      UNREACHABLE();
+  }
+}
+
+void KernelFingerprintHelper::CalculateDartTypeFingerprint() {
+  Tag tag = ReadTag();
+  BuildHash(tag);
+  switch (tag) {
+    case kInvalidType:
+    case kDynamicType:
+    case kVoidType:
+    case kBottomType:
+    case kVectorType:
+      // those contain nothing.
+      break;
+    case kInterfaceType:
+      CalculateInterfaceTypeFingerprint(false);
+      break;
+    case kSimpleInterfaceType:
+      CalculateInterfaceTypeFingerprint(true);
+      break;
+    case kFunctionType:
+      CalculateFunctionTypeFingerprint(false);
+      break;
+    case kSimpleFunctionType:
+      CalculateFunctionTypeFingerprint(true);
+      break;
+    case kTypeParameterType:
+      ReadUInt();                              // read index for parameter.
+      CalculateOptionalDartTypeFingerprint();  // read bound bound.
+      break;
+    default:
+      ReportUnexpectedTag("type", tag);
+      UNREACHABLE();
+  }
+}
+
+void KernelFingerprintHelper::CalculateOptionalDartTypeFingerprint() {
+  Tag tag = ReadTag();  // read tag.
+  BuildHash(tag);
+  if (tag == kNothing) {
+    return;
+  }
+  ASSERT(tag == kSomething);
+  CalculateDartTypeFingerprint();  // read type.
+}
+
+void KernelFingerprintHelper::CalculateInterfaceTypeFingerprint(bool simple) {
+  BuildHash(ReadUInt());  // read klass_name.
+  if (!simple) {
+    CalculateListOfDartTypesFingerprint();  // read list of types.
+  }
+}
+
+void KernelFingerprintHelper::CalculateFunctionTypeFingerprint(bool simple) {
+  if (!simple) {
+    CalculateTypeParametersListFingerprint();  // read type_parameters.
+    BuildHash(ReadUInt());                     // read required parameter count.
+    BuildHash(ReadUInt());                     // read total parameter count.
+  }
+
+  CalculateListOfDartTypesFingerprint();  // read positional_parameters types.
+
+  if (!simple) {
+    const intptr_t named_count =
+        ReadListLength();  // read named_parameters list length.
+    BuildHash(named_count);
+    for (intptr_t i = 0; i < named_count; ++i) {
+      // read string reference (i.e. named_parameters[i].name).
+      CalculateStringReferenceFingerprint();
+      CalculateDartTypeFingerprint();  // read named_parameters[i].type.
+    }
+  }
+
+  CalculateListOfStringsFingerprint();  // read positional parameter names.
+
+  if (!simple) {
+    // TODO(bkonyi): include in hash.
+    SkipCanonicalNameReference();  // read typedef reference.
+  }
+
+  CalculateDartTypeFingerprint();  // read return type.
+}
+
+void KernelFingerprintHelper::CalculateGetterNameFingerprint() {
+  const NameIndex name = ReadCanonicalNameReference();
+  if (I->strong() && !H.IsRoot(name) && (H.IsGetter(name) || H.IsField(name))) {
+    BuildHash(H.DartGetterName(name).Hash());
+  }
+}
+
+void KernelFingerprintHelper::CalculateSetterNameFingerprint() {
+  const NameIndex name = ReadCanonicalNameReference();
+  if (I->strong() && !H.IsRoot(name)) {
+    BuildHash(H.DartSetterName(name).Hash());
+  }
+}
+
+void KernelFingerprintHelper::CalculateMethodNameFingerprint() {
+  const NameIndex name =
+      ReadCanonicalNameReference();  // read interface_target_reference.
+  if (I->strong() && !H.IsRoot(name) && !H.IsField(name)) {
+    BuildHash(H.DartProcedureName(name).Hash());
+  }
+}
+
+void KernelFingerprintHelper::CalculateExpressionFingerprint() {
+  uint8_t payload = 0;
+  Tag tag = ReadTag(&payload);
+  BuildHash(tag);
+  switch (tag) {
+    case kInvalidExpression:
+      ReadPosition();
+      CalculateStringReferenceFingerprint();
+      return;
+    case kVariableGet:
+      ReadPosition();                          // read position.
+      ReadUInt();                              // read kernel position.
+      ReadUInt();                              // read relative variable index.
+      CalculateOptionalDartTypeFingerprint();  // read promoted type.
+      return;
+    case kSpecializedVariableGet:
+      ReadPosition();  // read position.
+      ReadUInt();      // read kernel position.
+      return;
+    case kVariableSet:
+      ReadPosition();                    // read position.
+      ReadUInt();                        // read kernel position.
+      ReadUInt();                        // read relative variable index.
+      CalculateExpressionFingerprint();  // read expression.
+      return;
+    case kSpecializedVariableSet:
+      ReadPosition();                    // read position.
+      ReadUInt();                        // read kernel position.
+      CalculateExpressionFingerprint();  // read expression.
+      return;
+    case kPropertyGet:
+      ReadPosition();                            // read position.
+      CalculateExpressionFingerprint();          // read receiver.
+      BuildHash(ReadNameAsGetterName().Hash());  // read name.
+      CalculateGetterNameFingerprint();  // read interface_target_reference.
+      return;
+    case kPropertySet:
+      ReadPosition();                            // read position.
+      CalculateExpressionFingerprint();          // read receiver.
+      BuildHash(ReadNameAsSetterName().Hash());  // read name.
+      CalculateExpressionFingerprint();          // read value.
+      CalculateSetterNameFingerprint();  // read interface_target_reference.
+      return;
+    case kSuperPropertyGet:
+      ReadPosition();                            // read position.
+      BuildHash(ReadNameAsGetterName().Hash());  // read name.
+      CalculateGetterNameFingerprint();  // read interface_target_reference.
+      return;
+    case kSuperPropertySet:
+      ReadPosition();                            // read position.
+      BuildHash(ReadNameAsSetterName().Hash());  // read name.
+      CalculateExpressionFingerprint();          // read value.
+      CalculateSetterNameFingerprint();  // read interface_target_reference.
+      return;
+    case kDirectPropertyGet:
+      ReadPosition();                       // read position.
+      CalculateExpressionFingerprint();     // read receiver.
+      CalculateCanonicalNameFingerprint();  // read target_reference.
+      return;
+    case kDirectPropertySet:
+      ReadPosition();                       // read position.
+      CalculateExpressionFingerprint();     // read receiver.
+      CalculateCanonicalNameFingerprint();  // read target_reference.
+      CalculateExpressionFingerprint();     // read value·
+      return;
+    case kStaticGet:
+      ReadPosition();                       // read position.
+      CalculateCanonicalNameFingerprint();  // read target_reference.
+      return;
+    case kStaticSet:
+      ReadPosition();                       // read position.
+      CalculateCanonicalNameFingerprint();  // read target_reference.
+      CalculateExpressionFingerprint();     // read expression.
+      return;
+    case kMethodInvocation:
+      ReadPosition();                            // read position.
+      CalculateExpressionFingerprint();          // read receiver.
+      BuildHash(ReadNameAsMethodName().Hash());  // read name.
+      CalculateArgumentsFingerprint();           // read arguments.
+      CalculateMethodNameFingerprint();  // read interface_target_reference.
+      return;
+    case kSuperMethodInvocation:
+      ReadPosition();                            // read position.
+      BuildHash(ReadNameAsMethodName().Hash());  // read name.
+      CalculateArgumentsFingerprint();           // read arguments.
+      CalculateCanonicalNameFingerprint();       // read target_reference.
+      return;
+    case kDirectMethodInvocation:
+      ReadPosition();                       // read position.
+      CalculateExpressionFingerprint();     // read receiver.
+      CalculateCanonicalNameFingerprint();  // read target_reference.
+      CalculateArgumentsFingerprint();      // read arguments.
+      return;
+    case kStaticInvocation:
+    case kConstStaticInvocation:
+      ReadPosition();                       // read position.
+      CalculateCanonicalNameFingerprint();  // read target_reference.
+      CalculateArgumentsFingerprint();      // read arguments.
+      return;
+    case kConstructorInvocation:
+    case kConstConstructorInvocation:
+      ReadPosition();                       // read position.
+      CalculateCanonicalNameFingerprint();  // read target_reference.
+      CalculateArgumentsFingerprint();      // read arguments.
+      return;
+    case kNot:
+      CalculateExpressionFingerprint();  // read expression.
+      return;
+    case kLogicalExpression:
+      CalculateExpressionFingerprint();  // read left.
+      SkipBytes(1);                      // read operator.
+      CalculateExpressionFingerprint();  // read right.
+      return;
+    case kConditionalExpression:
+      CalculateExpressionFingerprint();        // read condition.
+      CalculateExpressionFingerprint();        // read then.
+      CalculateExpressionFingerprint();        // read otherwise.
+      CalculateOptionalDartTypeFingerprint();  // read unused static type.
+      return;
+    case kStringConcatenation:
+      ReadPosition();                           // read position.
+      CalculateListOfExpressionsFingerprint();  // read list of expressions.
+      return;
+    case kIsExpression:
+      ReadPosition();                    // read position.
+      CalculateExpressionFingerprint();  // read operand.
+      CalculateDartTypeFingerprint();    // read type.
+      return;
+    case kAsExpression:
+      ReadPosition();                    // read position.
+      BuildHash(ReadFlags());            // read flags.
+      CalculateExpressionFingerprint();  // read operand.
+      CalculateDartTypeFingerprint();    // read type.
+      return;
+    case kSymbolLiteral:
+      CalculateStringReferenceFingerprint();  // read index into string table.
+      return;
+    case kTypeLiteral:
+      CalculateDartTypeFingerprint();  // read type.
+      return;
+    case kThisExpression:
+      return;
+    case kRethrow:
+      ReadPosition();  // read position.
+      return;
+    case kThrow:
+      ReadPosition();                    // read position.
+      CalculateExpressionFingerprint();  // read expression.
+      return;
+    case kListLiteral:
+    case kConstListLiteral:
+      ReadPosition();                           // read position.
+      CalculateDartTypeFingerprint();           // read type.
+      CalculateListOfExpressionsFingerprint();  // read list of expressions.
+      return;
+    case kMapLiteral:
+    case kConstMapLiteral: {
+      ReadPosition();                           // read position.
+      CalculateDartTypeFingerprint();           // read type.
+      CalculateDartTypeFingerprint();           // read value type.
+      intptr_t list_length = ReadListLength();  // read list length.
+      for (intptr_t i = 0; i < list_length; ++i) {
+        CalculateExpressionFingerprint();  // read ith key.
+        CalculateExpressionFingerprint();  // read ith value.
+      }
+      return;
+    }
+    case kFunctionExpression:
+      ReadPosition();                      // read position.
+      CalculateFunctionNodeFingerprint();  // read function node.
+      return;
+    case kLet:
+      CalculateVariableDeclarationFingerprint();  // read variable declaration.
+      CalculateExpressionFingerprint();           // read expression.
+      return;
+    case kInstantiation:
+      CalculateExpressionFingerprint();       // read expression.
+      CalculateListOfDartTypesFingerprint();  // read type arguments.
+      return;
+    case kVectorCreation:
+      BuildHash(ReadUInt());  // read value.
+      return;
+    case kVectorGet:
+      CalculateExpressionFingerprint();  // read vector expression.
+      BuildHash(ReadUInt());             // read index.
+      return;
+    case kVectorSet:
+      CalculateExpressionFingerprint();  // read vector expression.
+      BuildHash(ReadUInt());             // read index.
+      CalculateExpressionFingerprint();  // read value.
+      return;
+    case kVectorCopy:
+      CalculateExpressionFingerprint();  // read vector expression.
+      return;
+    case kClosureCreation:
+      // read top-level function reference.
+      CalculateCanonicalNameFingerprint();
+      CalculateExpressionFingerprint();       // read context vector.
+      CalculateDartTypeFingerprint();         // read function type.
+      CalculateListOfDartTypesFingerprint();  // read type arguments.
+      return;
+    case kBigIntLiteral:
+      CalculateStringReferenceFingerprint();  // read string reference.
+      return;
+    case kStringLiteral:
+      CalculateStringReferenceFingerprint();  // read string reference.
+      return;
+    case kSpecializedIntLiteral:
+      return;
+    case kNegativeIntLiteral:
+      BuildHash(ReadUInt());  // read value.
+      return;
+    case kPositiveIntLiteral:
+      BuildHash(ReadUInt());  // read value.
+      return;
+    case kDoubleLiteral:
+      CalculateStringReferenceFingerprint();  // read index into string table.
+      return;
+    case kTrueLiteral:
+      return;
+    case kFalseLiteral:
+      return;
+    case kNullLiteral:
+      return;
+    case kConstantExpression:
+      SkipConstantReference();
+      return;
+    case kLoadLibrary:
+    case kCheckLibraryIsLoaded:
+      ReadUInt();  // skip library index
+      return;
+    default:
+      ReportUnexpectedTag("expression", tag);
+      UNREACHABLE();
+  }
+}
+
+void KernelFingerprintHelper::CalculateStatementFingerprint() {
+  Tag tag = ReadTag();  // read tag.
+  BuildHash(tag);
+  switch (tag) {
+    case kExpressionStatement:
+      CalculateExpressionFingerprint();  // read expression.
+      return;
+    case kBlock:
+      CalculateStatementListFingerprint();
+      return;
+    case kEmptyStatement:
+      return;
+    case kAssertBlock:
+      CalculateStatementListFingerprint();
+      return;
+    case kAssertStatement:
+      CalculateExpressionFingerprint();  // Read condition.
+      ReadPosition();                    // read condition start offset.
+      ReadPosition();                    // read condition end offset.
+      if (ReadTag() == kSomething) {
+        CalculateExpressionFingerprint();  // read (rest of) message.
+      }
+      return;
+    case kLabeledStatement:
+      CalculateStatementFingerprint();  // read body.
+      return;
+    case kBreakStatement:
+      ReadPosition();  // read position.
+      ReadUInt();      // read target_index.
+      return;
+    case kWhileStatement:
+      ReadPosition();                    // read position.
+      CalculateExpressionFingerprint();  // read condition.
+      CalculateStatementFingerprint();   // read body.
+      return;
+    case kDoStatement:
+      ReadPosition();                    // read position.
+      CalculateStatementFingerprint();   // read body.
+      CalculateExpressionFingerprint();  // read condition.
+      return;
+    case kForStatement: {
+      ReadPosition();                                    // read position.
+      CalculateListOfVariableDeclarationsFingerprint();  // read variables.
+      Tag tag = ReadTag();  // Read first part of condition.
+      if (tag == kSomething) {
+        CalculateExpressionFingerprint();  // read rest of condition.
+      }
+      CalculateListOfExpressionsFingerprint();  // read updates.
+      CalculateStatementFingerprint();          // read body.
+      return;
+    }
+    case kForInStatement:
+    case kAsyncForInStatement:
+      ReadPosition();                             // read position.
+      ReadPosition();                             // read body position.
+      CalculateVariableDeclarationFingerprint();  // read variable.
+      CalculateExpressionFingerprint();           // read iterable.
+      CalculateStatementFingerprint();            // read body.
+      return;
+    case kSwitchStatement: {
+      ReadPosition();                     // read position.
+      CalculateExpressionFingerprint();   // read condition.
+      int case_count = ReadListLength();  // read number of cases.
+      for (intptr_t i = 0; i < case_count; ++i) {
+        int expression_count = ReadListLength();  // read number of expressions.
+        for (intptr_t j = 0; j < expression_count; ++j) {
+          ReadPosition();                    // read jth position.
+          CalculateExpressionFingerprint();  // read jth expression.
+        }
+        BuildHash(ReadBool());            // read is_default.
+        CalculateStatementFingerprint();  // read body.
+      }
+      return;
+    }
+    case kContinueSwitchStatement:
+      ReadPosition();  // read position.
+      ReadUInt();      // read target_index.
+      return;
+    case kIfStatement:
+      ReadPosition();                    // read position.
+      CalculateExpressionFingerprint();  // read condition.
+      CalculateStatementFingerprint();   // read then.
+      CalculateStatementFingerprint();   // read otherwise.
+      return;
+    case kReturnStatement: {
+      ReadPosition();       // read position
+      Tag tag = ReadTag();  // read (first part of) expression.
+      BuildHash(tag);
+      if (tag == kSomething) {
+        CalculateExpressionFingerprint();  // read (rest of) expression.
+      }
+      return;
+    }
+    case kTryCatch: {
+      CalculateStatementFingerprint();  // read body.
+      BuildHash(ReadBool());            // read any_catch_needs_stack_trace.
+      intptr_t catch_count = ReadListLength();  // read number of catches.
+      for (intptr_t i = 0; i < catch_count; ++i) {
+        ReadPosition();                  // read position.
+        CalculateDartTypeFingerprint();  // read guard.
+        tag = ReadTag();                 // read first part of exception.
+        BuildHash(tag);
+        if (tag == kSomething) {
+          CalculateVariableDeclarationFingerprint();  // read exception.
+        }
+        tag = ReadTag();  // read first part of stack trace.
+        BuildHash(tag);
+        if (tag == kSomething) {
+          CalculateVariableDeclarationFingerprint();  // read stack trace.
+        }
+        CalculateStatementFingerprint();  // read body.
+      }
+      return;
+    }
+    case kTryFinally:
+      CalculateStatementFingerprint();  // read body.
+      CalculateStatementFingerprint();  // read finalizer.
+      return;
+    case kYieldStatement: {
+      ReadPosition();                    // read position.
+      BuildHash(ReadByte());             // read flags.
+      CalculateExpressionFingerprint();  // read expression.
+      return;
+    }
+    case kVariableDeclaration:
+      CalculateVariableDeclarationFingerprint();  // read variable declaration.
+      return;
+    case kFunctionDeclaration:
+      ReadPosition();                             // read position.
+      CalculateVariableDeclarationFingerprint();  // read variable.
+      CalculateFunctionNodeFingerprint();         // read function node.
+      return;
+    default:
+      ReportUnexpectedTag("statement", tag);
+      UNREACHABLE();
+  }
+}
+
+uint32_t KernelFingerprintHelper::CalculateFieldFingerprint() {
+  hash_ = 0;
+  FieldHelper field_helper(this);
+
+  field_helper.ReadUntilExcluding(FieldHelper::kName);
+  const String& name = ReadNameAsFieldName();  // read name.
+  field_helper.SetJustRead(FieldHelper::kName);
+
+  field_helper.ReadUntilExcluding(FieldHelper::kType);
+  CalculateDartTypeFingerprint();  // read type.
+  field_helper.SetJustRead(FieldHelper::kType);
+
+  if (ReadTag() == kSomething) {
+    if (PeekTag() == kFunctionExpression) {
+      AlternativeReadingScope alt(&reader_);
+      CalculateExpressionFingerprint();
+    }
+    SkipExpression();
+  }
+
+  BuildHash(name.Hash());
+  BuildHash((field_helper.flags_ << 8) | field_helper.secondary_flags_);
+  BuildHash(field_helper.annotation_count_);
+  return hash_;
+}
+
+void KernelFingerprintHelper::CalculateFunctionNodeFingerprint() {
+  FunctionNodeHelper function_node_helper(this);
+
+  function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kTypeParameters);
+  CalculateTypeParametersListFingerprint();
+  function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
+
+  function_node_helper.ReadUntilExcluding(
+      FunctionNodeHelper::kPositionalParameters);
+  CalculateListOfVariableDeclarationsFingerprint();  // read positionals
+  CalculateListOfVariableDeclarationsFingerprint();  // read named
+  CalculateDartTypeFingerprint();                    // read return type.
+
+  if (ReadTag() == kSomething) {
+    CalculateStatementFingerprint();  // Read body.
+  }
+  BuildHash(function_node_helper.total_parameter_count_);
+  BuildHash(function_node_helper.required_parameter_count_);
+}
+
+uint32_t KernelFingerprintHelper::CalculateFunctionFingerprint() {
+  hash_ = 0;
+  Tag tag = PeekTag();
+  if (tag == kField) {
+    return CalculateFieldFingerprint();
+  } else if (tag == kConstructor) {
+    CalculateConstructorFingerprint();
+    return hash_;
+  }
+  ProcedureHelper procedure_helper(this);
+  procedure_helper.ReadUntilExcluding(ProcedureHelper::kName);
+  const String& name = ReadNameAsMethodName();  // Read name.
+  procedure_helper.SetJustRead(ProcedureHelper::kName);
+
+  procedure_helper.ReadUntilExcluding(ProcedureHelper::kFunction);
+  if (ReadTag() == kSomething) {
+    CalculateFunctionNodeFingerprint();
+  }
+
+  BuildHash(procedure_helper.kind_);
+  BuildHash(procedure_helper.flags_);
+  BuildHash(procedure_helper.flags2_);
+  BuildHash(procedure_helper.annotation_count_);
+  BuildHash(name.Hash());
+  return hash_;
+}
+
 void StreamingFlowGraphBuilder::ReadUntilFunctionNode(
     ParsedFunction* parsed_function) {
   const Tag tag = PeekTag();
@@ -4229,63 +4929,10 @@
   body +=
       flow_graph_builder_->CheckStackOverflowInPrologue(function.token_pos());
 
-  // Forwarding the type parameters is complicated by our approach to
-  // implementing the partial tearoff instantiation.
-  //
-  // When a tearoff is partially applied to a set of type arguments, the type
-  // arguments are saved in the closure's "function_type_arguments" field. The
-  // partial type application operator is guaranteed to provide arguments for
-  // all of a generic tearoff's type parameters, so we will only have to forward
-  // type arguments from the caller or from the closure object. In other words,
-  // if there are type arguments saved on the tearoff, we must throw
-  // NoSuchMethod.
   intptr_t type_args_len = 0;
   if (I->reify_generic_functions() && function.IsGeneric()) {
+    type_args_len = function.NumTypeParameters();
     ASSERT(parsed_function()->function_type_arguments() != NULL);
-    type_args_len = target.NumTypeParameters();
-
-    Fragment copy_type_args;
-
-    LocalVariable* closure =
-        parsed_function()->node_sequence()->scope()->VariableAt(0);
-    copy_type_args += LoadLocal(closure);
-    copy_type_args += LoadField(Closure::function_type_arguments_offset());
-
-    TargetEntryInstr *is_instantiated, *is_not_instantiated;
-    copy_type_args +=
-        BranchIfNull(&is_not_instantiated, &is_instantiated, /*negate=*/false);
-    JoinEntryInstr* join = BuildJoinEntry();
-
-    // We found type arguments saved on the tearoff to be provided to the
-    // function.
-
-    Fragment copy_instantiated_args(is_instantiated);
-
-    copy_instantiated_args +=
-        LoadLocal(parsed_function()->function_type_arguments());
-
-    TargetEntryInstr *no_type_args, *passed_type_args;
-    copy_instantiated_args +=
-        BranchIfNull(&no_type_args, &passed_type_args, /*negate=*/false);
-
-    Fragment use_instantiated_args(no_type_args);
-    use_instantiated_args += LoadLocal(closure);
-    use_instantiated_args +=
-        LoadField(Closure::function_type_arguments_offset());
-    use_instantiated_args += StoreLocal(
-        TokenPosition::kNoSource, parsed_function()->function_type_arguments());
-    use_instantiated_args += Drop();
-    use_instantiated_args += Goto(join);
-
-    Fragment goto_nsm(passed_type_args);
-    goto_nsm += Goto(flow_graph_builder_->BuildThrowNoSuchMethod());
-
-    // The tearoff was not partially applied, so we forward type arguments from
-    // the caller.
-    Fragment forward_caller_args(is_not_instantiated);
-    forward_caller_args += Goto(join);
-
-    body += Fragment(copy_type_args.entry, join);
     body += LoadLocal(parsed_function()->function_type_arguments());
     body += PushArgument();
   }
@@ -4766,55 +5413,58 @@
 
   Fragment body;
 
-  if (dart_function.IsConvertedClosureFunction()) {
-    LocalVariable* closure = new (Z) LocalVariable(
+  LocalVariable* closure = NULL;
+  if (dart_function.IsClosureFunction()) {
+    closure = parsed_function()->node_sequence()->scope()->VariableAt(0);
+  } else if (dart_function.IsConvertedClosureFunction()) {
+    closure = new (Z) LocalVariable(
         TokenPosition::kNoSource, TokenPosition::kNoSource,
         Symbols::TempParam(), AbstractType::ZoneHandle(Z, Type::DynamicType()));
     closure->set_index(parsed_function()->first_parameter_index());
     closure->set_is_captured_parameter(true);
+  }
+
+  if ((dart_function.IsClosureFunction() ||
+       dart_function.IsConvertedClosureFunction()) &&
+      dart_function.NumParentTypeParameters() > 0 &&
+      I->reify_generic_functions()) {
+    LocalVariable* fn_type_args = parsed_function()->function_type_arguments();
+    ASSERT(fn_type_args != NULL && closure != NULL);
+
+    if (dart_function.IsGeneric()) {
+      body += LoadLocal(fn_type_args);
+      body += PushArgument();
+      body += LoadLocal(closure);
+      body += LoadField(Closure::function_type_arguments_offset());
+      body += PushArgument();
+      body += IntConstant(dart_function.NumTypeParameters() +
+                          dart_function.NumParentTypeParameters());
+      body += PushArgument();
+
+      const Library& dart_internal =
+          Library::Handle(Z, Library::InternalLibrary());
+      const Function& prepend_function =
+          Function::ZoneHandle(Z, dart_internal.LookupFunctionAllowPrivate(
+                                      Symbols::PrependTypeArguments()));
+      ASSERT(!prepend_function.IsNull());
+
+      body += StaticCall(TokenPosition::kNoSource, prepend_function, 3,
+                         ICData::kStatic);
+      body += StoreLocal(TokenPosition::kNoSource, fn_type_args);
+      body += Drop();
+    } else {
+      body += LoadLocal(closure);
+      body += LoadField(Closure::function_type_arguments_offset());
+      body += StoreLocal(TokenPosition::kNoSource, fn_type_args);
+      body += Drop();
+    }
+  }
+
+  if (dart_function.IsConvertedClosureFunction()) {
     body += LoadLocal(closure);
     body += LoadField(Closure::context_offset());
     LocalVariable* context = closure;
     body += StoreLocal(TokenPosition::kNoSource, context);
-
-    // TODO(30455): Kernel generic methods undone. When generic closures are
-    // supported, the type arguments passed by the caller will actually need to
-    // be used here.
-    if (dart_function.IsGeneric() && I->reify_generic_functions()) {
-      LocalVariable* type_args_slot =
-          parsed_function()->function_type_arguments();
-      ASSERT(type_args_slot != NULL);
-      body += LoadField(Context::variable_offset(0));
-      body += StoreLocal(TokenPosition::kNoSource, type_args_slot);
-    }
-    body += Drop();
-  } else if (dart_function.IsClosureFunction() && dart_function.IsGeneric() &&
-             dart_function.NumParentTypeParameters() > 0 &&
-             I->reify_generic_functions()) {
-    LocalVariable* closure =
-        parsed_function()->node_sequence()->scope()->VariableAt(0);
-    LocalVariable* fn_type_args = parsed_function()->function_type_arguments();
-    ASSERT(fn_type_args != NULL && closure != NULL);
-
-    body += LoadLocal(fn_type_args);
-    body += PushArgument();
-    body += LoadLocal(closure);
-    body += LoadField(Closure::function_type_arguments_offset());
-    body += PushArgument();
-    body += IntConstant(dart_function.NumTypeParameters() +
-                        dart_function.NumParentTypeParameters());
-    body += PushArgument();
-
-    const Library& dart_internal =
-        Library::Handle(Z, Library::InternalLibrary());
-    const Function& prepend_function =
-        Function::ZoneHandle(Z, dart_internal.LookupFunctionAllowPrivate(
-                                    Symbols::PrependTypeArguments()));
-    ASSERT(!prepend_function.IsNull());
-
-    body += StaticCall(TokenPosition::kNoSource, prepend_function, 3,
-                       ICData::kStatic);
-    body += StoreLocal(TokenPosition::kNoSource, fn_type_args);
     body += Drop();
   }
 
@@ -5344,57 +5994,57 @@
   return Fragment();
 }
 
-intptr_t StreamingFlowGraphBuilder::ReaderOffset() {
+intptr_t KernelReaderHelper::ReaderOffset() const {
   return reader_.offset();
 }
 
-void StreamingFlowGraphBuilder::SetOffset(intptr_t offset) {
+void KernelReaderHelper::SetOffset(intptr_t offset) {
   reader_.set_offset(offset);
 }
 
-void StreamingFlowGraphBuilder::SkipBytes(intptr_t bytes) {
+void KernelReaderHelper::SkipBytes(intptr_t bytes) {
   reader_.set_offset(ReaderOffset() + bytes);
 }
 
-bool StreamingFlowGraphBuilder::ReadBool() {
+bool KernelReaderHelper::ReadBool() {
   return reader_.ReadBool();
 }
 
-uint8_t StreamingFlowGraphBuilder::ReadByte() {
+uint8_t KernelReaderHelper::ReadByte() {
   return reader_.ReadByte();
 }
 
-uint32_t StreamingFlowGraphBuilder::ReadUInt() {
+uint32_t KernelReaderHelper::ReadUInt() {
   return reader_.ReadUInt();
 }
 
-uint32_t StreamingFlowGraphBuilder::ReadUInt32() {
+uint32_t KernelReaderHelper::ReadUInt32() {
   return reader_.ReadUInt32();
 }
 
-uint32_t StreamingFlowGraphBuilder::PeekUInt() {
+uint32_t KernelReaderHelper::PeekUInt() {
   AlternativeReadingScope alt(&reader_);
   return reader_.ReadUInt();
 }
 
-uint32_t StreamingFlowGraphBuilder::PeekListLength() {
+uint32_t KernelReaderHelper::PeekListLength() {
   AlternativeReadingScope alt(&reader_);
   return reader_.ReadListLength();
 }
 
-intptr_t StreamingFlowGraphBuilder::ReadListLength() {
+intptr_t KernelReaderHelper::ReadListLength() {
   return reader_.ReadListLength();
 }
 
-StringIndex StreamingFlowGraphBuilder::ReadStringReference() {
+StringIndex KernelReaderHelper::ReadStringReference() {
   return StringIndex(ReadUInt());
 }
 
-NameIndex StreamingFlowGraphBuilder::ReadCanonicalNameReference() {
+NameIndex KernelReaderHelper::ReadCanonicalNameReference() {
   return reader_.ReadCanonicalNameReference();
 }
 
-StringIndex StreamingFlowGraphBuilder::ReadNameAsStringIndex() {
+StringIndex KernelReaderHelper::ReadNameAsStringIndex() {
   StringIndex name_index = ReadStringReference();  // read name index.
   if ((H.StringSize(name_index) >= 1) && H.CharacterAt(name_index, 0) == '_') {
     ReadUInt();  // read library index.
@@ -5402,7 +6052,7 @@
   return name_index;
 }
 
-const String& StreamingFlowGraphBuilder::ReadNameAsMethodName() {
+const String& KernelReaderHelper::ReadNameAsMethodName() {
   StringIndex name_index = ReadStringReference();  // read name index.
   if ((H.StringSize(name_index) >= 1) && H.CharacterAt(name_index, 0) == '_') {
     NameIndex library_reference =
@@ -5413,7 +6063,7 @@
   }
 }
 
-const String& StreamingFlowGraphBuilder::ReadNameAsSetterName() {
+const String& KernelReaderHelper::ReadNameAsSetterName() {
   StringIndex name_index = ReadStringReference();  // read name index.
   if ((H.StringSize(name_index) >= 1) && H.CharacterAt(name_index, 0) == '_') {
     NameIndex library_reference =
@@ -5424,7 +6074,7 @@
   }
 }
 
-const String& StreamingFlowGraphBuilder::ReadNameAsGetterName() {
+const String& KernelReaderHelper::ReadNameAsGetterName() {
   StringIndex name_index = ReadStringReference();  // read name index.
   if ((H.StringSize(name_index) >= 1) && H.CharacterAt(name_index, 0) == '_') {
     NameIndex library_reference =
@@ -5435,7 +6085,7 @@
   }
 }
 
-const String& StreamingFlowGraphBuilder::ReadNameAsFieldName() {
+const String& KernelReaderHelper::ReadNameAsFieldName() {
   StringIndex name_index = ReadStringReference();  // read name index.
   if ((H.StringSize(name_index) >= 1) && H.CharacterAt(name_index, 0) == '_') {
     NameIndex library_reference =
@@ -5446,34 +6096,41 @@
   }
 }
 
-void StreamingFlowGraphBuilder::SkipFlags() {
+void KernelReaderHelper::SkipFlags() {
   ReadFlags();
 }
 
-void StreamingFlowGraphBuilder::SkipStringReference() {
+void KernelReaderHelper::SkipStringReference() {
   ReadUInt();
 }
 
-void StreamingFlowGraphBuilder::SkipConstantReference() {
+void KernelReaderHelper::SkipConstantReference() {
   ReadUInt();
 }
 
-void StreamingFlowGraphBuilder::SkipCanonicalNameReference() {
+void KernelReaderHelper::SkipCanonicalNameReference() {
   ReadUInt();
 }
 
+void KernelReaderHelper::ReportUnexpectedTag(const char* variant, Tag tag) {
+  H.ReportError(script_, TokenPosition::kNoSource,
+                "Unexpected tag %d (%s) in ?, expected %s", tag,
+                Reader::TagName(tag), variant);
+}
+
 void StreamingFlowGraphBuilder::ReportUnexpectedTag(const char* variant,
                                                     Tag tag) {
-  H.ReportError(script_, TokenPosition::kNoSource,
-                "Unexpected tag %d (%s) in %s, expected %s", tag,
-                Reader::TagName(tag),
-                flow_graph_builder_ != NULL && parsed_function() != NULL
-                    ? parsed_function()->function().ToQualifiedCString()
-                    : "?",
-                variant);
+  if ((flow_graph_builder_ == NULL) || (parsed_function() == NULL)) {
+    KernelReaderHelper::ReportUnexpectedTag(variant, tag);
+  } else {
+    H.ReportError(script_, TokenPosition::kNoSource,
+                  "Unexpected tag %d (%s) in %s, expected %s", tag,
+                  Reader::TagName(tag),
+                  parsed_function()->function().ToQualifiedCString(), variant);
+  }
 }
 
-void StreamingFlowGraphBuilder::SkipDartType() {
+void KernelReaderHelper::SkipDartType() {
   Tag tag = ReadTag();
   switch (tag) {
     case kInvalidType:
@@ -5505,7 +6162,7 @@
   }
 }
 
-void StreamingFlowGraphBuilder::SkipOptionalDartType() {
+void KernelReaderHelper::SkipOptionalDartType() {
   Tag tag = ReadTag();  // read tag.
   if (tag == kNothing) {
     return;
@@ -5515,14 +6172,14 @@
   SkipDartType();  // read type.
 }
 
-void StreamingFlowGraphBuilder::SkipInterfaceType(bool simple) {
+void KernelReaderHelper::SkipInterfaceType(bool simple) {
   ReadUInt();  // read klass_name.
   if (!simple) {
     SkipListOfDartTypes();  // read list of types.
   }
 }
 
-void StreamingFlowGraphBuilder::SkipFunctionType(bool simple) {
+void KernelReaderHelper::SkipFunctionType(bool simple) {
   if (!simple) {
     SkipTypeParametersList();  // read type_parameters.
     ReadUInt();                // read required parameter count.
@@ -5550,42 +6207,42 @@
   SkipDartType();  // read return type.
 }
 
-void StreamingFlowGraphBuilder::SkipStatementList() {
+void KernelReaderHelper::SkipStatementList() {
   intptr_t list_length = ReadListLength();  // read list length.
   for (intptr_t i = 0; i < list_length; ++i) {
     SkipStatement();  // read ith expression.
   }
 }
 
-void StreamingFlowGraphBuilder::SkipListOfExpressions() {
+void KernelReaderHelper::SkipListOfExpressions() {
   intptr_t list_length = ReadListLength();  // read list length.
   for (intptr_t i = 0; i < list_length; ++i) {
     SkipExpression();  // read ith expression.
   }
 }
 
-void StreamingFlowGraphBuilder::SkipListOfDartTypes() {
+void KernelReaderHelper::SkipListOfDartTypes() {
   intptr_t list_length = ReadListLength();  // read list length.
   for (intptr_t i = 0; i < list_length; ++i) {
     SkipDartType();  // read ith type.
   }
 }
 
-void StreamingFlowGraphBuilder::SkipListOfStrings() {
+void KernelReaderHelper::SkipListOfStrings() {
   intptr_t list_length = ReadListLength();  // read list length.
   for (intptr_t i = 0; i < list_length; ++i) {
     SkipStringReference();  // read ith string index.
   }
 }
 
-void StreamingFlowGraphBuilder::SkipListOfVariableDeclarations() {
+void KernelReaderHelper::SkipListOfVariableDeclarations() {
   intptr_t list_length = ReadListLength();  // read list length.
   for (intptr_t i = 0; i < list_length; ++i) {
     SkipVariableDeclaration();  // read ith variable declaration.
   }
 }
 
-void StreamingFlowGraphBuilder::SkipTypeParametersList() {
+void KernelReaderHelper::SkipTypeParametersList() {
   intptr_t list_length = ReadListLength();  // read list length.
   for (intptr_t i = 0; i < list_length; ++i) {
     TypeParameterHelper helper(this);
@@ -5593,7 +6250,7 @@
   }
 }
 
-void StreamingFlowGraphBuilder::SkipInitializer() {
+void KernelReaderHelper::SkipInitializer() {
   Tag tag = ReadTag();
   ReadByte();  // read isSynthetic flag.
   switch (tag) {
@@ -5623,7 +6280,7 @@
   }
 }
 
-void StreamingFlowGraphBuilder::SkipExpression() {
+void KernelReaderHelper::SkipExpression() {
   uint8_t payload = 0;
   Tag tag = ReadTag(&payload);
   switch (tag) {
@@ -5858,7 +6515,7 @@
   }
 }
 
-void StreamingFlowGraphBuilder::SkipStatement() {
+void KernelReaderHelper::SkipStatement() {
   Tag tag = ReadTag();  // read tag.
   switch (tag) {
     case kExpressionStatement:
@@ -5974,7 +6631,7 @@
       return;
     case kYieldStatement: {
       TokenPosition position = ReadPosition();  // read position.
-      record_yield_position(position);
+      RecordYieldPosition(position);
       ReadByte();        // read flags.
       SkipExpression();  // read expression.
       return;
@@ -5993,19 +6650,19 @@
   }
 }
 
-void StreamingFlowGraphBuilder::SkipFunctionNode() {
+void KernelReaderHelper::SkipFunctionNode() {
   FunctionNodeHelper function_node_helper(this);
   function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd);
 }
 
-void StreamingFlowGraphBuilder::SkipName() {
+void KernelReaderHelper::SkipName() {
   StringIndex name_index = ReadStringReference();  // read name index.
   if ((H.StringSize(name_index) >= 1) && H.CharacterAt(name_index, 0) == '_') {
     SkipCanonicalNameReference();  // read library index.
   }
 }
 
-void StreamingFlowGraphBuilder::SkipArguments() {
+void KernelReaderHelper::SkipArguments() {
   ReadUInt();  // read argument count.
 
   SkipListOfDartTypes();    // read list of types.
@@ -6019,12 +6676,12 @@
   }
 }
 
-void StreamingFlowGraphBuilder::SkipVariableDeclaration() {
+void KernelReaderHelper::SkipVariableDeclaration() {
   VariableDeclarationHelper helper(this);
   helper.ReadUntilExcluding(VariableDeclarationHelper::kEnd);
 }
 
-void StreamingFlowGraphBuilder::SkipLibraryCombinator() {
+void KernelReaderHelper::SkipLibraryCombinator() {
   ReadBool();                        // read is_show.
   intptr_t name_count = ReadUInt();  // read list length.
   for (intptr_t j = 0; j < name_count; ++j) {
@@ -6032,7 +6689,7 @@
   }
 }
 
-void StreamingFlowGraphBuilder::SkipLibraryDependency() {
+void KernelReaderHelper::SkipLibraryDependency() {
   ReadPosition();  // read file offset.
   ReadFlags();
   SkipListOfExpressions();  // Annotations.
@@ -6044,12 +6701,12 @@
   }
 }
 
-void StreamingFlowGraphBuilder::SkipLibraryPart() {
+void KernelReaderHelper::SkipLibraryPart() {
   SkipListOfExpressions();  // Read annotations.
   SkipStringReference();    // Read part URI index.
 }
 
-void StreamingFlowGraphBuilder::SkipLibraryTypedef() {
+void KernelReaderHelper::SkipLibraryTypedef() {
   SkipCanonicalNameReference();  // read canonical name.
   ReadUInt();                    // read source_uri_index.
   ReadPosition();                // read position.
@@ -6059,33 +6716,33 @@
   SkipDartType();                // read type.
 }
 
-TokenPosition StreamingFlowGraphBuilder::ReadPosition(bool record) {
+TokenPosition KernelReaderHelper::ReadPosition(bool record) {
   TokenPosition position = reader_.ReadPosition();
   if (record) {
-    record_token_position(position);
+    RecordTokenPosition(position);
   }
   return position;
 }
 
-void StreamingFlowGraphBuilder::record_token_position(TokenPosition position) {
+void StreamingFlowGraphBuilder::RecordTokenPosition(TokenPosition position) {
   if (record_for_script_id_ == current_script_id_ &&
       record_token_positions_into_ != NULL && position.IsReal()) {
     record_token_positions_into_->Add(position.value());
   }
 }
 
-void StreamingFlowGraphBuilder::record_yield_position(TokenPosition position) {
+void StreamingFlowGraphBuilder::RecordYieldPosition(TokenPosition position) {
   if (record_for_script_id_ == current_script_id_ &&
       record_yield_positions_into_ != NULL && position.IsReal()) {
     record_yield_positions_into_->Add(position.value());
   }
 }
 
-Tag StreamingFlowGraphBuilder::ReadTag(uint8_t* payload) {
+Tag KernelReaderHelper::ReadTag(uint8_t* payload) {
   return reader_.ReadTag(payload);
 }
 
-Tag StreamingFlowGraphBuilder::PeekTag(uint8_t* payload) {
+Tag KernelReaderHelper::PeekTag(uint8_t* payload) {
   return reader_.PeekTag(payload);
 }
 
@@ -8328,9 +8985,9 @@
     TokenPosition* position) {
   if (position != NULL) *position = TokenPosition::kNoSource;
 
-  Double& constant =
-      Double::ZoneHandle(Z, Double::New(H.DartString(ReadStringReference()),
-                                        Heap::kOld));  // read string reference.
+  Double& constant = Double::ZoneHandle(
+      Z, Double::NewCanonical(
+             H.DartString(ReadStringReference())));  // read string reference.
   return Constant(constant);
 }
 
@@ -8423,7 +9080,15 @@
       ReadCanonicalNameReference();  // read function reference.
   Function& function = Function::ZoneHandle(
       Z, H.LookupStaticMethodByKernelProcedure(function_reference));
-  function = function.ConvertedClosureFunction();
+
+  intptr_t num_type_parameters;
+  {
+    AlternativeReadingScope _(&reader_);
+    SkipExpression();  // context vector
+    SkipDartType();    // skip function type
+    num_type_parameters = ReadListLength();
+  }
+  function = function.ConvertedClosureFunction(num_type_parameters);
   ASSERT(!function.IsNull());
 
   const Class& closure_class =
@@ -8444,34 +9109,25 @@
   instructions +=
       StoreInstanceField(TokenPosition::kNoSource, Closure::context_offset());
 
-  SkipDartType();  // skip function type of the closure.
+  // Skip the function type of the closure (it's predicable from the
+  // target and the supplied type arguments).
+  SkipDartType();
 
-  // TODO(30455): Kernel generic methods undone. When generic methods are
-  // fully supported in kernel, we'll need to store a NULL in the type arguments
-  // slot when type arguments are absent, so the wrapper for the target function
-  // can tell how many type args are captured vs. provided by the caller of the
-  // closure.
-
-  intptr_t types_count = ReadListLength();  // read type count.
-  if (types_count > 0) {
-    const TypeArguments& type_args =
-        T.BuildTypeArguments(types_count);  // read list of type arguments.
-    instructions += TranslateInstantiatedTypeArguments(type_args);
-    LocalVariable* type_args_slot = MakeTemporary();
-
-    instructions += LoadLocal(context);
-    instructions += LoadLocal(type_args_slot);
-    instructions += StoreInstanceField(TokenPosition::kNoSource,
-                                       Context::variable_offset(0));
-
+  ReadListLength();  // type parameter count
+  if (num_type_parameters > 0) {
     instructions += LoadLocal(closure);
-    instructions += LoadLocal(type_args_slot);
+    const TypeArguments& type_args = T.BuildTypeArguments(
+        num_type_parameters);  // read list of type arguments.
+    instructions += TranslateInstantiatedTypeArguments(type_args);
     instructions += StoreInstanceField(
         TokenPosition::kNoSource, Closure::function_type_arguments_offset());
-
-    instructions += Drop();  // type args
   }
 
+  instructions += LoadLocal(closure);
+  instructions += Constant(Object::empty_type_arguments());
+  instructions += StoreInstanceField(TokenPosition::kNoSource,
+                                     Closure::delayed_type_arguments_offset());
+
   instructions += Drop();  // context
   return instructions;
 }
@@ -8500,23 +9156,10 @@
   instructions += LoadLocal(new_closure);
 
   intptr_t num_type_args = ReadListLength();
-  const TypeArguments* type_args = &T.BuildTypeArguments(num_type_args);
-
-  // Even if all dynamic types are passed in, we need to put a vector in here to
-  // distinguish this partially applied tearoff from a normal tearoff. This is
-  // necessary because the tearoff wrapper (BuildGraphOfImplicitClosureFunction)
-  // needs to throw NSM if type arguments are passed to a partially applied
-  // tearoff.
-  if (type_args->IsNull()) {
-    type_args =
-        &TypeArguments::ZoneHandle(Z, TypeArguments::New(num_type_args));
-    for (intptr_t i = 0; i < num_type_args; ++i) {
-      type_args->SetTypeAt(i, Type::ZoneHandle(Z, Type::DynamicType()));
-    }
-  }
-  instructions += TranslateInstantiatedTypeArguments(*type_args);
+  const TypeArguments& type_args = T.BuildTypeArguments(num_type_args);
+  instructions += TranslateInstantiatedTypeArguments(type_args);
   instructions += StoreInstanceField(TokenPosition::kNoSource,
-                                     Closure::function_type_arguments_offset());
+                                     Closure::delayed_type_arguments_offset());
 
   // Copy over the target function.
   instructions += LoadLocal(new_closure);
@@ -8532,6 +9175,13 @@
   instructions += StoreInstanceField(
       TokenPosition::kNoSource, Closure::instantiator_type_arguments_offset());
 
+  // Copy over the function type arguments.
+  instructions += LoadLocal(new_closure);
+  instructions += LoadLocal(original_closure);
+  instructions += LoadField(Closure::function_type_arguments_offset());
+  instructions += StoreInstanceField(TokenPosition::kNoSource,
+                                     Closure::function_type_arguments_offset());
+
   // Copy over the context.
   instructions += LoadLocal(new_closure);
   instructions += LoadLocal(original_closure);
@@ -9647,6 +10297,11 @@
   instructions += flow_graph_builder_->StoreInstanceField(
       TokenPosition::kNoSource, Closure::function_type_arguments_offset());
 
+  instructions += LoadLocal(closure);
+  instructions += Constant(Object::empty_type_arguments());
+  instructions += flow_graph_builder_->StoreInstanceField(
+      TokenPosition::kNoSource, Closure::delayed_type_arguments_offset());
+
   // Store the function and the context in the closure.
   instructions += LoadLocal(closure);
   instructions += Constant(function);
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 722e9ab..337c045d6 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -17,6 +17,8 @@
 namespace dart {
 namespace kernel {
 
+class KernelReaderHelper;
+
 // Helper class that reads a kernel FunctionNode from binary.
 //
 // Use ReadUntilExcluding to read up to but not including a field.
@@ -50,8 +52,8 @@
     kSyncYielding = 4,
   };
 
-  explicit FunctionNodeHelper(StreamingFlowGraphBuilder* builder) {
-    builder_ = builder;
+  explicit FunctionNodeHelper(KernelReaderHelper* helper) {
+    helper_ = helper;
     next_read_ = kStart;
   }
 
@@ -72,7 +74,7 @@
   intptr_t required_parameter_count_;
 
  private:
-  StreamingFlowGraphBuilder* builder_;
+  KernelReaderHelper* helper_;
   intptr_t next_read_;
 };
 
@@ -93,8 +95,8 @@
     kIsGenericCovariantInterface = 1 << 1
   };
 
-  explicit TypeParameterHelper(StreamingFlowGraphBuilder* builder) {
-    builder_ = builder;
+  explicit TypeParameterHelper(KernelReaderHelper* helper) {
+    helper_ = helper;
     next_read_ = kStart;
   }
 
@@ -119,7 +121,7 @@
   StringIndex name_index_;
 
  private:
-  StreamingFlowGraphBuilder* builder_;
+  KernelReaderHelper* helper_;
   intptr_t next_read_;
 };
 
@@ -151,10 +153,8 @@
     kIsGenericCovariantInterface = 1 << 6
   };
 
-  explicit VariableDeclarationHelper(StreamingFlowGraphBuilder* builder) {
-    builder_ = builder;
-    next_read_ = kPosition;
-  }
+  explicit VariableDeclarationHelper(KernelReaderHelper* helper)
+      : helper_(helper), next_read_(kPosition) {}
 
   void ReadUntilIncluding(Field field) {
     ReadUntilExcluding(static_cast<Field>(static_cast<int>(field) + 1));
@@ -182,7 +182,7 @@
   StringIndex name_index_;
 
  private:
-  StreamingFlowGraphBuilder* builder_;
+  KernelReaderHelper* helper_;
   intptr_t next_read_;
 };
 
@@ -219,12 +219,12 @@
     kIsGenericCovariantInterface = 1 << 7
   };
 
-  explicit FieldHelper(StreamingFlowGraphBuilder* builder)
-      : builder_(builder),
+  explicit FieldHelper(KernelReaderHelper* helper)
+      : helper_(helper),
         next_read_(kStart),
         has_function_literal_initializer_(false) {}
 
-  FieldHelper(StreamingFlowGraphBuilder* builder, intptr_t offset);
+  FieldHelper(KernelReaderHelper* helper, intptr_t offset);
 
   void ReadUntilIncluding(Field field) {
     ReadUntilExcluding(static_cast<Field>(static_cast<int>(field) + 1));
@@ -260,11 +260,12 @@
   TokenPosition position_;
   TokenPosition end_position_;
   uint8_t flags_;
+  uint8_t secondary_flags_;
   intptr_t source_uri_index_;
   intptr_t annotation_count_;
 
  private:
-  StreamingFlowGraphBuilder* builder_;
+  KernelReaderHelper* helper_;
   intptr_t next_read_;
 
   bool has_function_literal_initializer_;
@@ -320,10 +321,8 @@
     kNoSuchMethodForwarder = 1 << 0,
   };
 
-  explicit ProcedureHelper(StreamingFlowGraphBuilder* builder) {
-    builder_ = builder;
-    next_read_ = kStart;
-  }
+  explicit ProcedureHelper(KernelReaderHelper* helper)
+      : helper_(helper), next_read_(kStart) {}
 
   void ReadUntilIncluding(Field field) {
     ReadUntilExcluding(static_cast<Field>(static_cast<int>(field) + 1));
@@ -359,7 +358,7 @@
   NameIndex forwarding_stub_super_target_;
 
  private:
-  StreamingFlowGraphBuilder* builder_;
+  KernelReaderHelper* helper_;
   intptr_t next_read_;
 };
 
@@ -392,10 +391,8 @@
     kSynthetic = 1 << 2,
   };
 
-  explicit ConstructorHelper(StreamingFlowGraphBuilder* builder) {
-    builder_ = builder;
-    next_read_ = kStart;
-  }
+  explicit ConstructorHelper(KernelReaderHelper* helper)
+      : helper_(helper), next_read_(kStart) {}
 
   void ReadUntilIncluding(Field field) {
     ReadUntilExcluding(static_cast<Field>(static_cast<int>(field) + 1));
@@ -418,7 +415,7 @@
   intptr_t annotation_count_;
 
  private:
-  StreamingFlowGraphBuilder* builder_;
+  KernelReaderHelper* helper_;
   intptr_t next_read_;
 };
 
@@ -456,10 +453,8 @@
     kIsEnumClass = 2,
   };
 
-  explicit ClassHelper(StreamingFlowGraphBuilder* builder) {
-    builder_ = builder;
-    next_read_ = kStart;
-  }
+  explicit ClassHelper(KernelReaderHelper* helper)
+      : helper_(helper), next_read_(kStart) {}
 
   void ReadUntilIncluding(Field field) {
     ReadUntilExcluding(static_cast<Field>(static_cast<int>(field) + 1));
@@ -484,7 +479,7 @@
   uint8_t flags_;
 
  private:
-  StreamingFlowGraphBuilder* builder_;
+  KernelReaderHelper* helper_;
   intptr_t next_read_;
 };
 
@@ -518,10 +513,8 @@
     kExternal = 1,
   };
 
-  explicit LibraryHelper(StreamingFlowGraphBuilder* builder) {
-    builder_ = builder;
-    next_read_ = kFlags;
-  }
+  explicit LibraryHelper(KernelReaderHelper* helper)
+      : helper_(helper), next_read_(kFlags) {}
 
   void ReadUntilIncluding(Field field) {
     ReadUntilExcluding(static_cast<Field>(static_cast<int>(field) + 1));
@@ -542,7 +535,7 @@
   intptr_t procedure_count_;
 
  private:
-  StreamingFlowGraphBuilder* builder_;
+  KernelReaderHelper* helper_;
   intptr_t next_read_;
 };
 
@@ -567,10 +560,8 @@
     Show = 1 << 0,
   };
 
-  explicit LibraryDependencyHelper(StreamingFlowGraphBuilder* builder) {
-    builder_ = builder;
-    next_read_ = kFileOffset;
-  }
+  explicit LibraryDependencyHelper(KernelReaderHelper* helper)
+      : helper_(helper), next_read_(kFileOffset) {}
 
   void ReadUntilIncluding(Field field) {
     ReadUntilExcluding(static_cast<Field>(static_cast<int>(field) + 1));
@@ -583,7 +574,7 @@
   NameIndex target_library_canonical_name_;
 
  private:
-  StreamingFlowGraphBuilder* builder_;
+  KernelReaderHelper* helper_;
   intptr_t next_read_;
 };
 
@@ -792,7 +783,7 @@
   void EnterScope(intptr_t kernel_offset);
   void ExitScope(TokenPosition start_position, TokenPosition end_position);
 
-  void ReportUnexpectedTag(const char* variant, Tag tag);
+  virtual void ReportUnexpectedTag(const char* variant, Tag tag);
 
   // This enum controls which parameters would be marked as requring type
   // check on the callee side.
@@ -1002,132 +993,56 @@
   Instance& result_;
 };
 
-class StreamingFlowGraphBuilder {
+class KernelReaderHelper {
  public:
-  StreamingFlowGraphBuilder(FlowGraphBuilder* flow_graph_builder,
-                            const TypedData& data,
-                            intptr_t data_program_offset)
-      : flow_graph_builder_(flow_graph_builder),
-        translation_helper_(flow_graph_builder->translation_helper_),
-        zone_(flow_graph_builder->zone_),
-        reader_(data),
-        script_(Script::Handle(zone_, parsed_function()->function().script())),
-        constant_evaluator_(this),
-        type_translator_(this, /* finalize= */ true),
-        data_program_offset_(data_program_offset),
-        current_script_id_(-1),
-        record_for_script_id_(-1),
-        record_token_positions_into_(NULL),
-        record_yield_positions_into_(NULL),
-        direct_call_metadata_helper_(this),
-        inferred_type_metadata_helper_(this),
-        procedure_attributes_metadata_helper_(this),
-        metadata_scanned_(false) {}
-
-  StreamingFlowGraphBuilder(TranslationHelper* translation_helper,
-                            Zone* zone,
-                            const uint8_t* data_buffer,
-                            intptr_t buffer_length,
-                            intptr_t data_program_offset)
-      : flow_graph_builder_(NULL),
+  KernelReaderHelper(Zone* zone,
+                     TranslationHelper* translation_helper,
+                     const Script& script,
+                     const TypedData& data,
+                     intptr_t data_program_offset)
+      : zone_(zone),
         translation_helper_(*translation_helper),
-        zone_(zone),
-        reader_(data_buffer, buffer_length),
-        script_(Script::Handle(zone_)),
-        constant_evaluator_(this),
-        type_translator_(this, /* finalize= */ true),
-        data_program_offset_(data_program_offset),
-        current_script_id_(-1),
-        record_for_script_id_(-1),
-        record_token_positions_into_(NULL),
-        record_yield_positions_into_(NULL),
-        direct_call_metadata_helper_(this),
-        inferred_type_metadata_helper_(this),
-        procedure_attributes_metadata_helper_(this),
-        metadata_scanned_(false) {}
-
-  StreamingFlowGraphBuilder(TranslationHelper* translation_helper,
-                            const Script& script,
-                            Zone* zone,
-                            const TypedData& data,
-                            intptr_t data_program_offset)
-      : flow_graph_builder_(NULL),
-        translation_helper_(*translation_helper),
-        zone_(zone),
         reader_(data),
         script_(script),
-        constant_evaluator_(this),
-        type_translator_(this, /* finalize= */ true),
-        data_program_offset_(data_program_offset),
-        current_script_id_(-1),
-        record_for_script_id_(-1),
-        record_token_positions_into_(NULL),
-        record_yield_positions_into_(NULL),
-        direct_call_metadata_helper_(this),
-        inferred_type_metadata_helper_(this),
-        procedure_attributes_metadata_helper_(this),
-        metadata_scanned_(false) {}
+        data_program_offset_(data_program_offset) {}
 
-  ~StreamingFlowGraphBuilder() {}
+  KernelReaderHelper(Zone* zone,
+                     TranslationHelper* translation_helper,
+                     const uint8_t* data_buffer,
+                     intptr_t buffer_length,
+                     intptr_t data_program_offset)
+      : zone_(zone),
+        translation_helper_(*translation_helper),
+        reader_(data_buffer, buffer_length),
+        script_(Script::Handle(zone_)),
+        data_program_offset_(data_program_offset) {}
 
-  FlowGraph* BuildGraph(intptr_t kernel_offset);
+  virtual ~KernelReaderHelper() {}
 
-  Fragment BuildStatementAt(intptr_t kernel_offset);
-  RawObject* BuildParameterDescriptor(intptr_t kernel_offset);
-  RawObject* EvaluateMetadata(intptr_t kernel_offset);
-  void CollectTokenPositionsFor(
-      intptr_t script_index,
-      intptr_t initial_script_index,
-      intptr_t kernel_offset,
-      GrowableArray<intptr_t>* record_token_positions_in,
-      GrowableArray<intptr_t>* record_yield_positions_in);
-  intptr_t SourceTableSize();
-  String& SourceTableUriFor(intptr_t index);
-  String& GetSourceFor(intptr_t index);
-  RawTypedData* GetLineStartsFor(intptr_t index);
   void SetOffset(intptr_t offset);
 
-  // If a 'ParsedFunction' is provided for 'set_forwarding_stub', this method
-  // will attach the forwarding stub target reference to the parsed function if
-  // it crosses a procedure node for a concrete forwarding stub.
-  void ReadUntilFunctionNode(ParsedFunction* set_forwarding_stub = NULL);
   intptr_t ReadListLength();
+  virtual void ReportUnexpectedTag(const char* variant, Tag tag);
 
-  void ReportUnexpectedTag(const char* variant, Tag tag);
+ protected:
+  const Script& script() const { return script_; }
 
- private:
-  void LoadAndSetupTypeParameters(ActiveClass* active_class,
-                                  const Object& set_on,
-                                  intptr_t type_parameter_count,
-                                  const Function& parameterized_function);
+  virtual void set_current_script_id(intptr_t id) {
+    // Do nothing by default. This is overridden in StreamingFlowGraphBuilder.
+    USE(id);
+  }
 
-  void DiscoverEnclosingElements(Zone* zone,
-                                 const Function& function,
-                                 Function* outermost_function);
+  virtual void RecordYieldPosition(TokenPosition position) {
+    // Do nothing by default. This is overridden in StreamingFlowGraphBuilder.
+    USE(position);
+  }
 
-  StringIndex GetNameFromVariableDeclaration(intptr_t kernel_offset,
-                                             const Function& function);
+  virtual void RecordTokenPosition(TokenPosition position) {
+    // Do nothing by default. This is overridden in StreamingFlowGraphBuilder.
+    USE(position);
+  }
 
-  bool optimizing();
-
-  FlowGraph* BuildGraphOfFieldInitializer();
-  FlowGraph* BuildGraphOfFieldAccessor(LocalVariable* setter_value);
-  void SetupDefaultParameterValues();
-  Fragment BuildFieldInitializer(NameIndex canonical_name);
-  Fragment BuildInitializers(const Class& parent_class);
-  FlowGraph* BuildGraphOfImplicitClosureFunction(const Function& function);
-  FlowGraph* BuildGraphOfFunction(bool constructor);
-  FlowGraph* BuildGraphOfNoSuchMethodForwarder(
-      const Function& function,
-      bool is_implicit_closure_function,
-      bool throw_no_such_method_error = false);
-
-  intptr_t GetOffsetForSourceInfo(intptr_t index);
-
-  Fragment BuildExpression(TokenPosition* position = NULL);
-  Fragment BuildStatement();
-
-  intptr_t ReaderOffset();
+  intptr_t ReaderOffset() const;
   void SkipBytes(intptr_t skip);
   bool ReadBool();
   uint8_t ReadByte();
@@ -1168,12 +1083,222 @@
   void SkipLibraryPart();
   void SkipLibraryTypedef();
   TokenPosition ReadPosition(bool record = true);
-  void record_token_position(TokenPosition position);
-  void record_yield_position(TokenPosition position);
   Tag ReadTag(uint8_t* payload = NULL);
   Tag PeekTag(uint8_t* payload = NULL);
   uint8_t ReadFlags() { return reader_.ReadFlags(); }
 
+  Zone* zone_;
+  TranslationHelper& translation_helper_;
+  Reader reader_;
+  const Script& script_;
+  // Some items like variables are specified in the kernel binary as
+  // absolute offsets (as in, offsets within the whole kernel program)
+  // of their declaration nodes. Hence, to cache and/or access them
+  // uniquely from within a function's kernel data, we need to
+  // add/subtract the offset of the kernel data in the over all
+  // kernel program.
+  intptr_t data_program_offset_;
+
+  friend class ClassHelper;
+  friend class ConstantHelper;
+  friend class ConstructorHelper;
+  friend class DirectCallMetadataHelper;
+  friend class ProcedureAttributesMetadataHelper;
+  friend class FieldHelper;
+  friend class FunctionNodeHelper;
+  friend class InferredTypeMetadataHelper;
+  friend class KernelLoader;
+  friend class LibraryDependencyHelper;
+  friend class LibraryHelper;
+  friend class MetadataHelper;
+  friend class ProcedureHelper;
+  friend class SimpleExpressionConverter;
+  friend class StreamingConstantEvaluator;
+  friend class StreamingDartTypeTranslator;
+  friend class StreamingScopeBuilder;
+  friend class VariableDeclarationHelper;
+  friend class TypeParameterHelper;
+};
+
+class KernelFingerprintHelper : public KernelReaderHelper {
+ public:
+  KernelFingerprintHelper(Zone* zone,
+                          TranslationHelper* translation_helper,
+                          const Script& script,
+                          const TypedData& data,
+                          intptr_t data_program_offset)
+      : KernelReaderHelper(zone,
+                           translation_helper,
+                           script,
+                           data,
+                           data_program_offset),
+        hash_(0) {}
+
+  virtual ~KernelFingerprintHelper() {}
+  uint32_t CalculateFieldFingerprint();
+  uint32_t CalculateFunctionFingerprint();
+
+  static uint32_t CalculateHash(uint32_t current, uint32_t val) {
+    return current * 31 + val;
+  }
+
+ private:
+  void BuildHash(uint32_t val);
+  void CalculateConstructorFingerprint();
+  void CalculateArgumentsFingerprint();
+  void CalculateVariableDeclarationFingerprint();
+  void CalculateStatementListFingerprint();
+  void CalculateListOfExpressionsFingerprint();
+  void CalculateListOfDartTypesFingerprint();
+  void CalculateListOfVariableDeclarationsFingerprint();
+  void CalculateStringReferenceFingerprint();
+  void CalculateListOfStringsFingerprint();
+  void CalculateTypeParameterFingerprint();
+  void CalculateTypeParametersListFingerprint();
+  void CalculateCanonicalNameFingerprint();
+  void CalculateInitializerFingerprint();
+  void CalculateDartTypeFingerprint();
+  void CalculateOptionalDartTypeFingerprint();
+  void CalculateInterfaceTypeFingerprint(bool simple);
+  void CalculateFunctionTypeFingerprint(bool simple);
+  void CalculateGetterNameFingerprint();
+  void CalculateSetterNameFingerprint();
+  void CalculateMethodNameFingerprint();
+  void CalculateExpressionFingerprint();
+  void CalculateStatementFingerprint();
+  void CalculateFunctionNodeFingerprint();
+
+  uint32_t hash_;
+};
+
+class StreamingFlowGraphBuilder : public KernelReaderHelper {
+ public:
+  StreamingFlowGraphBuilder(FlowGraphBuilder* flow_graph_builder,
+                            const TypedData& data,
+                            intptr_t data_program_offset)
+      : KernelReaderHelper(
+            flow_graph_builder->zone_,
+            &flow_graph_builder->translation_helper_,
+            Script::Handle(
+                flow_graph_builder->zone_,
+                flow_graph_builder->parsed_function_->function().script()),
+            data,
+            data_program_offset),
+        flow_graph_builder_(flow_graph_builder),
+        constant_evaluator_(this),
+        type_translator_(this, /* finalize= */ true),
+        current_script_id_(-1),
+        record_for_script_id_(-1),
+        record_token_positions_into_(NULL),
+        record_yield_positions_into_(NULL),
+        direct_call_metadata_helper_(this),
+        inferred_type_metadata_helper_(this),
+        procedure_attributes_metadata_helper_(this),
+        metadata_scanned_(false) {}
+
+  StreamingFlowGraphBuilder(TranslationHelper* translation_helper,
+                            Zone* zone,
+                            const uint8_t* data_buffer,
+                            intptr_t buffer_length,
+                            intptr_t data_program_offset)
+      : KernelReaderHelper(zone,
+                           translation_helper,
+                           data_buffer,
+                           buffer_length,
+                           data_program_offset),
+        flow_graph_builder_(NULL),
+        constant_evaluator_(this),
+        type_translator_(this, /* finalize= */ true),
+        current_script_id_(-1),
+        record_for_script_id_(-1),
+        record_token_positions_into_(NULL),
+        record_yield_positions_into_(NULL),
+        direct_call_metadata_helper_(this),
+        inferred_type_metadata_helper_(this),
+        procedure_attributes_metadata_helper_(this),
+        metadata_scanned_(false) {}
+
+  StreamingFlowGraphBuilder(TranslationHelper* translation_helper,
+                            const Script& script,
+                            Zone* zone,
+                            const TypedData& data,
+                            intptr_t data_program_offset)
+      : KernelReaderHelper(zone,
+                           translation_helper,
+                           script,
+                           data,
+                           data_program_offset),
+        flow_graph_builder_(NULL),
+        constant_evaluator_(this),
+        type_translator_(this, /* finalize= */ true),
+        current_script_id_(-1),
+        record_for_script_id_(-1),
+        record_token_positions_into_(NULL),
+        record_yield_positions_into_(NULL),
+        direct_call_metadata_helper_(this),
+        inferred_type_metadata_helper_(this),
+        procedure_attributes_metadata_helper_(this),
+        metadata_scanned_(false) {}
+
+  virtual ~StreamingFlowGraphBuilder() {}
+
+  FlowGraph* BuildGraph(intptr_t kernel_offset);
+
+  void ReportUnexpectedTag(const char* variant, Tag tag) override;
+
+  Fragment BuildStatementAt(intptr_t kernel_offset);
+  RawObject* BuildParameterDescriptor(intptr_t kernel_offset);
+  RawObject* EvaluateMetadata(intptr_t kernel_offset);
+  void CollectTokenPositionsFor(
+      intptr_t script_index,
+      intptr_t initial_script_index,
+      intptr_t kernel_offset,
+      GrowableArray<intptr_t>* record_token_positions_in,
+      GrowableArray<intptr_t>* record_yield_positions_in);
+  intptr_t SourceTableSize();
+  String& SourceTableUriFor(intptr_t index);
+  String& GetSourceFor(intptr_t index);
+  RawTypedData* GetLineStartsFor(intptr_t index);
+
+  // If a 'ParsedFunction' is provided for 'set_forwarding_stub', this method
+  // will attach the forwarding stub target reference to the parsed function if
+  // it crosses a procedure node for a concrete forwarding stub.
+  void ReadUntilFunctionNode(ParsedFunction* set_forwarding_stub = NULL);
+
+  enum DispatchCategory { Interface, ViaThis, Closure, DynamicDispatch };
+
+ private:
+  void LoadAndSetupTypeParameters(ActiveClass* active_class,
+                                  const Object& set_on,
+                                  intptr_t type_parameter_count,
+                                  const Function& parameterized_function);
+
+  void DiscoverEnclosingElements(Zone* zone,
+                                 const Function& function,
+                                 Function* outermost_function);
+
+  StringIndex GetNameFromVariableDeclaration(intptr_t kernel_offset,
+                                             const Function& function);
+
+  bool optimizing();
+
+  FlowGraph* BuildGraphOfFieldInitializer();
+  FlowGraph* BuildGraphOfFieldAccessor(LocalVariable* setter_value);
+  void SetupDefaultParameterValues();
+  Fragment BuildFieldInitializer(NameIndex canonical_name);
+  Fragment BuildInitializers(const Class& parent_class);
+  FlowGraph* BuildGraphOfImplicitClosureFunction(const Function& function);
+  FlowGraph* BuildGraphOfFunction(bool constructor);
+  FlowGraph* BuildGraphOfNoSuchMethodForwarder(
+      const Function& function,
+      bool is_implicit_closure_function,
+      bool throw_no_such_method_error = false);
+
+  intptr_t GetOffsetForSourceInfo(intptr_t index);
+
+  Fragment BuildExpression(TokenPosition* position = NULL);
+  Fragment BuildStatement();
+
   void loop_depth_inc();
   void loop_depth_dec();
   intptr_t for_in_depth();
@@ -1425,26 +1550,18 @@
                                bool is_closure,
                                FunctionNodeHelper* function_node_helper);
 
-  const Script& script() { return script_; }
+  void set_current_script_id(intptr_t id) override { current_script_id_ = id; }
+
+  void RecordTokenPosition(TokenPosition position) override;
+  void RecordYieldPosition(TokenPosition position) override;
 
   // Scan through metadata mappings section and cache offsets for recognized
   // metadata kinds.
   void EnsureMetadataIsScanned();
 
   FlowGraphBuilder* flow_graph_builder_;
-  TranslationHelper& translation_helper_;
-  Zone* zone_;
-  Reader reader_;
-  const Script& script_;
   StreamingConstantEvaluator constant_evaluator_;
   StreamingDartTypeTranslator type_translator_;
-  // Some items like variables are specified in the kernel binary as
-  // absolute offsets (as in, offsets within the whole kernel program)
-  // of their declaration nodes. Hence, to cache and/or access them
-  // uniquely from within a function's kernel data, we need to
-  // add/subtract the offset of the kernel data in the over all
-  // kernel program.
-  intptr_t data_program_offset_;
   intptr_t current_script_id_;
   intptr_t record_for_script_id_;
   GrowableArray<intptr_t>* record_token_positions_into_;
@@ -1463,7 +1580,7 @@
   friend class FunctionNodeHelper;
   friend class InferredTypeMetadataHelper;
   friend class KernelLoader;
-  friend class KernelReader;
+  friend class KernelReaderHelper;
   friend class LibraryDependencyHelper;
   friend class LibraryHelper;
   friend class MetadataHelper;
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 5cb1b88..5d91b40 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -111,6 +111,15 @@
   return *this;
 }
 
+void Fragment::Prepend(Instruction* start) {
+  if (entry == NULL) {
+    entry = current = start;
+  } else {
+    start->LinkTo(entry);
+    entry = start;
+  }
+}
+
 Fragment Fragment::closed() {
   ASSERT(entry != NULL);
   return Fragment(entry, NULL);
@@ -547,6 +556,10 @@
   return name;
 }
 
+const String& TranslationHelper::DartFieldName(NameIndex field) {
+  return DartFieldName(CanonicalNameParent(field), CanonicalNameString(field));
+}
+
 const String& TranslationHelper::DartFieldName(NameIndex parent,
                                                StringIndex field) {
   String& name = DartString(field);
@@ -1001,17 +1014,9 @@
 
   const Function& function = parsed_function_->function();
 
-  if (function.IsClosureFunction() && !function.IsGeneric()) {
-    LocalScope* scope = parsed_function_->node_sequence()->scope();
-    LocalVariable* closure = scope->VariableAt(0);
-    ASSERT(closure != NULL);
-    instructions += LoadLocal(closure);
-    instructions += LoadField(Closure::function_type_arguments_offset());
-
-  } else if (function.IsGeneric()) {
+  if (function.IsGeneric() || function.HasGenericParent()) {
     ASSERT(parsed_function_->function_type_arguments() != NULL);
     instructions += LoadLocal(parsed_function_->function_type_arguments());
-
   } else {
     instructions += NullConstant();
   }
@@ -1333,6 +1338,52 @@
   return Fragment(new (Z) TailCallInstr(code, arg_desc));
 }
 
+Fragment BaseFlowGraphBuilder::TestTypeArgsLen(Fragment eq_branch,
+                                               Fragment neq_branch,
+                                               intptr_t num_type_args) {
+  Fragment test;
+
+  TargetEntryInstr* eq_entry;
+  TargetEntryInstr* neq_entry;
+
+  test += LoadArgDescriptor();
+  test += LoadField(ArgumentsDescriptor::type_args_len_offset());
+  test += IntConstant(num_type_args);
+  test += BranchIfEqual(&eq_entry, &neq_entry);
+
+  eq_branch.Prepend(eq_entry);
+  neq_branch.Prepend(neq_entry);
+
+  JoinEntryInstr* join = BuildJoinEntry();
+  eq_branch += Goto(join);
+  neq_branch += Goto(join);
+
+  return Fragment(test.entry, join);
+}
+
+Fragment BaseFlowGraphBuilder::TestDelayedTypeArgs(LocalVariable* closure,
+                                                   Fragment present,
+                                                   Fragment absent) {
+  Fragment test;
+
+  TargetEntryInstr* absent_entry;
+  TargetEntryInstr* present_entry;
+
+  test += LoadLocal(closure);
+  test += LoadField(Closure::delayed_type_arguments_offset());
+  test += Constant(Object::empty_type_arguments());
+  test += BranchIfEqual(&absent_entry, &present_entry);
+
+  present.Prepend(present_entry);
+  absent.Prepend(absent_entry);
+
+  JoinEntryInstr* join = BuildJoinEntry();
+  absent += Goto(join);
+  present += Goto(join);
+
+  return Fragment(test.entry, join);
+}
+
 Fragment FlowGraphBuilder::RethrowException(TokenPosition position,
                                             int catch_try_index) {
   Fragment instructions;
@@ -2156,6 +2207,11 @@
   fragment +=
       StoreInstanceField(TokenPosition::kNoSource, Closure::context_offset());
 
+  fragment += LoadLocal(closure);
+  fragment += Constant(Object::empty_type_arguments());
+  fragment += StoreInstanceField(TokenPosition::kNoSource,
+                                 Closure::delayed_type_arguments_offset());
+
   // The context is on top of the operand stack.  Store `this`.  The context
   // doesn't need a parent pointer because it doesn't close over anything
   // else.
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index eacb8c0..abdf092 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -7,6 +7,8 @@
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
+#include <initializer_list>
+
 #include "vm/growable_array.h"
 #include "vm/hash_map.h"
 
@@ -169,6 +171,12 @@
 
   Fragment() : entry(NULL), current(NULL) {}
 
+  Fragment(std::initializer_list<Fragment> list) : entry(NULL), current(NULL) {
+    for (Fragment i : list) {
+      *this += i;
+    }
+  }
+
   explicit Fragment(Instruction* instruction)
       : entry(instruction), current(instruction) {}
 
@@ -178,6 +186,8 @@
   bool is_open() { return entry == NULL || current != NULL; }
   bool is_closed() { return !is_open(); }
 
+  void Prepend(Instruction* start);
+
   Fragment& operator+=(const Fragment& other);
   Fragment& operator<<=(Instruction* next);
 
@@ -396,6 +406,7 @@
   const String& DartGetterName(NameIndex getter);
   const String& DartGetterName(NameIndex parent, StringIndex getter);
 
+  const String& DartFieldName(NameIndex field);
   const String& DartFieldName(NameIndex parent, StringIndex field);
 
   const String& DartMethodName(NameIndex method);
@@ -630,6 +641,13 @@
     return LoadLocal(parsed_function_->arg_desc_var());
   }
 
+  Fragment TestTypeArgsLen(Fragment eq_branch,
+                           Fragment neq_branch,
+                           intptr_t num_type_args);
+  Fragment TestDelayedTypeArgs(LocalVariable* closure,
+                               Fragment present,
+                               Fragment absent);
+
   JoinEntryInstr* BuildThrowNoSuchMethod();
 
  protected:
@@ -655,6 +673,7 @@
   intptr_t pending_argument_count_;
 
   friend class TryCatchBlock;
+  friend class KernelReaderHelper;
   friend class StreamingFlowGraphBuilder;
   friend class FlowGraphBuilder;
   friend class PrologueBuilder;
@@ -874,6 +893,7 @@
   friend class BreakableBlock;
   friend class CatchBlock;
   friend class ConstantEvaluator;
+  friend class KernelReaderHelper;
   friend class StreamingFlowGraphBuilder;
   friend class ScopeBuilder;
   friend class SwitchBlock;
diff --git a/runtime/vm/compiler/frontend/prologue_builder.cc b/runtime/vm/compiler/frontend/prologue_builder.cc
index 66a82c9..902b5b0 100644
--- a/runtime/vm/compiler/frontend/prologue_builder.cc
+++ b/runtime/vm/compiler/frontend/prologue_builder.cc
@@ -58,7 +58,7 @@
     if (!compiling_for_osr_) prologue += f;
   }
   if (expect_type_args) {
-    Fragment f = BuildTypeArgumentsHandling(strong);
+    Fragment f = BuildTypeArgumentsHandling(nsm);
     if (link) prologue += f;
   }
 
@@ -391,36 +391,49 @@
   return populate_context;
 }
 
-Fragment PrologueBuilder::BuildTypeArgumentsHandling(bool strong) {
-  Fragment populate_args_desc;
-
+Fragment PrologueBuilder::BuildTypeArgumentsHandling(JoinEntryInstr* nsm) {
   LocalVariable* type_args_var = parsed_function_->RawTypeArgumentsVariable();
 
-  TargetEntryInstr *passed, *not_passed;
-  populate_args_desc += LoadArgDescriptor();
-  populate_args_desc += LoadField(ArgumentsDescriptor::type_args_len_offset());
-  populate_args_desc += IntConstant(0);
-  populate_args_desc += BranchIfEqual(&not_passed, &passed);
+  Fragment handling;
 
-  JoinEntryInstr* join = BuildJoinEntry();
-
-  Fragment store_type_args(passed);
+  Fragment store_type_args;
   store_type_args += LoadArgDescriptor();
   store_type_args += LoadField(ArgumentsDescriptor::count_offset());
   store_type_args += LoadFpRelativeSlot(kWordSize * (1 + kParamEndSlotFromFp));
   store_type_args += StoreLocal(TokenPosition::kNoSource, type_args_var);
   store_type_args += Drop();
-  store_type_args += Goto(join);
 
-  Fragment store_null(not_passed);
+  Fragment store_null;
   store_null += NullConstant();
   store_null += StoreLocal(TokenPosition::kNoSource, type_args_var);
   store_null += Drop();
-  store_null += Goto(join);
 
-  populate_args_desc = Fragment(populate_args_desc.entry, join);
+  handling += TestTypeArgsLen(store_null, store_type_args, 0);
 
-  return populate_args_desc;
+  if (parsed_function_->function().IsClosureFunction()) {
+    LocalVariable* closure =
+        parsed_function_->node_sequence()->scope()->VariableAt(0);
+
+    // Currently, delayed type arguments can only be introduced through type
+    // inference in the FE. So if they are present, we can assume they are
+    // correct in number and bound.
+    // clang-format off
+    Fragment use_delayed_type_args = {
+      LoadLocal(closure),
+      LoadField(Closure::delayed_type_arguments_offset()),
+      StoreLocal(TokenPosition::kNoSource, type_args_var),
+      Drop()
+    };
+
+    handling += TestDelayedTypeArgs(
+        closure,
+        /*present=*/TestTypeArgsLen(
+            use_delayed_type_args, Goto(nsm), 0),
+        /*absent=*/Fragment());
+    // clang-format on
+  }
+
+  return handling;
 }
 
 void PrologueBuilder::SortOptionalNamedParametersInto(LocalVariable** opt_param,
diff --git a/runtime/vm/compiler/frontend/prologue_builder.h b/runtime/vm/compiler/frontend/prologue_builder.h
index 5e89638..2e1026f 100644
--- a/runtime/vm/compiler/frontend/prologue_builder.h
+++ b/runtime/vm/compiler/frontend/prologue_builder.h
@@ -60,7 +60,7 @@
 
   Fragment BuildClosureContextHandling();
 
-  Fragment BuildTypeArgumentsHandling(bool strong);
+  Fragment BuildTypeArgumentsHandling(JoinEntryInstr* nsm);
 
   LocalVariable* ParameterVariable(intptr_t index) {
     return parsed_function_->RawParameterVariable(index);
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index 48cc6c3..9fc7a63 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -65,7 +65,7 @@
   R3 = 3,
   R4 = 4,
   R5 = 5,  // PP
-  R6 = 6,  // CTX
+  R6 = 6,
   R7 = 7,  // iOS FP
   R8 = 8,
   R9 = 9,
@@ -264,7 +264,6 @@
 // Register aliases.
 const Register TMP = IP;            // Used as scratch register by assembler.
 const Register TMP2 = kNoRegister;  // There is no second assembler temporary.
-const Register CTX = R6;    // Location of current context at method entry.
 const Register PP = R5;     // Caches object pool pointer in generated code.
 const Register SPREG = SP;  // Stack pointer register.
 const Register FPREG = FP;  // Frame pointer register.
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index 594baf4..95b3f87 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -38,7 +38,7 @@
   R25 = 25,
   R26 = 26,  // THR
   R27 = 27,  // PP
-  R28 = 28,  // CTX
+  R28 = 28,
   R29 = 29,  // FP
   R30 = 30,  // LR
   R31 = 31,  // ZR, CSP
@@ -107,7 +107,6 @@
 // Register aliases.
 const Register TMP = R16;  // Used as scratch register by assembler.
 const Register TMP2 = R17;
-const Register CTX = R28;  // Location of current context at method entry.
 const Register PP = R27;   // Caches object pool pointer in generated code.
 const Register CODE_REG = R24;
 const Register FPREG = FP;          // Frame pointer register.
@@ -151,12 +150,12 @@
 const VRegister kAbiLastPreservedFpuReg = V15;
 const int kAbiPreservedFpuRegCount = 8;
 
-const intptr_t kReservedCpuRegisters =
-    (1 << SPREG) |  // Dart SP
-    (1 << FPREG) | (1 << TMP) | (1 << TMP2) | (1 << PP) | (1 << THR) |
-    (1 << LR) | (1 << R31) |  // C++ SP
-    (1 << CTX) | (1 << R18);  // iOS platform register.
-                              // TODO(rmacnak): Only reserve on Mac & iOS.
+const intptr_t kReservedCpuRegisters = (1 << SPREG) |  // Dart SP
+                                       (1 << FPREG) | (1 << TMP) | (1 << TMP2) |
+                                       (1 << PP) | (1 << THR) | (1 << LR) |
+                                       (1 << R31) |  // C++ SP
+                                       (1 << R18);   // iOS platform register.
+// TODO(rmacnak): Only reserve on Mac & iOS.
 // CPU registers available to Dart allocator.
 const RegList kDartAvailableCpuRegs =
     kAllCpuRegistersList & ~kReservedCpuRegisters;
diff --git a/runtime/vm/constants_dbc.h b/runtime/vm/constants_dbc.h
index b86780e..b30f42c 100644
--- a/runtime/vm/constants_dbc.h
+++ b/runtime/vm/constants_dbc.h
@@ -310,7 +310,7 @@
 //    this instruction does so, and skips the following instruction. Otherwise,
 //    the following instruction is not skipped.
 //
-//  - StoreStaticT`OS D
+//  - StoreStaticTOS D
 //
 //    Stores TOS into the static field PP[D].
 //
@@ -908,7 +908,7 @@
   V(Entry,                                 D, num, ___, ___) \
   V(EntryOptimized,                      A_D, num, num, ___) \
   V(Frame,                                 D, num, ___, ___) \
-  V(SetFrame,                              A, num, ___, num) \
+  V(SetFrame,                              A, num, ___, ___) \
   V(AllocateContext,                       D, num, ___, ___) \
   V(AllocateUninitializedContext,        A_D, reg, num, ___) \
   V(CloneContext,                          0, ___, ___, ___) \
@@ -1080,7 +1080,6 @@
 const intptr_t CODE_REG = 0;
 const intptr_t kExceptionObjectReg = 0;
 const intptr_t kStackTraceObjectReg = 0;
-const intptr_t CTX = 0;
 
 enum FpuRegister {
   kNoFpuRegister = -1,
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index 7b4dd5c..1f4e449 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -56,7 +56,6 @@
 // Register aliases.
 const Register TMP = kNoRegister;   // No scratch register used by assembler.
 const Register TMP2 = kNoRegister;  // No second assembler scratch register.
-const Register CTX = EDI;  // Location of current context at method entry.
 const Register CODE_REG = EDI;
 const Register PP = kNoRegister;     // No object pool pointer.
 const Register SPREG = ESP;          // Stack pointer register.
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index 9f9168f..3032fcf 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -99,7 +99,6 @@
 // Register aliases.
 const Register TMP = R11;  // Used as scratch register by the assembler.
 const Register TMP2 = kNoRegister;  // No second assembler scratch register.
-const Register CTX = R12;  // Location of current context at method entry.
 // Caches object pool pointer in generated code.
 const Register PP = R15;
 const Register SPREG = RSP;          // Stack pointer register.
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index eff8af8..43db729 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1511,6 +1511,9 @@
   Isolate* I = T->isolate();
   CHECK_NULL(script_snapshot_buffer);
   CHECK_NULL(script_snapshot_size);
+  if (I->strong()) {
+    return Api::NewError("Script snapshots are not supported in Dart 2");
+  }
   // Finalize all classes if needed.
   Dart_Handle state = Api::CheckAndFinalizePendingClasses(T);
   if (::Dart_IsError(state)) {
@@ -5202,6 +5205,9 @@
   if (buffer == NULL) {
     RETURN_NULL_ERROR(buffer);
   }
+  if (I->strong()) {
+    return Api::NewError("Script snapshots are not supported in Dart 2");
+  }
   NoHeapGrowthControlScope no_growth_control;
 
   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index fc532c3..a7d2eb9 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -1927,14 +1927,14 @@
       "  var a = createExternalByteData();"
       "  Expect.equals(length, a.lengthInBytes);"
       "  for (int i = 0; i < length; i+=2) {"
-      "    Expect.equals(0x4241, a.getInt16(i, Endianness.LITTLE_ENDIAN));"
+      "    Expect.equals(0x4241, a.getInt16(i, Endian.little));"
       "  }"
       "  for (int i = 0; i < length; i+=2) {"
       "    a.setInt8(i, 0x24);"
       "    a.setInt8(i + 1, 0x28);"
       "  }"
       "  for (int i = 0; i < length; i+=2) {"
-      "    Expect.equals(0x2824, a.getInt16(i, Endianness.LITTLE_ENDIAN));"
+      "    Expect.equals(0x2824, a.getInt16(i, Endian.little));"
       "  }"
       "  return a;"
       "}\n";
@@ -1995,10 +1995,10 @@
       "}\n"
       "ByteData createExternalByteData() native 'CreateExternalByteData';"
       "access(ByteData a) {"
-      "  Expect.equals(0x04030201, a.getUint32(0, Endianness.LITTLE_ENDIAN));"
-      "  Expect.equals(0x08070605, a.getUint32(4, Endianness.LITTLE_ENDIAN));"
-      "  Expect.equals(0x0c0b0a09, a.getUint32(8, Endianness.LITTLE_ENDIAN));"
-      "  Expect.equals(0x100f0e0d, a.getUint32(12, Endianness.LITTLE_ENDIAN));"
+      "  Expect.equals(0x04030201, a.getUint32(0, Endian.little));"
+      "  Expect.equals(0x08070605, a.getUint32(4, Endian.little));"
+      "  Expect.equals(0x0c0b0a09, a.getUint32(8, Endian.little));"
+      "  Expect.equals(0x100f0e0d, a.getUint32(12, Endian.little));"
       "}"
       "ByteData main() {"
       "  var length = 16;"
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index de94a29..eb78a50 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -1280,6 +1280,11 @@
 static void RecordChanges(const GrowableObjectArray& changed_in_last_reload,
                           const Class& old_cls,
                           const Class& new_cls) {
+  // All members of enum classes are synthetic, so nothing to report here.
+  if (new_cls.is_enum_class()) {
+    return;
+  }
+
   // Don't report synthetic classes like the superclass of
   // `class MA extends S with M {}` or `class MA = S with M'. The relevant
   // changes with be reported as changes in M.
diff --git a/runtime/vm/isolate_reload_test.cc b/runtime/vm/isolate_reload_test.cc
index f65c9e4..20edba6 100644
--- a/runtime/vm/isolate_reload_test.cc
+++ b/runtime/vm/isolate_reload_test.cc
@@ -2254,7 +2254,7 @@
   intptr_t saved_subclass_count = subclasses.Length();
 
   const char* kScript =
-      "class AIterator extends Iterator {\n"
+      "abstract class AIterator extends Iterator {\n"
       "}\n"
       "main() {\n"
       "  return 1;\n"
@@ -2275,7 +2275,7 @@
   const char* kReloadScript =
       "class AIterator {\n"
       "}\n"
-      "class BIterator extends Iterator {\n"
+      "abstract class BIterator extends Iterator {\n"
       "}\n"
       "main() {\n"
       "  return 2;\n"
@@ -2310,7 +2310,7 @@
   intptr_t saved_subclass_count = subclasses.Length();
 
   const char* kScript =
-      "class AIterator extends Iterator {\n"
+      "abstract class AIterator extends Iterator {\n"
       "}\n"
       "main() {\n"
       "  return 1;\n"
@@ -2329,7 +2329,7 @@
   EXPECT_STREQ("AIterator", name.ToCString());
 
   const char* kReloadScript =
-      "class BIterator extends Iterator {\n"
+      "abstract class BIterator extends Iterator {\n"
       "}\n"
       "main() {\n"
       "  return 2;\n"
@@ -2369,7 +2369,7 @@
   intptr_t saved_subclass_count = subclasses.Length();
 
   const char* kScript =
-      "class AIterator extends Iterator {\n"
+      "abstract class AIterator extends Iterator {\n"
       "}\n"
       "class Foo {\n"
       "  final a;\n"
@@ -2394,7 +2394,7 @@
 
   // Attempt to reload with a bogus script.
   const char* kReloadScript =
-      "class BIterator extends Iterator {\n"
+      "abstract class BIterator extends Iterator {\n"
       "}\n"
       "class Foo {\n"
       "  final a kjsdf ksjdf ;\n"  // When we refinalize, we get an error.
diff --git a/runtime/vm/kernel.cc b/runtime/vm/kernel.cc
index 8cbc078..5394e53 100644
--- a/runtime/vm/kernel.cc
+++ b/runtime/vm/kernel.cc
@@ -29,6 +29,95 @@
   return field_helper.FieldHasFunctionLiteralInitializer(start, end);
 }
 
+uint32_t KernelSourceFingerprintHelper::CalculateClassFingerprint(
+    const Class& klass) {
+  Zone* zone = Thread::Current()->zone();
+
+  // Handle typedefs.
+  if (klass.IsTypedefClass()) {
+    const Function& func = Function::Handle(zone, klass.signature_function());
+    return CalculateFunctionFingerprint(func);
+  }
+
+  String& name = String::Handle(zone, klass.Name());
+  const Array& fields = Array::Handle(zone, klass.fields());
+  const Array& functions = Array::Handle(zone, klass.functions());
+  const Array& interfaces = Array::Handle(zone, klass.interfaces());
+  AbstractType& type = AbstractType::Handle(zone);
+
+  uint32_t hash = 0;
+  hash = KernelFingerprintHelper::CalculateHash(hash, name.Hash());
+
+  type ^= klass.super_type();
+  if (!type.IsNull()) {
+    name ^= type.Name();
+    hash = KernelFingerprintHelper::CalculateHash(hash, name.Hash());
+  }
+
+  type ^= klass.mixin();
+  if (!type.IsNull()) {
+    name ^= type.Name();
+    hash = KernelFingerprintHelper::CalculateHash(hash, name.Hash());
+  }
+
+  Field& field = Field::Handle(zone);
+  // Calculate fingerprint for the class fields.
+  for (intptr_t i = 0; i < fields.Length(); ++i) {
+    field ^= fields.At(i);
+    uint32_t fingerprint = CalculateFieldFingerprint(field);
+    hash = KernelFingerprintHelper::CalculateHash(hash, fingerprint);
+  }
+
+  // Calculate fingerprint for the class functions.
+  Function& func = Function::Handle(zone);
+  for (intptr_t i = 0; i < functions.Length(); ++i) {
+    func ^= functions.At(i);
+    uint32_t fingerprint = CalculateFunctionFingerprint(func);
+    hash = KernelFingerprintHelper::CalculateHash(hash, fingerprint);
+  }
+
+  // Calculate fingerprint for the interfaces.
+  for (intptr_t i = 0; i < interfaces.Length(); ++i) {
+    type ^= interfaces.At(i);
+    name ^= type.Name();
+    hash = KernelFingerprintHelper::CalculateHash(hash, name.Hash());
+  }
+
+  return hash;
+}
+
+uint32_t KernelSourceFingerprintHelper::CalculateFieldFingerprint(
+    const Field& field) {
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  const Script& script = Script::Handle(zone, field.Script());
+
+  TranslationHelper translation_helper(thread);
+  translation_helper.InitFromScript(script);
+
+  KernelFingerprintHelper helper(zone, &translation_helper, script,
+                                 TypedData::Handle(zone, field.KernelData()),
+                                 field.KernelDataProgramOffset());
+  helper.SetOffset(field.kernel_offset());
+  return helper.CalculateFieldFingerprint();
+}
+
+uint32_t KernelSourceFingerprintHelper::CalculateFunctionFingerprint(
+    const Function& func) {
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  const Script& script = Script::Handle(zone, func.script());
+
+  TranslationHelper translation_helper(thread);
+  translation_helper.InitFromScript(script);
+
+  KernelFingerprintHelper helper(zone, &translation_helper, script,
+                                 TypedData::Handle(zone, func.KernelData()),
+                                 func.KernelDataProgramOffset());
+  helper.SetOffset(func.kernel_offset());
+  return helper.CalculateFunctionFingerprint();
+}
+
 KernelLineStartsReader::KernelLineStartsReader(
     const dart::TypedData& line_starts_data,
     dart::Zone* zone)
diff --git a/runtime/vm/kernel.h b/runtime/vm/kernel.h
index deb900d..8568139 100644
--- a/runtime/vm/kernel.h
+++ b/runtime/vm/kernel.h
@@ -123,6 +123,13 @@
   DISALLOW_COPY_AND_ASSIGN(Program);
 };
 
+class KernelSourceFingerprintHelper {
+ public:
+  static uint32_t CalculateClassFingerprint(const Class& klass);
+  static uint32_t CalculateFieldFingerprint(const Field& field);
+  static uint32_t CalculateFunctionFingerprint(const Function& func);
+};
+
 class KernelLineStartsReader {
  public:
   KernelLineStartsReader(const dart::TypedData& line_starts_data,
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index bf28e59..a5521fc 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -315,16 +315,16 @@
   // the root name as in the canonical name table.
   NameIndex ReadCanonicalNameReference() { return NameIndex(ReadUInt() - 1); }
 
-  intptr_t offset() { return offset_; }
+  intptr_t offset() const { return offset_; }
   void set_offset(intptr_t offset) { offset_ = offset; }
 
-  intptr_t size() { return size_; }
+  intptr_t size() const { return size_; }
   void set_size(intptr_t size) { size_ = size; }
 
-  const TypedData* typed_data() { return typed_data_; }
+  const TypedData* typed_data() const { return typed_data_; }
   void set_typed_data(const TypedData* typed_data) { typed_data_ = typed_data; }
 
-  const uint8_t* raw_buffer() { return raw_buffer_; }
+  const uint8_t* raw_buffer() const { return raw_buffer_; }
   void set_raw_buffer(const uint8_t* raw_buffer) { raw_buffer_ = raw_buffer; }
 
   void CopyDataToVMHeap(const TypedData& typed_data,
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index a297180..c856133 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -110,9 +110,9 @@
 Instance* Object::null_instance_ = NULL;
 Function* Object::null_function_ = NULL;
 TypeArguments* Object::null_type_arguments_ = NULL;
+TypeArguments* Object::empty_type_arguments_ = NULL;
 Array* Object::empty_array_ = NULL;
 Array* Object::zero_array_ = NULL;
-Context* Object::empty_context_ = NULL;
 ContextScope* Object::empty_context_scope_ = NULL;
 ObjectPool* Object::empty_object_pool_ = NULL;
 PcDescriptors* Object::empty_descriptors_ = NULL;
@@ -506,9 +506,9 @@
   null_instance_ = Instance::ReadOnlyHandle();
   null_function_ = Function::ReadOnlyHandle();
   null_type_arguments_ = TypeArguments::ReadOnlyHandle();
+  empty_type_arguments_ = TypeArguments::ReadOnlyHandle();
   empty_array_ = Array::ReadOnlyHandle();
   zero_array_ = Array::ReadOnlyHandle();
-  empty_context_ = Context::ReadOnlyHandle();
   empty_context_scope_ = ContextScope::ReadOnlyHandle();
   empty_object_pool_ = ObjectPool::ReadOnlyHandle();
   empty_descriptors_ = PcDescriptors::ReadOnlyHandle();
@@ -538,6 +538,7 @@
   *null_instance_ = Instance::null();
   *null_function_ = Function::null();
   *null_type_arguments_ = TypeArguments::null();
+  *empty_type_arguments_ = TypeArguments::null();
 
   // Initialize the empty and zero array handles to null_ in order to be able to
   // check if the empty and zero arrays were allocated (RAW_NULL is not
@@ -775,17 +776,6 @@
     zero_array_->SetCanonical();
   }
 
-  // Allocate and initialize the empty context object.
-  {
-    uword address = heap->Allocate(Context::InstanceSize(0), Heap::kOld);
-    InitializeObject(address, kContextCid, Context::InstanceSize(0), true);
-    Context::initializeHandle(empty_context_, reinterpret_cast<RawContext*>(
-                                                  address + kHeapObjectTag));
-    empty_context_->StoreNonPointer(&empty_context_->raw_ptr()->num_variables_,
-                                    0);
-    empty_context_->SetCanonical();
-  }
-
   // Allocate and initialize the canonical empty context scope object.
   {
     uword address = heap->Allocate(ContextScope::InstanceSize(0), Heap::kOld);
@@ -857,6 +847,21 @@
     empty_exception_handlers_->SetCanonical();
   }
 
+  // Allocate and initialize the canonical empty type arguments object.
+  {
+    uword address = heap->Allocate(TypeArguments::InstanceSize(0), Heap::kOld);
+    InitializeObject(address, kTypeArgumentsCid, TypeArguments::InstanceSize(0),
+                     true);
+    TypeArguments::initializeHandle(
+        empty_type_arguments_,
+        reinterpret_cast<RawTypeArguments*>(address + kHeapObjectTag));
+    empty_type_arguments_->StoreSmi(&empty_type_arguments_->raw_ptr()->length_,
+                                    Smi::New(0));
+    empty_type_arguments_->StoreSmi(&empty_type_arguments_->raw_ptr()->hash_,
+                                    Smi::New(0));
+    empty_type_arguments_->SetCanonical();
+  }
+
   // The VM isolate snapshot object table is initialized to an empty array
   // as we do not have any VM isolate snapshot at this time.
   *vm_isolate_snapshot_object_table_ = Object::empty_array().raw();
@@ -962,8 +967,6 @@
   ASSERT(empty_array_->IsArray());
   ASSERT(!zero_array_->IsSmi());
   ASSERT(zero_array_->IsArray());
-  ASSERT(!empty_context_->IsSmi());
-  ASSERT(empty_context_->IsContext());
   ASSERT(!empty_context_scope_->IsSmi());
   ASSERT(empty_context_scope_->IsContextScope());
   ASSERT(!empty_descriptors_->IsSmi());
@@ -3715,8 +3718,16 @@
 }
 
 int32_t Class::SourceFingerprint() const {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  if (kernel_offset() > 0) {
+    return kernel::KernelSourceFingerprintHelper::CalculateClassFingerprint(
+        *this);
+  }
   return Script::Handle(script()).SourceFingerprint(token_pos(),
                                                     ComputeEndTokenPos());
+#else
+  return 0;
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
 }
 
 void Class::set_is_implemented() const {
@@ -4855,6 +4866,28 @@
   return result;
 }
 
+RawTypeArguments* TypeArguments::Prepend(Zone* zone,
+                                         const TypeArguments& other,
+                                         intptr_t total_length) const {
+  if (IsNull() && other.IsNull()) {
+    return Object::null_type_arguments().raw();
+  }
+  const TypeArguments& result =
+      TypeArguments::Handle(zone, TypeArguments::New(total_length, Heap::kNew));
+  AbstractType& type = AbstractType::Handle(zone);
+  const intptr_t split =
+      other.IsNull() ? total_length - Length() : other.Length();
+  for (intptr_t i = 0; i < split; i++) {
+    type = other.IsNull() ? Type::DynamicType() : other.TypeAt(i);
+    result.SetTypeAt(i, type);
+  }
+  for (intptr_t i = split; i < total_length; i++) {
+    type = IsNull() ? Type::DynamicType() : TypeAt(i - split);
+    result.SetTypeAt(i, type);
+  }
+  return result.Canonicalize();
+}
+
 RawString* TypeArguments::SubvectorName(intptr_t from_index,
                                         intptr_t len,
                                         NameVisibility name_visibility) const {
@@ -5805,6 +5838,8 @@
     // The parent function of an implicit closure function is not the enclosing
     // function we are asking about here.
     return false;
+  } else if (IsConvertedClosureFunction()) {
+    return NumParentTypeParameters() > 0;
   }
   Function& parent = Function::Handle(parent_function());
   while (!parent.IsNull()) {
@@ -6212,6 +6247,8 @@
 intptr_t Function::NumParentTypeParameters() const {
   if (IsImplicitClosureFunction()) {
     return 0;
+  } else if (IsConvertedClosureFunction()) {
+    return num_parent_type_parameters();
   }
   Thread* thread = Thread::Current();
   Function& parent = Function::Handle(parent_function());
@@ -6738,21 +6775,10 @@
     }
   }
 
-  Function& sig = Function::Handle(zone, Function::null());
-  if (IsConvertedClosureFunction() && !delete_type_parameters) {
-    sig = Function::NewConvertedClosureFunction(
-        String::Handle(zone, name()), parent, TokenPosition::kNoSource);
-    // TODO(30455): Kernel generic methods undone. Handle type parameters
-    // correctly when generic closures are supported. Until then, all type
-    // parameters to this target are used for captured type variables, so they
-    // aren't relevant to the type of the function.
-    sig.set_type_parameters(TypeArguments::Handle(zone, TypeArguments::null()));
-  } else {
-    sig = Function::NewSignatureFunction(owner, parent,
-                                         TokenPosition::kNoSource, space);
-    if (!delete_type_parameters) {
-      sig.set_type_parameters(TypeArguments::Handle(zone, type_parameters()));
-    }
+  Function& sig = Function::Handle(Function::NewSignatureFunction(
+      owner, parent, TokenPosition::kNoSource, space));
+  if (!delete_type_parameters) {
+    sig.set_type_parameters(TypeArguments::Handle(zone, type_parameters()));
   }
 
   AbstractType& type = AbstractType::Handle(zone, result_type());
@@ -7425,7 +7451,8 @@
 //
 // Function::ConvertedClosureFunction method follows the logic of
 // Function::ImplicitClosureFunction method.
-RawFunction* Function::ConvertedClosureFunction() const {
+RawFunction* Function::ConvertedClosureFunction(
+    intptr_t num_parent_type_parameters) const {
   // Return the existing converted closure function if any.
   if (converted_closure_function() != Function::null()) {
     return converted_closure_function();
@@ -7443,8 +7470,28 @@
   closure_function.set_context_scope(Object::empty_context_scope());
 
   // Set closure function's type parameters.
-  closure_function.set_type_parameters(
-      TypeArguments::Handle(zone, type_parameters()));
+  {
+    TypeArguments& total_type_parameters =
+        TypeArguments::Handle(type_parameters());
+
+    intptr_t num_type_parameters =
+        total_type_parameters.Length() - num_parent_type_parameters;
+    if (num_type_parameters == 0) {
+      closure_function.set_type_parameters(Object::null_type_arguments());
+    } else {
+      ASSERT(num_type_parameters > 0);
+      TypeArguments& new_type_parameters =
+          TypeArguments::Handle(TypeArguments::New(num_type_parameters));
+
+      for (intptr_t i = 0; i < num_type_parameters; ++i) {
+        new_type_parameters.SetTypeAt(
+            i, AbstractType::Handle(total_type_parameters.TypeAt(
+                   i + num_parent_type_parameters)));
+      }
+      closure_function.set_type_parameters(new_type_parameters);
+    }
+    closure_function.set_num_parent_type_parameters(num_parent_type_parameters);
+  }
 
   // Set closure function's result type to this result type.
   closure_function.set_result_type(AbstractType::Handle(zone, result_type()));
@@ -7507,6 +7554,26 @@
   }
 }
 
+void Function::set_num_parent_type_parameters(intptr_t num) const {
+  if (IsConvertedClosureFunction()) {
+    const Object& obj = Object::Handle(raw_ptr()->data_);
+    ASSERT(!obj.IsNull());
+    ClosureData::Cast(obj).set_num_parent_type_parameters(num);
+    return;
+  }
+  UNREACHABLE();
+}
+
+intptr_t Function::num_parent_type_parameters() const {
+  if (IsConvertedClosureFunction()) {
+    const Object& obj = Object::Handle(raw_ptr()->data_);
+    ASSERT(!obj.IsNull());
+    return ClosureData::Cast(obj).num_parent_type_parameters();
+  }
+  UNREACHABLE();
+  return 0;
+}
+
 void Function::BuildSignatureParameters(
     Thread* thread,
     Zone* zone,
@@ -7569,7 +7636,7 @@
   ASSERT(IsImplicitStaticClosureFunction());
   if (implicit_static_closure() == Instance::null()) {
     Zone* zone = Thread::Current()->zone();
-    const Context& context = Object::empty_context();
+    const Context& context = Context::Handle(zone);
     Instance& closure =
         Instance::Handle(zone, Closure::New(Object::null_type_arguments(),
                                             Object::null_type_arguments(),
@@ -7645,35 +7712,6 @@
 bool Function::HasInstantiatedSignature(Genericity genericity,
                                         intptr_t num_free_fun_type_params,
                                         TrailPtr trail) const {
-  // This function works differently for converted closures.
-  //
-  // Unlike regular closures, it's not possible to know which type parameters
-  // are supposed to come from parent functions or classes and which are
-  // actually parameters to the closure it represents. For example, consider:
-  //
-  //     class C<T> {
-  //       getf() => (T x) { return x; }
-  //     }
-  //
-  //     class D {
-  //       getf() {
-  //         dynamic fn<T>(T x) { return x; }
-  //         return fn;
-  //       }
-  //     }
-  //
-  // The signature of `fn` as a converted closure will in both cases look like
-  // `<T>(T) => dynamic`, because the signature of the converted closure
-  // function is the same as its top-level target function. However, in the
-  // first case the closure's type is instantiated, and in the second case
-  // it's not.
-  //
-  // Since we can never assume a converted closure is instantiated if it has any
-  // type parameters, we always return true in these cases.
-  if (IsConvertedClosureFunction()) {
-    return genericity == kCurrentClass || NumTypeParameters() == 0;
-  }
-
   if (num_free_fun_type_params == kCurrentAndEnclosingFree) {
     num_free_fun_type_params = kAllFree;
   } else if (genericity != kCurrentClass) {
@@ -7896,8 +7934,16 @@
 // Construct fingerprint from token stream. The token stream contains also
 // arguments.
 int32_t Function::SourceFingerprint() const {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  if (kernel_offset() > 0) {
+    return kernel::KernelSourceFingerprintHelper::CalculateFunctionFingerprint(
+        *this);
+  }
   return Script::Handle(script()).SourceFingerprint(token_pos(),
                                                     end_token_pos());
+#else
+  return 0;
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
 }
 
 void Function::SaveICDataMap(
@@ -8073,6 +8119,14 @@
                      const_str);
 }
 
+intptr_t ClosureData::num_parent_type_parameters() const {
+  return Smi::Value(raw_ptr()->num_parent_type_parameters_);
+}
+
+void ClosureData::set_num_parent_type_parameters(intptr_t value) const {
+  StorePointer(&raw_ptr()->num_parent_type_parameters_, Smi::New(value));
+}
+
 void ClosureData::set_context_scope(const ContextScope& value) const {
   StorePointer(&raw_ptr()->context_scope_, value.raw());
 }
@@ -8440,8 +8494,16 @@
 }
 
 int32_t Field::SourceFingerprint() const {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  if (kernel_offset() > 0) {
+    return kernel::KernelSourceFingerprintHelper::CalculateFieldFingerprint(
+        *this);
+  }
   return Script::Handle(Script()).SourceFingerprint(token_pos(),
                                                     end_token_pos());
+#else
+  return 0;
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
 }
 
 RawString* Field::InitializingExpression() const {
@@ -17603,7 +17665,6 @@
 RawAbstractType* Type::CloneUninstantiated(const Class& new_owner,
                                            TrailPtr trail) const {
   ASSERT(IsFinalized());
-  ASSERT(IsCanonical());
   ASSERT(!IsMalformed());
   if (IsInstantiated()) {
     return raw();
@@ -22714,6 +22775,8 @@
                         instantiator_type_arguments.raw());
     result.StorePointer(&result.raw_ptr()->function_type_arguments_,
                         function_type_arguments.raw());
+    result.StorePointer(&result.raw_ptr()->delayed_type_arguments_,
+                        Object::empty_type_arguments().raw());
     result.StorePointer(&result.raw_ptr()->function_, function.raw());
     result.StorePointer(&result.raw_ptr()->context_, context.raw());
   }
@@ -22728,16 +22791,24 @@
 
 RawFunction* Closure::GetInstantiatedSignature(Zone* zone) const {
   Function& sig_fun = Function::Handle(zone, function());
-  const TypeArguments& fn_type_args =
+  TypeArguments& fn_type_args =
       TypeArguments::Handle(zone, function_type_arguments());
+  const TypeArguments& delayed_type_args =
+      TypeArguments::Handle(zone, delayed_type_arguments());
   const TypeArguments& inst_type_args =
       TypeArguments::Handle(zone, instantiator_type_arguments());
+
   // We detect the case of a partial tearoff type application and substitute the
   // type arguments for the type parameters of the function.
-  intptr_t num_free_params =
-      sig_fun.IsImplicitClosureFunction() && !fn_type_args.IsNull()
-          ? kCurrentAndEnclosingFree
-          : kAllFree;
+  intptr_t num_free_params;
+  if (delayed_type_args.raw() != Object::empty_type_arguments().raw()) {
+    num_free_params = kCurrentAndEnclosingFree;
+    fn_type_args = delayed_type_args.Prepend(
+        zone, fn_type_args,
+        sig_fun.NumTypeParameters() + sig_fun.NumParentTypeParameters());
+  } else {
+    num_free_params = kAllFree;
+  }
   if (num_free_params == kCurrentAndEnclosingFree ||
       !sig_fun.HasInstantiatedSignature(kAny)) {
     return sig_fun.InstantiateSignatureFrom(inst_type_args, fn_type_args,
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index de0a01a..ea2c4d5 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -370,6 +370,10 @@
     ASSERT(null_type_arguments_ != NULL);
     return *null_type_arguments_;
   }
+  static const TypeArguments& empty_type_arguments() {
+    ASSERT(empty_type_arguments_ != NULL);
+    return *empty_type_arguments_;
+  }
 
   static const Array& empty_array() {
     ASSERT(empty_array_ != NULL);
@@ -380,11 +384,6 @@
     return *zero_array_;
   }
 
-  static const Context& empty_context() {
-    ASSERT(empty_context_ != NULL);
-    return *empty_context_;
-  }
-
   static const ContextScope& empty_context_scope() {
     ASSERT(empty_context_scope_ != NULL);
     return *empty_context_scope_;
@@ -817,9 +816,9 @@
   static Instance* null_instance_;
   static Function* null_function_;
   static TypeArguments* null_type_arguments_;
+  static TypeArguments* empty_type_arguments_;
   static Array* empty_array_;
   static Array* zero_array_;
-  static Context* empty_context_;
   static ContextScope* empty_context_scope_;
   static ObjectPool* empty_object_pool_;
   static PcDescriptors* empty_descriptors_;
@@ -2163,6 +2162,11 @@
   RawArray* parameter_names() const { return raw_ptr()->parameter_names_; }
   void set_parameter_names(const Array& value) const;
 
+  // For converted closure functions: indicate how many type parameters on the
+  // target are actually captured.
+  void set_num_parent_type_parameters(intptr_t num) const;
+  intptr_t num_parent_type_parameters() const;
+
   // The type parameters (and their bounds) are specified as an array of
   // TypeParameter.
   RawTypeArguments* type_parameters() const {
@@ -2300,7 +2304,8 @@
   // If none exists yet, create one and remember it.  See the comment on
   // ConvertedClosureFunction definition in runtime/vm/object.cc for elaborate
   // explanation.
-  RawFunction* ConvertedClosureFunction() const;
+  RawFunction* ConvertedClosureFunction(
+      intptr_t num_parent_type_parameters) const;
   void DropUncompiledConvertedClosureFunction() const;
 
   // Return the closure implicitly created for this function.
@@ -2983,6 +2988,9 @@
   RawInstance* implicit_static_closure() const { return raw_ptr()->closure_; }
   void set_implicit_static_closure(const Instance& closure) const;
 
+  intptr_t num_parent_type_parameters() const;
+  void set_num_parent_type_parameters(intptr_t value) const;
+
   static RawClosureData* New();
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(ClosureData, Object);
@@ -5741,6 +5749,10 @@
     return IsDynamicTypes(true, 0, len);
   }
 
+  RawTypeArguments* Prepend(Zone* zone,
+                            const TypeArguments& other,
+                            intptr_t total_length) const;
+
   // Check if the subvector of length 'len' starting at 'from_index' of this
   // type argument vector consists solely of DynamicType, ObjectType, or
   // VoidType.
@@ -8744,6 +8756,13 @@
     return OFFSET_OF(RawClosure, function_type_arguments_);
   }
 
+  RawTypeArguments* delayed_type_arguments() const {
+    return raw_ptr()->delayed_type_arguments_;
+  }
+  static intptr_t delayed_type_arguments_offset() {
+    return OFFSET_OF(RawClosure, delayed_type_arguments_);
+  }
+
   RawFunction* function() const { return raw_ptr()->function_; }
   static intptr_t function_offset() { return OFFSET_OF(RawClosure, function_); }
 
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index de84a19..5d52cbd 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -983,7 +983,8 @@
   RawFunction* parent_function_;  // Enclosing function of this local function.
   RawType* signature_type_;
   RawInstance* closure_;  // Closure object for static implicit closures.
-  VISIT_TO(RawObject*, closure_);
+  RawSmi* num_parent_type_parameters_;  // For converted closures only
+  VISIT_TO(RawObject*, num_parent_type_parameters_);
 
   friend class Function;
 };
@@ -1894,17 +1895,21 @@
   VISIT_FROM(RawCompressed, instantiator_type_arguments_)
   RawTypeArguments* instantiator_type_arguments_;
   RawTypeArguments* function_type_arguments_;
+  RawTypeArguments* delayed_type_arguments_;
   RawFunction* function_;
   RawContext* context_;
   RawSmi* hash_;
+
   VISIT_TO(RawCompressed, hash_)
 
-  // Note that instantiator_type_arguments_ and function_type_arguments_ are
-  // used to instantiate the signature of function_ when this closure is
-  // involved in a type test. In other words, these fields define the function
-  // type of this closure instance, but they are not used when invoking it.
-  // Whereas the source frontend will save a copy of the function's type
-  // arguments in the closure's context and only use the
+  // Note that instantiator_type_arguments_, function_type_arguments_ and
+  // delayed_type_arguments_ are used to instantiate the signature of function_
+  // when this closure is involved in a type test. In other words, these fields
+  // define the function type of this closure instance.
+  //
+  // function_type_arguments_ and delayed_type_arguments_ may also be used when
+  // invoking the closure. Whereas the source frontend will save a copy of the
+  // function's type arguments in the closure's context and only use the
   // function_type_arguments_ field for type tests, the kernel frontend will use
   // the function_type_arguments_ vector here directly.
   //
@@ -1913,6 +1918,12 @@
   // if the generic closure function_ has a generic parent function, the
   // passed-in function type arguments get concatenated to the function type
   // arguments of the parent that are found in the context_.
+  //
+  // delayed_type_arguments_ is used to support the parital instantiation
+  // feature. When this field is set to any value other than
+  // Object::empty_type_arguments(), the types in this vector will be passed as
+  // type arguments to the closure when invoked. In this case there may not be
+  // any type arguments passed directly (or NSM will be invoked instead).
 };
 
 class RawNumber : public RawInstance {
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index dd41cf1..bac281c 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -1478,9 +1478,7 @@
   int32_t num_vars = reader->Read<int32_t>();
   Context& context = Context::ZoneHandle(reader->zone());
   reader->AddBackRef(object_id, &context, kIsDeserialized);
-  if (num_vars == 0) {
-    context ^= Object::empty_context().raw();
-  } else {
+  if (num_vars != 0) {
     context ^= Context::New(num_vars);
 
     // Set all the object fields.
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index 4dbb6b6..e07e393 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -643,7 +643,8 @@
           (variable->name().raw() == Symbols::StackTraceVar().raw()) ||
           (variable->name().raw() == Symbols::ExceptionVar().raw()) ||
           (variable->name().raw() == Symbols::SavedTryContextVar().raw()) ||
-          (variable->name().raw() == Symbols::ArgDescVar().raw())) {
+          (variable->name().raw() == Symbols::ArgDescVar().raw()) ||
+          (variable->name().raw() == Symbols::FunctionTypeArgumentsVar().raw())) {
         // Don't capture those variables because the VM expects them to be on
         // the stack.
         continue;
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index ca885ea..1efbaa8 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -133,7 +133,7 @@
                                  "sp",  "ip",  "fp",  "pp",  "ctx"};
   static const Register kRegisters[] = {R0, R1, R2,  R3,  R4,  R5,  R6,  R7,
                                         R8, R9, R10, R11, R12, R13, R14, R15,
-                                        PC, LR, SP,  IP,  FP,  PP,  CTX};
+                                        PC, LR, SP,  IP,  FP,  PP};
   ASSERT(ARRAY_SIZE(kNames) == ARRAY_SIZE(kRegisters));
   for (unsigned i = 0; i < ARRAY_SIZE(kNames); i++) {
     if (strcmp(kNames[i], name) == 0) {
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index c115b7c..3db2d65 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -133,14 +133,14 @@
       "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
       "r24", "r25", "r26", "r27", "r28", "r29", "r30",
 
-      "ip0", "ip1", "pp",  "ctx", "fp",  "lr",  "sp",  "zr",
+      "ip0", "ip1", "pp",  "fp",  "lr",  "sp",  "zr",
   };
   static const Register kRegisters[] = {
       R0,  R1,  R2,  R3,  R4,  R5,  R6,  R7,  R8,  R9,  R10,
       R11, R12, R13, R14, R15, R16, R17, R18, R19, R20, R21,
       R22, R23, R24, R25, R26, R27, R28, R29, R30,
 
-      IP0, IP1, PP,  CTX, FP,  LR,  R31, ZR,
+      IP0, IP1, PP,  FP,  LR,  R31, ZR,
   };
   ASSERT(ARRAY_SIZE(kNames) == ARRAY_SIZE(kRegisters));
   for (unsigned i = 0; i < ARRAY_SIZE(kNames); i++) {
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 447fbf4..d3667ce 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -751,13 +751,14 @@
   READ_VM_SINGLETON_OBJ(kZeroArrayObject, Object::zero_array().raw());
   READ_VM_SINGLETON_OBJ(kDynamicType, Object::dynamic_type().raw());
   READ_VM_SINGLETON_OBJ(kVoidType, Object::void_type().raw());
+  READ_VM_SINGLETON_OBJ(kEmptyTypeArguments,
+                        Object::empty_type_arguments().raw());
   READ_VM_SINGLETON_OBJ(kTrueValue, Bool::True().raw());
   READ_VM_SINGLETON_OBJ(kFalseValue, Bool::False().raw());
   READ_VM_SINGLETON_OBJ(kExtractorParameterTypes,
                         Object::extractor_parameter_types().raw());
   READ_VM_SINGLETON_OBJ(kExtractorParameterNames,
                         Object::extractor_parameter_names().raw());
-  READ_VM_SINGLETON_OBJ(kEmptyContextObject, Object::empty_context().raw());
   READ_VM_SINGLETON_OBJ(kEmptyContextScopeObject,
                         Object::empty_context_scope().raw());
   READ_VM_SINGLETON_OBJ(kEmptyObjectPool, Object::empty_object_pool().raw());
@@ -1018,13 +1019,14 @@
   WRITE_VM_SINGLETON_OBJ(Object::zero_array().raw(), kZeroArrayObject);
   WRITE_VM_SINGLETON_OBJ(Object::dynamic_type().raw(), kDynamicType);
   WRITE_VM_SINGLETON_OBJ(Object::void_type().raw(), kVoidType);
+  WRITE_VM_SINGLETON_OBJ(Object::empty_type_arguments().raw(),
+                         kEmptyTypeArguments);
   WRITE_VM_SINGLETON_OBJ(Bool::True().raw(), kTrueValue);
   WRITE_VM_SINGLETON_OBJ(Bool::False().raw(), kFalseValue);
   WRITE_VM_SINGLETON_OBJ(Object::extractor_parameter_types().raw(),
                          kExtractorParameterTypes);
   WRITE_VM_SINGLETON_OBJ(Object::extractor_parameter_names().raw(),
                          kExtractorParameterNames);
-  WRITE_VM_SINGLETON_OBJ(Object::empty_context().raw(), kEmptyContextObject);
   WRITE_VM_SINGLETON_OBJ(Object::empty_context_scope().raw(),
                          kEmptyContextScopeObject);
   WRITE_VM_SINGLETON_OBJ(Object::empty_object_pool().raw(), kEmptyObjectPool);
diff --git a/runtime/vm/snapshot_ids.h b/runtime/vm/snapshot_ids.h
index 3f2464a..d767648 100644
--- a/runtime/vm/snapshot_ids.h
+++ b/runtime/vm/snapshot_ids.h
@@ -42,10 +42,10 @@
   kBoolType,
   kStringType,
   kArrayType,
+  kEmptyTypeArguments,
 
   kExtractorParameterTypes,
   kExtractorParameterNames,
-  kEmptyContextObject,
   kEmptyContextScopeObject,
   kImplicitClosureScopeObject,
   kEmptyObjectPool,
@@ -53,9 +53,9 @@
   kEmptyVarDescriptors,
   kEmptyExceptionHandlers,
   kCachedArgumentsDescriptor0,
-  kCachedArgumentsDescriptorN = (kCachedArgumentsDescriptor0 +
-                                 ArgumentsDescriptor::kCachedDescriptorCount -
-                                 1),
+  kCachedArgumentsDescriptorN =
+      (kCachedArgumentsDescriptor0 +
+       ArgumentsDescriptor::kCachedDescriptorCount - 1),
   kCachedICDataArray0,
   kCachedICDataArrayN =
       (kCachedICDataArray0 + ICData::kCachedICDataArrayCount - 1),
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index c22d567..4d58c04 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -429,24 +429,24 @@
 # This is the main target for copying scripts in _platform_sdk_scripts to bin/
 group("copy_platform_sdk_scripts") {
   visibility = [ ":create_platform_sdk" ]
-  deps = []
+  public_deps = []
   foreach(sdk_script, _platform_sdk_scripts) {
-    deps += [ ":copy_${sdk_script}_script" ]
+    public_deps += [ ":copy_${sdk_script}_script" ]
   }
   foreach(script, _scripts) {
-    deps += [ ":copy_${script}_script" ]
+    public_deps += [ ":copy_${script}_script" ]
   }
 }
 
 # This is the main target for copying scripts in _full_sdk_scripts to bin/
 group("copy_full_sdk_scripts") {
   visibility = [ ":create_full_sdk" ]
-  deps = []
+  public_deps = []
   foreach(sdk_script, _full_sdk_scripts) {
-    deps += [ ":copy_${sdk_script}_script" ]
+    public_deps += [ ":copy_${sdk_script}_script" ]
   }
   foreach(script, _scripts) {
-    deps += [ ":copy_${script}_script" ]
+    public_deps += [ ":copy_${script}_script" ]
   }
 }
 
@@ -473,9 +473,9 @@
 # bin/snapshots
 group("copy_platform_sdk_snapshots") {
   visibility = [ ":create_platform_sdk" ]
-  deps = []
+  public_deps = []
   foreach(snapshot, _platform_sdk_snapshots) {
-    deps += [ ":copy_${snapshot[0]}_snapshot" ]
+    public_deps += [ ":copy_${snapshot[0]}_snapshot" ]
   }
 }
 
@@ -483,18 +483,18 @@
 # bin/snapshots
 group("copy_full_sdk_snapshots") {
   visibility = [ ":create_full_sdk" ]
-  deps = []
+  public_deps = []
   foreach(snapshot, _full_sdk_snapshots) {
-    deps += [ ":copy_${snapshot[0]}_snapshot" ]
+    public_deps += [ ":copy_${snapshot[0]}_snapshot" ]
   }
 }
 
 # This is the main rule for copying analyzer sources to lib/
 group("copy_analyzer_sources") {
   visibility = [ ":create_common_sdk" ]
-  deps = []
+  public_deps = []
   foreach(analyzer_source_dir, _analyzer_source_dirs) {
-    deps += [ ":copy_${analyzer_source_dir}_source_dir" ]
+    public_deps += [ ":copy_${analyzer_source_dir}_source_dir" ]
   }
 }
 
@@ -505,7 +505,7 @@
 # This is the main rule for copying the files that dartdoc needs.
 group("copy_dartdoc_files") {
   visibility = [ ":create_common_sdk" ]
-  deps = [
+  public_deps = [
     ":copy_dartdoc_resources",
     ":copy_dartdoc_templates",
   ]
@@ -732,7 +732,7 @@
     ":copy_dev_compiler_sdk",
     ":copy_dev_compiler_tools",
   ]
-  deps = [
+  public_deps = [
     ":copy_dev_compiler_js_amd",
     ":copy_dev_compiler_js_amd_kernel",
     ":copy_dev_compiler_js_common",
@@ -765,7 +765,7 @@
 # This is the main rule for copying ddc's dependencies to lib/
 group("copy_dev_compiler_sdk") {
   visibility = [ ":create_full_sdk" ]
-  deps = [
+  public_deps = [
     ":copy_dev_compiler_js",
     ":copy_dev_compiler_summary",
     ":copy_dev_compiler_tools",
@@ -819,9 +819,9 @@
     ":create_platform_sdk",
     ":copy_libraries",
   ]
-  deps = []
+  public_deps = []
   foreach(library, _platform_sdk_libraries) {
-    deps += [ ":copy_${library}_library" ]
+    public_deps += [ ":copy_${library}_library" ]
   }
 }
 
@@ -831,19 +831,19 @@
     ":create_full_sdk",
     ":copy_libraries",
   ]
-  deps = []
+  public_deps = []
   foreach(library, _full_sdk_libraries) {
-    deps += [ ":copy_${library}_library" ]
+    public_deps += [ ":copy_${library}_library" ]
   }
 }
 
 group("copy_libraries") {
   if (dart_platform_sdk) {
-    deps = [
+    public_deps = [
       ":copy_platform_sdk_libraries",
     ]
   } else {
-    deps = [
+    public_deps = [
       ":copy_full_sdk_libraries",
     ]
   }
@@ -947,7 +947,7 @@
 # Parts common to both platform and full SDKs.
 group("create_common_sdk") {
   visibility = [ ":create_sdk" ]
-  deps = [
+  public_deps = [
     ":copy_analysis_summaries",
     ":copy_analyzer_sources",
     ":copy_api_readme",
@@ -966,14 +966,14 @@
     ":write_version_file",
   ]
   if (is_win) {
-    deps += [ ":copy_7zip" ]
+    public_deps += [ ":copy_7zip" ]
   }
 }
 
 # Parts specific to the platform SDK.
 group("create_platform_sdk") {
   visibility = [ ":create_sdk" ]
-  deps = [
+  public_deps = [
     ":copy_platform_sdk_libraries",
     ":copy_platform_sdk_scripts",
     ":copy_platform_sdk_snapshots",
@@ -984,7 +984,7 @@
 group("create_full_sdk") {
   visibility = [ ":create_sdk" ]
 
-  deps = [
+  public_deps = [
     ":copy_dart2js_dill_files",
     ":copy_dev_compiler_sdk",
     ":copy_full_sdk_libraries",
@@ -995,12 +995,12 @@
 
 # The main target to depend on from ../BUILD.gn
 group("create_sdk") {
-  deps = [
+  public_deps = [
     ":create_common_sdk",
   ]
   if (dart_platform_sdk) {
-    deps += [ ":create_platform_sdk" ]
+    public_deps += [ ":create_platform_sdk" ]
   } else {
-    deps += [ ":create_full_sdk" ]
+    public_deps += [ ":create_full_sdk" ]
   }
 }
diff --git a/sdk/lib/_internal/js_runtime/lib/async_patch.dart b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
index bec28e9..5f04f0b 100644
--- a/sdk/lib/_internal/js_runtime/lib/async_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
@@ -17,7 +17,7 @@
 import 'dart:_isolate_helper'
     show IsolateNatives, TimerImpl, leaveJsAsync, enterJsAsync, isWorker;
 
-import 'dart:_foreign_helper' show JS;
+import 'dart:_foreign_helper' show JS, JS_GET_FLAG;
 
 import 'dart:_async_await_error_codes' as async_error_codes;
 
@@ -53,8 +53,6 @@
         f();
       }
 
-      ;
-
       var observer = JS('', 'new self.MutationObserver(#)',
           convertDartClosureToJS(internalCallback, 1));
       JS('', '#.observe(#, { childList: true })', observer, div);
@@ -403,8 +401,8 @@
 ///
 /// If yielding while the subscription is paused it will become suspended. And
 /// only resume after the subscription is resumed or canceled.
-class _AsyncStarStreamController {
-  StreamController controller;
+class _AsyncStarStreamController<T> {
+  StreamController<T> controller;
   Stream get stream => controller.stream;
 
   /// True when the async* function has yielded while being paused.
@@ -424,7 +422,7 @@
 
   add(event) => controller.add(event);
 
-  addStream(Stream stream) {
+  addStream(Stream<T> stream) {
     return controller.addStream(stream, cancelOnError: false);
   }
 
@@ -439,7 +437,7 @@
       });
     }
 
-    controller = new StreamController(onListen: () {
+    controller = new StreamController<T>(onListen: () {
       _resumeBody();
     }, onResume: () {
       // Only schedule again if the async* function actually is suspended.
@@ -466,9 +464,9 @@
   }
 }
 
-_makeAsyncStarController(body) {
-  return new _AsyncStarStreamController(body);
-}
+//_makeAsyncStarController(body) {
+//  return new _AsyncStarStreamController(body);
+//}
 
 class _IterationMarker {
   static const YIELD_SINGLE = 0;
@@ -500,7 +498,7 @@
   toString() => "IterationMarker($state, $value)";
 }
 
-class _SyncStarIterator implements Iterator {
+class _SyncStarIterator<T> implements Iterator<T> {
   // _SyncStarIterator handles stepping a sync* generator body state machine.
   //
   // It also handles the stepping over 'nested' iterators to flatten yield*
@@ -515,9 +513,11 @@
   dynamic _body;
 
   // The current value, unless iterating a non-sync* nested iterator.
-  dynamic _current = null;
+  T _current = null;
 
   // This is the nested iterator when iterating a yield* of a non-sync iterator.
+  // TODO(32956): In strong-mode, yield* takes an Iterable<T> (possibly checked
+  // with an implicit downcast), so change type to Iterator<T>.
   Iterator _nestedIterator = null;
 
   // Stack of suspended state machines when iterating a yield* of a sync*
@@ -526,7 +526,10 @@
 
   _SyncStarIterator(this._body);
 
-  get current => _nestedIterator == null ? _current : _nestedIterator.current;
+  T get current {
+    if (_nestedIterator == null) return _current;
+    return _nestedIterator.current;
+  }
 
   _runBody() {
     // TODO(sra): Find a way to hard-wire SUCCESS and ERROR codes.
@@ -594,11 +597,20 @@
             continue;
           } else {
             _nestedIterator = inner;
+            // TODO(32956): Change to the following when strong-mode is the only
+            // option:
+            //
+            //     _nestedIterator = JS<Iterator<T>>('','#', inner);
             continue;
           }
         }
       } else {
-        _current = value;
+        // TODO(32956): Remove this test.
+        if (JS_GET_FLAG('STRONG_MODE')) {
+          _current = JS<T>('', '#', value);
+        } else {
+          _current = value;
+        }
         return true;
       }
     }
@@ -609,7 +621,7 @@
 /// An Iterable corresponding to a sync* method.
 ///
 /// Each invocation of a sync* method will return a new instance of this class.
-class _SyncStarIterable extends IterableBase {
+class _SyncStarIterable<T> extends IterableBase<T> {
   // This is a function that will return a helper function that does the
   // iteration of the sync*.
   //
@@ -618,7 +630,8 @@
 
   _SyncStarIterable(this._outerHelper);
 
-  Iterator get iterator => new _SyncStarIterator(JS('', '#()', _outerHelper));
+  Iterator<T> get iterator =>
+      new _SyncStarIterator<T>(JS('', '#()', _outerHelper));
 }
 
 @patch
diff --git a/sdk/lib/_internal/js_runtime/lib/js_rti.dart b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
index 5a18016..427a1b0 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
@@ -1030,11 +1030,9 @@
     var field = '${JS_GET_NAME(JsGetName.OPERATOR_AS_PREFIX)}${typeOfTString}';
     substitution = getField(typeOfSPrototype, field);
   }
-  // The class of [s] is a subclass of the class of [t].  If [s] has no type
-  // arguments and no substitution, it is used as raw type.  If [t] has no
-  // type arguments, it used as a raw type.  In both cases, [s] is a subtype
-  // of [t].
-  if ((!isJsArray(s) && substitution == null) || !isJsArray(t)) {
+  // The class of [s] is a subclass of the class of [t]. If [t] has no
+  // type arguments, it used as a raw type and [s] is a subtype of [t].
+  if (!isJsArray(t)) {
     return true;
   }
   // Recursively check the type arguments.
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index 8de4156..bcd1f22 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -148,12 +148,10 @@
  */
 abstract class Future<T> {
   /// A `Future<Null>` completed with `null`.
-  static final _Future<Null> _nullFuture =
-      new _Future<Null>.zoneValue(null, Zone.root);
+  static final _Future<Null> _nullFuture = new _Future<Null>.value(null);
 
   /// A `Future<bool>` completed with `false`.
-  static final _Future<bool> _falseFuture =
-      new _Future<bool>.zoneValue(false, Zone.root);
+  static final _Future<bool> _falseFuture = new _Future<bool>.value(false);
 
   /**
    * Creates a future containing the result of calling [computation]
diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart
index 2b56f9d..6eeaa08 100644
--- a/sdk/lib/async/future_impl.dart
+++ b/sdk/lib/async/future_impl.dart
@@ -184,7 +184,7 @@
    * Until the future is completed, the field may hold the zone that
    * listener callbacks used to create this future should be run in.
    */
-  final Zone _zone;
+  final Zone _zone = Zone.current;
 
   /**
    * Either the result, a list of listeners or another future.
@@ -204,24 +204,20 @@
   var _resultOrListeners;
 
   // This constructor is used by async/await.
-  _Future() : _zone = Zone.current;
+  _Future();
 
-  _Future.immediate(FutureOr<T> result) : _zone = Zone.current {
+  _Future.immediate(FutureOr<T> result) {
     _asyncComplete(result);
   }
 
-  /** Creates a future with the value and the specified zone. */
-  _Future.zoneValue(T value, this._zone) {
-    _setValue(value);
-  }
-
-  _Future.immediateError(var error, [StackTrace stackTrace])
-      : _zone = Zone.current {
+  _Future.immediateError(var error, [StackTrace stackTrace]) {
     _asyncCompleteError(error, stackTrace);
   }
 
   /** Creates a future that is already completed with the value. */
-  _Future.value(T value) : this.zoneValue(value, Zone.current);
+  _Future.value(T value) {
+    _setValue(value);
+  }
 
   bool get _mayComplete => _state == _stateIncomplete;
   bool get _isPendingComplete => _state == _statePendingComplete;
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 971f9a5..b2b328e 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -6925,8 +6925,12 @@
 Language/Statements/Assert/execution_t03: RuntimeError # Please triage this failure
 Language/Statements/Assert/execution_t11: RuntimeError # Please triage this failure
 Language/Statements/Return/runtime_type_t04: RuntimeError # Issue 26584
+Language/Statements/Return/type_t03: RuntimeError # Would pass if FutureOr checked
+Language/Statements/Return/type_t04: RuntimeError # Would pass if FutureOr checked
 Language/Statements/Switch/execution_t01: Fail # Missing type check in switch expression
 Language/Statements/Switch/type_t01: RuntimeError # Issue 16089
+Language/Statements/Yield_and_Yield_Each/Yield/static_type_t01: RuntimeError
+Language/Statements/Yield_and_Yield_Each/Yield/static_type_t02: RuntimeError
 Language/Types/Dynamic_Type_System/malbounded_type_error_t01: RuntimeError # Issue 21088
 Language/Types/Parameterized_Types/malbounded_t06: RuntimeError # Issue 21088
 Language/Types/Static_Types/malformed_type_t01: RuntimeError # Issue 21089
@@ -7155,8 +7159,6 @@
 Language/Expressions/Function_Invocation/Unqualified_Invocation/instance_context_invocation_t04: Crash
 Language/Expressions/Method_Invocation/Super_Invocation/accessible_instance_member_t02: Crash
 Language/Expressions/Method_Invocation/Super_Invocation/evaluation_t05: Crash
-Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t03: Crash
-Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t04: Crash
 Language/Expressions/Method_Invocation/Super_Invocation/invocation_t02: Crash
 Language/Expressions/This/placement_t04: Crash
 Language/Functions/setter_modifier_t01: Crash
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index 582da56..5d636c5 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -110,6 +110,16 @@
 Language/Mixins/Mixin_Application/error_t02: MissingCompileTimeError
 
 [ $fasta && $strong ]
+Language/Classes/Abstract_Instance_Members/inherited_t01: CompileTimeError
+Language/Classes/Abstract_Instance_Members/inherited_t02: CompileTimeError
+Language/Classes/Abstract_Instance_Members/inherited_t03: CompileTimeError
+Language/Classes/Abstract_Instance_Members/inherited_t04: CompileTimeError
+Language/Classes/Abstract_Instance_Members/inherited_t05: CompileTimeError
+Language/Classes/Abstract_Instance_Members/inherited_t06: CompileTimeError
+Language/Classes/Abstract_Instance_Members/invocation_t01: CompileTimeError
+Language/Classes/Abstract_Instance_Members/invocation_t02: CompileTimeError
+Language/Classes/Abstract_Instance_Members/no_implementation_t01: CompileTimeError
+Language/Classes/Abstract_Instance_Members/override_default_value_t06: CompileTimeError
 Language/Classes/Abstract_Instance_Members/override_less_positional_parameters_t01: CompileTimeError
 Language/Classes/Abstract_Instance_Members/override_less_positional_parameters_t02: CompileTimeError
 Language/Classes/Abstract_Instance_Members/override_more_required_parameters_t01: CompileTimeError
@@ -185,6 +195,8 @@
 Language/Classes/Instance_Methods/override_subtype_t06: CompileTimeError
 Language/Classes/Instance_Variables/constant_t01: MissingCompileTimeError
 Language/Classes/Instance_Variables/definition_t03: CompileTimeError
+Language/Classes/Setters/name_t01: CompileTimeError
+Language/Classes/Setters/name_t05: CompileTimeError
 Language/Classes/Setters/override_t01: CompileTimeError
 Language/Classes/Setters/override_t03: CompileTimeError
 Language/Classes/Setters/same_name_getter_different_type_t02: CompileTimeError
@@ -194,15 +206,23 @@
 Language/Classes/Static_Methods/type_object_t01: CompileTimeError
 Language/Classes/Static_Methods/type_object_t02: CompileTimeError
 Language/Classes/Static_Variables/inheritance_t01: CompileTimeError
+Language/Classes/Superclasses/Inheritance_and_Overriding/abstract_method_t01/01: CompileTimeError
 Language/Classes/Superclasses/Inheritance_and_Overriding/inheritance_t03: CompileTimeError
 Language/Classes/Superclasses/Inheritance_and_Overriding/inheritance_t05: CompileTimeError
 Language/Classes/Superclasses/Inheritance_and_Overriding/inheritance_t06: CompileTimeError
 Language/Classes/Superclasses/wrong_superclass_t08: MissingCompileTimeError
 Language/Classes/Superinterfaces/implicit_interface_t01: CompileTimeError
 Language/Classes/Superinterfaces/implicit_interface_t02: CompileTimeError
+Language/Classes/Superinterfaces/no_member_t01: CompileTimeError
 Language/Classes/Superinterfaces/no_member_t02: CompileTimeError
+Language/Classes/Superinterfaces/no_member_t05: CompileTimeError
 Language/Classes/Superinterfaces/wrong_type_t05: MissingCompileTimeError
 Language/Classes/definition_t24: MissingCompileTimeError
+Language/Classes/method_definition_t03: CompileTimeError
+Language/Classes/method_definition_t04: CompileTimeError
+Language/Classes/method_definition_t05: CompileTimeError
+Language/Classes/same_name_instance_and_static_members_t02: Pass
+Language/Classes/same_name_instance_and_static_members_t04: Pass
 Language/Classes/same_name_type_variable_t04: MissingCompileTimeError
 Language/Classes/same_name_type_variable_t07: MissingCompileTimeError
 Language/Enums/declaration_equivalent_t03: CompileTimeError
@@ -498,6 +518,8 @@
 Language/Expressions/Identifier_Reference/undeclared_identifier_t08: CompileTimeError
 Language/Expressions/If_null_Expressions/static_type_t01: CompileTimeError
 Language/Expressions/If_null_Expressions/static_type_t02: CompileTimeError
+Language/Expressions/Instance_Creation/Const/abstract_class_t02: CompileTimeError
+Language/Expressions/Instance_Creation/Const/abstract_class_t04: CompileTimeError
 Language/Expressions/Instance_Creation/New/abstract_class_t01/01: CompileTimeError
 Language/Expressions/Instance_Creation/New/abstract_class_t02/01: CompileTimeError
 Language/Expressions/Instance_Creation/New/argument_static_type_t01: CompileTimeError
@@ -573,6 +595,7 @@
 Language/Expressions/Lookup/Getter_and_Setter_Lookup/definition_t03: CompileTimeError
 Language/Expressions/Lookup/Getter_and_Setter_Lookup/definition_t09: CompileTimeError
 Language/Expressions/Lookup/Getter_and_Setter_Lookup/definition_t10: CompileTimeError
+Language/Expressions/Lookup/Method_Lookup/method_lookup_t03: CompileTimeError
 Language/Expressions/Lookup/Method_Lookup/superclass_t07: CompileTimeError
 Language/Expressions/Lookup/Method_Lookup/superclass_t08: CompileTimeError
 Language/Expressions/Maps/key_value_equals_operator_t01: MissingCompileTimeError
@@ -929,9 +952,16 @@
 Language/Libraries_and_Scripts/private_access_t01: CompileTimeError
 Language/Libraries_and_Scripts/private_access_t03: CompileTimeError
 Language/Libraries_and_Scripts/private_access_t04: CompileTimeError
+Language/Mixins/Mixin_Application/abstract_t05: CompileTimeError
+Language/Mixins/Mixin_Application/abstract_t06: CompileTimeError
 Language/Mixins/Mixin_Application/abstract_t07: CompileTimeError
 Language/Mixins/Mixin_Application/abstract_t08: CompileTimeError
 Language/Mixins/Mixin_Application/deferred_t01: MissingCompileTimeError
+Language/Mixins/Mixin_Application/interfaces_t05: CompileTimeError
+Language/Mixins/Mixin_Application/superinterfaces_t01: CompileTimeError
+Language/Mixins/Mixin_Application/superinterfaces_t02: CompileTimeError
+Language/Mixins/Mixin_Application/superinterfaces_t06: CompileTimeError
+Language/Mixins/Mixin_Application/superinterfaces_t08: CompileTimeError
 Language/Mixins/Mixin_Application/syntax_t20: CompileTimeError
 Language/Mixins/declaring_constructor_t05: MissingCompileTimeError
 Language/Mixins/declaring_constructor_t06: MissingCompileTimeError
@@ -943,6 +973,7 @@
 Language/Overview/Privacy/private_and_public_t09: CompileTimeError
 Language/Overview/Privacy/private_and_public_t10: CompileTimeError
 Language/Overview/Privacy/private_and_public_t11: CompileTimeError
+Language/Overview/Privacy/private_and_public_t18: CompileTimeError
 Language/Overview/Privacy/private_and_public_t19: CompileTimeError
 Language/Overview/Privacy/private_and_public_t20: CompileTimeError
 Language/Overview/Scoping/hiding_declaration_t05: CompileTimeError
@@ -989,6 +1020,7 @@
 Language/Statements/For/Asynchronous_For_in/execution_t03: CompileTimeError
 Language/Statements/For/For_Loop/execution_t07: CompileTimeError
 Language/Statements/For/For_Loop/execution_t08: CompileTimeError
+Language/Statements/For/For_in/execution_t05: CompileTimeError
 Language/Statements/For/syntax_t07: CompileTimeError
 Language/Statements/If/condition_evaluation_t01: CompileTimeError
 Language/Statements/If/condition_evaluation_t02: CompileTimeError
@@ -1169,7 +1201,9 @@
 LibTest/collection/DoubleLinkedQueue/takeWhile_A02_t01: CompileTimeError
 LibTest/collection/HashMap/HashMap_class_A01_t01: CompileTimeError
 LibTest/collection/HashSet/HashSet_class_A01_t01: CompileTimeError
+LibTest/collection/IterableBase/IterableBase_class_A01_t01: CompileTimeError
 LibTest/collection/IterableBase/IterableBase_class_A01_t02: CompileTimeError
+LibTest/collection/IterableMixin/IterableMixin_class_A01_t01: CompileTimeError
 LibTest/collection/IterableMixin/IterableMixin_class_A02_t01: CompileTimeError
 LibTest/collection/LinkedHashMap/LinkedHashMap_A03_t01: CompileTimeError
 LibTest/collection/LinkedHashMap/LinkedHashMap_A04_t01: CompileTimeError
diff --git a/tests/compiler/dart2js/async_await/async_await_js_transform_test.dart b/tests/compiler/dart2js/async_await/async_await_js_transform_test.dart
index 31dda4f..adefec8 100644
--- a/tests/compiler/dart2js/async_await/async_await_js_transform_test.dart
+++ b/tests/compiler/dart2js/async_await/async_await_js_transform_test.dart
@@ -31,6 +31,7 @@
           asyncReturn: new VariableUse("returnHelper"),
           asyncRethrow: new VariableUse("rethrowHelper"),
           completerFactory: new VariableUse("NewCompleter"),
+          completerFactoryTypeArgument: new VariableUse("CompleterType"),
           wrapBody: new VariableUse("_wrapJsFunctionForAsync"),
           safeVariableName: (String name) => "__$name",
           bodyName: new StringBackedName("body")));
@@ -43,6 +44,7 @@
       new SyncStarRewriter(null, null,
           endOfIteration: new VariableUse("endOfIteration"),
           iterableFactory: new VariableUse("NewIterable"),
+          iterableFactoryTypeArgument: new VariableUse("IterableType"),
           yieldStarExpression: new VariableUse("yieldStar"),
           uncaughtErrorExpression: new VariableUse("uncaughtError"),
           safeVariableName: (String name) => "__$name",
@@ -64,7 +66,7 @@
 
           /// 01: ok
           r"""function() {
-  var __goto = 0, __completer = NewCompleter(), closures, v0, v1, v2, v3;
+  var __goto = 0, __completer = NewCompleter(CompleterType), closures, v0, v1, v2, v3;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -100,7 +102,7 @@
   await foo();
 }""", """
 function(a) {
-  var __goto = 0, __completer = NewCompleter(), __self = this;
+  var __goto = 0, __completer = NewCompleter(CompleterType), __self = this;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -145,7 +147,7 @@
     return 4;
   }""", """
 function(b) {
-  var __goto = 0, __completer = NewCompleter(), __returnValue, __handler = 2, __currentError, __next = [], __helper;
+  var __goto = 0, __completer = NewCompleter(CompleterType), __returnValue, __handler = 2, __currentError, __next = [], __helper;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1) {
       __currentError = __result;
@@ -255,7 +257,7 @@
   f = --foo1()[await foo2()];
 }""", """
 function(c) {
-  var __goto = 0, __completer = NewCompleter(), a, b, c, d, e, f, __temp1;
+  var __goto = 0, __completer = NewCompleter(CompleterType), a, b, c, d, e, f, __temp1;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -307,7 +309,7 @@
     h = foo1() && foo2();
   }""", """
 function(d2) {
-  var __goto = 0, __completer = NewCompleter(), a, b, c, d, e, f, g, h, __temp1;
+  var __goto = 0, __completer = NewCompleter(CompleterType), a, b, c, d, e, f, g, h, __temp1;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -439,7 +441,7 @@
   }
 }""", """
 function(x, y) {
-  var __goto = 0, __completer = NewCompleter();
+  var __goto = 0, __completer = NewCompleter(CompleterType);
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -523,7 +525,7 @@
   }
   """, """
 function(f) {
-  var __goto = 0, __completer = NewCompleter(), a;
+  var __goto = 0, __completer = NewCompleter(CompleterType), a;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -583,7 +585,7 @@
 }
 """, """
 function(g) {
-  var __goto = 0, __completer = NewCompleter(), __returnValue, i, __temp1;
+  var __goto = 0, __completer = NewCompleter(CompleterType), __returnValue, i, __temp1;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -663,7 +665,7 @@
   }
   """, """
 function(a, h) {
-  var __goto = 0, __completer = NewCompleter(), x, __temp1, __temp2;
+  var __goto = 0, __completer = NewCompleter(CompleterType), x, __temp1, __temp2;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -739,7 +741,7 @@
 }
 """, """
 function(c, i) {
-  var __goto = 0, __completer = NewCompleter(), __handler = 1, __currentError, __next = [], x, y, __error, __error1;
+  var __goto = 0, __completer = NewCompleter(CompleterType), __handler = 1, __currentError, __next = [], x, y, __error, __error1;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1) {
       __currentError = __result;
@@ -849,7 +851,7 @@
   }
   """, """
 function(x, y, j) {
-  var __goto = 0, __completer = NewCompleter(), __temp1, __temp2, __temp3;
+  var __goto = 0, __completer = NewCompleter(CompleterType), __temp1, __temp2, __temp3;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -927,7 +929,7 @@
   }
 }""", """
 function(x, y, k) {
-  var __goto = 0, __completer = NewCompleter(), __returnValue, __temp1;
+  var __goto = 0, __completer = NewCompleter(CompleterType), __returnValue, __temp1;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -1050,7 +1052,7 @@
     }
   }""", """
 function(l) {
-  var __goto = 0, __completer = NewCompleter();
+  var __goto = 0, __completer = NewCompleter(CompleterType);
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1)
       return rethrowHelper(__result, __completer);
@@ -1097,7 +1099,7 @@
     print(exception);
   }""", """
 function(m) {
-  var __goto = 0, __completer = NewCompleter(), __handler = 1, __currentError, __next = [], exception, __exception;
+  var __goto = 0, __completer = NewCompleter(CompleterType), __handler = 1, __currentError, __next = [], exception, __exception;
   var body = _wrapJsFunctionForAsync(function(__errorCode, __result) {
     if (__errorCode === 1) {
       __currentError = __result;
@@ -1189,6 +1191,6 @@
             return uncaughtError(__currentError);
         }
     };
-  });
+  }, IterableType);
 }""");
 }
diff --git a/tests/compiler/dart2js/closure/data/list_literal_strong_trust.dart b/tests/compiler/dart2js/closure/data/list_literal_strong_trust.dart
new file mode 100644
index 0000000..754fe55
--- /dev/null
+++ b/tests/compiler/dart2js/closure/data/list_literal_strong_trust.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+@NoInline()
+method<T>() {
+  /*fields=[T],free=[T]*/ dynamic local() => <T>[];
+  return local;
+}
+
+@NoInline()
+test(o) => o is List<int>;
+
+main() {
+  Expect.isTrue(test(method<int>().call()));
+  Expect.isFalse(test(method<String>().call()));
+}
diff --git a/tests/compiler/dart2js/closure/data/list_literal_trust.dart b/tests/compiler/dart2js/closure/data/list_literal_trust.dart
new file mode 100644
index 0000000..433ef26
--- /dev/null
+++ b/tests/compiler/dart2js/closure/data/list_literal_trust.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+/*element: A.:hasThis*/
+class A<T> {
+  /*element: A.method:hasThis*/
+  @NoInline()
+  method() {
+    /*fields=[this],free=[this],hasThis*/ dynamic local() => <T>[];
+    return local;
+  }
+}
+
+@NoInline()
+test(o) => o is List<int>;
+
+main() {
+  Expect.isTrue(test(new A<int>().method().call()));
+  Expect.isFalse(test(new A<String>().method().call()));
+}
diff --git a/tests/compiler/dart2js/closure/data/list_literal_untested_strong_trust.dart b/tests/compiler/dart2js/closure/data/list_literal_untested_strong_trust.dart
new file mode 100644
index 0000000..55e709a
--- /dev/null
+++ b/tests/compiler/dart2js/closure/data/list_literal_untested_strong_trust.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+@NoInline()
+method<T>() {
+  /**/ dynamic local() => <T>[];
+  return local;
+}
+
+@NoInline()
+test(o) => o == null;
+
+main() {
+  Expect.isTrue(test(method<int>().call()));
+  Expect.isTrue(test(method<String>().call()));
+  Expect.isFalse(test(null));
+}
diff --git a/tests/compiler/dart2js/closure/data/list_literal_untested_trust.dart b/tests/compiler/dart2js/closure/data/list_literal_untested_trust.dart
new file mode 100644
index 0000000..92b057e
--- /dev/null
+++ b/tests/compiler/dart2js/closure/data/list_literal_untested_trust.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+/*element: A.:hasThis*/
+class A<T> {
+  /*element: A.method:hasThis*/
+  @NoInline()
+  method() {
+    /*hasThis*/ dynamic local() => <T>[];
+    return local;
+  }
+}
+
+@NoInline()
+test(o) => o == null;
+
+main() {
+  Expect.isTrue(test(new A<int>().method().call()));
+  Expect.isTrue(test(new A<String>().method().call()));
+  Expect.isFalse(test(null));
+}
diff --git a/tests/compiler/dart2js/closure/data/map_literal_strong_trust.dart b/tests/compiler/dart2js/closure/data/map_literal_strong_trust.dart
new file mode 100644
index 0000000..0347de4
--- /dev/null
+++ b/tests/compiler/dart2js/closure/data/map_literal_strong_trust.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+@NoInline()
+method<T>() {
+  /*fields=[T],free=[T]*/ dynamic local() => <T, int>{};
+  return local;
+}
+
+@NoInline()
+test(o) => o is Map<int, int>;
+
+main() {
+  Expect.isTrue(test(method<int>().call()));
+  Expect.isFalse(test(method<String>().call()));
+}
diff --git a/tests/compiler/dart2js/closure/data/map_literal_trust.dart b/tests/compiler/dart2js/closure/data/map_literal_trust.dart
new file mode 100644
index 0000000..08cfea6
--- /dev/null
+++ b/tests/compiler/dart2js/closure/data/map_literal_trust.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+/*element: A.:hasThis*/
+class A<T> {
+  /*element: A.method:hasThis*/
+  @NoInline()
+  method() {
+    /*fields=[this],free=[this],hasThis*/ dynamic local() => <T, int>{};
+    return local;
+  }
+}
+
+@NoInline()
+test(o) => o is Map<int, int>;
+
+main() {
+  Expect.isTrue(test(new A<int>().method().call()));
+  Expect.isFalse(test(new A<String>().method().call()));
+}
diff --git a/tests/compiler/dart2js/closure/data/map_literal_untested_strong_trust.dart b/tests/compiler/dart2js/closure/data/map_literal_untested_strong_trust.dart
new file mode 100644
index 0000000..8793b90
--- /dev/null
+++ b/tests/compiler/dart2js/closure/data/map_literal_untested_strong_trust.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+@NoInline()
+method<T>() {
+  /**/ dynamic local() => <T, int>{};
+  return local;
+}
+
+@NoInline()
+test(o) => o == null;
+
+main() {
+  Expect.isTrue(test(method<int>().call()));
+  Expect.isTrue(test(method<String>().call()));
+  Expect.isFalse(test(null));
+}
diff --git a/tests/compiler/dart2js/closure/data/map_literal_untested_trust.dart b/tests/compiler/dart2js/closure/data/map_literal_untested_trust.dart
new file mode 100644
index 0000000..958da83
--- /dev/null
+++ b/tests/compiler/dart2js/closure/data/map_literal_untested_trust.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+/*element: A.:hasThis*/
+class A<T> {
+  /*element: A.method:hasThis*/
+  @NoInline()
+  method() {
+    /*hasThis*/ dynamic local() => <T, int>{};
+    return local;
+  }
+}
+
+@NoInline()
+test(o) => o == null;
+
+main() {
+  Expect.isTrue(test(new A<int>().method().call()));
+  Expect.isTrue(test(new A<String>().method().call()));
+  Expect.isFalse(test(null));
+}
diff --git a/tests/compiler/dart2js/closure/data/test_type.dart b/tests/compiler/dart2js/closure/data/test_type.dart
new file mode 100644
index 0000000..c74d190
--- /dev/null
+++ b/tests/compiler/dart2js/closure/data/test_type.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+////////////////////////////////////////////////////////////////////////////////
+/// Explicit is-test is always required.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class1.:hasThis*/
+class Class1<T> {
+  /*element: Class1.method1:hasThis*/
+  method1(dynamic o) {
+    /*fields=[o,this],free=[o,this],hasThis*/
+    dynamic local() => o is T;
+    return local;
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Explicit as-cast is always required.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class2.:hasThis*/
+class Class2<T> {
+  /*element: Class2.method2:hasThis*/
+  method2(dynamic o) {
+    /*fields=[o,this],free=[o,this],hasThis*/
+    dynamic local() => o as T;
+    return local;
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Implicit as-cast is only required in strong mode.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class3.:hasThis*/
+class Class3<T> {
+  /*element: Class3.method3:hasThis*/
+  method3(dynamic o) {
+    /*ast.fields=[o],free=[o],hasThis*/
+    /*kernel.fields=[o],free=[o],hasThis*/
+    /*strong.fields=[o,this],free=[o,this],hasThis*/
+    T local() => o;
+    return local;
+  }
+}
+
+main() {
+  new Class1<int>().method1(0).call();
+  new Class2<int>().method2(0).call();
+  new Class3<int>().method3(0).call();
+}
diff --git a/tests/compiler/dart2js/closure/data/test_type_strong.dart b/tests/compiler/dart2js/closure/data/test_type_strong.dart
new file mode 100644
index 0000000..93dcec0
--- /dev/null
+++ b/tests/compiler/dart2js/closure/data/test_type_strong.dart
@@ -0,0 +1,42 @@
+// 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.
+
+////////////////////////////////////////////////////////////////////////////////
+/// Explicit is-test is always required.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: method1:*/
+method1<T>(dynamic o) {
+  /*fields=[T,o],free=[T,o]*/
+  dynamic local() => o is T;
+  return local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Explicit as-cast is always required.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: method2:*/
+method2<T>(dynamic o) {
+  /*fields=[T,o],free=[T,o]*/
+  dynamic local() => o as T;
+  return local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Implicit as-cast is only required in strong mode.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: method3:*/
+method3<T>(dynamic o) {
+  /*fields=[T,o],free=[T,o]*/
+  T local() => o;
+  return local;
+}
+
+main() {
+  method1<int>(0).call();
+  method2<int>(0).call();
+  method3<int>(0).call();
+}
diff --git a/tests/compiler/dart2js/closure/data/test_type_strong_trust.dart b/tests/compiler/dart2js/closure/data/test_type_strong_trust.dart
new file mode 100644
index 0000000..abb909b
--- /dev/null
+++ b/tests/compiler/dart2js/closure/data/test_type_strong_trust.dart
@@ -0,0 +1,42 @@
+// 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.
+
+////////////////////////////////////////////////////////////////////////////////
+/// Explicit is-test is required even with --omit-implicit-checks.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: method1:*/
+method1<T>(dynamic o) {
+  /*fields=[T,o],free=[T,o]*/
+  dynamic local() => o is T;
+  return local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Explicit as-cast is required even with --omit-implicit-checks.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: method2:*/
+method2<T>(dynamic o) {
+  /*fields=[T,o],free=[T,o]*/
+  dynamic local() => o as T;
+  return local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Implicit as-cast is not required with --omit-implicit-checks.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: method3:*/
+method3<T>(dynamic o) {
+  /*fields=[o],free=[o]*/
+  T local() => o;
+  return local;
+}
+
+main() {
+  method1<int>(0).call();
+  method2<int>(0).call();
+  method3<int>(0).call();
+}
diff --git a/tests/compiler/dart2js/closure/data/test_type_trust.dart b/tests/compiler/dart2js/closure/data/test_type_trust.dart
new file mode 100644
index 0000000..7ed8dc1
--- /dev/null
+++ b/tests/compiler/dart2js/closure/data/test_type_trust.dart
@@ -0,0 +1,51 @@
+// 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.
+
+////////////////////////////////////////////////////////////////////////////////
+/// Explicit is-test is required even with --omit-implicit-checks.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class1.:hasThis*/
+class Class1<T> {
+  /*element: Class1.method1:hasThis*/
+  method1(dynamic o) {
+    /*fields=[o,this],free=[o,this],hasThis*/
+    dynamic local() => o is T;
+    return local;
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Explicit as-cast is required even with --omit-implicit-checks.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class2.:hasThis*/
+class Class2<T> {
+  /*element: Class2.method2:hasThis*/
+  method2(dynamic o) {
+    /*fields=[o,this],free=[o,this],hasThis*/
+    dynamic local() => o as T;
+    return local;
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Implicit as-cast is not required with --omit-implicit-checks.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class3.:hasThis*/
+class Class3<T> {
+  /*element: Class3.method3:hasThis*/
+  method3(dynamic o) {
+    /*fields=[o],free=[o],hasThis*/
+    T local() => o;
+    return local;
+  }
+}
+
+main() {
+  new Class1<int>().method1(0).call();
+  new Class2<int>().method2(0).call();
+  new Class3<int>().method3(0).call();
+}
diff --git a/tests/compiler/dart2js/closure/data/two_local_functions.dart b/tests/compiler/dart2js/closure/data/two_local_functions.dart
new file mode 100644
index 0000000..a7ecf9c
--- /dev/null
+++ b/tests/compiler/dart2js/closure/data/two_local_functions.dart
@@ -0,0 +1,9 @@
+// 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() {
+  /**/ local1() {}
+  /*fields=[local1],free=[local1]*/ local2() => local1();
+  return local2;
+}
diff --git a/tests/compiler/dart2js/closure/data/type_annotations.dart b/tests/compiler/dart2js/closure/data/type_annotations.dart
new file mode 100644
index 0000000..329252f
--- /dev/null
+++ b/tests/compiler/dart2js/closure/data/type_annotations.dart
@@ -0,0 +1,167 @@
+// 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.
+
+////////////////////////////////////////////////////////////////////////////////
+/// A sound initialization of a local variable doesn't capture the type
+/// variable.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class1.:hasThis*/
+class Class1<T> {
+  /*element: Class1.method1:hasThis*/
+  method1(T o) {
+    /*fields=[o],free=[o],hasThis*/
+    dynamic local() {
+      T t = o;
+      return t;
+    }
+
+    return local;
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A sound assignment to a local variable doesn't capture the type variable.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class1b.:hasThis*/
+class Class1b<T> {
+  /*element: Class1b.method1b:hasThis*/
+  method1b(T o) {
+    /*fields=[o],free=[o],hasThis*/
+    dynamic local() {
+      T t = null;
+      t = o;
+      return t;
+    }
+
+    return local;
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A local function parameter type is only captured in strong mode.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class2.:hasThis*/
+class Class2<T> {
+  /*element: Class2.method2:hasThis*/
+  method2() {
+    /*ast.hasThis*/
+    /*kernel.hasThis*/
+    /*strong.fields=[this],free=[this],hasThis*/
+    dynamic local(T t) => t;
+    return local;
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A local function return type is only captured in strong mode.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class3.:hasThis*/
+class Class3<T> {
+  /*element: Class3.method3:hasThis*/
+  method3(dynamic o) {
+    /*ast.fields=[o],free=[o],hasThis*/
+    /*kernel.fields=[o],free=[o],hasThis*/
+    /*strong.fields=[o,this],free=[o,this],hasThis*/
+    T local() => o;
+    return local;
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A member parameter type is not captured.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class4.:hasThis*/
+class Class4<T> {
+  /*element: Class4.method4:hasThis*/
+  method4(T o) {
+    /*fields=[o],free=[o],hasThis*/
+    dynamic local() => o;
+    return local;
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A member return type is not captured.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class5.:hasThis*/
+class Class5<T> {
+  /*element: Class5.method5:hasThis*/
+  T method5(dynamic o) {
+    /*fields=[o],free=[o],hasThis*/
+    dynamic local() => o;
+    return local();
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A local function parameter type is not captured by an inner local function.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class6.:hasThis*/
+class Class6<T> {
+  /*element: Class6.method6:hasThis*/
+  method6() {
+    /*ast.hasThis*/
+    /*kernel.hasThis*/
+    /*strong.fields=[this],free=[this],hasThis*/
+    dynamic local(T t) {
+      /*fields=[t],free=[t],hasThis*/
+      dynamic inner() => t;
+      return inner;
+    }
+
+    return local;
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A local function return type is not captured by an inner local function.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class7.:hasThis*/
+class Class7<T> {
+  /*element: Class7.method7:hasThis*/
+  method7(dynamic o) {
+    /*ast.fields=[o],free=[o],hasThis*/
+    /*kernel.fields=[o],free=[o],hasThis*/
+    /*strong.fields=[o,this],free=[o,this],hasThis*/
+    T local() {
+      /*fields=[o],free=[o],hasThis*/
+      dynamic inner() => o;
+      return inner();
+    }
+
+    return local;
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A field type is not captured.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class8.:hasThis*/
+class Class8<T> {
+  /*element: Class8.field8:hasThis*/
+  T field8 = /*hasThis*/ () {
+    return null;
+  }();
+}
+
+main() {
+  new Class1<int>().method1(0).call();
+  new Class1b<int>().method1b(0).call();
+  new Class2<int>().method2().call(0);
+  new Class3<int>().method3(0).call();
+  new Class4<int>().method4(0).call();
+  new Class5<int>().method5(0);
+  new Class6<int>().method6().call(0).call();
+  new Class7<int>().method7(0).call().call();
+  new Class8<int>().field8;
+}
diff --git a/tests/compiler/dart2js/closure/data/type_annotations_strong.dart b/tests/compiler/dart2js/closure/data/type_annotations_strong.dart
new file mode 100644
index 0000000..3b4c2a6
--- /dev/null
+++ b/tests/compiler/dart2js/closure/data/type_annotations_strong.dart
@@ -0,0 +1,97 @@
+// 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.
+
+////////////////////////////////////////////////////////////////////////////////
+/// A sound assignment to a local variable doesn't capture the type variable.
+////////////////////////////////////////////////////////////////////////////////
+
+method1<T>(T o) {
+  /*fields=[o],free=[o]*/
+  dynamic local() {
+    T t = o;
+    return t;
+  }
+
+  return local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A local function parameter type is captured in strong mode.
+////////////////////////////////////////////////////////////////////////////////
+
+method2<T>() {
+  /*fields=[T],free=[T]*/
+  dynamic local(T t) => t;
+  return local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A local function return type is captured in strong mode.
+////////////////////////////////////////////////////////////////////////////////
+
+method3<T>(dynamic o) {
+  /*fields=[T,o],free=[T,o]*/
+  T local() => o;
+  return local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A member parameter type is not captured.
+////////////////////////////////////////////////////////////////////////////////
+
+method4<T>(T o) {
+  /*fields=[o],free=[o]*/
+  dynamic local() => o;
+  return local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A member return type is not captured.
+////////////////////////////////////////////////////////////////////////////////
+
+T method5<T>(dynamic o) {
+  /*fields=[o],free=[o]*/
+  dynamic local() => o;
+  return local();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A local function parameter type is not captured by an inner local function.
+////////////////////////////////////////////////////////////////////////////////
+
+method6<T>() {
+  /*fields=[T],free=[T]*/
+  dynamic local(T t) {
+    /*fields=[t],free=[t]*/
+    dynamic inner() => t;
+    return inner;
+  }
+
+  return local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A local function return type is not captured by an inner local function.
+////////////////////////////////////////////////////////////////////////////////
+
+method7<T>(dynamic o) {
+  /*fields=[T,o],free=[T,o]*/
+  T local() {
+    /*fields=[o],free=[o]*/
+    dynamic inner() => o;
+    return inner();
+  }
+
+  return local;
+}
+
+main() {
+  method1<int>(0).call();
+  method2<int>().call(0);
+  method3<int>(0).call();
+  method4<int>(0).call();
+  method5<int>(0);
+  method6<int>().call(0).call();
+  method7<int>(0).call().call();
+}
diff --git a/tests/compiler/dart2js/closure/data/type_annotations_strong_trust.dart b/tests/compiler/dart2js/closure/data/type_annotations_strong_trust.dart
new file mode 100644
index 0000000..1ec0bf1
--- /dev/null
+++ b/tests/compiler/dart2js/closure/data/type_annotations_strong_trust.dart
@@ -0,0 +1,97 @@
+// 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.
+
+////////////////////////////////////////////////////////////////////////////////
+/// A sound assignment to a local variable doesn't capture the type variable.
+////////////////////////////////////////////////////////////////////////////////
+
+method1<T>(T o) {
+  /*fields=[o],free=[o]*/
+  dynamic local() {
+    T t = o;
+    return t;
+  }
+
+  return local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A local function parameter type is with --omit-type-checks.
+////////////////////////////////////////////////////////////////////////////////
+
+method2<T>() {
+  /**/
+  dynamic local(T t) => t;
+  return local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A local function return type is not captured with --omit-type-checks.
+////////////////////////////////////////////////////////////////////////////////
+
+method3<T>(dynamic o) {
+  /*fields=[o],free=[o]*/
+  T local() => o;
+  return local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A member parameter type is not captured.
+////////////////////////////////////////////////////////////////////////////////
+
+method4<T>(T o) {
+  /*fields=[o],free=[o]*/
+  dynamic local() => o;
+  return local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A member return type is not captured.
+////////////////////////////////////////////////////////////////////////////////
+
+T method5<T>(dynamic o) {
+  /*fields=[o],free=[o]*/
+  dynamic local() => o;
+  return local();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A local function parameter type is not captured by an inner local function.
+////////////////////////////////////////////////////////////////////////////////
+
+method6<T>() {
+  /**/
+  dynamic local(T t) {
+    /*fields=[t],free=[t]*/
+    dynamic inner() => t;
+    return inner;
+  }
+
+  return local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A local function return type is not captured by an inner local function.
+////////////////////////////////////////////////////////////////////////////////
+
+method7<T>(dynamic o) {
+  /*fields=[o],free=[o]*/
+  T local() {
+    /*fields=[o],free=[o]*/
+    dynamic inner() => o;
+    return inner();
+  }
+
+  return local;
+}
+
+main() {
+  method1<int>(0).call();
+  method2<int>().call(0);
+  method3<int>(0).call();
+  method4<int>(0).call();
+  method5<int>(0);
+  method6<int>().call(0).call();
+  method7<int>(0).call().call();
+}
diff --git a/tests/compiler/dart2js/closure/data/type_annotations_trust.dart b/tests/compiler/dart2js/closure/data/type_annotations_trust.dart
new file mode 100644
index 0000000..ff0ee55
--- /dev/null
+++ b/tests/compiler/dart2js/closure/data/type_annotations_trust.dart
@@ -0,0 +1,125 @@
+// 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.
+
+////////////////////////////////////////////////////////////////////////////////
+/// A sound assignment to a local variable doesn't capture the type variable.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class1.:hasThis*/
+class Class1<T> {
+  /*element: Class1.method1:hasThis*/
+  method1(T o) {
+    /*fields=[o],free=[o],hasThis*/
+    dynamic local() {
+      T t = o;
+      return t;
+    }
+
+    return local;
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A local function parameter type is with --omit-type-checks.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class2.:hasThis*/
+class Class2<T> {
+  /*element: Class2.method2:hasThis*/
+  method2() {
+    /*hasThis*/
+    dynamic local(T t) => t;
+    return local;
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A local function return type is not captured with --omit-type-checks.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class3.:hasThis*/
+class Class3<T> {
+  /*element: Class3.method3:hasThis*/
+  method3(dynamic o) {
+    /*fields=[o],free=[o],hasThis*/
+    T local() => o;
+    return local;
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A member parameter type is not captured.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class4.:hasThis*/
+class Class4<T> {
+  /*element: Class4.method4:hasThis*/
+  method4(T o) {
+    /*fields=[o],free=[o],hasThis*/
+    dynamic local() => o;
+    return local;
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A member return type is not captured.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class5.:hasThis*/
+class Class5<T> {
+  /*element: Class5.method5:hasThis*/
+  T method5(dynamic o) {
+    /*fields=[o],free=[o],hasThis*/
+    dynamic local() => o;
+    return local();
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A local function parameter type is not captured by an inner local function.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class6.:hasThis*/
+class Class6<T> {
+  /*element: Class6.method6:hasThis*/
+  method6() {
+    /*hasThis*/
+    dynamic local(T t) {
+      /*fields=[t],free=[t],hasThis*/
+      dynamic inner() => t;
+      return inner;
+    }
+
+    return local;
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A local function return type is not captured by an inner local function.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class7.:hasThis*/
+class Class7<T> {
+  /*element: Class7.method7:hasThis*/
+  method7(dynamic o) {
+    /*fields=[o],free=[o],hasThis*/
+    T local() {
+      /*fields=[o],free=[o],hasThis*/
+      dynamic inner() => o;
+      return inner();
+    }
+
+    return local;
+  }
+}
+
+main() {
+  new Class1<int>().method1(0).call();
+  new Class2<int>().method2().call(0);
+  new Class3<int>().method3(0).call();
+  new Class4<int>().method4(0).call();
+  new Class5<int>().method5(0);
+  new Class6<int>().method6().call(0).call();
+  new Class7<int>().method7(0).call().call();
+}
diff --git a/tests/compiler/dart2js/closure/data/type_arguments.dart b/tests/compiler/dart2js/closure/data/type_arguments.dart
new file mode 100644
index 0000000..8061663
--- /dev/null
+++ b/tests/compiler/dart2js/closure/data/type_arguments.dart
@@ -0,0 +1,44 @@
+// 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.
+
+////////////////////////////////////////////////////////////////////////////////
+/// A constructor invocation to a class that needs type arguments captures the
+/// type variables.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class1a.:hasThis*/
+class Class1a<T> {}
+
+/*element: Class1b.:hasThis*/
+class Class1b<T> {
+  /*element: Class1b.method1:hasThis*/
+  method1() {
+    /*fields=[this],free=[this],hasThis*/
+    dynamic local() => new Class1a<T>();
+    return local;
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A constructor invocation to a class that _doesn't_ needs type arguments does
+/// _not_ capture the type variables.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class2a.:hasThis*/
+class Class2a<T> {}
+
+/*element: Class2b.:hasThis*/
+class Class2b<T> {
+  /*element: Class2b.method2:hasThis*/
+  method2() {
+    /*hasThis*/
+    dynamic local() => new Class2a<T>();
+    return local;
+  }
+}
+
+main() {
+  new Class1b<int>().method1().call() is Class1a<int>;
+  new Class2b<int>().method2().call();
+}
diff --git a/tests/compiler/dart2js/closure/data/type_arguments_strong.dart b/tests/compiler/dart2js/closure/data/type_arguments_strong.dart
new file mode 100644
index 0000000..99733a8
--- /dev/null
+++ b/tests/compiler/dart2js/closure/data/type_arguments_strong.dart
@@ -0,0 +1,138 @@
+// 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.
+
+////////////////////////////////////////////////////////////////////////////////
+/// A constructor invocation for a class that needs type arguments captures the
+/// type variables.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class1a.:hasThis*/
+class Class1a<T> {}
+
+/*element: Class1b.:hasThis*/
+class Class1b<T> {
+  /*element: Class1b.method1:hasThis*/
+  method1() {
+    /*fields=[this],free=[this],hasThis*/
+    dynamic local() => new Class1a<T>();
+    return local;
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A constructor invocation for a class that _doesn't_ needs type arguments
+/// does _not_ capture the type variables.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class2a.:hasThis*/
+class Class2a<T> {}
+
+/*element: Class2b.:hasThis*/
+class Class2b<T> {
+  /*element: Class2b.method2:hasThis*/
+  method2() {
+    /*hasThis*/
+    dynamic local() => new Class2a<T>();
+    return local;
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A static invocation of a method that needs type arguments captures the type
+/// variables.
+////////////////////////////////////////////////////////////////////////////////
+
+method3a<T>(o) => o is T;
+
+method3b<T>(o) {
+  /*fields=[T,o],free=[T,o]*/
+  dynamic local() => method3a<T>(o);
+  return local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// A static invocation of a method that _doesn't_ needs type arguments does
+/// _not_ capture the type variables.
+////////////////////////////////////////////////////////////////////////////////
+
+method4a<T>(o) => o;
+
+method4b<T>(o) {
+  /*fields=[o],free=[o]*/
+  dynamic local() => method4a<T>(o);
+  return local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// An instance member invocation of a method that needs type arguments captures
+/// the type variables.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class5a.:hasThis*/
+class Class5a {
+  /*element: Class5a.method5a:hasThis*/
+  method5a<T>(o) => o is T;
+}
+
+method5b<T>(o) {
+  /*fields=[T,o],free=[T,o]*/
+  dynamic local() => new Class5a().method5a<T>(o);
+  return local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// An instance member invocation of a method that _doesn't_ needs type
+/// arguments does _not_ capture the type variables.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: Class6a.:hasThis*/
+class Class6a {
+  /*element: Class6a.method6a:hasThis*/
+  method6a<T>(o) => o;
+}
+
+method6b<T>(o) {
+  /*fields=[o],free=[o]*/
+  dynamic local() => new Class6a().method6a<T>(o);
+  return local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// An invocation of a local function that needs type arguments captures the
+/// type variables.
+////////////////////////////////////////////////////////////////////////////////
+
+method7b<T>(o) {
+  /**/
+  method7a<S>(p) => p is S;
+
+  /*fields=[T,method7a,o],free=[T,method7a,o]*/
+  dynamic local() => method7a<T>(o);
+  return local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// An invocation if a local function that _doesn't_ needs type arguments does
+/// _not_ capture the type variables.
+////////////////////////////////////////////////////////////////////////////////
+
+method8b<T>(o) {
+  /**/
+  method8a<S>(p) => p;
+
+  /*fields=[T,method8a,o],free=[T,method8a,o]*/
+  dynamic local() => method8a<T>(o);
+  return local;
+}
+
+main() {
+  new Class1b<int>().method1().call() is Class1a<int>;
+  new Class2b<int>().method2().call();
+  method3b<int>(0).call();
+  method4b<int>(0).call();
+  method5b<int>(0).call();
+  method6b<int>(0).call();
+  method7b<int>(0).call();
+  method8b<int>(0).call();
+}
diff --git a/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart b/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart
new file mode 100644
index 0000000..5d224e8
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that `length` access in JSArray.indexOf is encoding using `.length` and
+// not `.get$length()`.
+
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/elements/names.dart';
+import 'package:compiler/src/world.dart';
+import 'package:compiler/src/js_emitter/model.dart';
+import 'package:compiler/src/js/js.dart' as js;
+import 'package:compiler/src/universe/selector.dart';
+import 'package:expect/expect.dart';
+import '../memory_compiler.dart';
+import '../helpers/element_lookup.dart';
+import '../helpers/program_lookup.dart';
+
+const String source = '''
+import 'package:expect/expect.dart';
+
+@NoInline()
+test(o, a) => o.indexOf(a);
+main() {
+  test([1, 2, 3], 2);
+  test(['1', '2', '3'], '2');
+}
+''';
+
+main() {
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest([Flags.useOldFrontend]);
+    print('--test from ast (trust-type-annotations)--------------------------');
+    await runTest([Flags.useOldFrontend, Flags.trustTypeAnnotations]);
+    print('--test from kernel------------------------------------------------');
+    await runTest([]);
+    print('--test from kernel (trust-type-annotations)-----------------------');
+    await runTest([Flags.trustTypeAnnotations]);
+    print('--test from kernel (strong mode)----------------------------------');
+    await runTest([Flags.strongMode]);
+    print('--test from kernel (strong mode, omit-implicit.checks)------------');
+    await runTest([Flags.strongMode, Flags.omitImplicitChecks]);
+  });
+}
+
+runTest(List<String> options) async {
+  CompilationResult result = await runCompiler(
+      memorySourceFiles: {'main.dart': source}, options: options);
+  Expect.isTrue(result.isSuccess);
+  Compiler compiler = result.compiler;
+  ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+  MemberEntity jsArrayIndexOf =
+      findClassMember(closedWorld, 'JSArray', 'indexOf');
+  ProgramLookup programLookup = new ProgramLookup(result.compiler);
+
+  Selector getLengthSelector = new Selector.getter(const PublicName('length'));
+  js.Name getLengthName =
+      compiler.backend.namer.invocationName(getLengthSelector);
+
+  Method method = programLookup.getMethod(jsArrayIndexOf);
+  int lengthCount = 0;
+  forEachNode(method.code, onCall: (js.Call node) {
+    js.Node target = node.target;
+    Expect.isFalse(
+        target is js.PropertyAccess && target.selector == getLengthName,
+        "Unexpected .get\$length access ${js.nodeToString(node)} in\n"
+        "${js.nodeToString(method.code, pretty: true)}");
+  }, onPropertyAccess: (js.PropertyAccess node) {
+    js.Node selector = node.selector;
+    if (selector is js.LiteralString && selector.value == '"length"') {
+      lengthCount++;
+    }
+  });
+  Expect.equals(
+      2,
+      lengthCount,
+      "Unexpected .length access in\n"
+      "${js.nodeToString(method.code, pretty: true)}");
+}
diff --git a/tests/compiler/dart2js/codegen/negation_shift_regression_test.dart b/tests/compiler/dart2js/codegen/negation_shift_regression_test.dart
new file mode 100644
index 0000000..ec028c8
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/negation_shift_regression_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+// A bug in UnaryNegateSpecializer left '-a' labelled as 'positive', allowing
+// misoptimization of '<<'.
+const String TEST1 = r"""
+foo(param) {
+  var a = param ? 0xFFFFFFFF : 1;
+  return 1 << -a;
+  // present: '$shl'
+  // absent: '_shlPositive'
+}
+""";
+
+const String TEST2 = r"""
+foo(param) {
+  var a = param ? 0xFFFFFFFF : 1;
+  return 1 << a;
+  // present: '_shlPositive'
+  // absent: '$shl'
+}
+""";
+
+main() {
+  runTests({bool useKernel}) async {
+    check(String test) async {
+      await compile(test,
+          entry: 'foo',
+          useKernel: useKernel,
+          check: checkerForAbsentPresent(test));
+    }
+
+    await check(TEST1);
+    await check(TEST2);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index d15d999..52efe99 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -5,6 +5,7 @@
 analyze_test: Slow, Pass
 async_await_syntax_test: Pass # DON'T CHANGE THIS LINE -- Don't mark these tests as failing. Instead, fix the errors/warnings that they report or update the whitelist in the test-files to temporarily allow digression.
 boolified_operator_test: Fail # Issue 8001
+closure/closure_test: Pass, Slow
 codegen/gvn_dynamic_field_get_test: Fail # Issue 18519
 codegen/load_elimination_test: Pass, Slow
 codegen/logical_expression_test: Fail # Issue 17027
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
index 1ab3749..02b0d5e 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
@@ -480,14 +480,17 @@
     bool trustTypeAnnotations = false;
     if (name.endsWith('_ea.dart')) {
       testOptions.add(Flags.enableAsserts);
-    } else if (name.endsWith('_strong.dart')) {
+    }
+    if (name.contains('_strong')) {
       strongModeOnlyTest = true;
       if (!testStrongMode) {
         testOptions.add(Flags.strongMode);
       }
-    } else if (name.endsWith('_checked.dart')) {
+    }
+    if (name.endsWith('_checked.dart')) {
       testOptions.add(Flags.enableCheckedMode);
-    } else if (name.endsWith('_trust.dart')) {
+    }
+    if (name.contains('_trust')) {
       trustTypeAnnotations = true;
     }
 
diff --git a/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart b/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
index 5c22fee..0c4ed18 100644
--- a/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
+++ b/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
@@ -18,6 +18,8 @@
   const FunctionTypeData('void', 'F6', '<X extends int>(X x)'),
   const FunctionTypeData('void', 'F7', '<Y extends num>(Y y, [int i])'),
   const FunctionTypeData('Z', 'F8', '<Z extends num>(Z z)'),
+  const FunctionTypeData('T', 'F13', '<T>(T t1, T t2)'),
+  const FunctionTypeData('S', 'F14', '<S>(S s1, S s2)'),
 ];
 
 main() {
@@ -74,6 +76,10 @@
           env.isSubtype(a, b),
           "Expected `$a` ${isSubtype ? '' : 'not '}to be a subtype of `$b`, "
           "but it is${isSubtype ? ' not' : ''}.");
+      if (isSubtype) {
+        Expect.isTrue(env.isPotentialSubtype(a, b),
+            '$a <: $b but not a potential subtype.');
+      }
     }
 
     InterfaceType Object_ = env['Object'];
@@ -95,6 +101,8 @@
     FunctionType F10 = env.getClosureType('F10');
     FunctionType F11 = env.getMemberType('F11');
     FunctionType F12 = env.getMemberType('F12');
+    FunctionType F13 = env.getFieldType('F13');
+    FunctionType F14 = env.getFieldType('F14');
 
     List<FunctionType> all = <FunctionType>[
       F1,
@@ -109,6 +117,8 @@
       F10,
       F11,
       F12,
+      F13,
+      F14,
     ];
 
     testToString(F1, 'void Function<#A>(#A)');
@@ -123,6 +133,8 @@
     testToString(F10, 'void Function<#A extends #B,#B>(#A,#B)');
     testToString(F11, 'void Function<#A extends C3<#A>>(#A)');
     testToString(F12, 'void Function<#A extends C3<#A>>(#A)');
+    testToString(F13, '#A Function<#A>(#A,#A)');
+    testToString(F14, '#A Function<#A>(#A,#A)');
 
     testBounds(F1, [Object_]);
     testBounds(F2, [Object_]);
@@ -140,6 +152,8 @@
     testBounds(F12, [
       instantiate(C3, [F12.typeVariables.last])
     ]);
+    testBounds(F13, [Object_]);
+    testBounds(F14, [Object_]);
 
     testInstantiate(F1, [C1], 'void Function(C1)');
     testInstantiate(F2, [C2], 'void Function(C2)');
@@ -153,6 +167,8 @@
     testInstantiate(F10, [int_, num_], 'void Function(int,num)');
     testInstantiate(F11, [C4], 'void Function(C4)');
     testInstantiate(F12, [C4], 'void Function(C4)');
+    testInstantiate(F13, [C1], 'C1 Function(C1,C1)');
+    testInstantiate(F14, [C2], 'C2 Function(C2,C2)');
 
     Map<FunctionType, List<FunctionType>> expectedEquals =
         <FunctionType, List<FunctionType>>{
@@ -162,6 +178,8 @@
       F10: [F9],
       F11: [F12],
       F12: [F11],
+      F13: [F14],
+      F14: [F13],
     };
 
     Map<FunctionType, List<FunctionType>> expectedSubtype =
diff --git a/tests/compiler/dart2js/helpers/element_lookup.dart b/tests/compiler/dart2js/helpers/element_lookup.dart
index 670e45f..4ebe13a 100644
--- a/tests/compiler/dart2js/helpers/element_lookup.dart
+++ b/tests/compiler/dart2js/helpers/element_lookup.dart
@@ -13,6 +13,10 @@
       elementEnvironment.lookupClass(elementEnvironment.mainLibrary, name);
   cls ??= elementEnvironment.lookupClass(
       closedWorld.commonElements.coreLibrary, name);
+  cls ??= elementEnvironment.lookupClass(
+      closedWorld.commonElements.interceptorsLibrary, name);
+  cls ??= elementEnvironment.lookupClass(
+      closedWorld.commonElements.jsHelperLibrary, name);
   assert(cls != null, "Class '$name' not found.");
   return cls;
 }
diff --git a/tests/compiler/dart2js/helpers/program_lookup.dart b/tests/compiler/dart2js/helpers/program_lookup.dart
index b73b5fc..7ac0fed 100644
--- a/tests/compiler/dart2js/helpers/program_lookup.dart
+++ b/tests/compiler/dart2js/helpers/program_lookup.dart
@@ -6,6 +6,7 @@
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/js_backend/namer.dart';
 import 'package:compiler/src/js_emitter/model.dart';
 import 'package:compiler/src/js/js.dart' as js;
 
@@ -31,9 +32,11 @@
 
 class ProgramLookup {
   final Program program;
+  final Namer namer;
 
   ProgramLookup(Compiler compiler)
-      : this.program = compiler.backend.emitter.emitter.programForTesting;
+      : this.program = compiler.backend.emitter.emitter.programForTesting,
+        this.namer = compiler.backend.namer;
 
   Map<LibraryEntity, LibraryData> libraryMap;
 
@@ -123,19 +126,29 @@
   }
 }
 
-void forEachCall(js.Node root, void f(js.Call node)) {
-  CallVisitor visitor = new CallVisitor(f);
+void forEachNode(js.Node root,
+    {void Function(js.Call) onCall,
+    void Function(js.PropertyAccess) onPropertyAccess}) {
+  CallbackVisitor visitor =
+      new CallbackVisitor(onCall: onCall, onPropertyAccess: onPropertyAccess);
   root.accept(visitor);
 }
 
-class CallVisitor extends js.BaseVisitor {
-  final void Function(js.Call) callback;
+class CallbackVisitor extends js.BaseVisitor {
+  final void Function(js.Call) onCall;
+  final void Function(js.PropertyAccess) onPropertyAccess;
 
-  CallVisitor(this.callback);
+  CallbackVisitor({this.onCall, this.onPropertyAccess});
 
   @override
   visitCall(js.Call node) {
-    callback(node);
+    if (onCall != null) onCall(node);
     super.visitCall(node);
   }
+
+  @override
+  visitAccess(js.PropertyAccess node) {
+    if (onPropertyAccess != null) onPropertyAccess(node);
+    super.visitAccess(node);
+  }
 }
diff --git a/tests/compiler/dart2js/inference/data/expose_this.dart b/tests/compiler/dart2js/inference/data/expose_this.dart
index 8bc8934..e888229 100644
--- a/tests/compiler/dart2js/inference/data/expose_this.dart
+++ b/tests/compiler/dart2js/inference/data/expose_this.dart
@@ -70,9 +70,6 @@
     this;
     /*update: [exact=Class3]*/ field = 42;
   }
-
-  /*element: Class3.method:[null]*/
-  method() {}
 }
 
 /*element: exposeThis3:[exact=Class3]*/
diff --git a/tests/compiler/dart2js/inference/data/expose_this_mask.dart b/tests/compiler/dart2js/inference/data/expose_this_mask.dart
index 1447e11..b1033c6 100644
--- a/tests/compiler/dart2js/inference/data/expose_this_mask.dart
+++ b/tests/compiler/dart2js/inference/data/expose_this_mask.dart
@@ -42,7 +42,7 @@
 
 /*element: otherGetter:[null]*/
 otherGetter() {
-  new OtherClass1();
+  new OtherClass1(). /*[exact=OtherClass1]*/ field1a;
   new Class1();
 }
 
@@ -70,7 +70,7 @@
 
 /*element: otherMethod:[null]*/
 otherMethod() {
-  new OtherClass2();
+  new OtherClass2(). /*[exact=OtherClass2]*/ field2a;
   new Class2();
 }
 
diff --git a/tests/compiler/dart2js/inference/inference_test_helper.dart b/tests/compiler/dart2js/inference/inference_test_helper.dart
index ed2bc4a..2b9c68f 100644
--- a/tests/compiler/dart2js/inference/inference_test_helper.dart
+++ b/tests/compiler/dart2js/inference/inference_test_helper.dart
@@ -48,7 +48,6 @@
     await checkTests(
         dataDir, computeMemberAstTypeMasks, computeMemberIrTypeMasks,
         libDirectory: new Directory.fromUri(Platform.script.resolve('libs')),
-        testStrongMode: true,
         forUserLibrariesOnly: true,
         args: args,
         options: [stopAfterTypeInference],
diff --git a/tests/compiler/dart2js/inference/side_effects/closure_call.dart b/tests/compiler/dart2js/inference/side_effects/closure_call.dart
index baa0e7c..7aaf687 100644
--- a/tests/compiler/dart2js/inference/side_effects/closure_call.dart
+++ b/tests/compiler/dart2js/inference/side_effects/closure_call.dart
@@ -2,8 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/*element: method:SideEffects(reads nothing; writes nothing)*/
+method() {}
+
 /*element: callExpression:SideEffects(reads anything; writes anything)*/
-callExpression() => (null)();
+callExpression() => (method)();
 
 /*element: Super.:SideEffects(reads nothing; writes nothing)*/
 class Super {
diff --git a/tests/compiler/dart2js/inference/side_effects_test.dart b/tests/compiler/dart2js/inference/side_effects_test.dart
index f0189f7..a92944e 100644
--- a/tests/compiler/dart2js/inference/side_effects_test.dart
+++ b/tests/compiler/dart2js/inference/side_effects_test.dart
@@ -26,8 +26,7 @@
         dataDir, computeMemberAstSideEffects, computeMemberIrSideEffects,
         args: args,
         options: [stopAfterTypeInference],
-        // TODO(johnniwinther): Run tests with strong mode.
-        testStrongMode: false);
+        skipForStrong: ['closure_call.dart']);
   });
 }
 
diff --git a/tests/compiler/dart2js/inlining/data/conditional.dart b/tests/compiler/dart2js/inlining/data/conditional.dart
index 5203943..2cb4977 100644
--- a/tests/compiler/dart2js/inlining/data/conditional.dart
+++ b/tests/compiler/dart2js/inlining/data/conditional.dart
@@ -22,7 +22,7 @@
 /*element: _method1:[_conditionalField]*/
 _method1() => 42;
 
-var _field1;
+bool _field1;
 
 /*element: _conditionalField:[]*/
 _conditionalField() {
@@ -49,7 +49,7 @@
 _method2() => 42;
 
 /*element: _conditionalParameter:[conditionalParameter]*/
-_conditionalParameter(o) {
+_conditionalParameter(bool o) {
   return o
       ? _method2() + _method2() + _method2()
       : _method2() + _method2() + _method2();
diff --git a/tests/compiler/dart2js/inlining/inlining_test.dart b/tests/compiler/dart2js/inlining/inlining_test.dart
index c14e939..36e7b3f 100644
--- a/tests/compiler/dart2js/inlining/inlining_test.dart
+++ b/tests/compiler/dart2js/inlining/inlining_test.dart
@@ -28,10 +28,7 @@
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
     await checkTests(
         dataDir, computeMemberAstInlinings, computeMemberIrInlinings,
-        args: args,
-        skipForAst: ['external.dart'],
-        // TODO(johnniwinther): Run tests with strong mode.
-        testStrongMode: false);
+        args: args, skipForAst: ['external.dart']);
   });
 }
 
diff --git a/tests/compiler/dart2js/jumps/data/complex_loops.dart b/tests/compiler/dart2js/jumps/data/complex_loops.dart
new file mode 100644
index 0000000..5495006
--- /dev/null
+++ b/tests/compiler/dart2js/jumps/data/complex_loops.dart
@@ -0,0 +1,101 @@
+// 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.
+
+simpleForInLoopWithContinue(list) {
+  /*0@continue*/ for (int i in list) {
+    if (i % 2 == 0) /*target=0*/ continue;
+    print(i);
+  }
+}
+
+complexForInLoopWithContinueLookalike1(list) {
+  for (int i in list) {
+    label:
+    /*0@break*/
+    {
+      if (i % 2 == 0) /*target=0*/ break label;
+      print(i);
+    }
+    print(i);
+  }
+}
+
+complexForInLoopWithContinueLookalike2(list) {
+  /*kernel.0@continue*/
+  /*strong.0@continue*/
+  for (int i in list) {
+    label:
+    /*ast.0@break*/
+    {
+      if (i % 2 == 0) /*target=0*/ break label;
+      print(i);
+    }
+  }
+}
+
+labelledBreakInNestedWhileLoop(bool condition()) {
+  int i = 111;
+  /*0@break*/ while (condition()) {
+    label:
+    /*1@break*/ {
+      while (condition()) {
+        /*target=1*/ break label;
+      }
+      i--;
+    }
+    /*target=0*/ break;
+  }
+  return i;
+}
+
+nestedLoopsWithInnerBreak(list) {
+  for (int i in list) {
+    /*0@break*/ for (int j in list) {
+      if (i % j == 0) /*target=0*/ break;
+      print(i);
+    }
+  }
+}
+
+nestedLoopsWithInnerContinue(list) {
+  for (int i in list) {
+    /*0@continue*/ for (int j in list) {
+      if (i % j == 0) /*target=0*/ continue;
+      print(i);
+    }
+  }
+}
+
+nestedLoopsWithLabelledBreak(list) {
+  outer:
+  /*0@break*/
+  for (int i in list) {
+    for (int j in list) {
+      if (i % j == 0) /*target=0*/ break outer;
+      print(i);
+    }
+  }
+}
+
+nestedLoopsWithLabelledContinue(list) {
+  outer:
+  /*0@continue*/
+  for (int i in list) {
+    for (int j in list) {
+      if (i % j == 0) /*target=0*/ continue outer;
+      print(i);
+    }
+  }
+}
+
+main() {
+  simpleForInLoopWithContinue([1, 2, 3, 4]);
+  complexForInLoopWithContinueLookalike1([1, 2, 3, 4]);
+  complexForInLoopWithContinueLookalike2([1, 2, 3, 4]);
+  labelledBreakInNestedWhileLoop(() => true);
+  nestedLoopsWithInnerBreak([1, 2, 3, 4]);
+  nestedLoopsWithInnerContinue([1, 2, 3, 4]);
+  nestedLoopsWithLabelledBreak([1, 2, 3, 4]);
+  nestedLoopsWithLabelledContinue([1, 2, 3, 4]);
+}
diff --git a/tests/compiler/dart2js/jumps/jump_test.dart b/tests/compiler/dart2js/jumps/jump_test.dart
index 2a911b4..b18da0e 100644
--- a/tests/compiler/dart2js/jumps/jump_test.dart
+++ b/tests/compiler/dart2js/jumps/jump_test.dart
@@ -24,9 +24,7 @@
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
     await checkTests(dataDir, computeJumpsData, computeKernelJumpsData,
         options: [Flags.disableTypeInference, stopAfterTypeInference],
-        args: args,
-        // TODO(johnniwinther): Run tests with strong mode.
-        testStrongMode: false);
+        args: args);
   });
 }
 
diff --git a/tests/compiler/dart2js/model/constant_expression_test.dart b/tests/compiler/dart2js/model/constant_expression_test.dart
index 44a1406..6babb67 100644
--- a/tests/compiler/dart2js/model/constant_expression_test.dart
+++ b/tests/compiler/dart2js/model/constant_expression_test.dart
@@ -57,7 +57,9 @@
     const ConstantData('1 + 2', ConstantExpressionKind.BINARY),
     const ConstantData('1 == 2', ConstantExpressionKind.BINARY),
     // TODO(sigmund): reenable (Issue 32511)
-    // const ConstantData('1 != 2', ConstantExpressionKind.BINARY),
+    const ConstantData('1 != 2', ConstantExpressionKind.UNARY,
+        // a != b is encoded as !(a == b) by CFE.
+        text: '!(1 == 2)'),
     const ConstantData('1 ?? 2', ConstantExpressionKind.BINARY),
     const ConstantData('-(1)', ConstantExpressionKind.UNARY, text: '-1'),
     const ConstantData('"foo".length', ConstantExpressionKind.STRING_LENGTH),
@@ -156,34 +158,44 @@
         'const A<int>(field1: 87)', ConstantExpressionKind.CONSTRUCTED,
         type: 'A<int>', fields: const {'field(A#field1)': '87'}),
     // TODO(sigmund): reenable (Issue 32511)
-    //const ConstantData('const B()', ConstantExpressionKind.CONSTRUCTED,
-    //    type: 'A<B<dynamic>>',
-    //    fields: const {
-    //      'field(A#field1)': '42',
-    //    }),
-    //const ConstantData('const B<int>()', ConstantExpressionKind.CONSTRUCTED,
-    //    type: 'A<B<int>>',
-    //    fields: const {
-    //      'field(A#field1)': '42',
-    //    }),
-    //const ConstantData(
-    //    'const B<int>(field1: 87)', ConstantExpressionKind.CONSTRUCTED,
-    //    type: 'A<B<int>>',
-    //    fields: const {
-    //      'field(A#field1)': '87',
-    //    }),
-    //const ConstantData(
-    //    'const C<int>(field1: 87)', ConstantExpressionKind.CONSTRUCTED,
-    //    type: 'A<B<double>>',
-    //    fields: const {
-    //      'field(A#field1)': '87',
-    //    }),
-    //const ConstantData(
-    //    'const B<int>.named()', ConstantExpressionKind.CONSTRUCTED,
-    //    type: 'A<int>',
-    //    fields: const {
-    //      'field(A#field1)': '42',
-    //    }),
+    const ConstantData('const B()', ConstantExpressionKind.CONSTRUCTED,
+        type: 'A<B<dynamic>>',
+        fields: const {
+          'field(A#field1)': '42',
+        },
+        // Redirecting factories are replaced by their effective targets by CFE.
+        text: 'const A<B<dynamic>>()'),
+    const ConstantData('const B<int>()', ConstantExpressionKind.CONSTRUCTED,
+        type: 'A<B<int>>',
+        fields: const {
+          'field(A#field1)': '42',
+        },
+        // Redirecting factories are replaced by their effective targets by CFE.
+        text: 'const A<B<int>>()'),
+    const ConstantData(
+        'const B<int>(field1: 87)', ConstantExpressionKind.CONSTRUCTED,
+        type: 'A<B<int>>',
+        fields: const {
+          'field(A#field1)': '87',
+        },
+        // Redirecting factories are replaced by their effective targets by CFE.
+        text: 'const A<B<int>>(field1: 87)'),
+    const ConstantData(
+        'const C<int>(field1: 87)', ConstantExpressionKind.CONSTRUCTED,
+        type: 'A<B<double>>',
+        fields: const {
+          'field(A#field1)': '87',
+        },
+        // Redirecting factories are replaced by their effective targets by CFE.
+        text: 'const A<B<double>>(field1: 87)'),
+    const ConstantData(
+        'const B<int>.named()', ConstantExpressionKind.CONSTRUCTED,
+        type: 'A<int>',
+        fields: const {
+          'field(A#field1)': '42',
+        },
+        // Redirecting factories are replaced by their effective targets by CFE.
+        text: 'const A<int>()'),
   ]),
 ];
 
diff --git a/tests/compiler/dart2js/model/enqueuer_test.dart b/tests/compiler/dart2js/model/enqueuer_test.dart
new file mode 100644
index 0000000..567a11f
--- /dev/null
+++ b/tests/compiler/dart2js/model/enqueuer_test.dart
@@ -0,0 +1,291 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that the enqueuers are not dependent upon in which order impacts are
+// applied.
+
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/common_elements.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/elements/names.dart';
+import 'package:compiler/src/elements/types.dart';
+import 'package:compiler/src/enqueue.dart';
+import 'package:compiler/src/types/types.dart';
+import 'package:compiler/src/universe/call_structure.dart';
+import 'package:compiler/src/universe/selector.dart';
+import 'package:compiler/src/universe/world_impact.dart';
+import 'package:compiler/src/universe/use.dart';
+import 'package:compiler/src/universe/world_builder.dart';
+import 'package:compiler/src/world.dart';
+import 'package:expect/expect.dart';
+import '../memory_compiler.dart';
+
+class Test {
+  final String name;
+  final String code;
+  final List<Impact> impacts;
+  final Map<String, List<String>> expectedLiveMap;
+
+  const Test({this.name, this.code, this.impacts, this.expectedLiveMap});
+
+  Map<String, List<String>> get expectedLiveResolutionMap {
+    Map<String, List<String>> map = {};
+    expectedLiveMap.forEach((String clsName, List<String> memberNames) {
+      for (String memberName in memberNames) {
+        if (memberName.startsWith('?')) {
+          memberName = memberName.substring(1);
+        }
+        map.putIfAbsent(clsName, () => []).add(memberName);
+      }
+    });
+    return map;
+  }
+
+  Map<String, List<String>> get expectedLiveCodegenMap {
+    Map<String, List<String>> map = {};
+    expectedLiveMap.forEach((String clsName, List<String> memberNames) {
+      for (String memberName in memberNames) {
+        if (memberName.startsWith('?')) {
+          // Skip for codegen
+          continue;
+        }
+        map.putIfAbsent(clsName, () => []).add(memberName);
+      }
+    });
+    return map;
+  }
+}
+
+enum ImpactKind { instantiate, invoke }
+
+class Impact {
+  final ImpactKind kind;
+  final String clsName;
+  final String memberName;
+
+  const Impact.instantiate(this.clsName, [this.memberName = ''])
+      : this.kind = ImpactKind.instantiate;
+  const Impact.invoke(this.clsName, this.memberName)
+      : this.kind = ImpactKind.invoke;
+
+  String toString() =>
+      'Impact(kind=$kind,clsName=$clsName,memberName=$memberName)';
+}
+
+const List<Test> tests = const <Test>[
+  const Test(name: 'Instantiate class', code: '''
+class A {
+  void method() {}
+}
+''', impacts: const [
+    const Impact.instantiate('A'),
+    const Impact.invoke('A', 'method'),
+  ], expectedLiveMap: const {
+    'A': const ['', 'method'],
+  }),
+  const Test(name: 'Instantiate subclass', code: '''
+class A {
+  void method() {}
+}
+class B extends A {
+}
+''', impacts: const [
+    const Impact.instantiate('B'),
+    const Impact.invoke('B', 'method'),
+  ], expectedLiveMap: const {
+    'A': const ['?', 'method'],
+    'B': const [''],
+  }),
+  const Test(name: 'Instantiate superclass/subclass', code: '''
+class A {
+  void method() {}
+}
+class B extends A {
+}
+''', impacts: const [
+    const Impact.instantiate('A'),
+    const Impact.instantiate('B'),
+    const Impact.invoke('B', 'method'),
+  ], expectedLiveMap: const {
+    'A': const ['', 'method'],
+    'B': const [''],
+  }),
+];
+
+main() {
+  asyncTest(() async {
+    for (Test test in tests) {
+      await runTest(test);
+    }
+  });
+}
+
+runTest(Test test) async {
+  print('====================================================================');
+  print('Running test ${test.name}');
+  for (List<Impact> permutation in permutations(test.impacts)) {
+    print('------------------------------------------------------------------');
+    print('Permutation: $permutation');
+    await runTestPermutation(test, permutation);
+  }
+}
+
+Iterable<List<Impact>> permutations(List<Impact> impacts) sync* {
+  int length = impacts.length;
+  if (length <= 1) {
+    yield impacts;
+  } else {
+    for (int index = 0; index < length; index++) {
+      Impact head = impacts[index];
+      List<Impact> tail = new List<Impact>.from(impacts)..removeAt(index);
+      for (List<Impact> permutation in permutations(tail)) {
+        yield [head]..addAll(permutation);
+      }
+    }
+  }
+}
+
+runTestPermutation(Test test, List<Impact> impacts) async {
+  Compiler compiler = compilerFor(memorySourceFiles: {
+    'main.dart': '''
+${test.code}
+main() {}
+'''
+  }, options: [
+    Flags.strongMode,
+    Flags.disableInlining,
+  ]);
+
+  void checkInvariant(
+      Enqueuer enqueuer, ElementEnvironment elementEnvironment) {
+    for (MemberEntity member
+        in compiler.enqueuer.resolution.processedEntities) {
+      Expect.isTrue(
+          member == elementEnvironment.mainFunction ||
+              member.library != elementEnvironment.mainLibrary,
+          "Unexpected member $member in ${enqueuer}.");
+    }
+  }
+
+  void instantiate(
+      Enqueuer enqueuer, ElementEnvironment elementEnvironment, String name) {
+    ClassEntity cls =
+        elementEnvironment.lookupClass(elementEnvironment.mainLibrary, name);
+    ConstructorEntity constructor =
+        elementEnvironment.lookupConstructor(cls, '');
+    InterfaceType type = elementEnvironment.getRawType(cls);
+    WorldImpact impact = new WorldImpactBuilderImpl()
+      ..registerStaticUse(new StaticUse.typedConstructorInvoke(
+          constructor, constructor.parameterStructure.callStructure, type));
+    enqueuer.applyImpact(impact);
+  }
+
+  void invoke(
+      Enqueuer enqueuer,
+      ElementEnvironment elementEnvironment,
+      String className,
+      String methodName,
+      ReceiverConstraint Function(ClassEntity cls) createConstraint) {
+    ClassEntity cls = elementEnvironment.lookupClass(
+        elementEnvironment.mainLibrary, className);
+    Selector selector = new Selector.call(
+        new Name(methodName, elementEnvironment.mainLibrary),
+        CallStructure.NO_ARGS);
+    WorldImpact impact = new WorldImpactBuilderImpl()
+      ..registerDynamicUse(new ConstrainedDynamicUse(
+          selector, createConstraint(cls), const <DartType>[]));
+    enqueuer.applyImpact(impact);
+  }
+
+  void applyImpact(
+      Enqueuer enqueuer,
+      ElementEnvironment elementEnvironment,
+      Impact impact,
+      ReceiverConstraint Function(ClassEntity cls) createConstraint) {
+    switch (impact.kind) {
+      case ImpactKind.instantiate:
+        instantiate(enqueuer, elementEnvironment, impact.clsName);
+        break;
+      case ImpactKind.invoke:
+        invoke(enqueuer, elementEnvironment, impact.clsName, impact.memberName,
+            createConstraint);
+        break;
+    }
+  }
+
+  void checkLiveMembers(
+      Enqueuer enqueuer,
+      ElementEnvironment elementEnvironment,
+      Map<String, List<String>> expectedLiveMap) {
+    Map<String, List<String>> actualLiveMap = {};
+    for (MemberEntity member in enqueuer.processedEntities) {
+      if (member != elementEnvironment.mainFunction &&
+          member.library == elementEnvironment.mainLibrary) {
+        actualLiveMap
+            .putIfAbsent(member.enclosingClass.name, () => [])
+            .add(member.name);
+      }
+    }
+
+    Expect.setEquals(
+        expectedLiveMap.keys,
+        actualLiveMap.keys,
+        "Unexpected live classes in $enqueuer\n "
+        "Expected: ${expectedLiveMap.keys}\n "
+        "Actual  : ${actualLiveMap.keys}");
+    expectedLiveMap.forEach((String clsName, List<String> expectedMembers) {
+      List<String> actualMembers = actualLiveMap[clsName];
+      Expect.setEquals(
+          expectedMembers,
+          actualMembers,
+          "Unexpected live members for $clsName in $enqueuer\n "
+          "Expected: $expectedMembers\n "
+          "Actual  : $actualMembers");
+    });
+  }
+
+  compiler.onResolutionQueueEmptyForTesting = () {
+    Enqueuer enqueuer = compiler.enqueuer.resolution;
+    ElementEnvironment elementEnvironment =
+        compiler.frontendStrategy.elementEnvironment;
+    checkInvariant(enqueuer, elementEnvironment);
+
+    ReceiverConstraint createConstraint(ClassEntity cls) {
+      return new StrongModeConstraint(cls);
+    }
+
+    for (Impact impact in impacts) {
+      applyImpact(enqueuer, elementEnvironment, impact, createConstraint);
+    }
+  };
+  compiler.onCodegenQueueEmptyForTesting = () {
+    Enqueuer enqueuer = compiler.enqueuer.codegenEnqueuerForTesting;
+    ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+    ElementEnvironment elementEnvironment =
+        compiler.backendClosedWorldForTesting.elementEnvironment;
+    checkInvariant(enqueuer, elementEnvironment);
+
+    ReceiverConstraint createConstraint(ClassEntity cls) {
+      return new TypeMask.subtype(cls, closedWorld);
+    }
+
+    for (Impact impact in impacts) {
+      applyImpact(enqueuer, elementEnvironment, impact, createConstraint);
+    }
+  };
+
+  await compiler.run(Uri.parse('memory:main.dart'));
+
+  checkLiveMembers(
+      compiler.enqueuer.resolution,
+      compiler.frontendStrategy.elementEnvironment,
+      test.expectedLiveResolutionMap);
+
+  checkLiveMembers(
+      compiler.enqueuer.codegenEnqueuerForTesting,
+      compiler.backendClosedWorldForTesting.elementEnvironment,
+      test.expectedLiveCodegenMap);
+}
diff --git a/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart b/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart
new file mode 100644
index 0000000..fa652b4
--- /dev/null
+++ b/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart
@@ -0,0 +1,194 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/common_elements.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/universe/world_builder.dart';
+import 'package:compiler/src/world.dart';
+import '../memory_compiler.dart';
+
+main() {
+  useStrongModeWorldStrategy = true;
+  asyncTest(() async {
+    print('--test from non-strong mode---------------------------------------');
+    await runTest(strongMode: false);
+    print('--test from strong mode-------------------------------------------');
+    await runTest(strongMode: true);
+  });
+}
+
+runTest({bool strongMode}) async {
+  CompilationResult result = await runCompiler(memorySourceFiles: {
+    'main.dart': '''
+class A {
+  method1() {}
+  method2() {}
+  get getter => 42;
+  set setter(_) {}
+}
+
+class B {
+  method1() {}
+  method2() {}
+  get getter => 42;
+  set setter(_) {}
+}
+
+class C extends A {
+  method1() {}
+  method2() {}
+  get getter => 42;
+  set setter(_) {}
+}
+
+class D implements B {
+  method1() {}
+  method2() {}
+  get getter => 42;
+  set setter(_) {}
+}
+
+class E implements A {
+  method1() {}
+  method2() {}
+  get getter => 42;
+  set setter(_) {}
+}
+
+class F extends B {
+  method1() {}
+  method2() {}
+  get getter => 42;
+  set setter(_) {}
+}
+
+class G {
+  method1() {}
+  method2() {}
+  get getter => 42;
+  set setter(_) {}
+}
+
+class H extends Object with G implements A {}
+
+class I {
+  method1() {}
+  method2() {}
+  get getter => 42;
+  set setter(_) {}
+}
+
+class J extends I implements A {}
+
+class K {
+  method1() {}
+  method2() {}
+  get getter => 42;
+  set setter(_) {}
+}
+
+class L = Object with K;
+class L2 = Object with L;
+class M extends L {}
+class M2 extends L2 {}
+
+class N {
+  method1() {}
+  get getter => 42;
+  set setter(_) {}
+}
+
+abstract class O extends N {}
+
+class P implements O {
+  method1() {}
+  get getter => 42;
+  set setter(_) {}
+}
+
+class Q {
+  method3() {}
+}
+
+class R extends Q {}
+
+main() {
+  A a = new A();
+  B b = new B();
+  a.method1();
+  a.getter;
+  b.method2();
+  b.setter = 42; 
+  new C();
+  new D();
+  new H();
+  new J();
+  new M().method1();
+  new M2().getter;
+  new N();
+  O o = new P();
+  o.method1(); 
+  o.getter;
+  o.setter = 42;
+  R r;
+  r.method3();
+  r = new R(); // Create R after call.
+}
+'''
+  }, options: strongMode ? [Flags.strongMode] : []);
+  Expect.isTrue(result.isSuccess);
+  Compiler compiler = result.compiler;
+
+  Map<String, List<String>> expectedLiveMembersMap = <String, List<String>>{
+    'A': strongMode
+        ? ['method1', 'getter']
+        : ['method1', 'method2', 'getter', 'setter'],
+    'B': strongMode
+        ? ['method2', 'setter']
+        : ['method1', 'method2', 'getter', 'setter'],
+    'C': strongMode
+        ? ['method1', 'getter']
+        : ['method1', 'method2', 'getter', 'setter'],
+    'D': strongMode
+        ? ['method2', 'setter']
+        : ['method1', 'method2', 'getter', 'setter'],
+    'G': strongMode
+        ? ['method1', 'getter']
+        : ['method1', 'method2', 'getter', 'setter'],
+    'I': strongMode
+        ? ['method1', 'getter']
+        : ['method1', 'method2', 'getter', 'setter'],
+    'K': strongMode
+        ? ['method1', 'getter']
+        : ['method1', 'method2', 'getter', 'setter'],
+    'N': strongMode ? [] : ['method1', 'getter', 'setter'],
+    'P': ['method1', 'getter', 'setter'],
+    'Q': ['method3'],
+  };
+
+  ClosedWorld closedWorld =
+      compiler.resolutionWorldBuilder.closedWorldForTesting;
+  ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
+
+  elementEnvironment.forEachClass(elementEnvironment.mainLibrary,
+      (ClassEntity cls) {
+    List<String> expectedLiveMembers =
+        expectedLiveMembersMap[cls.name] ?? const <String>[];
+    elementEnvironment.forEachLocalClassMember(cls, (MemberEntity member) {
+      if (member.enclosingClass != cls) return;
+      bool expected = expectedLiveMembers.contains(member.name);
+      bool live = closedWorld.processedMembers.contains(member);
+      Expect.equals(
+          expected,
+          live,
+          "Member $member ${expected ? '' : 'not '}expected to be live "
+          "in ${strongMode ? 'Dart 2' : 'Dart 1'}. "
+          "Expected members for ${cls.name}: $expectedLiveMembers");
+    });
+  });
+}
diff --git a/tests/compiler/dart2js/model/subtype_test.dart b/tests/compiler/dart2js/model/subtype_test.dart
index d54572c..48445e3 100644
--- a/tests/compiler/dart2js/model/subtype_test.dart
+++ b/tests/compiler/dart2js/model/subtype_test.dart
@@ -42,6 +42,10 @@
   if (expectMoreSpecific == null) expectMoreSpecific = expectSubtype;
   Expect.equals(expectSubtype, env.isSubtype(subtype, supertype),
       '$subtype <: $supertype');
+  if (expectSubtype) {
+    Expect.isTrue(env.isPotentialSubtype(subtype, supertype),
+        '$subtype <: $supertype (potential)');
+  }
   if (env.types is Types) {
     Expect.equals(expectMoreSpecific, env.isMoreSpecific(subtype, supertype),
         '$subtype << $supertype');
@@ -828,6 +832,9 @@
       options: strongMode ? [Flags.strongMode] : []).then((env) {
     void expect(bool expectSubtype, DartType T, DartType S) {
       Expect.equals(expectSubtype, env.isSubtype(T, S), '$T <: $S');
+      if (expectSubtype) {
+        Expect.isTrue(env.isPotentialSubtype(T, S), '$T <: $S (potential)');
+      }
     }
 
     InterfaceType ClassWithCall = env['ClassWithCall'];
diff --git a/tests/compiler/dart2js/model/subtypeset_test.dart b/tests/compiler/dart2js/model/subtypeset_test.dart
index 10cef63..cbaf315 100644
--- a/tests/compiler/dart2js/model/subtypeset_test.dart
+++ b/tests/compiler/dart2js/model/subtypeset_test.dart
@@ -42,8 +42,8 @@
       class E extends C implements B {}
       class F extends C {}
       class G extends C {}
-      class H implements C {}
-      class I implements H {}
+      abstract class H implements C {}
+      abstract class I implements H {}
       """,
       mainSource: r"""
       main() {
diff --git a/tests/compiler/dart2js/rti/data/closure_generic_unneeded_strong.dart b/tests/compiler/dart2js/rti/data/closure_generic_unneeded_strong.dart
index b3b1ef3..5e985bd 100644
--- a/tests/compiler/dart2js/rti/data/closure_generic_unneeded_strong.dart
+++ b/tests/compiler/dart2js/rti/data/closure_generic_unneeded_strong.dart
@@ -4,11 +4,11 @@
 
 import 'package:expect/expect.dart';
 
-/*class: A:needsArgs*/
+/*class: A:*/
 class A<T> {
   @NoInline()
   m() {
-    return /*needsSignature*/ (T t, String s) {};
+    return /**/ (T t, String s) {};
   }
 }
 
diff --git a/tests/compiler/dart2js/rti/data/closure_unneeded.dart b/tests/compiler/dart2js/rti/data/closure_unneeded.dart
index 5ba4637..5e985bd 100644
--- a/tests/compiler/dart2js/rti/data/closure_unneeded.dart
+++ b/tests/compiler/dart2js/rti/data/closure_unneeded.dart
@@ -4,14 +4,11 @@
 
 import 'package:expect/expect.dart';
 
-/*ast.class: A:*/
-/*kernel.class: A:*/
-/*strong.class: A:needsArgs*/
+/*class: A:*/
 class A<T> {
   @NoInline()
   m() {
-    // TODO(johnniwinther): Optimize local function type signature need.
-    return /*ast.*/ /*kernel.*/ /*strong.needsSignature*/ (T t, String s) {};
+    return /**/ (T t, String s) {};
   }
 }
 
diff --git a/tests/compiler/dart2js/rti/data/closure_unneeded_strong.dart b/tests/compiler/dart2js/rti/data/closure_unneeded_strong.dart
index 34d26df..ad98d37 100644
--- a/tests/compiler/dart2js/rti/data/closure_unneeded_strong.dart
+++ b/tests/compiler/dart2js/rti/data/closure_unneeded_strong.dart
@@ -8,7 +8,7 @@
 class A<T> {
   @NoInline()
   m() {
-    return /*needsSignature*/ (int i, String s) {};
+    return /**/ (int i, String s) {};
   }
 }
 
diff --git a/tests/compiler/dart2js/rti/data/local_function_generic_strong.dart b/tests/compiler/dart2js/rti/data/local_function_generic_strong.dart
new file mode 100644
index 0000000..71a9566
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/local_function_generic_strong.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+method1() {
+  /*needsSignature*/
+  T local<T>(T t) => t;
+  return local;
+}
+
+@NoInline()
+test(o) => o is S Function<S>(S);
+
+main() {
+  Expect.isTrue(test(method1()));
+}
diff --git a/tests/compiler/dart2js/rti/data/local_function_list_literal_strong.dart b/tests/compiler/dart2js/rti/data/local_function_list_literal_strong.dart
new file mode 100644
index 0000000..40f4aa7
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/local_function_list_literal_strong.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+/*class: global#JSArray:deps=[EmptyIterable,List,ListIterable,SubListIterable],explicit=[JSArray],needsArgs*/
+
+/*element: method:needsArgs*/
+@NoInline()
+method<T>() {
+  return () => <T>[];
+}
+
+@NoInline()
+test(o) => o is List<int>;
+
+main() {
+  Expect.isTrue(test(method<int>().call()));
+  Expect.isFalse(test(method<String>().call()));
+}
diff --git a/tests/compiler/dart2js/rti/data/local_function_map_literal_strong.dart b/tests/compiler/dart2js/rti/data/local_function_map_literal_strong.dart
new file mode 100644
index 0000000..d0d805a
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/local_function_map_literal_strong.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+/*class: global#LinkedHashMap:deps=[Map],needsArgs*/
+
+/*element: method:needsArgs*/
+@NoInline()
+method<T>() {
+  return () => <T, int>{};
+}
+
+@NoInline()
+test(o) => o is Map<int, int>;
+
+main() {
+  Expect.isTrue(test(method<int>().call()));
+  Expect.isFalse(test(method<String>().call()));
+}
diff --git a/tests/compiler/dart2js/rti/data/local_function_signature2_strong.dart b/tests/compiler/dart2js/rti/data/local_function_signature2_strong.dart
new file mode 100644
index 0000000..a5dd390c
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/local_function_signature2_strong.dart
@@ -0,0 +1,109 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+class Class1 {
+  method1() {
+    /**/
+    num local<T>(num n) => null;
+    return local;
+  }
+
+  method2() {
+    /**/
+    num local<T>(int n) => null;
+    return local;
+  }
+
+  method3() {
+    /**/
+    int local<T>(num n) => null;
+    return local;
+  }
+}
+
+class Class2 {
+  /*element: Class2.method4:needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
+  method4<T>() {
+    /*needsSignature*/
+    num local(T n) => null;
+    return local;
+  }
+}
+
+class Class3 {
+  /*element: Class3.method5:needsArgs,selectors=[Selector(call, method5, arity=0, types=1)]*/
+  method5<T>() {
+    /*needsSignature*/
+    T local(num n) => null;
+    return local;
+  }
+}
+
+class Class4 {
+  /*element: Class4.method6:*/
+  method6<T>() {
+    /**/
+    num local(num n, T t) => null;
+    return local;
+  }
+}
+
+/*element: method7:needsArgs*/
+method7<T>() {
+  /*needsSignature*/
+  num local(T n) => null;
+  return local;
+}
+
+/*element: method8:needsArgs*/
+method8<T>() {
+  /*needsSignature*/
+  T local(num n) => null;
+  return local;
+}
+
+/*element: method9:*/
+method9<T>() {
+  /**/
+  num local(num n, T t) => null;
+  return local;
+}
+
+method10() {
+  /**/
+  num local<T>(T n) => null;
+  return local;
+}
+
+method11() {
+  /**/
+  T local<T>(num n) => null;
+  return local;
+}
+
+method12() {
+  /**/
+  num local<T>(num n, T t) => null;
+  return local;
+}
+
+@NoInline()
+test(o) => o is num Function(num);
+
+main() {
+  Expect.isFalse(test(new Class1().method1()));
+  Expect.isFalse(test(new Class1().method2()));
+  Expect.isFalse(test(new Class1().method3()));
+  Expect.isTrue(test(new Class2().method4<num>()));
+  Expect.isTrue(test(new Class3().method5<num>()));
+  Expect.isFalse(test(new Class4().method6<num>()));
+  Expect.isTrue(test(method7<num>()));
+  Expect.isTrue(test(method8<num>()));
+  Expect.isFalse(test(method9()));
+  Expect.isFalse(test(method10()));
+  Expect.isFalse(test(method11()));
+  Expect.isFalse(test(method12()));
+}
diff --git a/tests/compiler/dart2js/rti/data/local_function_signatures.dart b/tests/compiler/dart2js/rti/data/local_function_signatures.dart
new file mode 100644
index 0000000..cc7bc3d
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/local_function_signatures.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+class Class1 {
+  method1() {
+    /*ast.*/
+    /*kernel.*/
+    /*strong.needsSignature*/
+    num local(num n) => null;
+    return local;
+  }
+
+  method2() {
+    num local(int n) => null;
+    return local;
+  }
+
+  method3() {
+    Object local(num n) => null;
+    return local;
+  }
+}
+
+/*class: Class2:needsArgs*/
+class Class2<T> {
+  method4() {
+    /*needsSignature*/
+    num local(T n) => null;
+    return local;
+  }
+}
+
+/*class: Class3:needsArgs*/
+class Class3<T> {
+  method5() {
+    /*needsSignature*/
+    T local(num n) => null;
+    return local;
+  }
+}
+
+/*class: Class4:*/
+class Class4<T> {
+  method6() {
+    /**/
+    num local(num n, T t) => null;
+    return local;
+  }
+}
+
+@NoInline()
+test(o) => o is num Function(num);
+
+main() {
+  Expect.isTrue(test(new Class1().method1()));
+  Expect.isFalse(test(new Class1().method2()));
+  Expect.isFalse(test(new Class1().method3()));
+  Expect.isTrue(test(new Class2<num>().method4()));
+  Expect.isTrue(test(new Class3<num>().method5()));
+  Expect.isFalse(test(new Class4<num>().method6()));
+}
diff --git a/tests/compiler/dart2js/rti/data/local_function_signatures_strong.dart b/tests/compiler/dart2js/rti/data/local_function_signatures_strong.dart
new file mode 100644
index 0000000..71f5374
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/local_function_signatures_strong.dart
@@ -0,0 +1,130 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+class Class1 {
+  method1() {
+    /*needsSignature*/
+    num local<T>(num n) => null;
+    return local;
+  }
+
+  method2() {
+    /**/
+    num local<T>(int n) => null;
+    return local;
+  }
+
+  method3() {
+    /*needsSignature*/
+    int local<T>(num n) => null;
+    return local;
+  }
+}
+
+class Class2 {
+  /*element: Class2.method4:needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
+  method4<T>() {
+    /*needsSignature*/
+    num local(T n) => null;
+    return local;
+  }
+}
+
+class Class3 {
+  /*element: Class3.method5:needsArgs,selectors=[Selector(call, method5, arity=0, types=1)]*/
+  method5<T>() {
+    /*needsSignature*/
+    T local(num n) => null;
+    return local;
+  }
+}
+
+class Class4 {
+  /*element: Class4.method6:*/
+  method6<T>() {
+    /**/
+    num local(num n, T t) => null;
+    return local;
+  }
+}
+
+/*element: method7:needsArgs*/
+method7<T>() {
+  /*needsSignature*/
+  num local(T n) => null;
+  return local;
+}
+
+/*element: method8:needsArgs*/
+method8<T>() {
+  /*needsSignature*/
+  T local(num n) => null;
+  return local;
+}
+
+/*element: method9:*/
+method9<T>() {
+  /**/
+  num local(num n, T t) => null;
+  return local;
+}
+
+method10() {
+  /*needsSignature*/
+  num local<T>(T n) => null;
+  return local;
+}
+
+method11() {
+  /*needsSignature*/
+  T local<T>(num n) => null;
+  return local;
+}
+
+method12() {
+  /**/
+  num local<T>(num n, T t) => null;
+  return local;
+}
+
+num Function(num) method13() {
+  /*needsSignature*/
+  num local<T>(num n) => null;
+  return local;
+}
+
+num Function(num) method14() {
+  /*needsSignature*/
+  num local<T>(T n) => null;
+  return local;
+}
+
+num Function(num) method15() {
+  /*needsSignature*/
+  T local<T>(num n) => null;
+  return local;
+}
+
+@NoInline()
+test(o) => o is num Function(num);
+
+main() {
+  Expect.isFalse(test(new Class1().method1()));
+  Expect.isFalse(test(new Class1().method2()));
+  Expect.isFalse(test(new Class1().method3()));
+  Expect.isTrue(test(new Class2().method4<num>()));
+  Expect.isTrue(test(new Class3().method5<num>()));
+  Expect.isFalse(test(new Class4().method6<num>()));
+  Expect.isTrue(test(method7<num>()));
+  Expect.isTrue(test(method8<num>()));
+  Expect.isFalse(test(method9()));
+  Expect.isFalse(test(method10()));
+  Expect.isFalse(test(method11()));
+  Expect.isFalse(test(method12()));
+  Expect.isTrue(test(method13()));
+  Expect.isTrue(test(method14()));
+  Expect.isTrue(test(method15()));
+}
diff --git a/tests/compiler/dart2js/rti/data/method_signatures.dart b/tests/compiler/dart2js/rti/data/method_signatures.dart
new file mode 100644
index 0000000..4c4a161
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/method_signatures.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+class Class1 {
+  /*element: Class1.method1:*/
+  num method1(num n) => null;
+
+  /*element: Class1.method2:*/
+  num method2(int n) => null;
+
+  /*element: Class1.method3:*/
+  Object method3(num n) => null;
+}
+
+/*class: Class2:needsArgs*/
+class Class2<T> {
+  /*element: Class2.method4:needsSignature*/
+  num method4(T n) => null;
+}
+
+/*class: Class3:needsArgs*/
+class Class3<T> {
+  /*element: Class3.method5:needsSignature*/
+  T method5(num n) => null;
+}
+
+/*class: Class4:*/
+class Class4<T> {
+  /*element: Class4.method6:*/
+  num method6(num n, T t) => null;
+}
+
+/*element: method7:*/
+num method7(num n) => null;
+
+/*element: method8:*/
+num method8(int n) => null;
+
+/*element: method9:*/
+Object method9(num n) => null;
+
+@NoInline()
+test(o) => o is num Function(num);
+
+main() {
+  Expect.isTrue(test(new Class1().method1));
+  Expect.isFalse(test(new Class1().method2));
+  Expect.isFalse(test(new Class1().method3));
+  Expect.isTrue(test(new Class2<num>().method4));
+  Expect.isTrue(test(new Class3<num>().method5));
+  Expect.isFalse(test(new Class4<num>().method6));
+  Expect.isTrue(test(method7));
+  Expect.isFalse(test(method8));
+  Expect.isFalse(test(method9));
+}
diff --git a/tests/compiler/dart2js/rti/data/method_signatures_strong.dart b/tests/compiler/dart2js/rti/data/method_signatures_strong.dart
new file mode 100644
index 0000000..811548f
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/method_signatures_strong.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+class Class1 {
+  /*element: Class1.method1:*/
+  num method1<T>(num n) => null;
+
+  /*element: Class1.method2:*/
+  num method2<T>(int n) => null;
+
+  /*element: Class1.method3:*/
+  int method3<T>(num n) => null;
+}
+
+class Class2 {
+  /*element: Class2.method4:*/
+  num method4<T>(T n) => null;
+}
+
+class Class3 {
+  /*element: Class3.method5:*/
+  T method5<T>(num n) => null;
+}
+
+class Class4 {
+  /*element: Class4.method6:*/
+  num method6<T>(num n, T t) => null;
+}
+
+/*element: method7:*/
+num method7<T>(T n) => null;
+
+/*element: method8:*/
+T method8<T>(num n) => null;
+
+/*element: method9:*/
+num method9<T>(num n, T t) => null;
+
+@NoInline()
+test(o) => o is num Function(num);
+
+forceInstantiation(num Function(num) f) => f;
+
+main() {
+  Expect.isFalse(test(new Class1().method1));
+  Expect.isFalse(test(new Class1().method2));
+  Expect.isFalse(test(new Class1().method3));
+  Expect.isTrue(test(forceInstantiation(new Class2().method4)));
+  Expect.isTrue(test(forceInstantiation(new Class3().method5)));
+  Expect.isFalse(test(new Class4().method6));
+  Expect.isTrue(test(forceInstantiation(method7)));
+  Expect.isTrue(test(forceInstantiation(method8)));
+  Expect.isFalse(test(method9));
+}
diff --git a/tests/compiler/dart2js/rti/emission/closure_function.dart b/tests/compiler/dart2js/rti/emission/closure_function.dart
index 2b51d64..099dee0 100644
--- a/tests/compiler/dart2js/rti/emission/closure_function.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_function.dart
@@ -8,6 +8,9 @@
 test(o) => o is Function;
 
 main() {
-  test(/*checks=[],functionType,instance*/ () {});
+  test(
+      /*ast.checks=[],functionType,instance*/
+      /*kernel.checks=[],functionType,instance*/
+      /*strong.checks=[],instance*/ () {});
   test(null);
 }
diff --git a/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart b/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart
index c205496..ac72186 100644
--- a/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart
@@ -10,7 +10,11 @@
   m() {
     // TODO(johnniwinther): The signature is not needed since the type isn't a
     // potential subtype of the checked function types.
-    return /*checks=[$signature],instance*/ (T t, String s) {};
+    return
+        /*ast.checks=[$signature],instance*/
+        /*kernel.checks=[$signature],instance*/
+        /*strong.checks=[],instance*/
+        (T t, String s) {};
   }
 }
 
diff --git a/tests/compiler/dart2js/rti/emission/local_function_list_literal_strong.dart b/tests/compiler/dart2js/rti/emission/local_function_list_literal_strong.dart
new file mode 100644
index 0000000..f3ac8a5
--- /dev/null
+++ b/tests/compiler/dart2js/rti/emission/local_function_list_literal_strong.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+/*class: global#JSArray:checkedInstance,checks=[$isIterable,$isList],instance*/
+
+@NoInline()
+method<T>() {
+  return /*checks=[],instance*/ () => <T>[];
+}
+
+@NoInline()
+test(o) => o is List<int>;
+
+main() {
+  Expect.isTrue(test(method<int>().call()));
+  Expect.isFalse(test(method<String>().call()));
+}
diff --git a/tests/compiler/dart2js/rti/emission/local_function_map_literal_strong.dart b/tests/compiler/dart2js/rti/emission/local_function_map_literal_strong.dart
new file mode 100644
index 0000000..fefa55b
--- /dev/null
+++ b/tests/compiler/dart2js/rti/emission/local_function_map_literal_strong.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+/*class: global#JsLinkedHashMap:checks=[],instance*/
+
+@NoInline()
+method<T>() {
+  return
+      /*checks=[],instance*/
+      () => <T, int>{};
+}
+
+@NoInline()
+test(o) => o is Map<int, int>;
+
+main() {
+  Expect.isTrue(test(method<int>().call()));
+  Expect.isFalse(test(method<String>().call()));
+}
diff --git a/tests/compiler/dart2js/rti/factory_call_test.dart b/tests/compiler/dart2js/rti/factory_call_test.dart
index d3632ae..9d3f08f 100644
--- a/tests/compiler/dart2js/rti/factory_call_test.dart
+++ b/tests/compiler/dart2js/rti/factory_call_test.dart
@@ -83,7 +83,7 @@
 
       js.Name selector = getName(targetName);
       bool callFound = false;
-      forEachCall(fun, (js.Call node) {
+      forEachNode(fun, onCall: (js.Call node) {
         js.Expression target = node.target;
         if (target is js.PropertyAccess && target.selector == selector) {
           callFound = true;
diff --git a/tests/compiler/dart2js/rti/instance_call_test.dart b/tests/compiler/dart2js/rti/instance_call_test.dart
index 1b656ed..337bae0 100644
--- a/tests/compiler/dart2js/rti/instance_call_test.dart
+++ b/tests/compiler/dart2js/rti/instance_call_test.dart
@@ -152,7 +152,7 @@
 
       js.Name selector = getName(targetName, expectedTypeArguments);
       bool callFound = false;
-      forEachCall(fun, (js.Call node) {
+      forEachNode(fun, onCall: (js.Call node) {
         js.Expression target = node.target;
         if (target is js.PropertyAccess && target.selector == selector) {
           callFound = true;
diff --git a/tests/compiler/dart2js/type_test_helper.dart b/tests/compiler/dart2js/type_test_helper.dart
index ee2a76a..95e82a0 100644
--- a/tests/compiler/dart2js/type_test_helper.dart
+++ b/tests/compiler/dart2js/type_test_helper.dart
@@ -263,6 +263,10 @@
     return types.isSubtype(T, S);
   }
 
+  bool isPotentialSubtype(DartType T, DartType S) {
+    return types.isPotentialSubtype(T, S);
+  }
+
   bool isMoreSpecific(ResolutionDartType T, ResolutionDartType S) {
     return (types as Types).isMoreSpecific(T, S);
   }
diff --git a/tests/compiler/dart2js_extra/32928_test.dart b/tests/compiler/dart2js_extra/32928_test.dart
new file mode 100644
index 0000000..549909b
--- /dev/null
+++ b/tests/compiler/dart2js_extra/32928_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// dart2jsOptions=--strong
+
+/// Regression test for issue 32928.
+
+abstract class A<T> {
+  set f(T value) {
+    print(value);
+  }
+}
+
+abstract class B extends A {}
+
+class C extends B {
+  m(value) => super.f = value;
+}
+
+main() {
+  new C().m(null);
+}
diff --git a/tests/compiler/dart2js_extra/local_function_generic_strong_test.dart b/tests/compiler/dart2js_extra/local_function_generic_strong_test.dart
new file mode 100644
index 0000000..c7d3ec5
--- /dev/null
+++ b/tests/compiler/dart2js_extra/local_function_generic_strong_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+method1() {
+  T local<T>(T t) => t;
+  return local;
+}
+
+@NoInline()
+test(o) => o is S Function<S>(S);
+
+main() {
+  Expect.isTrue(test(method1()));
+}
diff --git a/tests/compiler/dart2js_extra/local_function_signatures_strong_test.dart b/tests/compiler/dart2js_extra/local_function_signatures_strong_test.dart
new file mode 100644
index 0000000..d6f4f31
--- /dev/null
+++ b/tests/compiler/dart2js_extra/local_function_signatures_strong_test.dart
@@ -0,0 +1,114 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class Class1 {
+  method1() {
+    num local<T>(num n) => null;
+    return local;
+  }
+
+  method2() {
+    num local<T>(int n) => null;
+    return local;
+  }
+
+  method3() {
+    int local<T>(num n) => null;
+    return local;
+  }
+}
+
+class Class2 {
+  method4<T>() {
+    num local(T n) => null;
+    return local;
+  }
+}
+
+class Class3 {
+  method5<T>() {
+    T local(num n) => null;
+    return local;
+  }
+}
+
+class Class4 {
+  method6<T>() {
+    num local(num n, T t) => null;
+    return local;
+  }
+}
+
+method7<T>() {
+  num local(T n) => null;
+  return local;
+}
+
+method8<T>() {
+  T local(num n) => null;
+  return local;
+}
+
+method9<T>() {
+  num local(num n, T t) => null;
+  return local;
+}
+
+method10() {
+  num local<T>(T n) => null;
+  return local;
+}
+
+method11() {
+  T local<T>(num n) => null;
+  return local;
+}
+
+method12() {
+  num local<T>(num n, T t) => null;
+  return local;
+}
+
+num Function(num) //# 01: ok
+    method13() {
+  num local<T>(num n) => null;
+  return local;
+}
+
+num Function(num) //# 01: continued
+    method14() {
+  num local<T>(T n) => null;
+  return local;
+}
+
+num Function(num) //# 01: continued
+    method15() {
+  T local<T>(num n) => null;
+  return local;
+}
+
+@NoInline()
+test(o) => o is num Function(num);
+
+main() {
+  Expect.isFalse(test(new Class1().method1()));
+  Expect.isFalse(test(new Class1().method2()));
+  Expect.isFalse(test(new Class1().method3()));
+  Expect.isTrue(test(new Class2().method4<num>()));
+  Expect.isTrue(test(new Class3().method5<num>()));
+  Expect.isFalse(test(new Class4().method6<num>()));
+  Expect.isTrue(test(method7<num>()));
+  Expect.isTrue(test(method8<num>()));
+  Expect.isFalse(test(method9()));
+  Expect.isFalse(test(method10()));
+  Expect.isFalse(test(method11()));
+  Expect.isFalse(test(method12()));
+  Expect.isTrue(test(method13())); //# 01: continued
+  Expect.isTrue(test(method14())); //# 01: continued
+  Expect.isTrue(test(method15())); //# 01: continued
+}
diff --git a/tests/compiler/dart2js_extra/local_function_signatures_test.dart b/tests/compiler/dart2js_extra/local_function_signatures_test.dart
new file mode 100644
index 0000000..76ce246e
--- /dev/null
+++ b/tests/compiler/dart2js_extra/local_function_signatures_test.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class Class1 {
+  method1() {
+    num local(num n) => null;
+    return local;
+  }
+
+  method2() {
+    num local(int n) => null;
+    return local;
+  }
+
+  method3() {
+    Object local(num n) => null;
+    return local;
+  }
+}
+
+class Class2<T> {
+  method4() {
+    num local(T n) => null;
+    return local;
+  }
+}
+
+class Class3<T> {
+  method5() {
+    T local(num n) => null;
+    return local;
+  }
+}
+
+class Class4<T> {
+  method6() {
+    num local(num n, T t) => null;
+    return local;
+  }
+}
+
+@NoInline()
+test(o) => o is num Function(num);
+
+main() {
+  Expect.isTrue(test(new Class1().method1()));
+  Expect.isFalse(test(new Class1().method2()));
+  Expect.isFalse(test(new Class1().method3()));
+  Expect.isTrue(test(new Class2<num>().method4()));
+  Expect.isTrue(test(new Class3<num>().method5()));
+  Expect.isFalse(test(new Class4<num>().method6()));
+}
diff --git a/tests/compiler/dart2js_extra/method_signatures_strong_test.dart b/tests/compiler/dart2js_extra/method_signatures_strong_test.dart
new file mode 100644
index 0000000..d23ed34
--- /dev/null
+++ b/tests/compiler/dart2js_extra/method_signatures_strong_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class Class1 {
+  num method1<T>(num n) => null;
+
+  num method2<T>(int n) => null;
+
+  int method3<T>(num n) => null;
+}
+
+class Class2 {
+  num method4<T>(T n) => null;
+}
+
+class Class3 {
+  T method5<T>(num n) => null;
+}
+
+class Class4 {
+  num method6<T>(num n, T t) => null;
+}
+
+num method7<T>(T n) => null;
+
+T method8<T>(num n) => null;
+
+num method9<T>(num n, T t) => null;
+
+@NoInline()
+test(o) => o is num Function(num);
+
+forceInstantiation(num Function(num) f) => f;
+
+main() {
+  Expect.isFalse(test(new Class1().method1));
+  Expect.isFalse(test(new Class1().method2));
+  Expect.isFalse(test(new Class1().method3));
+  Expect.isTrue(test(forceInstantiation(new Class2().method4)));
+  Expect.isTrue(test(forceInstantiation(new Class3().method5)));
+  Expect.isFalse(test(new Class4().method6));
+  Expect.isTrue(test(forceInstantiation(method7)));
+  Expect.isTrue(test(forceInstantiation(method8)));
+  Expect.isFalse(test(method9));
+}
diff --git a/tests/compiler/dart2js_extra/method_signatures_test.dart b/tests/compiler/dart2js_extra/method_signatures_test.dart
new file mode 100644
index 0000000..569b329
--- /dev/null
+++ b/tests/compiler/dart2js_extra/method_signatures_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class Class1 {
+  num method1(num n) => null;
+
+  num method2(int n) => null;
+
+  Object method3(num n) => null;
+}
+
+class Class2<T> {
+  num method4(T n) => null;
+}
+
+class Class3<T> {
+  T method5(num n) => null;
+}
+
+class Class4<T> {
+  num method6(num n, T t) => null;
+}
+
+num method7(num n) => null;
+
+num method8(int n) => null;
+
+Object method9(num n) => null;
+
+@NoInline()
+test(o) => o is num Function(num);
+
+main() {
+  Expect.isTrue(test(new Class1().method1));
+  Expect.isFalse(test(new Class1().method2));
+  Expect.isFalse(test(new Class1().method3));
+  Expect.isTrue(test(new Class2<num>().method4));
+  Expect.isTrue(test(new Class3<num>().method5));
+  Expect.isFalse(test(new Class4<num>().method6));
+  Expect.isTrue(test(method7));
+  Expect.isFalse(test(method8));
+  Expect.isFalse(test(method9));
+}
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index 4b626c0..ce101ae 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -161,6 +161,7 @@
 
 [ $compiler == dart2js && $checked && $fasta && $strong ]
 apply3_test: RuntimeError
+collection_of_test: RuntimeError
 error_stack_trace1_test: RuntimeError # Issue 12399
 from_environment_const_type_test/02: MissingCompileTimeError
 from_environment_const_type_test/03: MissingCompileTimeError
@@ -195,15 +196,24 @@
 dynamic_nosuchmethod_test: Fail # mirrors not supported
 
 [ $compiler == dart2js && $fast_startup && $fasta && $strong ]
-iterable_return_type_test/01: RuntimeError # Issue 20085
+cast_test: RuntimeError
+error_stack_trace1_test: RuntimeError
+growable_list_test: RuntimeError
+int_parse_radix_test/01: RuntimeError
+int_parse_radix_test/02: RuntimeError
+integer_to_radix_string_test/01: RuntimeError
+integer_to_radix_string_test/02: RuntimeError
+integer_to_radix_string_test/none: RuntimeError
+integer_to_string_test/01: RuntimeError
 iterable_return_type_test/02: RuntimeError # Dart2js does not support Uint64*.
-iterable_to_list_test/01: Crash # Wrong number of template arguments, given 2, expected 1
-iterable_to_list_test/none: Crash # Wrong number of template arguments, given 2, expected 1
-list_test/01: Crash # Unsupported operation: Unsupported type parameter type node T.
-list_test/none: Crash # Unsupported operation: Unsupported type parameter type node T.
-map_test: Crash # tests/corelib_2/map_test.dart:903:7: Internal problem: Unhandled Null in installDefaultConstructor.
+list_concurrent_modify_test: RuntimeError
+main_test: RuntimeError
+nan_infinity_test/01: RuntimeError
+string_split_test/checkedstore: RuntimeError
 symbol_reserved_word_test/03: RuntimeError # Issue 19972, new Symbol('void') should be allowed.
 uri_base_test: Crash # RangeError (index): Invalid value: Valid value range is empty: 0
+uri_parameters_all_test: RuntimeError
+uri_test: RuntimeError
 
 [ $compiler == dart2js && $fasta ]
 int_from_environment_test: Pass # Issue 31762
@@ -268,9 +278,6 @@
 [ $compiler == dart2js && !$fasta ]
 *: SkipByDesign
 
-[ $compiler == dart2js && $strong ]
-collection_of_test: RuntimeError
-
 [ $compiler != dart2js && $compiler != dartdevc && $compiler != dartdevk && $compiler != dartk && $compiler != dartkp && $compiler != fasta ]
 iterable_element_at_test/static: MissingCompileTimeError
 
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 80b93c7..0453fe4 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -87,7 +87,6 @@
 assign_static_type_test/01: Fail
 assign_static_type_test/02: MissingCompileTimeError
 async_return_types_test/nestedFuture: Fail # Issue 26429
-async_return_types_test/wrongTypeParameter: Fail # Issue 26429
 cha_deopt1_test: RuntimeError
 cha_deopt2_test: RuntimeError
 cha_deopt3_test: RuntimeError
diff --git a/tests/language_2/export1_lib.dart b/tests/language_2/export1_lib.dart
index 77768c1..3f7be5b 100644
--- a/tests/language_2/export1_lib.dart
+++ b/tests/language_2/export1_lib.dart
@@ -4,6 +4,6 @@
 
 library export1_lib;
 
-export "dart:math" show LN10, LN2, E;
+export "dart:math" show ln10, ln2, e;
 
-var E = "E"; // Hides constant E from math lib.
+var e = "E"; // Hides constant E from math lib.
diff --git a/tests/language_2/function_type_alias6_test.dart b/tests/language_2/function_type_alias6_test.dart
index 47821da..4c5a5a6 100644
--- a/tests/language_2/function_type_alias6_test.dart
+++ b/tests/language_2/function_type_alias6_test.dart
@@ -21,7 +21,7 @@
   var f = (List x) {};
   Expect.isTrue(f is F);
   var g = (List<F> x) {};
-  Expect.isTrue(g is F);
+  Expect.isFalse(g is F);
   var d = new D();
   Expect.isTrue(d.foo is! C);
   Expect.isTrue(d.bar is C);
diff --git a/tests/language_2/import_combinators_test.dart b/tests/language_2/import_combinators_test.dart
index ecb5c87..c2757e1 100644
--- a/tests/language_2/import_combinators_test.dart
+++ b/tests/language_2/import_combinators_test.dart
@@ -9,7 +9,7 @@
 import "package:expect/expect.dart";
 import "import1_lib.dart" show hide, show hide ugly;
 import "export1_lib.dart";
-import "dart:math" as M show E;
+import "dart:math" as M show e;
 
 part "import_combinators_part.dart";
 
@@ -19,9 +19,9 @@
   // Top-level function from part, refers to imported variable show.
   Expect.equals("show", lookBehindCurtain());
   // Top-level variable E from export1_lib.dart.
-  Expect.equals("E", E);
+  Expect.equals("E", e);
   // Top-level variable E imported from dart:math.
-  Expect.equals(2.718281828459045, M.E);
+  Expect.equals(2.718281828459045, M.e);
   // Constant LN2 from math library, re-exported by export1_lib.dart.
-  Expect.equals(0.6931471805599453, LN2);
+  Expect.equals(0.6931471805599453, ln2);
 }
diff --git a/tests/language_2/instantiate_tearoff_test.dart b/tests/language_2/instantiate_tearoff_test.dart
index 1c50f7f..254949e 100644
--- a/tests/language_2/instantiate_tearoff_test.dart
+++ b/tests/language_2/instantiate_tearoff_test.dart
@@ -8,10 +8,9 @@
 
 int intToInt(int x) => x;
 String stringToString(String x) => x;
+String stringAndIntToString(String x, int y) => x;
 
-main() {
-  int Function(int) intFunc = f;
-  dynamic intFuncDynamic = intFunc;
+test(intFuncDynamic, stringFuncDynamic, dynamicFuncDynamic) {
   Expect.isTrue(intFuncDynamic is int Function(int));
   Expect.isFalse(intFuncDynamic is String Function(String));
   Expect.equals(intFuncDynamic(1), 1);
@@ -22,8 +21,6 @@
   Expect.throwsNoSuchMethodError(() {
     intFuncDynamic<String>('oops');
   });
-  String Function(String) stringFunc = f;
-  dynamic stringFuncDynamic = stringFunc;
   Expect.isTrue(stringFuncDynamic is String Function(String));
   Expect.isFalse(stringFuncDynamic is int Function(int));
   Expect.equals(stringFuncDynamic('hello'), 'hello');
@@ -35,9 +32,33 @@
   Expect.throwsNoSuchMethodError(() {
     stringFuncDynamic<int>(1);
   });
-  dynamic Function(dynamic) dynamicFunc = f;
-  dynamic dynamicFuncDynamic = dynamicFunc;
   Expect.throwsNoSuchMethodError(() {
     dynamicFuncDynamic<int>(1);
   });
 }
+
+main() {
+  int Function(int) if1 = f;
+  String Function(String) sf1 = f;
+  dynamic Function(dynamic) df1 = f;
+  test(if1, sf1, df1);
+
+  T local<T>(T x) => x;
+
+  int Function(int) if2 = local;
+  String Function(String) sf2 = local;
+  dynamic Function(dynamic) df2 = local;
+  test(if2, sf2, df2);
+
+  dynamic bar<X>() {
+    String foo<T>(X x, T t) {
+      return "$X, $T";
+    }
+
+    String Function(X, int) x = foo;
+    return x;
+  }
+  dynamic fn = bar<String>();
+  Expect.equals("${fn.runtimeType}", "${stringAndIntToString.runtimeType}");
+  Expect.equals(fn("a", 1), "String, int");
+}
diff --git a/tests/language_2/intrinsified_methods_test.dart b/tests/language_2/intrinsified_methods_test.dart
index 6e3401b..c321cf4 100644
--- a/tests/language_2/intrinsified_methods_test.dart
+++ b/tests/language_2/intrinsified_methods_test.dart
@@ -24,7 +24,7 @@
 }
 
 testTrigonometric() {
-  Expect.approxEquals(1.0, sin(PI / 2.0), 0.0001);
+  Expect.approxEquals(1.0, sin(pi / 2.0), 0.0001);
   Expect.approxEquals(1.0, cos(0), 0.0001);
   Expect.approxEquals(1.0, cos(0.0), 0.0001);
 }
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index 0ed2de8..55a2708 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -140,7 +140,6 @@
 switch4_negative_test: CompileTimeError
 switch5_negative_test: CompileTimeError
 switch7_negative_test: CompileTimeError
-syntax_test/none: Fail # Issue 11575
 test_negative_test: CompileTimeError
 try_catch_on_syntax_test/10: MissingCompileTimeError
 try_catch_on_syntax_test/11: MissingCompileTimeError
@@ -520,26 +519,7 @@
 optional_named_parameters_test/08: MissingCompileTimeError
 optional_named_parameters_test/09: MissingCompileTimeError
 override_field_test/02: MissingCompileTimeError
-override_inheritance_abstract_test/02: MissingCompileTimeError
-override_inheritance_abstract_test/03: MissingCompileTimeError
-override_inheritance_abstract_test/04: MissingCompileTimeError
-override_inheritance_abstract_test/08: MissingCompileTimeError
-override_inheritance_abstract_test/09: MissingCompileTimeError
-override_inheritance_abstract_test/10: MissingCompileTimeError
-override_inheritance_abstract_test/11: MissingCompileTimeError
-override_inheritance_abstract_test/12: MissingCompileTimeError
-override_inheritance_abstract_test/13: MissingCompileTimeError
-override_inheritance_abstract_test/14: MissingCompileTimeError
-override_inheritance_abstract_test/17: MissingCompileTimeError
-override_inheritance_abstract_test/19: MissingCompileTimeError
-override_inheritance_abstract_test/20: MissingCompileTimeError
-override_inheritance_abstract_test/21: MissingCompileTimeError
-override_inheritance_abstract_test/22: MissingCompileTimeError
-override_inheritance_abstract_test/23: MissingCompileTimeError
-override_inheritance_abstract_test/24: MissingCompileTimeError
-override_inheritance_abstract_test/25: MissingCompileTimeError
-override_inheritance_abstract_test/26: MissingCompileTimeError
-override_inheritance_abstract_test/28: MissingCompileTimeError
+override_inheritance_abstract_test/*: Skip # Tests Dart 2 semantics
 override_inheritance_field_test/05: MissingCompileTimeError
 override_inheritance_field_test/07: MissingCompileTimeError
 override_inheritance_field_test/08: MissingCompileTimeError
@@ -590,7 +570,6 @@
 override_inheritance_no_such_method_test/09: MissingCompileTimeError
 override_inheritance_no_such_method_test/10: MissingCompileTimeError
 override_inheritance_no_such_method_test/12: MissingCompileTimeError
-override_inheritance_no_such_method_test/13: MissingCompileTimeError
 override_method_with_field_test/02: MissingCompileTimeError
 parser_quirks_test: StaticWarning
 part2_test/01: MissingCompileTimeError
@@ -984,26 +963,7 @@
 optional_named_parameters_test/08: MissingCompileTimeError
 optional_named_parameters_test/09: MissingCompileTimeError
 override_field_test/02: MissingCompileTimeError
-override_inheritance_abstract_test/02: MissingCompileTimeError
-override_inheritance_abstract_test/03: MissingCompileTimeError
-override_inheritance_abstract_test/04: MissingCompileTimeError
-override_inheritance_abstract_test/08: MissingCompileTimeError
-override_inheritance_abstract_test/09: MissingCompileTimeError
-override_inheritance_abstract_test/10: MissingCompileTimeError
-override_inheritance_abstract_test/11: MissingCompileTimeError
-override_inheritance_abstract_test/12: MissingCompileTimeError
-override_inheritance_abstract_test/13: MissingCompileTimeError
-override_inheritance_abstract_test/14: MissingCompileTimeError
-override_inheritance_abstract_test/17: MissingCompileTimeError
-override_inheritance_abstract_test/19: MissingCompileTimeError
-override_inheritance_abstract_test/20: MissingCompileTimeError
-override_inheritance_abstract_test/21: MissingCompileTimeError
-override_inheritance_abstract_test/22: MissingCompileTimeError
-override_inheritance_abstract_test/23: MissingCompileTimeError
-override_inheritance_abstract_test/24: MissingCompileTimeError
-override_inheritance_abstract_test/25: MissingCompileTimeError
-override_inheritance_abstract_test/26: MissingCompileTimeError
-override_inheritance_abstract_test/28: MissingCompileTimeError
+override_inheritance_abstract_test/*: Skip # Tests Dart 2 semantics
 override_inheritance_field_test/05: MissingCompileTimeError
 override_inheritance_field_test/07: MissingCompileTimeError
 override_inheritance_field_test/08: MissingCompileTimeError
@@ -1054,7 +1014,6 @@
 override_inheritance_no_such_method_test/09: MissingCompileTimeError
 override_inheritance_no_such_method_test/10: MissingCompileTimeError
 override_inheritance_no_such_method_test/12: MissingCompileTimeError
-override_inheritance_no_such_method_test/13: MissingCompileTimeError
 override_method_with_field_test/02: MissingCompileTimeError
 parser_quirks_test: StaticWarning
 part2_test/01: MissingCompileTimeError
@@ -1194,25 +1153,6 @@
 multiple_interface_inheritance_test: CompileTimeError # Issue 30552
 no_main_test/01: MissingStaticWarning # Issue 28823
 no_such_method_negative_test: CompileTimeError
-override_inheritance_abstract_test/02: MissingCompileTimeError
-override_inheritance_abstract_test/03: MissingCompileTimeError
-override_inheritance_abstract_test/04: MissingCompileTimeError
-override_inheritance_abstract_test/08: MissingCompileTimeError
-override_inheritance_abstract_test/09: MissingCompileTimeError
-override_inheritance_abstract_test/10: MissingCompileTimeError
-override_inheritance_abstract_test/11: MissingCompileTimeError
-override_inheritance_abstract_test/12: MissingCompileTimeError
-override_inheritance_abstract_test/13: MissingCompileTimeError
-override_inheritance_abstract_test/14: MissingCompileTimeError
-override_inheritance_abstract_test/17: MissingCompileTimeError
-override_inheritance_abstract_test/19: MissingCompileTimeError
-override_inheritance_abstract_test/20: MissingCompileTimeError
-override_inheritance_abstract_test/21: MissingCompileTimeError
-override_inheritance_abstract_test/22: MissingCompileTimeError
-override_inheritance_abstract_test/23: MissingCompileTimeError
-override_inheritance_abstract_test/24: MissingCompileTimeError
-override_inheritance_abstract_test/25: MissingCompileTimeError
-override_inheritance_abstract_test/26: MissingCompileTimeError
 override_inheritance_field_test/04: CompileTimeError
 override_inheritance_field_test/06: CompileTimeError
 override_inheritance_field_test/26: CompileTimeError
@@ -1225,7 +1165,6 @@
 override_inheritance_generic_test/02: CompileTimeError
 override_inheritance_method_test/28: CompileTimeError
 override_inheritance_method_test/29: CompileTimeError
-override_inheritance_no_such_method_test/13: MissingCompileTimeError
 parameter_initializer_test: CompileTimeError
 parser_quirks_test: CompileTimeError
 prefix13_negative_test: CompileTimeError, OK
@@ -1248,6 +1187,8 @@
 super_bound_closure_test/none: CompileTimeError
 super_setter_test: StaticWarning # Issue 28823
 switch_case_test/none: CompileTimeError
+syntax_test/60: MissingCompileTimeError
+syntax_test/61: MissingCompileTimeError
 type_promotion_functions_test/01: Pass
 type_promotion_functions_test/05: Pass
 type_promotion_functions_test/06: Pass
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index 742853a..7d81932 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -73,7 +73,6 @@
 function_subtype_call2_test: RuntimeError
 function_subtype_cast1_test: RuntimeError
 function_subtype_not1_test: RuntimeError
-function_subtype_typearg5_test: RuntimeError
 function_type/function_type0_test: RuntimeError # Issue 30476
 function_type/function_type10_test: RuntimeError # Issue 30476
 function_type/function_type12_test: RuntimeError # Issue 30476
@@ -193,8 +192,6 @@
 checked_method_error_order_test: RuntimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
-closure_invoked_through_interface_target_field_test: MissingCompileTimeError
-closure_invoked_through_interface_target_getter_test: MissingCompileTimeError
 compile_time_constant_o_test/01: MissingCompileTimeError
 compile_time_constant_o_test/02: MissingCompileTimeError
 conditional_method_invocation_test/05: MissingCompileTimeError
@@ -339,8 +336,6 @@
 generic_closure_test/01: RuntimeError
 generic_closure_test/none: RuntimeError
 generic_function_dcall_test: Crash # Unsupported operation: Unsupported type parameter type node T.
-generic_function_typedef_test/01: RuntimeError
-generic_instanceof_test: RuntimeError
 generic_tearoff_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_typedef_test: RuntimeError
 getter_override2_test/02: MissingCompileTimeError
@@ -371,7 +366,6 @@
 list_literal_syntax_test/02: MissingCompileTimeError
 list_literal_syntax_test/03: MissingCompileTimeError
 malformed2_test/00: MissingCompileTimeError
-many_generic_instanceof_test: RuntimeError
 map_literal1_test/01: MissingCompileTimeError
 map_literal8_test: RuntimeError
 method_override7_test/00: MissingCompileTimeError
@@ -525,12 +519,12 @@
 switch_case_test/01: MissingCompileTimeError
 switch_case_test/02: MissingCompileTimeError
 symbol_literal_test/01: MissingCompileTimeError
-syntax_test/28: MissingCompileTimeError
-syntax_test/29: MissingCompileTimeError
-syntax_test/30: MissingCompileTimeError
-syntax_test/31: MissingCompileTimeError
-syntax_test/32: MissingCompileTimeError
-syntax_test/33: MissingCompileTimeError
+syntax_test/28: MissingCompileTimeError # Issue 29763
+syntax_test/29: MissingCompileTimeError # Issue 29763
+syntax_test/30: MissingCompileTimeError # Issue 29763
+syntax_test/31: MissingCompileTimeError # Issue 29763
+syntax_test/32: MissingCompileTimeError # Issue 29763
+syntax_test/33: MissingCompileTimeError # Issue 29763
 tearoff_dynamic_test: RuntimeError
 truncdiv_test: RuntimeError # non JS number semantics - Issue 15246
 try_catch_test/01: MissingCompileTimeError
@@ -560,8 +554,6 @@
 issue31596_super_test/04: MissingCompileTimeError
 issue31596_super_test/05: RuntimeError
 issue31596_test: RuntimeError
-nsm5_test: MissingCompileTimeError
-override_inheritance_no_such_method_test/05: MissingCompileTimeError
 
 [ $compiler == dart2js && $fast_startup ]
 const_evaluation_test/*: Fail # mirrors not supported
@@ -592,220 +584,188 @@
 vm/reflect_core_vm_test: Fail # mirrors not supported
 
 [ $compiler == dart2js && $fast_startup && $fasta && $strong ]
-assertion_initializer_const_function_test/01: MissingCompileTimeError
 assertion_test: RuntimeError
+async_await_test/02: RuntimeError
+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
 bad_override_test/04: MissingCompileTimeError
 bad_override_test/05: MissingCompileTimeError
 bit_operations_test: RuntimeError
 branch_canonicalization_test: RuntimeError
-call_function_apply_test: RuntimeError # Issue 23873
+call_method_implicit_tear_off_implements_function_test/02: RuntimeError
+call_method_implicit_tear_off_implements_function_test/04: RuntimeError
+call_method_implicit_tear_off_test/02: RuntimeError
+call_method_implicit_tear_off_test/04: RuntimeError
 canonical_const2_test: RuntimeError, OK # non JS number semantics
+cha_deopt1_test: RuntimeError
+cha_deopt2_test: RuntimeError
+cha_deopt3_test: RuntimeError
 check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
-closure_invoked_through_interface_target_field_test: MissingCompileTimeError
-closure_invoked_through_interface_target_getter_test: MissingCompileTimeError
 compile_time_constant_o_test/01: MissingCompileTimeError
 compile_time_constant_o_test/02: MissingCompileTimeError
-conditional_method_invocation_test/05: MissingCompileTimeError
-conditional_method_invocation_test/06: MissingCompileTimeError
-conditional_method_invocation_test/07: MissingCompileTimeError
-conditional_method_invocation_test/08: MissingCompileTimeError
-conditional_method_invocation_test/12: MissingCompileTimeError
-conditional_method_invocation_test/13: MissingCompileTimeError
-conditional_method_invocation_test/18: MissingCompileTimeError
-conditional_method_invocation_test/19: MissingCompileTimeError
-conditional_property_access_test/04: MissingCompileTimeError
-conditional_property_access_test/05: MissingCompileTimeError
-conditional_property_access_test/06: MissingCompileTimeError
-conditional_property_access_test/10: MissingCompileTimeError
-conditional_property_access_test/11: MissingCompileTimeError
-conditional_property_access_test/16: MissingCompileTimeError
-conditional_property_access_test/17: MissingCompileTimeError
-conditional_property_assignment_test/04: MissingCompileTimeError
-conditional_property_assignment_test/05: MissingCompileTimeError
-conditional_property_assignment_test/06: MissingCompileTimeError
-conditional_property_assignment_test/10: MissingCompileTimeError
-conditional_property_assignment_test/11: MissingCompileTimeError
-conditional_property_assignment_test/12: MissingCompileTimeError
-conditional_property_assignment_test/13: MissingCompileTimeError
-conditional_property_assignment_test/27: MissingCompileTimeError
-conditional_property_assignment_test/28: MissingCompileTimeError
-conditional_property_assignment_test/32: MissingCompileTimeError
-conditional_property_assignment_test/33: MissingCompileTimeError
-conditional_property_assignment_test/34: MissingCompileTimeError
-conditional_property_assignment_test/35: MissingCompileTimeError
-conditional_property_increment_decrement_test/04: MissingCompileTimeError
-conditional_property_increment_decrement_test/08: MissingCompileTimeError
-conditional_property_increment_decrement_test/12: MissingCompileTimeError
-conditional_property_increment_decrement_test/16: MissingCompileTimeError
-conditional_property_increment_decrement_test/21: MissingCompileTimeError
-conditional_property_increment_decrement_test/22: MissingCompileTimeError
-conditional_property_increment_decrement_test/27: MissingCompileTimeError
-conditional_property_increment_decrement_test/28: MissingCompileTimeError
-conditional_property_increment_decrement_test/33: MissingCompileTimeError
-conditional_property_increment_decrement_test/34: MissingCompileTimeError
-conditional_property_increment_decrement_test/39: MissingCompileTimeError
-conditional_property_increment_decrement_test/40: MissingCompileTimeError
+compile_time_constant_static5_test/11: CompileTimeError
+compile_time_constant_static5_test/16: CompileTimeError
+compile_time_constant_static5_test/21: CompileTimeError
+compile_time_constant_static5_test/23: CompileTimeError
+conditional_rewrite_test: RuntimeError
 config_import_test: RuntimeError
-const_constructor2_test/05: MissingCompileTimeError
-const_constructor2_test/06: MissingCompileTimeError
-const_constructor2_test/13: MissingCompileTimeError
-const_constructor2_test/14: MissingCompileTimeError
-const_constructor2_test/15: MissingCompileTimeError
-const_constructor2_test/16: MissingCompileTimeError
-const_constructor2_test/17: MissingCompileTimeError
-const_constructor2_test/18: MissingCompileTimeError
-const_constructor2_test/20: MissingCompileTimeError
-const_constructor2_test/22: MissingCompileTimeError
-const_constructor2_test/24: MissingCompileTimeError
 const_dynamic_type_literal_test/02: MissingCompileTimeError
-const_error_multiply_initialized_test/02: MissingCompileTimeError
-const_error_multiply_initialized_test/04: MissingCompileTimeError
 const_evaluation_test/01: RuntimeError
-const_init2_test/02: MissingCompileTimeError
 const_instance_field_test/01: MissingCompileTimeError
+const_list_test: RuntimeError
 const_map2_test/00: MissingCompileTimeError
 const_map3_test/00: MissingCompileTimeError
+const_map4_test: RuntimeError
 const_switch2_test/01: MissingCompileTimeError
 const_switch_test/02: RuntimeError, OK # constant identity based on JS constants
 const_switch_test/04: RuntimeError, OK # constant identity based on JS constants
-const_types_test/01: MissingCompileTimeError
-const_types_test/02: MissingCompileTimeError
-const_types_test/03: MissingCompileTimeError
-const_types_test/04: MissingCompileTimeError
-const_types_test/05: MissingCompileTimeError
-const_types_test/06: MissingCompileTimeError
-const_types_test/13: MissingCompileTimeError
 const_types_test/34: MissingCompileTimeError
-const_types_test/35: MissingCompileTimeError
 const_types_test/39: MissingCompileTimeError
-const_types_test/40: MissingCompileTimeError
 constants_test/05: MissingCompileTimeError
-constructor_duplicate_final_test/01: MissingCompileTimeError
-constructor_duplicate_final_test/02: MissingCompileTimeError
-constructor_named_arguments_test/01: MissingCompileTimeError
+constructor12_test: RuntimeError
 constructor_named_arguments_test/none: RuntimeError
 constructor_redirect1_negative_test/01: Crash # Stack Overflow
-constructor_redirect1_negative_test/none: MissingCompileTimeError
 constructor_redirect2_negative_test: Crash # Stack Overflow
-constructor_redirect2_test/01: MissingCompileTimeError
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
-covariant_override/runtime_check_test: RuntimeError
-covariant_subtyping_tearoff1_test: RuntimeError
-covariant_subtyping_tearoff2_test: RuntimeError
-covariant_subtyping_tearoff3_test: RuntimeError
+covariance_type_parameter_test/01: RuntimeError
+covariance_type_parameter_test/02: RuntimeError
+covariance_type_parameter_test/03: RuntimeError
+covariant_override/tear_off_type_test: RuntimeError
 covariant_subtyping_test: Crash # Unsupported operation: Unsupported type parameter type node E.
-covariant_subtyping_unsafe_call1_test: RuntimeError
-covariant_subtyping_unsafe_call2_test: RuntimeError
-covariant_subtyping_unsafe_call3_test: RuntimeError
 cyclic_constructor_test/01: Crash # Stack Overflow
+cyclic_type_test/00: RuntimeError
+cyclic_type_test/02: RuntimeError
+cyclic_type_test/03: RuntimeError
+cyclic_type_test/04: RuntimeError
+cyclic_typedef_test/10: Crash # Crash when compiling file:///usr/local/google/home/sra/Dart/sdk/out/ReleaseX64/generated_tests/language_2/cyclic_typedef_test_10.dart,
+cyclic_typedef_test/11: Crash # Crash when compiling file:///usr/local/google/home/sra/Dart/sdk/out/ReleaseX64/generated_tests/language_2/cyclic_typedef_test_11.dart,
+deferred_closurize_load_library_test: RuntimeError
+deferred_constant_list_test: RuntimeError
 deferred_constraints_constants_test/default_argument2: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred_constraints_constants_test/none: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred_constraints_constants_test/reference_after_load: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
-deferred_constraints_type_annotation_test/as_operation: MissingCompileTimeError
-deferred_constraints_type_annotation_test/catch_check: MissingCompileTimeError
-deferred_constraints_type_annotation_test/is_check: MissingCompileTimeError
-deferred_constraints_type_annotation_test/new_before_load: MissingCompileTimeError
-deferred_constraints_type_annotation_test/new_generic2: MissingCompileTimeError
-deferred_constraints_type_annotation_test/new_generic3: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation1: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic1: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic2: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic3: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic4: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_null: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_top_level: MissingCompileTimeError
+deferred_constraints_type_annotation_test/new: RuntimeError
+deferred_constraints_type_annotation_test/new_generic1: RuntimeError
+deferred_constraints_type_annotation_test/none: RuntimeError
+deferred_constraints_type_annotation_test/static_method: RuntimeError
+deferred_constraints_type_annotation_test/type_annotation_non_deferred: RuntimeError
+deferred_function_type_test: RuntimeError
+deferred_global_test: RuntimeError
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
+deferred_inlined_test: RuntimeError
 deferred_load_constants_test/none: RuntimeError
-deferred_load_library_wrong_args_test/01: MissingRuntimeError
+deferred_load_inval_code_test: RuntimeError
+deferred_load_library_wrong_args_test/01: CompileTimeError
+deferred_mixin_test: RuntimeError
+deferred_no_such_method_test: RuntimeError
 deferred_not_loaded_check_test: RuntimeError # Test out of date. Issue 31933
+deferred_only_constant_test: RuntimeError
+deferred_optimized_test: RuntimeError
 deferred_redirecting_factory_test: RuntimeError
+deferred_regression_22995_test: RuntimeError
+deferred_regression_28678_test: RuntimeError
+deferred_shadow_load_library_test: RuntimeError
+deferred_shared_and_unshared_classes_test: RuntimeError
+deferred_static_seperate_test: RuntimeError
+deferred_type_dependency_test/as: RuntimeError
+deferred_type_dependency_test/is: RuntimeError
+deferred_type_dependency_test/none: RuntimeError
+deferred_type_dependency_test/type_annotation: RuntimeError
 double_int_to_string_test: RuntimeError, OK # non JS number semantics
 duplicate_export_negative_test: Fail
 duplicate_implements_test/01: MissingCompileTimeError
 duplicate_implements_test/02: MissingCompileTimeError
-duplicate_implements_test/03: MissingCompileTimeError
-duplicate_implements_test/04: MissingCompileTimeError
-dynamic_prefix_core_test/none: RuntimeError
-dynamic_test: RuntimeError
+dynamic_prefix_core_test/none: CompileTimeError
+emit_const_fields_test: CompileTimeError
 enum_mirror_test: RuntimeError
+example_constructor_test: RuntimeError
 expect_test: RuntimeError, OK # Issue 13080
 external_test/10: MissingRuntimeError
 external_test/13: MissingRuntimeError
 external_test/20: MissingRuntimeError
-factory_redirection_test/07: MissingCompileTimeError
+external_test/21: CompileTimeError
+external_test/24: CompileTimeError
+extract_type_arguments_test: RuntimeError
+f_bounded_quantification4_test: RuntimeError
 fauxverride_test/03: MissingCompileTimeError
 fauxverride_test/05: MissingCompileTimeError
 field_increment_bailout_test: RuntimeError
+field_initialization_order_test/01: MissingCompileTimeError
+field_initialization_order_test/none: RuntimeError
 field_override3_test/00: MissingCompileTimeError
 field_override3_test/01: MissingCompileTimeError
 field_override3_test/02: MissingCompileTimeError
 field_override3_test/03: MissingCompileTimeError
 field_override4_test/02: MissingCompileTimeError
-final_attempt_reinitialization_test/01: MissingCompileTimeError
-final_attempt_reinitialization_test/02: MissingCompileTimeError
+flatten_test/05: MissingRuntimeError
+flatten_test/08: MissingRuntimeError
+flatten_test/09: MissingRuntimeError
+flatten_test/12: MissingRuntimeError
 full_stacktrace1_test: RuntimeError # Issue 12698
 full_stacktrace2_test: RuntimeError # Issue 12698
 full_stacktrace3_test: RuntimeError # Issue 12698
+function_subtype3_test: RuntimeError
 function_subtype_bound_closure3_test: RuntimeError
 function_subtype_bound_closure4_test: RuntimeError
-function_subtype_bound_closure7_test: RuntimeError
 function_subtype_call1_test: RuntimeError
 function_subtype_call2_test: RuntimeError
 function_subtype_cast1_test: RuntimeError
-function_subtype_checked0_test: RuntimeError
-function_subtype_closure0_test: RuntimeError
-function_subtype_closure1_test: RuntimeError
-function_subtype_factory1_test: RuntimeError
-function_subtype_inline1_test: RuntimeError
 function_subtype_inline2_test: RuntimeError
-function_subtype_named1_test: RuntimeError
-function_subtype_named2_test: RuntimeError
 function_subtype_not1_test: RuntimeError
-function_subtype_optional1_test: RuntimeError
-function_subtype_optional2_test: RuntimeError
-function_subtype_regression_ddc_588_test: RuntimeError
 function_subtype_setter0_test: RuntimeError
-function_subtype_typearg2_test: RuntimeError
-function_subtype_typearg3_test: RuntimeError
-function_subtype_typearg5_test: RuntimeError
-function_type2_test: RuntimeError
 function_type_alias2_test: RuntimeError
-function_type_alias_test: RuntimeError
-generalized_void_syntax_test: CompileTimeError # Issue #30176.
+function_type_alias4_test: RuntimeError
 generic_closure_test/01: RuntimeError
 generic_closure_test/none: RuntimeError
-generic_field_mixin6_test/none: RuntimeError
-generic_function_bounds_test: Crash # Unsupported operation: Unsupported type parameter type node T.
-generic_function_dcall_test: Crash # Unsupported operation: Unsupported type parameter type node T.
-generic_function_typedef_test/01: RuntimeError
-generic_instanceof_test: RuntimeError
-generic_list_checked_test: RuntimeError
-generic_local_functions_test: Crash # Unsupported operation: Unsupported type parameter type node Y.
-generic_tearoff_test: Crash # Unsupported operation: Unsupported type parameter type node T.
-generic_typedef_test: Crash # Unsupported operation: Unsupported type parameter type node S.
+generic_function_bounds_test: RuntimeError
+generic_function_dcall_test: RuntimeError
+generic_function_type_as_type_argument_test/01: MissingCompileTimeError
+generic_function_type_as_type_argument_test/02: MissingCompileTimeError
+generic_instanceof2_test: RuntimeError
+generic_is_check_test: RuntimeError
+generic_method_types_test/02: RuntimeError
+generic_methods_bounds_test/02: MissingRuntimeError
+generic_methods_dynamic_test/02: MissingRuntimeError
+generic_methods_dynamic_test/04: MissingRuntimeError
+generic_methods_generic_class_tearoff_test: RuntimeError
+generic_methods_generic_function_result_test/01: MissingCompileTimeError
+generic_methods_simple_as_expression_test/02: MissingRuntimeError
+generic_methods_type_expression_test: RuntimeError
+generic_methods_unused_parameter_test: RuntimeError
+generic_no_such_method_dispatcher_simple_test: CompileTimeError
+generic_no_such_method_dispatcher_test: CompileTimeError
+generic_tearoff_test: CompileTimeError
 getter_override2_test/02: MissingCompileTimeError
 getter_override_test/00: MissingCompileTimeError
 getter_override_test/01: MissingCompileTimeError
 getter_override_test/02: MissingCompileTimeError
-getters_setters2_test/01: RuntimeError
-getters_setters2_test/none: RuntimeError
 identical_closure2_test: RuntimeError # non JS number semantics
 if_null_precedence_test/none: RuntimeError
-implicit_creation/implicit_new_or_const_composite_test: RuntimeError
-implicit_creation/implicit_new_or_const_test: RuntimeError
-inferrer_synthesized_constructor_test: RuntimeError
 infinity_test: RuntimeError # non JS number semantics - Issue 4984
 instance_creation_in_function_annotation_test: RuntimeError
-instanceof2_test: RuntimeError
-instanceof4_test/01: RuntimeError
-instanceof4_test/none: RuntimeError
+instantiate_tearoff_of_call_test: CompileTimeError
+int64_literal_test/01: RuntimeError
+int64_literal_test/02: RuntimeError
+int64_literal_test/03: MissingCompileTimeError
+int64_literal_test/04: RuntimeError
+int64_literal_test/05: RuntimeError
+int64_literal_test/10: RuntimeError
+int64_literal_test/20: RuntimeError
+int64_literal_test/30: MissingCompileTimeError
+int64_literal_test/40: RuntimeError
+int64_literal_test/none: RuntimeError
 integer_division_by_zero_test: RuntimeError # Issue 8301
 internal_library_test/02: Crash # NoSuchMethodError: Class 'DillLibraryBuilder' has no instance getter 'mixinApplicationClasses'.
 invocation_mirror2_test: RuntimeError # mirrors not supported
@@ -813,39 +773,29 @@
 invocation_mirror_invoke_on_test: RuntimeError
 issue21079_test: RuntimeError
 issue23244_test: RuntimeError
+issue31596_super_test/01: CompileTimeError
+issue31596_super_test/03: CompileTimeError
 left_shift_test: RuntimeError # non JS number semantics
 library_env_test/has_mirror_support: RuntimeError
-list_literal1_test/01: MissingCompileTimeError
-list_literal4_test/00: MissingCompileTimeError
-list_literal4_test/01: MissingCompileTimeError
-list_literal4_test/03: MissingCompileTimeError
-list_literal4_test/04: MissingCompileTimeError
-list_literal4_test/05: MissingCompileTimeError
-list_literal_syntax_test/01: MissingCompileTimeError
-list_literal_syntax_test/02: MissingCompileTimeError
-list_literal_syntax_test/03: MissingCompileTimeError
-malformed2_test/00: MissingCompileTimeError
-many_generic_instanceof_test: RuntimeError
+local_function2_test/none: RuntimeError
+local_function3_test/none: RuntimeError
+local_function_test/none: RuntimeError
+main_test/03: RuntimeError
 many_overridden_no_such_method_test: RuntimeError
-map_literal8_test: RuntimeError
 method_override7_test/00: MissingCompileTimeError
 method_override7_test/01: MissingCompileTimeError
 method_override7_test/02: MissingCompileTimeError
 method_override8_test/00: MissingCompileTimeError
 method_override8_test/01: MissingCompileTimeError
+method_override_test: CompileTimeError
+minify_closure_variable_collision_test: CompileTimeError
 mint_arithmetic_test: RuntimeError # non JS number semantics
 mixin_forwarding_constructor4_test/01: MissingCompileTimeError
 mixin_forwarding_constructor4_test/02: MissingCompileTimeError
 mixin_forwarding_constructor4_test/03: MissingCompileTimeError
 mixin_illegal_super_use_test/01: MissingCompileTimeError
-mixin_illegal_super_use_test/02: MissingCompileTimeError
-mixin_illegal_super_use_test/03: MissingCompileTimeError
 mixin_illegal_super_use_test/04: MissingCompileTimeError
-mixin_illegal_super_use_test/05: MissingCompileTimeError
-mixin_illegal_super_use_test/06: MissingCompileTimeError
 mixin_illegal_super_use_test/07: MissingCompileTimeError
-mixin_illegal_super_use_test/08: MissingCompileTimeError
-mixin_illegal_super_use_test/09: MissingCompileTimeError
 mixin_illegal_super_use_test/10: MissingCompileTimeError
 mixin_illegal_super_use_test/11: MissingCompileTimeError
 mixin_illegal_superclass_test/01: MissingCompileTimeError
@@ -878,14 +828,7 @@
 mixin_illegal_superclass_test/28: MissingCompileTimeError
 mixin_illegal_superclass_test/29: MissingCompileTimeError
 mixin_illegal_superclass_test/30: MissingCompileTimeError
-mixin_issue10216_2_test: RuntimeError
-mixin_mixin4_test: RuntimeError
-mixin_mixin5_test: RuntimeError
 mixin_mixin6_test: RuntimeError
-mixin_mixin7_test: RuntimeError
-mixin_mixin_bound2_test: RuntimeError
-mixin_mixin_bound_test: RuntimeError
-mixin_mixin_test: RuntimeError
 mixin_of_mixin_test/none: CompileTimeError
 mixin_super_2_test/none: CompileTimeError
 mixin_super_constructor_named_test/01: MissingCompileTimeError
@@ -911,7 +854,10 @@
 mixin_supertype_subclass4_test/04: CompileTimeError
 mixin_supertype_subclass4_test/05: CompileTimeError
 mixin_supertype_subclass4_test/none: CompileTimeError
-mixin_type_parameters_super_test: RuntimeError
+mixin_supertype_subclass_test/01: CompileTimeError
+mixin_supertype_subclass_test/03: CompileTimeError
+mixin_supertype_subclass_test/04: CompileTimeError
+mixin_supertype_subclass_test/none: CompileTimeError
 modulo_test: RuntimeError # non JS number semantics
 multiline_newline_test/04: MissingCompileTimeError
 multiline_newline_test/04r: MissingCompileTimeError
@@ -920,17 +866,16 @@
 multiline_newline_test/06: MissingCompileTimeError
 multiline_newline_test/06r: MissingCompileTimeError
 named_parameters_default_eq_test/02: MissingCompileTimeError
+named_parameters_default_eq_test/none: RuntimeError
 nan_identical_test: RuntimeError # Issue 11551
-nested_generic_closure_test: Crash # Unsupported operation: Unsupported type parameter type node F.
+nested_generic_closure_test: RuntimeError
 no_main_test/01: CompileTimeError
+no_such_method_mock_test: RuntimeError
 no_such_method_test: RuntimeError
-not_enough_positional_arguments_test/00: MissingCompileTimeError
-not_enough_positional_arguments_test/01: MissingCompileTimeError
-not_enough_positional_arguments_test/02: MissingCompileTimeError
-not_enough_positional_arguments_test/03: MissingCompileTimeError
-not_enough_positional_arguments_test/05: MissingCompileTimeError
-not_enough_positional_arguments_test/06: MissingCompileTimeError
-not_enough_positional_arguments_test/07: MissingCompileTimeError
+nosuchmethod_forwarding/nosuchmethod_forwarding_arguments_test: RuntimeError
+nosuchmethod_forwarding/nosuchmethod_forwarding_test/05: RuntimeError
+nosuchmethod_forwarding/nosuchmethod_forwarding_test/06: RuntimeError
+null_no_such_method_test: CompileTimeError
 null_test/mirrors: RuntimeError
 null_test/none: RuntimeError
 number_identity2_test: RuntimeError
@@ -941,6 +886,13 @@
 override_field_method4_negative_test: Fail
 override_field_method5_negative_test: Fail
 override_field_test/01: MissingCompileTimeError
+override_inheritance_field_test/04: CompileTimeError
+override_inheritance_field_test/06: CompileTimeError
+override_inheritance_field_test/26: CompileTimeError
+override_inheritance_field_test/29: CompileTimeError
+override_inheritance_generic_test/02: CompileTimeError
+override_inheritance_method_test/28: CompileTimeError
+override_inheritance_method_test/29: CompileTimeError
 override_inheritance_mixed_test/01: MissingCompileTimeError
 override_inheritance_mixed_test/02: MissingCompileTimeError
 override_inheritance_mixed_test/03: MissingCompileTimeError
@@ -948,23 +900,24 @@
 override_inheritance_mixed_test/08: MissingCompileTimeError
 override_inheritance_mixed_test/09: MissingCompileTimeError
 override_method_with_field_test/01: MissingCompileTimeError
-positional_parameters_type_test/01: MissingCompileTimeError
-positional_parameters_type_test/02: MissingCompileTimeError
-private_super_constructor_test/01: MissingCompileTimeError
+parser_quirks_test: CompileTimeError
 redirecting_factory_default_values_test/01: MissingCompileTimeError
 redirecting_factory_default_values_test/02: MissingCompileTimeError
-redirecting_factory_long_test: RuntimeError
 redirecting_factory_reflection_test: RuntimeError
-regress_20394_test/01: MissingCompileTimeError
+regress_22443_test: RuntimeError
+regress_23089_test: Crash # Crash when compiling file:///usr/local/google/home/sra/Dart/sdk/tests/language_2/regress_23089_test.dart,
+regress_23408_test: CompileTimeError
 regress_24283_test: RuntimeError # non JS number semantics
 regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
-regress_28217_test/01: MissingCompileTimeError
-regress_28217_test/none: MissingCompileTimeError
 regress_28255_test: RuntimeError
-regress_28341_test: RuntimeError
+regress_28278_test: RuntimeError
+regress_29025_test: CompileTimeError
+regress_29405_test: CompileTimeError
 regress_29784_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in () for j:constructor(A.ok).
 regress_29784_test/02: MissingCompileTimeError # Issue 29784
-regress_31057_test: Crash # Unsupported operation: Unsupported type parameter type node B.
+regress_30339_test: CompileTimeError
+runtime_type_function_test: RuntimeError
+setter_no_getter_test/01: CompileTimeError
 setter_override_test/00: MissingCompileTimeError
 setter_override_test/03: MissingCompileTimeError
 stacktrace_demangle_ctors_test: RuntimeError # Issue 12698
@@ -972,25 +925,49 @@
 stacktrace_rethrow_error_test/withtraceparameter: RuntimeError # Issue 12698
 stacktrace_rethrow_nonerror_test: RuntimeError # Issue 12698
 stacktrace_test: RuntimeError # Issue 12698
+string_interpolate_test: CompileTimeError
+string_interpolation_and_buffer_test: RuntimeError
+string_split_test: CompileTimeError
+string_supertype_checked_test: CompileTimeError
+super_bound_closure_test/none: CompileTimeError
 super_call4_test: Crash # NoSuchMethodError: The getter 'thisLocal' was called on null.
+super_no_such_method1_test: CompileTimeError
+super_no_such_method2_test: CompileTimeError
+super_no_such_method3_test: CompileTimeError
+super_no_such_method4_test: CompileTimeError
+super_no_such_method5_test: CompileTimeError
+super_operator_index5_test: CompileTimeError
+super_operator_index6_test: CompileTimeError
+super_operator_index7_test: CompileTimeError
+super_operator_index8_test: CompileTimeError
+super_test: RuntimeError
 switch_bad_case_test/01: MissingCompileTimeError
 switch_bad_case_test/02: MissingCompileTimeError
 switch_case_test/00: MissingCompileTimeError
 switch_case_test/01: MissingCompileTimeError
 switch_case_test/02: MissingCompileTimeError
-symbol_literal_test/01: MissingCompileTimeError
-syntax_test/28: MissingCompileTimeError
-syntax_test/29: MissingCompileTimeError
-syntax_test/30: MissingCompileTimeError
-syntax_test/31: MissingCompileTimeError
-syntax_test/32: MissingCompileTimeError
-syntax_test/33: MissingCompileTimeError
-tearoff_dynamic_test: Crash # Unsupported operation: Unsupported type parameter type node T.
+syntax_test/28: MissingCompileTimeError # Issue 29763
+syntax_test/29: MissingCompileTimeError # Issue 29763
+syntax_test/30: MissingCompileTimeError # Issue 29763
+syntax_test/31: MissingCompileTimeError # Issue 29763
+syntax_test/32: MissingCompileTimeError # Issue 29763
+syntax_test/33: MissingCompileTimeError # Issue 29763
+tearoff_dynamic_test: RuntimeError
 truncdiv_test: RuntimeError # non JS number semantics - Issue 15246
 try_catch_test/01: MissingCompileTimeError
+type_error_test: RuntimeError
 type_literal_test: RuntimeError
-type_variable_conflict2_test/02: MissingCompileTimeError
-typevariable_substitution2_test/02: RuntimeError
+type_promotion_functions_test/02: CompileTimeError
+type_promotion_functions_test/03: CompileTimeError
+type_promotion_functions_test/04: CompileTimeError
+type_promotion_functions_test/09: CompileTimeError
+type_promotion_functions_test/11: CompileTimeError
+type_promotion_functions_test/12: CompileTimeError
+type_promotion_functions_test/13: CompileTimeError
+type_promotion_functions_test/14: CompileTimeError
+type_promotion_functions_test/none: CompileTimeError
+type_promotion_more_specific_test/04: CompileTimeError
+type_variable_promotion_test: RuntimeError
 
 [ $compiler == dart2js && $fasta ]
 call_method_as_cast_test/06: RuntimeError
@@ -1005,7 +982,6 @@
 extract_type_arguments_test: Crash # Issue 31371
 function_propagation_test: RuntimeError
 generic_test/01: MissingCompileTimeError # front end does not validate `extends`
-implicit_downcast_during_yield_star_test: RuntimeError
 instantiate_tearoff_of_call_test: RuntimeError
 instantiate_tearoff_test: RuntimeError
 mixin_type_parameter_inference_error_test/none: CompileTimeError
@@ -1033,39 +1009,27 @@
 type_alias_equality_test/04: RuntimeError # Issue 32784
 
 [ $compiler == dart2js && $fasta && $host_checked && $strong ]
-abstract_factory_constructor_test/00: MissingCompileTimeError
-abstract_getter_test/01: MissingCompileTimeError
 abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
 abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError
-abstract_syntax_test/00: MissingCompileTimeError
 additional_interface_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
 additional_interface_adds_optional_args_concrete_test: MissingCompileTimeError
 assertion_test: RuntimeError
 async_await_test/02: RuntimeError
 async_await_test/03: RuntimeError
 async_await_test/none: RuntimeError
-async_congruence_local_test/none: RuntimeError
-async_congruence_method_test/none: RuntimeError
-async_congruence_top_level_test: RuntimeError
-async_congruence_unnamed_test/none: RuntimeError
 async_or_generator_return_type_stacktrace_test/01: MissingCompileTimeError
 async_or_generator_return_type_stacktrace_test/02: MissingCompileTimeError
 async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError
 async_return_types_test/nestedFuture: 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/tooManyTypeParameters: 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_await_pauses_test: RuntimeError
 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_regression_2238_test: RuntimeError
-async_star_regression_23116_test: RuntimeError
-async_star_stream_take_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
-async_test: 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
@@ -1092,8 +1056,6 @@
 class_literal_static_test/01: MissingCompileTimeError
 class_literal_static_test/03: MissingCompileTimeError
 class_literal_static_test/07: MissingCompileTimeError
-closure_invoked_through_interface_target_field_test: MissingCompileTimeError
-closure_invoked_through_interface_target_getter_test: MissingCompileTimeError
 closure_self_reference_test: Crash # 'file:*/pkg/compiler/lib/src/ssa/nodes.dart': Failed assertion: line 641 pos 12: 'isClosed()': is not true.
 compile_time_constant_k_test/01: MissingCompileTimeError
 compile_time_constant_k_test/02: MissingCompileTimeError
@@ -1197,7 +1159,6 @@
 f_bounded_quantification4_test: RuntimeError
 f_bounded_quantification_test/01: MissingCompileTimeError
 f_bounded_quantification_test/02: MissingCompileTimeError
-factory2_test/03: MissingCompileTimeError
 factory4_test/00: MissingCompileTimeError
 fauxverride_test/03: MissingCompileTimeError
 fauxverride_test/05: MissingCompileTimeError
@@ -1228,7 +1189,6 @@
 function_subtype_inline2_test: RuntimeError
 function_subtype_not1_test: RuntimeError
 function_subtype_setter0_test: RuntimeError
-function_subtype_typearg5_test: RuntimeError
 function_type_alias2_test: RuntimeError
 function_type_alias4_test: RuntimeError
 generic_closure_test/01: RuntimeError
@@ -1237,9 +1197,7 @@
 generic_function_dcall_test: RuntimeError
 generic_function_type_as_type_argument_test/01: MissingCompileTimeError
 generic_function_type_as_type_argument_test/02: MissingCompileTimeError
-generic_function_typedef_test/01: RuntimeError
 generic_instanceof2_test: RuntimeError
-generic_instanceof_test: RuntimeError
 generic_is_check_test: RuntimeError
 generic_method_types_test/02: RuntimeError
 generic_methods_bounds_test/01: MissingCompileTimeError
@@ -1267,8 +1225,6 @@
 identical_const_test/03: MissingCompileTimeError
 identical_const_test/04: MissingCompileTimeError
 if_null_precedence_test/none: RuntimeError
-implicit_this_test/01: MissingCompileTimeError
-implicit_this_test/04: MissingCompileTimeError
 infinity_test: RuntimeError # non JS number semantics - Issue 4984
 initializing_formal_type_annotation_test/01: MissingCompileTimeError
 initializing_formal_type_annotation_test/02: MissingCompileTimeError
@@ -1321,7 +1277,6 @@
 malbounded_type_test_test/00: MissingCompileTimeError
 malbounded_type_test_test/01: MissingCompileTimeError
 malbounded_type_test_test/02: MissingCompileTimeError
-many_generic_instanceof_test: RuntimeError
 many_overridden_no_such_method_test: RuntimeError
 map_literal3_test/01: MissingCompileTimeError
 map_literal3_test/02: MissingCompileTimeError
@@ -1467,25 +1422,6 @@
 override_field_test/01: MissingCompileTimeError
 override_field_test/02: MissingCompileTimeError
 override_field_test/03: MissingCompileTimeError
-override_inheritance_abstract_test/02: MissingCompileTimeError
-override_inheritance_abstract_test/03: MissingCompileTimeError
-override_inheritance_abstract_test/04: MissingCompileTimeError
-override_inheritance_abstract_test/08: MissingCompileTimeError
-override_inheritance_abstract_test/09: MissingCompileTimeError
-override_inheritance_abstract_test/10: MissingCompileTimeError
-override_inheritance_abstract_test/11: MissingCompileTimeError
-override_inheritance_abstract_test/12: MissingCompileTimeError
-override_inheritance_abstract_test/13: MissingCompileTimeError
-override_inheritance_abstract_test/14: MissingCompileTimeError
-override_inheritance_abstract_test/17: MissingCompileTimeError
-override_inheritance_abstract_test/19: MissingCompileTimeError
-override_inheritance_abstract_test/20: MissingCompileTimeError
-override_inheritance_abstract_test/21: MissingCompileTimeError
-override_inheritance_abstract_test/22: MissingCompileTimeError
-override_inheritance_abstract_test/23: MissingCompileTimeError
-override_inheritance_abstract_test/24: MissingCompileTimeError
-override_inheritance_abstract_test/25: MissingCompileTimeError
-override_inheritance_abstract_test/26: MissingCompileTimeError
 override_inheritance_field_test/04: CompileTimeError
 override_inheritance_field_test/06: CompileTimeError
 override_inheritance_field_test/26: CompileTimeError
@@ -1502,18 +1438,8 @@
 override_inheritance_mixed_test/02: MissingCompileTimeError
 override_inheritance_mixed_test/03: MissingCompileTimeError
 override_inheritance_mixed_test/04: MissingCompileTimeError
-override_inheritance_mixed_test/06: MissingCompileTimeError
-override_inheritance_mixed_test/07: MissingCompileTimeError
 override_inheritance_mixed_test/08: MissingCompileTimeError
 override_inheritance_mixed_test/09: MissingCompileTimeError
-override_inheritance_no_such_method_test/01: MissingCompileTimeError
-override_inheritance_no_such_method_test/02: MissingCompileTimeError
-override_inheritance_no_such_method_test/06: MissingCompileTimeError
-override_inheritance_no_such_method_test/07: MissingCompileTimeError
-override_inheritance_no_such_method_test/09: MissingCompileTimeError
-override_inheritance_no_such_method_test/10: MissingCompileTimeError
-override_inheritance_no_such_method_test/12: MissingCompileTimeError
-override_inheritance_no_such_method_test/13: MissingCompileTimeError
 override_method_with_field_test/01: MissingCompileTimeError
 parser_quirks_test: CompileTimeError
 partial_tearoff_instantiation_test/05: Crash # Assertion failure: kind=special,memberName=instantiate,callStructure:CallStructure(arity=0, types=1)
@@ -1598,12 +1524,12 @@
 syntax_test/24: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
 syntax_test/25: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
 syntax_test/26: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-syntax_test/28: MissingCompileTimeError
-syntax_test/29: MissingCompileTimeError
-syntax_test/30: MissingCompileTimeError
-syntax_test/31: MissingCompileTimeError
-syntax_test/32: MissingCompileTimeError
-syntax_test/33: MissingCompileTimeError
+syntax_test/28: MissingCompileTimeError # Issue 29763
+syntax_test/29: MissingCompileTimeError # Issue 29763
+syntax_test/30: MissingCompileTimeError # Issue 29763
+syntax_test/31: MissingCompileTimeError # Issue 29763
+syntax_test/32: MissingCompileTimeError # Issue 29763
+syntax_test/33: MissingCompileTimeError # Issue 29763
 tearoff_dynamic_test: RuntimeError
 truncdiv_test: RuntimeError # non JS number semantics - Issue 15246
 try_catch_test/01: MissingCompileTimeError
@@ -1707,39 +1633,27 @@
 wrong_number_type_arguments_test/none: Pass
 
 [ $compiler == dart2js && $fasta && $minified && $strong ]
-abstract_factory_constructor_test/00: MissingCompileTimeError
-abstract_getter_test/01: MissingCompileTimeError
 abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
 abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError
-abstract_syntax_test/00: MissingCompileTimeError
 additional_interface_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
 additional_interface_adds_optional_args_concrete_test: MissingCompileTimeError
 assertion_test: RuntimeError
 async_await_test/02: RuntimeError
 async_await_test/03: RuntimeError
 async_await_test/none: RuntimeError
-async_congruence_local_test/none: RuntimeError
-async_congruence_method_test/none: RuntimeError
-async_congruence_top_level_test: RuntimeError
-async_congruence_unnamed_test/none: RuntimeError
 async_or_generator_return_type_stacktrace_test/01: MissingCompileTimeError
 async_or_generator_return_type_stacktrace_test/02: MissingCompileTimeError
 async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError
 async_return_types_test/nestedFuture: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 async_return_types_test/tooManyTypeParameters: 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_await_pauses_test: RuntimeError
 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_regression_2238_test: RuntimeError
-async_star_regression_23116_test: RuntimeError
-async_star_stream_take_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
-async_test: 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
@@ -1766,8 +1680,6 @@
 class_literal_static_test/01: MissingCompileTimeError
 class_literal_static_test/03: MissingCompileTimeError
 class_literal_static_test/07: MissingCompileTimeError
-closure_invoked_through_interface_target_field_test: MissingCompileTimeError
-closure_invoked_through_interface_target_getter_test: MissingCompileTimeError
 compile_time_constant_k_test/01: MissingCompileTimeError
 compile_time_constant_k_test/02: MissingCompileTimeError
 compile_time_constant_k_test/03: MissingCompileTimeError
@@ -1866,7 +1778,6 @@
 f_bounded_quantification4_test: RuntimeError # Issue 12605
 f_bounded_quantification_test/01: MissingCompileTimeError
 f_bounded_quantification_test/02: MissingCompileTimeError
-factory2_test/03: MissingCompileTimeError
 factory4_test/00: MissingCompileTimeError
 fauxverride_test/03: MissingCompileTimeError
 fauxverride_test/05: MissingCompileTimeError
@@ -1897,16 +1808,13 @@
 function_subtype_inline2_test: RuntimeError
 function_subtype_not1_test: RuntimeError
 function_subtype_setter0_test: RuntimeError
-function_subtype_typearg5_test: RuntimeError
 function_type_alias2_test: RuntimeError
 function_type_alias4_test: RuntimeError
 generic_function_bounds_test: RuntimeError
 generic_function_dcall_test: RuntimeError
 generic_function_type_as_type_argument_test/01: MissingCompileTimeError
 generic_function_type_as_type_argument_test/02: MissingCompileTimeError
-generic_function_typedef_test/01: RuntimeError
 generic_instanceof2_test: RuntimeError
-generic_instanceof_test: RuntimeError
 generic_is_check_test: RuntimeError
 generic_method_types_test/02: RuntimeError
 generic_methods_bounds_test/01: MissingCompileTimeError
@@ -1934,8 +1842,6 @@
 identical_const_test/03: MissingCompileTimeError
 identical_const_test/04: MissingCompileTimeError
 if_null_precedence_test/none: RuntimeError
-implicit_this_test/01: MissingCompileTimeError
-implicit_this_test/04: MissingCompileTimeError
 infinity_test: RuntimeError # non JS number semantics - Issue 4984
 initializing_formal_type_annotation_test/01: MissingCompileTimeError
 initializing_formal_type_annotation_test/02: MissingCompileTimeError
@@ -1988,7 +1894,6 @@
 malbounded_type_test_test/00: MissingCompileTimeError
 malbounded_type_test_test/01: MissingCompileTimeError
 malbounded_type_test_test/02: MissingCompileTimeError
-many_generic_instanceof_test: RuntimeError
 many_overridden_no_such_method_test: RuntimeError
 map_literal3_test/01: MissingCompileTimeError
 map_literal3_test/02: MissingCompileTimeError
@@ -2136,25 +2041,6 @@
 override_field_test/01: MissingCompileTimeError
 override_field_test/02: MissingCompileTimeError
 override_field_test/03: MissingCompileTimeError
-override_inheritance_abstract_test/02: MissingCompileTimeError
-override_inheritance_abstract_test/03: MissingCompileTimeError
-override_inheritance_abstract_test/04: MissingCompileTimeError
-override_inheritance_abstract_test/08: MissingCompileTimeError
-override_inheritance_abstract_test/09: MissingCompileTimeError
-override_inheritance_abstract_test/10: MissingCompileTimeError
-override_inheritance_abstract_test/11: MissingCompileTimeError
-override_inheritance_abstract_test/12: MissingCompileTimeError
-override_inheritance_abstract_test/13: MissingCompileTimeError
-override_inheritance_abstract_test/14: MissingCompileTimeError
-override_inheritance_abstract_test/17: MissingCompileTimeError
-override_inheritance_abstract_test/19: MissingCompileTimeError
-override_inheritance_abstract_test/20: MissingCompileTimeError
-override_inheritance_abstract_test/21: MissingCompileTimeError
-override_inheritance_abstract_test/22: MissingCompileTimeError
-override_inheritance_abstract_test/23: MissingCompileTimeError
-override_inheritance_abstract_test/24: MissingCompileTimeError
-override_inheritance_abstract_test/25: MissingCompileTimeError
-override_inheritance_abstract_test/26: MissingCompileTimeError
 override_inheritance_field_test/04: CompileTimeError
 override_inheritance_field_test/06: CompileTimeError
 override_inheritance_field_test/26: CompileTimeError
@@ -2171,18 +2057,8 @@
 override_inheritance_mixed_test/02: MissingCompileTimeError
 override_inheritance_mixed_test/03: MissingCompileTimeError
 override_inheritance_mixed_test/04: MissingCompileTimeError
-override_inheritance_mixed_test/06: MissingCompileTimeError
-override_inheritance_mixed_test/07: MissingCompileTimeError
 override_inheritance_mixed_test/08: MissingCompileTimeError
 override_inheritance_mixed_test/09: MissingCompileTimeError
-override_inheritance_no_such_method_test/01: MissingCompileTimeError
-override_inheritance_no_such_method_test/02: MissingCompileTimeError
-override_inheritance_no_such_method_test/06: MissingCompileTimeError
-override_inheritance_no_such_method_test/07: MissingCompileTimeError
-override_inheritance_no_such_method_test/09: MissingCompileTimeError
-override_inheritance_no_such_method_test/10: MissingCompileTimeError
-override_inheritance_no_such_method_test/12: MissingCompileTimeError
-override_inheritance_no_such_method_test/13: MissingCompileTimeError
 override_method_with_field_test/01: MissingCompileTimeError
 parser_quirks_test: CompileTimeError
 recursive_generic_test: RuntimeError
@@ -2242,12 +2118,12 @@
 switch_case_test/01: MissingCompileTimeError
 switch_case_test/02: MissingCompileTimeError
 symbol_conflict_test: RuntimeError # Issue 23857
-syntax_test/28: MissingCompileTimeError
-syntax_test/29: MissingCompileTimeError
-syntax_test/30: MissingCompileTimeError
-syntax_test/31: MissingCompileTimeError
-syntax_test/32: MissingCompileTimeError
-syntax_test/33: MissingCompileTimeError
+syntax_test/28: MissingCompileTimeError # Issue 29763
+syntax_test/29: MissingCompileTimeError # Issue 29763
+syntax_test/30: MissingCompileTimeError # Issue 29763
+syntax_test/31: MissingCompileTimeError # Issue 29763
+syntax_test/32: MissingCompileTimeError # Issue 29763
+syntax_test/33: MissingCompileTimeError # Issue 29763
 tearoff_dynamic_test: RuntimeError
 truncdiv_test: RuntimeError # non JS number semantics - Issue 15246
 try_catch_test/01: MissingCompileTimeError
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index b259467..b611f55 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -146,6 +146,7 @@
 parameter_initializer_test: CompileTimeError
 part_refers_to_core_library_test/01: Crash
 prefix10_negative_test: Fail # Issue 29920
+regress_23089_test: MissingCompileTimeError
 regress_23408_test: CompileTimeError
 regress_24283_test: RuntimeError # Intended to fail, requires 64-bit numbers.
 regress_29025_test: CompileTimeError # Issue 29081
@@ -170,7 +171,8 @@
 super_operator_index7_test: RuntimeError
 super_operator_index8_test: RuntimeError
 switch_case_test/none: CompileTimeError
-syntax_test/none: CompileTimeError
+syntax_test/60: MissingCompileTimeError
+syntax_test/61: MissingCompileTimeError
 truncdiv_test: RuntimeError # Issue 29920
 try_catch_on_syntax_test/10: MissingCompileTimeError
 try_catch_on_syntax_test/11: MissingCompileTimeError
@@ -287,9 +289,6 @@
 void_type_usage_test/paren_void_init: MissingCompileTimeError
 
 [ $compiler == dartdevk ]
-abstract_factory_constructor_test/00: MissingCompileTimeError
-abstract_getter_test/01: MissingCompileTimeError
-abstract_syntax_test/00: MissingCompileTimeError
 additional_interface_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
 additional_interface_adds_optional_args_concrete_test: MissingCompileTimeError
 async_or_generator_return_type_stacktrace_test/01: MissingCompileTimeError
@@ -317,8 +316,6 @@
 check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
-closure_invoked_through_interface_target_field_test: MissingCompileTimeError
-closure_invoked_through_interface_target_getter_test: MissingCompileTimeError
 compile_time_constant_c_test/02: MissingCompileTimeError
 compile_time_constant_k_test/01: MissingCompileTimeError
 compile_time_constant_k_test/02: MissingCompileTimeError
@@ -379,7 +376,6 @@
 external_test/24: CompileTimeError
 f_bounded_quantification_test/01: MissingCompileTimeError
 f_bounded_quantification_test/02: MissingCompileTimeError
-factory2_test/03: MissingCompileTimeError
 factory4_test/00: MissingCompileTimeError
 fauxverride_test/03: MissingCompileTimeError
 fauxverride_test/05: MissingCompileTimeError
@@ -420,8 +416,6 @@
 implicit_creation/implicit_const_not_default_values_test/e30: Pass
 implicit_creation/implicit_const_not_default_values_test/e6: Pass
 implicit_creation/implicit_const_not_default_values_test/e9: Pass
-implicit_this_test/01: MissingCompileTimeError
-implicit_this_test/04: MissingCompileTimeError
 initializing_formal_type_annotation_test/01: MissingCompileTimeError
 initializing_formal_type_annotation_test/02: MissingCompileTimeError
 instantiate_tearoff_of_call_test: CompileTimeError
@@ -524,12 +518,6 @@
 mixin_invalid_bound_test/08: MissingCompileTimeError
 mixin_invalid_bound_test/09: MissingCompileTimeError
 mixin_invalid_bound_test/10: MissingCompileTimeError
-mixin_of_mixin_test/01: MissingCompileTimeError
-mixin_of_mixin_test/02: MissingCompileTimeError
-mixin_of_mixin_test/03: MissingCompileTimeError
-mixin_of_mixin_test/04: MissingCompileTimeError
-mixin_of_mixin_test/05: MissingCompileTimeError
-mixin_of_mixin_test/06: MissingCompileTimeError
 mixin_regress_13688_test: RuntimeError # Issue 32427
 mixin_super_2_test/01: MissingCompileTimeError
 mixin_super_2_test/03: MissingCompileTimeError
@@ -551,7 +539,6 @@
 multiline_newline_test/06r: MissingCompileTimeError
 named_constructor_test/01: MissingCompileTimeError
 named_parameters_default_eq_test/02: MissingCompileTimeError
-nsm5_test: MissingCompileTimeError
 null2_test: RuntimeError # Issue 32194
 null_method_test: RuntimeError # Issue 32194
 null_no_such_method_test: CompileTimeError # Issue 31533
@@ -579,18 +566,8 @@
 override_inheritance_mixed_test/02: MissingCompileTimeError
 override_inheritance_mixed_test/03: MissingCompileTimeError
 override_inheritance_mixed_test/04: MissingCompileTimeError
-override_inheritance_mixed_test/06: MissingCompileTimeError
-override_inheritance_mixed_test/07: MissingCompileTimeError
 override_inheritance_mixed_test/08: MissingCompileTimeError
 override_inheritance_mixed_test/09: MissingCompileTimeError
-override_inheritance_no_such_method_test/01: MissingCompileTimeError
-override_inheritance_no_such_method_test/02: MissingCompileTimeError
-override_inheritance_no_such_method_test/05: MissingCompileTimeError
-override_inheritance_no_such_method_test/06: MissingCompileTimeError
-override_inheritance_no_such_method_test/07: MissingCompileTimeError
-override_inheritance_no_such_method_test/09: MissingCompileTimeError
-override_inheritance_no_such_method_test/10: MissingCompileTimeError
-override_inheritance_no_such_method_test/12: MissingCompileTimeError
 override_method_with_field_test/01: MissingCompileTimeError
 recursive_mixin_test: RuntimeError # Issue 32428
 redirecting_factory_default_values_test/01: MissingCompileTimeError
@@ -637,12 +614,6 @@
 switch_case_test/01: MissingCompileTimeError
 switch_case_test/02: MissingCompileTimeError
 syncstar_yield_test/copyParameters: RuntimeError # Expect.equals(expected: <2>, actual: <3>) fails.
-syntax_test/28: MissingCompileTimeError
-syntax_test/29: MissingCompileTimeError
-syntax_test/30: MissingCompileTimeError
-syntax_test/31: MissingCompileTimeError
-syntax_test/32: MissingCompileTimeError
-syntax_test/33: MissingCompileTimeError
 tearoff_dynamic_test: RuntimeError # Issue 32194
 try_catch_test/01: MissingCompileTimeError
 type_alias_equality_test/02: RuntimeError # Issue 32785
@@ -737,7 +708,6 @@
 flatten_test/12: MissingRuntimeError # Issue 29920
 for_variable_capture_test: RuntimeError # Issue 29920; Expect.equals(expected: <1>, actual: <0>) fails.
 function_subtype_inline2_test: RuntimeError # Expect.fail('Missing type error: 'new C.c1(m2)'.')
-function_type_alias6_test/none: RuntimeError # Expect.isTrue(false) fails.
 generic_function_type_as_type_argument_test/01: MissingCompileTimeError # Issue 29920
 generic_function_type_as_type_argument_test/02: MissingCompileTimeError # Issue 29920
 generic_instanceof2_test: RuntimeError # Issue 29920; ReferenceError: FooOfK$String is not defined
@@ -786,26 +756,6 @@
 numbers_test: RuntimeError # Issue 29920; Expect.equals(expected: <false>, actual: <true>) fails.
 overridden_no_such_method_test: RuntimeError # UnimplementedError: JsInstanceMirror.delegate unimplemented; UnimplementedError: JsInstanceMirror.delegate unimplemented
 override_field_test/03: MissingCompileTimeError
-override_inheritance_abstract_test/02: MissingCompileTimeError
-override_inheritance_abstract_test/03: MissingCompileTimeError
-override_inheritance_abstract_test/04: MissingCompileTimeError
-override_inheritance_abstract_test/08: MissingCompileTimeError
-override_inheritance_abstract_test/09: MissingCompileTimeError
-override_inheritance_abstract_test/10: MissingCompileTimeError
-override_inheritance_abstract_test/11: MissingCompileTimeError
-override_inheritance_abstract_test/12: MissingCompileTimeError
-override_inheritance_abstract_test/13: MissingCompileTimeError
-override_inheritance_abstract_test/14: MissingCompileTimeError
-override_inheritance_abstract_test/17: MissingCompileTimeError
-override_inheritance_abstract_test/19: MissingCompileTimeError
-override_inheritance_abstract_test/20: MissingCompileTimeError
-override_inheritance_abstract_test/21: MissingCompileTimeError
-override_inheritance_abstract_test/22: MissingCompileTimeError
-override_inheritance_abstract_test/23: MissingCompileTimeError
-override_inheritance_abstract_test/24: MissingCompileTimeError
-override_inheritance_abstract_test/25: MissingCompileTimeError
-override_inheritance_abstract_test/26: MissingCompileTimeError
-override_inheritance_no_such_method_test/13: MissingCompileTimeError
 parser_quirks_test: CompileTimeError
 private3_test: RuntimeError # Type 'PrivateSymbol' is not a subtype of type 'Symbol' in strong mode
 regress_16640_test: RuntimeError # Issue 29920; Uncaught Error: type arguments should not be null: E => {
@@ -821,5 +771,7 @@
 switch_label2_test: RuntimeError # Issue 29920; UnimplementedError: node <ShadowContinueSwitchStatement> see https://github.com/dart-lang/sdk/issues/29352 `continue #L1;
 switch_label_test: RuntimeError # Issue 29920; UnimplementedError: node <ShadowContinueSwitchStatement> see https://github.com/dart-lang/sdk/issues/29352 `continue #L1;
 switch_try_catch_test: RuntimeError # Issue 29920; Expect.throws: Unexpected 'UnimplementedError: node <ShadowContinueSwitchStatement> see https://github.com/dart-lang/sdk/issues/29352 `continue #L1;
+syntax_test/60: MissingCompileTimeError
+syntax_test/61: MissingCompileTimeError
 truncdiv_test: RuntimeError # Issue 29920; Expect.throws fails: Did not throw
 vm/*: SkipByDesign # VM only tests.; VM only tests.
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index ea83e68..52eae2d 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -53,11 +53,8 @@
 implicit_creation/implicit_const_not_default_values_test/e8: MissingCompileTimeError
 
 [ $fasta ]
-abstract_factory_constructor_test/00: MissingCompileTimeError # Issue 32013.
-abstract_getter_test/01: MissingCompileTimeError # Issue 32013.
-abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError # Issue 32013.
+abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError # Issue 32014.
 abstract_override_adds_optional_args_concrete_test: MissingCompileTimeError # Issue 32014.
-abstract_syntax_test/00: MissingCompileTimeError # Issue 32013.
 additional_interface_adds_optional_args_concrete_subclass_test: MissingCompileTimeError # Issue 32014.
 additional_interface_adds_optional_args_concrete_test: MissingCompileTimeError # Issue 32014.
 async_or_generator_return_type_stacktrace_test/01: MissingCompileTimeError
@@ -71,8 +68,6 @@
 call_non_method_field_test/01: MissingCompileTimeError
 call_non_method_field_test/02: MissingCompileTimeError
 check_member_static_test/01: MissingCompileTimeError
-closure_invoked_through_interface_target_field_test: MissingCompileTimeError
-closure_invoked_through_interface_target_getter_test: MissingCompileTimeError
 compile_time_constant_o_test/01: MissingCompileTimeError
 compile_time_constant_o_test/02: MissingCompileTimeError
 const_cast2_test/01: CompileTimeError
@@ -102,7 +97,6 @@
 duplicate_export_negative_test: Fail # Issue 6134
 f_bounded_quantification_test/01: MissingCompileTimeError
 f_bounded_quantification_test/02: MissingCompileTimeError
-factory2_test/03: MissingCompileTimeError
 factory4_test/00: MissingCompileTimeError
 field3_test/01: MissingCompileTimeError
 field_override_test/00: MissingCompileTimeError
@@ -115,8 +109,6 @@
 identical_const_test/02: MissingCompileTimeError
 identical_const_test/03: MissingCompileTimeError
 identical_const_test/04: MissingCompileTimeError
-implicit_this_test/01: MissingCompileTimeError
-implicit_this_test/04: MissingCompileTimeError
 issue31596_override_test/07: MissingCompileTimeError
 issue31596_override_test/08: MissingCompileTimeError
 issue31596_super_test/02: MissingCompileTimeError
@@ -176,45 +168,14 @@
 mixin_type_parameters_errors_test/05: MissingCompileTimeError
 named_constructor_test/01: MissingCompileTimeError
 named_parameters_default_eq_test/02: MissingCompileTimeError # Fasta bug: Default values are not allowed on redirecting factory constructors.
-nsm5_test: MissingCompileTimeError
 override_field_test/02: MissingCompileTimeError
 override_field_test/03: MissingCompileTimeError
-override_inheritance_abstract_test/02: MissingCompileTimeError
-override_inheritance_abstract_test/03: MissingCompileTimeError
-override_inheritance_abstract_test/04: MissingCompileTimeError
-override_inheritance_abstract_test/08: MissingCompileTimeError
-override_inheritance_abstract_test/09: MissingCompileTimeError
-override_inheritance_abstract_test/10: MissingCompileTimeError
-override_inheritance_abstract_test/11: MissingCompileTimeError
-override_inheritance_abstract_test/12: MissingCompileTimeError
-override_inheritance_abstract_test/13: MissingCompileTimeError
-override_inheritance_abstract_test/14: MissingCompileTimeError
-override_inheritance_abstract_test/17: MissingCompileTimeError
-override_inheritance_abstract_test/19: MissingCompileTimeError
-override_inheritance_abstract_test/20: MissingCompileTimeError
-override_inheritance_abstract_test/21: MissingCompileTimeError
-override_inheritance_abstract_test/22: MissingCompileTimeError
-override_inheritance_abstract_test/23: MissingCompileTimeError
-override_inheritance_abstract_test/24: MissingCompileTimeError
-override_inheritance_abstract_test/25: MissingCompileTimeError
-override_inheritance_abstract_test/26: MissingCompileTimeError
 override_inheritance_field_test/44: MissingCompileTimeError
 override_inheritance_field_test/47: MissingCompileTimeError
 override_inheritance_field_test/48: MissingCompileTimeError
 override_inheritance_field_test/53: MissingCompileTimeError
 override_inheritance_field_test/54: MissingCompileTimeError
-override_inheritance_mixed_test/06: MissingCompileTimeError
-override_inheritance_mixed_test/07: MissingCompileTimeError
 override_inheritance_mixed_test/09: MissingCompileTimeError
-override_inheritance_no_such_method_test/01: MissingCompileTimeError
-override_inheritance_no_such_method_test/02: MissingCompileTimeError
-override_inheritance_no_such_method_test/05: MissingCompileTimeError
-override_inheritance_no_such_method_test/06: MissingCompileTimeError
-override_inheritance_no_such_method_test/07: MissingCompileTimeError
-override_inheritance_no_such_method_test/09: MissingCompileTimeError
-override_inheritance_no_such_method_test/10: MissingCompileTimeError
-override_inheritance_no_such_method_test/12: MissingCompileTimeError
-override_inheritance_no_such_method_test/13: MissingCompileTimeError
 partial_tearoff_instantiation_test/05: MissingCompileTimeError
 partial_tearoff_instantiation_test/06: MissingCompileTimeError
 partial_tearoff_instantiation_test/07: MissingCompileTimeError
@@ -233,14 +194,14 @@
 switch_case_test/00: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 switch_case_test/01: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 switch_case_test/02: MissingCompileTimeError # KernelVM bug: Constant evaluation.
-syntax_test/28: MissingCompileTimeError
-syntax_test/29: MissingCompileTimeError
-syntax_test/30: MissingCompileTimeError
-syntax_test/31: MissingCompileTimeError
-syntax_test/32: MissingCompileTimeError
-syntax_test/33: MissingCompileTimeError
-syntax_test/60: MissingCompileTimeError
-syntax_test/61: MissingCompileTimeError
+syntax_test/28: MissingCompileTimeError # Issue 29763
+syntax_test/29: MissingCompileTimeError # Issue 29763
+syntax_test/30: MissingCompileTimeError # Issue 29763
+syntax_test/31: MissingCompileTimeError # Issue 29763
+syntax_test/32: MissingCompileTimeError # Issue 29763
+syntax_test/33: MissingCompileTimeError # Issue 29763
+syntax_test/60: MissingCompileTimeError # Issue 30176
+syntax_test/61: MissingCompileTimeError # Issue 30176
 type_variable_bounds2_test: MissingCompileTimeError
 type_variable_bounds3_test/00: MissingCompileTimeError
 type_variable_bounds4_test/01: MissingCompileTimeError
@@ -490,13 +451,6 @@
 [ $arch != simarm && $arch != simarm64 && $arch != simdbc64 && $compiler == dartk ]
 export_ambiguous_main_test: MissingCompileTimeError
 
-[ $arch == simdbc64 && $compiler == dartk && $mode == debug && $strong ]
-partial_tearoff_instantiation_test/05: Crash # Issue http://dartbug.com/32340
-partial_tearoff_instantiation_test/06: Crash # Issue http://dartbug.com/32340
-partial_tearoff_instantiation_test/07: Crash # Issue http://dartbug.com/32340
-partial_tearoff_instantiation_test/08: Crash # Issue http://dartbug.com/32340
-partial_tearoff_instantiation_test/none: Crash # Issue http://dartbug.com/32340
-
 [ $compiler != dart2js && $compiler != dartk && $compiler != dartkp && $fasta ]
 const_optional_args_test/01: MissingCompileTimeError
 
@@ -504,12 +458,6 @@
 compile_time_constant_c_test/02: MissingCompileTimeError
 const_constructor_nonconst_field_test/01: MissingCompileTimeError
 const_syntax_test/05: MissingCompileTimeError
-mixin_of_mixin_test/01: MissingCompileTimeError
-mixin_of_mixin_test/02: MissingCompileTimeError
-mixin_of_mixin_test/03: MissingCompileTimeError
-mixin_of_mixin_test/04: MissingCompileTimeError
-mixin_of_mixin_test/05: MissingCompileTimeError
-mixin_of_mixin_test/06: MissingCompileTimeError
 mixin_super_2_test/01: MissingCompileTimeError
 mixin_super_2_test/03: MissingCompileTimeError
 mixin_supertype_subclass_test/02: MissingCompileTimeError
@@ -652,8 +600,6 @@
 for_in_side_effects_test/01: MissingCompileTimeError
 function_propagation_test: RuntimeError
 function_subtype_inline2_test: RuntimeError
-function_type_alias6_test/none: RuntimeError
-generic_function_dcall_test: RuntimeError
 generic_instanceof2_test: RuntimeError
 generic_is_check_test: RuntimeError
 generic_no_such_method_dispatcher_simple_test: CompileTimeError # Issue 31533
@@ -986,7 +932,6 @@
 function_propagation_test: RuntimeError
 function_subtype_inline2_test: RuntimeError
 function_type_alias6_test/none: RuntimeError
-generic_function_dcall_test: RuntimeError
 generic_instanceof2_test: RuntimeError
 generic_is_check_test: RuntimeError
 generic_methods_recursive_bound_test/03: Crash, Pass
@@ -1338,9 +1283,33 @@
 type_promotion_more_specific_test/04: CompileTimeError
 
 [ $compiler == fasta && !$strong ]
+abstract_factory_constructor_test/00: MissingCompileTimeError
+abstract_getter_test/01: MissingCompileTimeError
+abstract_syntax_test/00: MissingCompileTimeError
 call_method_implicit_invoke_local_test/05: MissingCompileTimeError
+closure_invoked_through_interface_target_field_test: MissingCompileTimeError
+closure_invoked_through_interface_target_getter_test: MissingCompileTimeError
+factory2_test/03: MissingCompileTimeError
+implicit_this_test/01: MissingCompileTimeError
+implicit_this_test/04: MissingCompileTimeError
 invalid_override_in_mixin_test/01: MissingCompileTimeError
 map_literal1_test/01: MissingCompileTimeError
+mixin_of_mixin_test/01: MissingCompileTimeError
+mixin_of_mixin_test/02: MissingCompileTimeError
+mixin_of_mixin_test/03: MissingCompileTimeError
+mixin_of_mixin_test/04: MissingCompileTimeError
+mixin_of_mixin_test/05: MissingCompileTimeError
+mixin_of_mixin_test/06: MissingCompileTimeError
+nsm5_test: MissingCompileTimeError
+override_inheritance_mixed_test/06: MissingCompileTimeError
+override_inheritance_mixed_test/07: MissingCompileTimeError
+override_inheritance_no_such_method_test/01: MissingCompileTimeError
+override_inheritance_no_such_method_test/05: MissingCompileTimeError
+override_inheritance_no_such_method_test/06: MissingCompileTimeError
+override_inheritance_no_such_method_test/07: MissingCompileTimeError
+override_inheritance_no_such_method_test/09: MissingCompileTimeError
+override_inheritance_no_such_method_test/10: MissingCompileTimeError
+override_inheritance_no_such_method_test/12: MissingCompileTimeError
 
 [ $fasta && $strong ]
 compile_time_constant_k_test/01: MissingCompileTimeError
@@ -1920,7 +1889,7 @@
 override_field_method4_negative_test: Fail
 override_field_method5_negative_test: Fail
 override_field_test/01: MissingCompileTimeError
-override_inheritance_abstract_test/28: MissingCompileTimeError
+override_inheritance_abstract_test/*: Skip # Tests Dart 2 semantics
 override_inheritance_field_test/05: MissingCompileTimeError
 override_inheritance_field_test/07: MissingCompileTimeError
 override_inheritance_field_test/08: MissingCompileTimeError
diff --git a/tests/language_2/language_2_precompiled.status b/tests/language_2/language_2_precompiled.status
index c188ce8..8ff6cb8 100644
--- a/tests/language_2/language_2_precompiled.status
+++ b/tests/language_2/language_2_precompiled.status
@@ -763,6 +763,7 @@
 override_inheritance_abstract_test/02: MissingCompileTimeError
 override_inheritance_abstract_test/03: MissingCompileTimeError
 override_inheritance_abstract_test/04: MissingCompileTimeError
+override_inheritance_abstract_test/07: MissingCompileTimeError
 override_inheritance_abstract_test/08: MissingCompileTimeError
 override_inheritance_abstract_test/09: MissingCompileTimeError
 override_inheritance_abstract_test/10: MissingCompileTimeError
@@ -779,7 +780,6 @@
 override_inheritance_abstract_test/24: MissingCompileTimeError
 override_inheritance_abstract_test/25: MissingCompileTimeError
 override_inheritance_abstract_test/26: MissingCompileTimeError
-override_inheritance_abstract_test/28: MissingCompileTimeError
 override_inheritance_field_test/05: MissingCompileTimeError
 override_inheritance_field_test/07: MissingCompileTimeError
 override_inheritance_field_test/08: MissingCompileTimeError
@@ -824,7 +824,6 @@
 override_inheritance_mixed_test/08: MissingCompileTimeError
 override_inheritance_mixed_test/09: MissingCompileTimeError
 override_inheritance_no_such_method_test/01: MissingCompileTimeError
-override_inheritance_no_such_method_test/02: MissingCompileTimeError
 override_inheritance_no_such_method_test/06: MissingCompileTimeError
 override_inheritance_no_such_method_test/07: MissingCompileTimeError
 override_inheritance_no_such_method_test/09: MissingCompileTimeError
diff --git a/tests/language_2/language_2_vm.status b/tests/language_2/language_2_vm.status
index 3c012b6..8e3a8e3 100644
--- a/tests/language_2/language_2_vm.status
+++ b/tests/language_2/language_2_vm.status
@@ -774,6 +774,7 @@
 override_inheritance_abstract_test/02: MissingCompileTimeError
 override_inheritance_abstract_test/03: MissingCompileTimeError
 override_inheritance_abstract_test/04: MissingCompileTimeError
+override_inheritance_abstract_test/07: MissingCompileTimeError
 override_inheritance_abstract_test/08: MissingCompileTimeError
 override_inheritance_abstract_test/09: MissingCompileTimeError
 override_inheritance_abstract_test/10: MissingCompileTimeError
@@ -790,7 +791,6 @@
 override_inheritance_abstract_test/24: MissingCompileTimeError
 override_inheritance_abstract_test/25: MissingCompileTimeError
 override_inheritance_abstract_test/26: MissingCompileTimeError
-override_inheritance_abstract_test/28: MissingCompileTimeError
 override_inheritance_field_test/05: MissingCompileTimeError
 override_inheritance_field_test/07: MissingCompileTimeError
 override_inheritance_field_test/08: MissingCompileTimeError
@@ -834,13 +834,11 @@
 override_inheritance_mixed_test/07: MissingCompileTimeError
 override_inheritance_mixed_test/09: MissingCompileTimeError
 override_inheritance_no_such_method_test/01: MissingCompileTimeError
-override_inheritance_no_such_method_test/02: MissingCompileTimeError
 override_inheritance_no_such_method_test/06: MissingCompileTimeError
 override_inheritance_no_such_method_test/07: MissingCompileTimeError
 override_inheritance_no_such_method_test/09: MissingCompileTimeError
 override_inheritance_no_such_method_test/10: MissingCompileTimeError
 override_inheritance_no_such_method_test/12: MissingCompileTimeError
-override_inheritance_no_such_method_test/13: MissingCompileTimeError
 override_method_with_field_test/02: MissingCompileTimeError
 part2_test/01: MissingCompileTimeError
 positional_parameters_type_test/01: MissingCompileTimeError
@@ -1124,6 +1122,7 @@
 function_type/function_type96_test: RuntimeError # Issue 30475
 function_type/function_type9_test: RuntimeError # Issue 30475
 function_type_alias2_test: RuntimeError
+function_type_alias6_test/none: RuntimeError
 invalid_override_in_mixin_test/01: MissingCompileTimeError
 type_literal_prefix_call_test: RuntimeError
 
diff --git a/tests/language_2/override_inheritance_abstract_test.dart b/tests/language_2/override_inheritance_abstract_test.dart
index bb6c449..026fcf3 100644
--- a/tests/language_2/override_inheritance_abstract_test.dart
+++ b/tests/language_2/override_inheritance_abstract_test.dart
@@ -6,7 +6,7 @@
   method1(); //# 01: ok
   method5(); //# 05: ok
   method6(); //# 06: ok
-  method7();
+  method7(); //# 07: compile-time error
   get getter8; //# 08: compile-time error
   set setter9(_); //# 09: compile-time error
   method10(); //# 10: compile-time error
@@ -44,7 +44,7 @@
   var member21; //# 21: continued
 }
 
-abstract class Class extends A implements I, J {
+class Class extends A implements I, J {
   method1() {} //# 01: continued
   method2(); //# 02: compile-time error
   get getter3; //# 03: compile-time error
@@ -62,5 +62,5 @@
 }
 
 main() {
-  new Class(); //# 28: compile-time error
+  new Class();
 }
diff --git a/tests/language_2/override_inheritance_no_such_method_test.dart b/tests/language_2/override_inheritance_no_such_method_test.dart
index 1f90b47..535f5a4 100644
--- a/tests/language_2/override_inheritance_no_such_method_test.dart
+++ b/tests/language_2/override_inheritance_no_such_method_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// Test use of @proxy and noSuchMethod in relation to abstract methods in
+// Test use of noSuchMethod in relation to abstract methods in
 // concrete classes.
 
 abstract class A {
@@ -17,14 +17,9 @@
   method11(); //# 11: ok
 }
 
-@proxy //# 02: compile-time error
-@proxy //# 07: continued
-@proxy //# 10: continued
 class Class1 extends A implements I {
   method1(); //# 01: compile-time error
 
-  method2(); //# 02: continued
-
   noSuchMethod(_) => null; //# 03: ok
   method3(); //# 03: continued
 
@@ -39,11 +34,10 @@
   noSuchMethod(_) => null; //# 11: continued
 }
 
-@proxy //# 12: compile-time error
 class B {
-  method12(); //# 12: continued
+  method12(); //# 12: compile-time error
 
-  noSuchMethod(_) => null; //# 13: compile-time error
+  noSuchMethod(_) => null; //# 13: ok
   method13(); //# 13: continued
 }
 
diff --git a/tests/language_2/ref_before_declaration_test.dart b/tests/language_2/ref_before_declaration_test.dart
index d5b8908..65f58ac 100644
--- a/tests/language_2/ref_before_declaration_test.dart
+++ b/tests/language_2/ref_before_declaration_test.dart
@@ -66,7 +66,7 @@
 }
 
 void testLibPrefix() {
-  var pie = math.PI;
+  var pie = math.pi;
   final math = 0; // //# 05: compile-time error
 }
 
diff --git a/tests/language_2/syntax_test.dart b/tests/language_2/syntax_test.dart
index 0982b99..5946a1d 100644
--- a/tests/language_2/syntax_test.dart
+++ b/tests/language_2/syntax_test.dart
@@ -112,7 +112,9 @@
 
 class ListFactory<E> implements List<E>
 native "Array" //# 33: syntax error
-{}
+{
+  noSuchMethod(_) => null; // Allow unimplemented methods
+}
 
 abstract class I implements UNKNOWN; //# 34: syntax error
 
@@ -138,7 +140,9 @@
 
 class XListFactory<E> implements List<E>
 hest "Array" //# 40: syntax error
-{}
+{
+  noSuchMethod(_) => null; // Allow unimplemented methods
+}
 
 class YWindow extends DOMWindow
 for "*Window" //# 41: syntax error
@@ -162,7 +166,9 @@
 
 class YListFactory<E> implements List<E>
 for "Array" //# 46: syntax error
-{}
+{
+  noSuchMethod(_) => null; // Allow unimplemented methods
+}
 
 class A {
   const A()
diff --git a/tests/lib_2/async/null_future_zone_test.dart b/tests/lib_2/async/null_future_zone_test.dart
deleted file mode 100644
index 802c399..0000000
--- a/tests/lib_2/async/null_future_zone_test.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-import 'dart:async';
-
-main() {
-  asyncStart(2);
-  () async {
-    var it = new StreamIterator(new Stream.fromIterable([]));
-    Expect.isFalse(await it.moveNext());
-
-    Future nullFuture;
-    Future falseFuture;
-
-    runZoned(() {
-      nullFuture = (new StreamController()..stream.listen(null).cancel()).done;
-      falseFuture = it.moveNext();
-    }, zoneSpecification: new ZoneSpecification(scheduleMicrotask:
-        (Zone self, ZoneDelegate parent, Zone zone, void f()) {
-      Expect.fail("Should not be called");
-    }));
-
-    nullFuture.then((value) {
-      Expect.isNull(value);
-      asyncEnd();
-    });
-
-    falseFuture.then((value) {
-      Expect.isFalse(value);
-      asyncEnd();
-    });
-  }();
-}
diff --git a/tests/lib_2/convert/html_escape_test.dart b/tests/lib_2/convert/html_escape_test.dart
index 55de638..f40c18d 100644
--- a/tests/lib_2/convert/html_escape_test.dart
+++ b/tests/lib_2/convert/html_escape_test.dart
@@ -75,7 +75,7 @@
 const _COUNT = 3;
 
 void main() {
-  _testMode(HTML_ESCAPE, _TEST_INPUT, _OUTPUT_UNKNOWN);
+  _testMode(htmlEscape, _TEST_INPUT, _OUTPUT_UNKNOWN);
   _testMode(const HtmlEscape(), _TEST_INPUT, _OUTPUT_UNKNOWN);
   _testMode(
       const HtmlEscape(HtmlEscapeMode.unknown), _TEST_INPUT, _OUTPUT_UNKNOWN);
@@ -85,5 +85,5 @@
       _OUTPUT_SQ_ATTRIBUTE);
   _testMode(
       const HtmlEscape(HtmlEscapeMode.element), _TEST_INPUT, _OUTPUT_ELEMENT);
-  _testMode(HTML_ESCAPE, _NOOP, _NOOP);
+  _testMode(htmlEscape, _NOOP, _NOOP);
 }
diff --git a/tests/lib_2/math/double_pow_test.dart b/tests/lib_2/math/double_pow_test.dart
index 4d95575..4feac67 100644
--- a/tests/lib_2/math/double_pow_test.dart
+++ b/tests/lib_2/math/double_pow_test.dart
@@ -153,8 +153,8 @@
 
   // Some non-exceptional values.
   checkVeryClose(16.0, pow(4.0, 2.0));
-  checkVeryClose(SQRT2, pow(2.0, 0.5));
-  checkVeryClose(SQRT1_2, pow(0.5, 0.5));
+  checkVeryClose(sqrt2, pow(2.0, 0.5));
+  checkVeryClose(sqrt1_2, pow(0.5, 0.5));
   // Denormal result.
   Expect.identical(5e-324, pow(2.0, -1074.0));
   // Overflow.
diff --git a/tests/lib_2/math/math2_test.dart b/tests/lib_2/math/math2_test.dart
index e24e3b2..83f0183 100644
--- a/tests/lib_2/math/math2_test.dart
+++ b/tests/lib_2/math/math2_test.dart
@@ -14,21 +14,21 @@
   static void testConstants() {
     // Source for mathematical constants is Wolfram Alpha.
     Expect.equals(
-        2.7182818284590452353602874713526624977572470936999595749669, math.E);
+        2.7182818284590452353602874713526624977572470936999595749669, math.e);
     Expect.equals(2.3025850929940456840179914546843642076011014886287729760333,
-        math.LN10);
+        math.ln10);
     Expect.equals(
-        0.6931471805599453094172321214581765680755001343602552541206, math.LN2);
+        0.6931471805599453094172321214581765680755001343602552541206, math.ln2);
     Expect.equals(1.4426950408889634073599246810018921374266459541529859341354,
-        math.LOG2E);
+        math.log2e);
     Expect.equals(0.4342944819032518276511289189166050822943970058036665661144,
-        math.LOG10E);
+        math.log10e);
     Expect.equals(
-        3.1415926535897932384626433832795028841971693993751058209749, math.PI);
+        3.1415926535897932384626433832795028841971693993751058209749, math.pi);
     Expect.equals(0.7071067811865475244008443621048490392848359376884740365883,
-        math.SQRT1_2);
+        math.sqrt1_2);
     Expect.equals(1.4142135623730950488016887242096980785696718753769480731766,
-        math.SQRT2);
+        math.sqrt2);
   }
 
   static checkClose(double a, double b, EPSILON) {
@@ -37,65 +37,65 @@
   }
 
   static void testSin() {
-    // Given the imprecision of PI we can't expect better results than this.
+    // Given the imprecision of pi we can't expect better results than this.
     final double EPSILON = 1e-15;
     checkClose(0.0, math.sin(0.0), EPSILON);
-    checkClose(0.0, math.sin(math.PI), EPSILON);
-    checkClose(0.0, math.sin(2.0 * math.PI), EPSILON);
-    checkClose(1.0, math.sin(math.PI / 2.0), EPSILON);
-    checkClose(-1.0, math.sin(math.PI * (3.0 / 2.0)), EPSILON);
+    checkClose(0.0, math.sin(math.pi), EPSILON);
+    checkClose(0.0, math.sin(2.0 * math.pi), EPSILON);
+    checkClose(1.0, math.sin(math.pi / 2.0), EPSILON);
+    checkClose(-1.0, math.sin(math.pi * (3.0 / 2.0)), EPSILON);
   }
 
   static void testCos() {
-    // Given the imprecision of PI we can't expect better results than this.
+    // Given the imprecision of pi we can't expect better results than this.
     final double EPSILON = 1e-15;
     checkClose(1.0, math.cos(0.0), EPSILON);
-    checkClose(-1.0, math.cos(math.PI), EPSILON);
-    checkClose(1.0, math.cos(2.0 * math.PI), EPSILON);
-    checkClose(0.0, math.cos(math.PI / 2.0), EPSILON);
-    checkClose(0.0, math.cos(math.PI * (3.0 / 2.0)), EPSILON);
+    checkClose(-1.0, math.cos(math.pi), EPSILON);
+    checkClose(1.0, math.cos(2.0 * math.pi), EPSILON);
+    checkClose(0.0, math.cos(math.pi / 2.0), EPSILON);
+    checkClose(0.0, math.cos(math.pi * (3.0 / 2.0)), EPSILON);
   }
 
   static void testTan() {
-    // Given the imprecision of PI we can't expect better results than this.
+    // Given the imprecision of pi we can't expect better results than this.
     final double EPSILON = 1e-15;
     checkClose(0.0, math.tan(0.0), EPSILON);
-    checkClose(0.0, math.tan(math.PI), EPSILON);
-    checkClose(0.0, math.tan(2.0 * math.PI), EPSILON);
-    checkClose(1.0, math.tan(math.PI / 4.0), EPSILON);
+    checkClose(0.0, math.tan(math.pi), EPSILON);
+    checkClose(0.0, math.tan(2.0 * math.pi), EPSILON);
+    checkClose(1.0, math.tan(math.pi / 4.0), EPSILON);
   }
 
   static void testAsin() {
-    // Given the imprecision of PI we can't expect better results than this.
+    // Given the imprecision of pi we can't expect better results than this.
     final double EPSILON = 1e-15;
     checkClose(0.0, math.asin(0.0), EPSILON);
-    checkClose(math.PI / 2.0, math.asin(1.0), EPSILON);
-    checkClose(-math.PI / 2.0, math.asin(-1.0), EPSILON);
+    checkClose(math.pi / 2.0, math.asin(1.0), EPSILON);
+    checkClose(-math.pi / 2.0, math.asin(-1.0), EPSILON);
   }
 
   static void testAcos() {
-    // Given the imprecision of PI we can't expect better results than this.
+    // Given the imprecision of pi we can't expect better results than this.
     final double EPSILON = 1e-15;
     checkClose(0.0, math.acos(1.0), EPSILON);
-    checkClose(math.PI, math.acos(-1.0), EPSILON);
-    checkClose(math.PI / 2.0, math.acos(0.0), EPSILON);
+    checkClose(math.pi, math.acos(-1.0), EPSILON);
+    checkClose(math.pi / 2.0, math.acos(0.0), EPSILON);
   }
 
   static void testAtan() {
-    // Given the imprecision of PI we can't expect better results than this.
+    // Given the imprecision of pi we can't expect better results than this.
     final double EPSILON = 1e-15;
     checkClose(0.0, math.atan(0.0), EPSILON);
-    checkClose(math.PI / 4.0, math.atan(1.0), EPSILON);
-    checkClose(-math.PI / 4.0, math.atan(-1.0), EPSILON);
+    checkClose(math.pi / 4.0, math.atan(1.0), EPSILON);
+    checkClose(-math.pi / 4.0, math.atan(-1.0), EPSILON);
   }
 
   static void testAtan2() {
-    // Given the imprecision of PI we can't expect better results than this.
+    // Given the imprecision of pi we can't expect better results than this.
     final double EPSILON = 1e-15;
     checkClose(0.0, math.atan2(0.0, 5.0), EPSILON);
-    checkClose(math.PI / 4.0, math.atan2(2.0, 2.0), EPSILON);
-    checkClose(3 * math.PI / 4.0, math.atan2(0.5, -0.5), EPSILON);
-    checkClose(-3 * math.PI / 4.0, math.atan2(-2.5, -2.5), EPSILON);
+    checkClose(math.pi / 4.0, math.atan2(2.0, 2.0), EPSILON);
+    checkClose(3 * math.pi / 4.0, math.atan2(0.5, -0.5), EPSILON);
+    checkClose(-3 * math.pi / 4.0, math.atan2(-2.5, -2.5), EPSILON);
   }
 
   static checkVeryClose(double a, double b) {
@@ -127,32 +127,32 @@
 
   static void testSqrt() {
     checkVeryClose(2.0, math.sqrt(4.0));
-    checkVeryClose(math.SQRT2, math.sqrt(2.0));
-    checkVeryClose(math.SQRT1_2, math.sqrt(0.5));
+    checkVeryClose(math.sqrt2, math.sqrt(2.0));
+    checkVeryClose(math.sqrt1_2, math.sqrt(0.5));
     checkVeryClose(1e50, math.sqrt(1e100));
     checkVeryClose(1.1111111061110855443054405046358901279277111935183977e56,
         math.sqrt(12345678901234e99));
   }
 
   static void testExp() {
-    checkVeryClose(math.E, math.exp(1.0));
+    checkVeryClose(math.e, math.exp(1.0));
     final EPSILON = 1e-15;
-    checkClose(10.0, math.exp(math.LN10), EPSILON);
-    checkClose(2.0, math.exp(math.LN2), EPSILON);
+    checkClose(10.0, math.exp(math.ln10), EPSILON);
+    checkClose(2.0, math.exp(math.ln2), EPSILON);
   }
 
   static void testLog() {
     // Even though E is imprecise, it is good enough to get really close to 1.
     // We still provide an epsilon.
-    checkClose(1.0, math.log(math.E), 1e-16);
-    checkVeryClose(math.LN10, math.log(10.0));
-    checkVeryClose(math.LN2, math.log(2.0));
+    checkClose(1.0, math.log(math.e), 1e-16);
+    checkVeryClose(math.ln10, math.log(10.0));
+    checkVeryClose(math.ln2, math.log(2.0));
   }
 
   static void testPow() {
     checkVeryClose(16.0, math.pow(4.0, 2.0));
-    checkVeryClose(math.SQRT2, math.pow(2.0, 0.5));
-    checkVeryClose(math.SQRT1_2, math.pow(0.5, 0.5));
+    checkVeryClose(math.sqrt2, math.pow(2.0, 0.5));
+    checkVeryClose(math.sqrt1_2, math.pow(0.5, 0.5));
   }
 
   static bool parseIntThrowsFormatException(str) {
diff --git a/tests/lib_2/math/math_test.dart b/tests/lib_2/math/math_test.dart
index 3e1e879..ca32951 100644
--- a/tests/lib_2/math/math_test.dart
+++ b/tests/lib_2/math/math_test.dart
@@ -11,21 +11,21 @@
   static void testConstants() {
     // Source for mathematical constants is Wolfram Alpha.
     Expect.equals(
-        2.7182818284590452353602874713526624977572470936999595749669, E);
+        2.7182818284590452353602874713526624977572470936999595749669, e);
     Expect.equals(
-        2.3025850929940456840179914546843642076011014886287729760333, LN10);
+        2.3025850929940456840179914546843642076011014886287729760333, ln10);
     Expect.equals(
-        0.6931471805599453094172321214581765680755001343602552541206, LN2);
+        0.6931471805599453094172321214581765680755001343602552541206, ln2);
     Expect.equals(
-        1.4426950408889634073599246810018921374266459541529859341354, LOG2E);
+        1.4426950408889634073599246810018921374266459541529859341354, log2e);
     Expect.equals(
-        0.4342944819032518276511289189166050822943970058036665661144, LOG10E);
+        0.4342944819032518276511289189166050822943970058036665661144, log10e);
     Expect.equals(
-        3.1415926535897932384626433832795028841971693993751058209749, PI);
+        3.1415926535897932384626433832795028841971693993751058209749, pi);
     Expect.equals(
-        0.7071067811865475244008443621048490392848359376884740365883, SQRT1_2);
+        0.7071067811865475244008443621048490392848359376884740365883, sqrt1_2);
     Expect.equals(
-        1.4142135623730950488016887242096980785696718753769480731766, SQRT2);
+        1.4142135623730950488016887242096980785696718753769480731766, sqrt2);
   }
 
   static checkClose(double a, double b, EPSILON) {
@@ -34,65 +34,65 @@
   }
 
   static void testSin() {
-    // Given the imprecision of PI we can't expect better results than this.
+    // Given the imprecision of pi we can't expect better results than this.
     final double EPSILON = 1e-15;
     checkClose(0.0, sin(0.0), EPSILON);
-    checkClose(0.0, sin(PI), EPSILON);
-    checkClose(0.0, sin(2.0 * PI), EPSILON);
-    checkClose(1.0, sin(PI / 2.0), EPSILON);
-    checkClose(-1.0, sin(PI * (3.0 / 2.0)), EPSILON);
+    checkClose(0.0, sin(pi), EPSILON);
+    checkClose(0.0, sin(2.0 * pi), EPSILON);
+    checkClose(1.0, sin(pi / 2.0), EPSILON);
+    checkClose(-1.0, sin(pi * (3.0 / 2.0)), EPSILON);
   }
 
   static void testCos() {
-    // Given the imprecision of PI we can't expect better results than this.
+    // Given the imprecision of pi we can't expect better results than this.
     final double EPSILON = 1e-15;
     checkClose(1.0, cos(0.0), EPSILON);
-    checkClose(-1.0, cos(PI), EPSILON);
-    checkClose(1.0, cos(2.0 * PI), EPSILON);
-    checkClose(0.0, cos(PI / 2.0), EPSILON);
-    checkClose(0.0, cos(PI * (3.0 / 2.0)), EPSILON);
+    checkClose(-1.0, cos(pi), EPSILON);
+    checkClose(1.0, cos(2.0 * pi), EPSILON);
+    checkClose(0.0, cos(pi / 2.0), EPSILON);
+    checkClose(0.0, cos(pi * (3.0 / 2.0)), EPSILON);
   }
 
   static void testTan() {
-    // Given the imprecision of PI we can't expect better results than this.
+    // Given the imprecision of pi we can't expect better results than this.
     final double EPSILON = 1e-15;
     checkClose(0.0, tan(0.0), EPSILON);
-    checkClose(0.0, tan(PI), EPSILON);
-    checkClose(0.0, tan(2.0 * PI), EPSILON);
-    checkClose(1.0, tan(PI / 4.0), EPSILON);
+    checkClose(0.0, tan(pi), EPSILON);
+    checkClose(0.0, tan(2.0 * pi), EPSILON);
+    checkClose(1.0, tan(pi / 4.0), EPSILON);
   }
 
   static void testAsin() {
-    // Given the imprecision of PI we can't expect better results than this.
+    // Given the imprecision of pi we can't expect better results than this.
     final double EPSILON = 1e-15;
     checkClose(0.0, asin(0.0), EPSILON);
-    checkClose(PI / 2.0, asin(1.0), EPSILON);
-    checkClose(-PI / 2.0, asin(-1.0), EPSILON);
+    checkClose(pi / 2.0, asin(1.0), EPSILON);
+    checkClose(-pi / 2.0, asin(-1.0), EPSILON);
   }
 
   static void testAcos() {
-    // Given the imprecision of PI we can't expect better results than this.
+    // Given the imprecision of pi we can't expect better results than this.
     final double EPSILON = 1e-15;
     checkClose(0.0, acos(1.0), EPSILON);
-    checkClose(PI, acos(-1.0), EPSILON);
-    checkClose(PI / 2.0, acos(0.0), EPSILON);
+    checkClose(pi, acos(-1.0), EPSILON);
+    checkClose(pi / 2.0, acos(0.0), EPSILON);
   }
 
   static void testAtan() {
-    // Given the imprecision of PI we can't expect better results than this.
+    // Given the imprecision of pi we can't expect better results than this.
     final double EPSILON = 1e-15;
     checkClose(0.0, atan(0.0), EPSILON);
-    checkClose(PI / 4.0, atan(1.0), EPSILON);
-    checkClose(-PI / 4.0, atan(-1.0), EPSILON);
+    checkClose(pi / 4.0, atan(1.0), EPSILON);
+    checkClose(-pi / 4.0, atan(-1.0), EPSILON);
   }
 
   static void testAtan2() {
-    // Given the imprecision of PI we can't expect better results than this.
+    // Given the imprecision of pi we can't expect better results than this.
     final double EPSILON = 1e-15;
     checkClose(0.0, atan2(0.0, 5.0), EPSILON);
-    checkClose(PI / 4.0, atan2(2.0, 2.0), EPSILON);
-    checkClose(3 * PI / 4.0, atan2(0.5, -0.5), EPSILON);
-    checkClose(-3 * PI / 4.0, atan2(-2.5, -2.5), EPSILON);
+    checkClose(pi / 4.0, atan2(2.0, 2.0), EPSILON);
+    checkClose(3 * pi / 4.0, atan2(0.5, -0.5), EPSILON);
+    checkClose(-3 * pi / 4.0, atan2(-2.5, -2.5), EPSILON);
   }
 
   static checkVeryClose(double a, double b) {
@@ -124,26 +124,26 @@
 
   static void testSqrt() {
     checkVeryClose(2.0, sqrt(4.0));
-    checkVeryClose(SQRT2, sqrt(2.0));
-    checkVeryClose(SQRT1_2, sqrt(0.5));
+    checkVeryClose(sqrt2, sqrt(2.0));
+    checkVeryClose(sqrt1_2, sqrt(0.5));
     checkVeryClose(1e50, sqrt(1e100));
     checkVeryClose(1.1111111061110855443054405046358901279277111935183977e56,
         sqrt(12345678901234e99));
   }
 
   static void testExp() {
-    checkVeryClose(E, exp(1.0));
+    checkVeryClose(e, exp(1.0));
     final EPSILON = 1e-15;
-    checkClose(10.0, exp(LN10), EPSILON);
-    checkClose(2.0, exp(LN2), EPSILON);
+    checkClose(10.0, exp(ln10), EPSILON);
+    checkClose(2.0, exp(ln2), EPSILON);
   }
 
   static void testLog() {
     // Even though E is imprecise, it is good enough to get really close to 1.
     // We still provide an epsilon.
-    checkClose(1.0, log(E), 1e-16);
-    checkVeryClose(LN10, log(10.0));
-    checkVeryClose(LN2, log(2.0));
+    checkClose(1.0, log(e), 1e-16);
+    checkVeryClose(ln10, log(10.0));
+    checkVeryClose(ln2, log(2.0));
   }
 
   static bool parseIntThrowsFormatException(str) {
diff --git a/tests/lib_2/math/pi_test.dart b/tests/lib_2/math/pi_test.dart
index aec9789..ea31ade 100644
--- a/tests/lib_2/math/pi_test.dart
+++ b/tests/lib_2/math/pi_test.dart
@@ -48,5 +48,5 @@
   // Mmmmh, Pie!
   var pie = 4.0 * (inside / (inside + outside));
   print("$pie");
-  Expect.isTrue(((PI - 0.009) < pie) && (pie < (PI + 0.009)));
+  Expect.isTrue(((pi - 0.009) < pie) && (pie < (pi + 0.009)));
 }
diff --git a/tests/standalone_2/io/certificates/bad_server_chain.pem b/tests/standalone_2/io/certificates/bad_server_chain.pem
new file mode 100644
index 0000000..3c5024b
--- /dev/null
+++ b/tests/standalone_2/io/certificates/bad_server_chain.pem
@@ -0,0 +1,58 @@
+-----BEGIN CERTIFICATE-----
+MIIDJzCCAg+gAwIBAgIBATANBgkqhkiG9w0BAQsFADAgMR4wHAYDVQQDDBVpbnRl
+cm1lZGlhdGVhdXRob3JpdHkwHhcNMTgwNDIzMjAxNjM0WhcNMjgwNDIwMjAxNjM0
+WjAXMRUwEwYDVQQDDAxiYWRsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQC6gVBNsFLEkomxJ1VRe5rZ1ELduRLHJKio9zTrh+o/6EaCZ4X6
+EIr3CwVx7UiBDRyCApGZXbqvtNbP/ihbjRvxmlvCSL9ztF9tNrLqsaEq4w5KvQDT
+5u27+pAzdLjjoFTK6VZfw+AhEZHxiokEDDYB3t6gWkfabOstDouLyEYL25RLKaGQ
+v/Qb7XU6K4f20OnuXVoQ4FxNdqtvm7TgmXBT0kp+f62q6BvLUIzewpblBlgT5h3h
+KAZF7RDpGBxRgYxA6ZH4n3mv4kh84YtTODRGfb8ugdaQjrgTWOhQ4nddcdR5TVww
+A8Jp+G000RQ97Go0zgd29CicKF96zbGdKFkZAgMBAAGjdTBzMAwGA1UdEwEB/wQC
+MAAwHQYDVR0OBBYEFG8s5yvy1kAoNjJ5PYrx9RNSPFJXMB8GA1UdIwQYMBaAFCpT
+tHybjDJ/Jz25uI9Bxikc1muYMA4GA1UdDwEB/wQEAwIDqDATBgNVHSUEDDAKBggr
+BgEFBQcDATANBgkqhkiG9w0BAQsFAAOCAQEAgom55wfxp9ywWKZOzaGCa+uXZjPK
+rmdUcnJLduRdnchuIsQUZa3Ijpzn7Dw+UZV8ggxvU0L07PbT0QlZUoKhDj6BlZ4W
+TAseBh5QyBUeEdMU+Tr2fXGM6+mmVURBLTX5I2Chmnw2ymqqUK8MtbUhPXbfZayV
+eUV35iloOhm3q/5rKBtfdNq31zrg+Naam6/UyRgBhinweFFXiYeZRpctD3w3cA3g
+RGjuNNNRASZZzAXGiE4IOv9drd0/wGajwBT1DJDQOAxZPfADC3wEcDRG4ve1SYHY
+5N3AlidXe8dPDePhlxH3JH9s2WPi6lgiHQSmtzyeehbzqpJ9JCBM5BerdQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDLjCCAhagAwIBAgIBAjANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1yb290
+YXV0aG9yaXR5MB4XDTE4MDQyMzIwMTYzM1oXDTI4MDQyMDIwMTYzM1owIDEeMBwG
+A1UEAwwVaW50ZXJtZWRpYXRlYXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAsSFr3/sYhGFF7gEZSn7Am8ATtPhTo5ypQqSAv/4Uy+k4zvT3
+b3OZyYpzr5Wsa6NXcEKwNipyR1GBpYwaYI/W4DSi+COdH4DQSZDQFr+hvmXRazzj
+VSsOxF6veGLcza53meLPRb4o4yVoZARd6xR5i3OUD4kezvOjpmlFT3OKNU0Di+Vq
+qeS14/at6Vt6G0rS8CluafD7Z0/5zp6vrImKwC6OWzlmmcAqBGsE/BTzrAxLdt4K
+uw3Xs3uvS3YZIAC536C1Mop1n4FBUGxeUMWH+I/llzK9ol1pmQHJrxfOD5WdFuuE
+iFfpiOmBdUfDBbEPllmIvzUBFOo5VhxVmq8EHQIDAQABo3sweTASBgNVHRMBAf8E
+CDAGAQH/AgEAMB0GA1UdDgQWBBQqU7R8m4wyfyc9ubiPQcYpHNZrmDAfBgNVHSME
+GDAWgBT0rD9lRUhqJvAg7hfBEz/ZqHCzHjAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0l
+BAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQELBQADggEBAGjRSFvVeIrRF3iuA5vr
+SgufTCNzAyEz7+pDKflzHSQXF1fdItiOdPGv1i57gIr7HaYuxvBiEklhmnWreYye
+Tn6ghfhEHhdZHBpihDXuIvLizhtR/lg9CDZrHjuY6nukyx4JnWwUBR3TulPK5gJu
+jB9YISY8tjXrvVNqdi0a+G0T4HHnVs3v6Nd/Qdsxfp4maAB1U3HFmR3DXKTxDtBK
+mNNMqf9PpX4lw4o6UieiEwOMd+4REhmwLNTwhWrhVg5q6GKQl873Ge/7J2nXvgkH
+nUbEsncLsArqqrz201f2m32A6pinwY/j85vEeRkHwlsU0jOvVnHzAlggP0u/kFAF
+EjE=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIC/jCCAeagAwIBAgIBATANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1yb290
+YXV0aG9yaXR5MB4XDTE4MDQyMzIwMTYzM1oXDTI4MDQyMDIwMTYzM1owGDEWMBQG
+A1UEAwwNcm9vdGF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBALkvRWdbx9GwxePkh0nnpht4MrPW5NkZBORqfhFi7PFbQ7Rwgl39hm9iAmci
+pOWZGSJi7AaqLuSID0UEeRdG/fNFawI5XIoxP+TmdKdrk/SaTJQKKJiZ9B8+EG0z
+hV8/v6jrlwj0gq9eBBAmOInnmQiEYE4gKFNvh9xdP//gi+otBf30gmtJ4AxXOTu/
+M+XEigXelmIvy57b+B+qnonTFcGkXhSr+JfCA1l6ta7OtknQtItpV0FDr/d8hA+6
+Bn25ZSisd00GC3CUMX1tM5V8cQE6GO/W2mnpUFVvWycYx9wDyU7rlyNUf8nWeoIW
+3d3s/6KAppa07KrkLiTantIrqMUCAwEAAaNTMFEwHQYDVR0OBBYEFPSsP2VFSGom
+8CDuF8ETP9mocLMeMB8GA1UdIwQYMBaAFPSsP2VFSGom8CDuF8ETP9mocLMeMA8G
+A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ1VynTevPnNtwevQpUa
+zlur64N+Dx/yF4gvd4byjO+JouMJLaJqV2dwnqgAahg6YKasVtv4xX9MVJR2IjIb
+Tfa0nYQxM5clwk3J78nh82Ncb2RNeYJyNmSdocnOkmTSoOGUFOxtRz1vmKUcrfwl
+yENO/qGe/sYmOv0IWJjeGQ2OZPblRumV4dJy3qTHFmOLpYwA0BGiIV5uj5Ou7QU1
+R5PY2pnJg4RXeaq95Pr50lkO9vpRyFUJHjR+P+J05M9FbjLPOQIFkpMYx/GyBg5n
+P+omyagOGW8bXfBTtUYu+rP/k+BC5AxI3Kdv/AD5vyHKi/JXhP3ycb8AYx5ENHoK
+qjA=
+-----END CERTIFICATE-----
diff --git a/tests/standalone_2/io/certificates/bad_server_key.pem b/tests/standalone_2/io/certificates/bad_server_key.pem
new file mode 100644
index 0000000..4b5670a
--- /dev/null
+++ b/tests/standalone_2/io/certificates/bad_server_key.pem
@@ -0,0 +1,29 @@
+-----BEGIN ENCRYPTED PRIVATE KEY-----
+MIIE4zAcBgoqhkiG9w0BDAEBMA4ECPLRqWLveTDuAgIIAASCBMGjMwpu3Hy4cuO7
+i3p2EyH+UJGm9J/KcRN2ys6E5rwCdLHtURLmdWsmtNkDNTvmgdllXfdVhO9XavRJ
+ShBSvTzvOokpl/nxRaFmhEhMWskdGpP1WSp+GtQiVHM2gczDR2jNZDZKWEnZfU5B
+CUt0VJkokJZxmdeSpFIrTTJxcOQZEsbb1ujrAMpWqEvIGq+U2Is7A5RxWJl1XKmY
+5QB9nfw5Olj0J499kMKJx8WjRhmfQHu+qMpN2HglBVK44fnk/I5ilNdhuScuaKPZ
+csOv5D5Ojlgc6hQG1zCPh8lRNH1MXLd2BMwEJqPSKNbvfrUWvr7BnJMoOdnlZwaH
+73/zJrMwuUpZzAm2sgHZlJhELoYyK0A40IhAz4u9XF1iv35yK2D6/O2qJO6VUzqD
+TsdSnUYaUTZkZdgfucR+EbmPSw7r+QYEsHFzErPTUR64hwIeC3bCv0Q4hrPskxKj
+135iDQDbuCykeNe8s51qgEt8oawdig/Anaguksuj/eKGTWZXPrhA3LTYqBkaX8ao
+XFWkj3ALvjRHCeLfQ5AlXyd3mJiHl93pxH9GIaTiL66ptYvfcN5tERcD6GL/sUXh
+vJ0kr8HsBS9WTFvVg4dzQ9NAqtRoDB1IUqEq2dLys/gjrhE26tmUnuaXiOuokSWx
+HXEK/2pWAqZ/ZA7vbQ/DyV25TDeEP3SRKeTDLdlWBjTNUKyBv3nfsoZBK1K2wOUh
+UDmB3TMBEdXI6L2FvjxMuDRJxruhn7HhRz7ifsizRHPyaPDbUFF9IK/x9qPAzufK
+lk6NqqcgJdNg8wxv/dVYAHeJmMOhTau9CL6N7AYo2VDWphlZSjBgtTZw7sY739c2
+35ziR9yBoJyveFcQko01ycJrjhivn3cqbFXZfsIbecDKz+8qZhWjKw/yysv0X6tI
+tB1btpWtlVB8h7WlXWgUGJWKCUFXRC1fCJA5W7LoTnvZ9VvYMBRKUbDsMiSWNcTZ
+mLmJj0yIhve9uCHsFXBidTCT751CYucaZYvOqNr3pKf4eTQQNCYB5Pt6jx4V7Xks
+ZDjr5ljVy6Ux6NweQT2Zs/hOnuS3q1XoLbRVsW9d9YttahnNyjP8il3HphSzBHOF
+SUReTlgAHEbSUZTZ1z2GXFblUJPb2syfJOIXP5qHQtSrGN3CkQ//JvysxlOck41h
+fLO6TZUadorgEHqb+en6h6gVvDvI3i0T66yWwurhlEvWZepAWetzSv64VsVGXEjc
+lrT8yj6AAZYISoYZU0vtM0tP+FDqvyA597DZMiDDBU6chmGxWhcnaqIIDTP2KQIJ
+Z0NAYp924NHAgnTq1FbXxllej6vxcCwymsnXGyCMhsOt1RTAVHeY0uZ5qPCToJ30
+xS/WTrVH5z0xtp2Qz+INFleNnseYKBJvEDfk+gK0sLm533fehnFeB+GgNqqV9hKc
+bLpU+C3VrsxX0JLWYgfweVDT+jT78FXzUIkWykvBGv+iv+ztFUFiopDzJzfLriH8
+K4kG2o/K3MQWrygjnt+iTjpBe08auX9Ot8X65ygArOa0zOy0nUwSQGyPXL/7L3dQ
+LqS6ZBpreqXClTeegKH8SwEYnXLFNDuU1GuD+pRyQJVWYfqiiWeenaKpCi73VWaK
+J+9e86VqcQ==
+-----END ENCRYPTED PRIVATE KEY-----
diff --git a/tests/standalone_2/io/certificates/client1.p12 b/tests/standalone_2/io/certificates/client1.p12
index 8d19d04..69a674d 100644
--- a/tests/standalone_2/io/certificates/client1.p12
+++ b/tests/standalone_2/io/certificates/client1.p12
Binary files differ
diff --git a/tests/standalone_2/io/certificates/client1.pem b/tests/standalone_2/io/certificates/client1.pem
index 429cd72..468a677 100644
--- a/tests/standalone_2/io/certificates/client1.pem
+++ b/tests/standalone_2/io/certificates/client1.pem
@@ -1,19 +1,19 @@
 -----BEGIN CERTIFICATE-----
-MIIDBzCCAe+gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDEw9jbGll
-bnRhdXRob3JpdHkwHhcNMTUxMDI3MTAyNjM1WhcNMjUxMDI0MTAyNjM1WjAQMQ4w
-DAYDVQQDDAV1c2VyMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALlg
-zRZlohMtAg44+kPk04G/gIkdeyh7toUA3nR/2sS11j8EutHewezvMV8YyxBxQn8f
-8x8FkDbrE/6GYg2Dsu6TxrXIFre9Lt5jLlJi/6qEaVtXNTdP3vKO87FJ7YVLCeYe
-MxuTCdHloeUICP5x3GJz3AVdcg/S9qRWrpm8LdRdFk66l8vD+aDf+Oqe+mLVtAr6
-kqkdq1nUJOkRBp+zFMmB3Zfm28aYew6BmFQSscxemZyJxiv4dB+EDr821kEjgGBY
-IQGpdADrfh3j9JAzEr30o6sjfr6QWKHG6ZD7xhSl7rIxmx1yoKoJh8vLpcQfdv79
-7VZZT5N7xjz0xkjqTA0CAwEAAaNiMGAwCQYDVR0TBAIwADAdBgNVHQ4EFgQUMpcX
-0o3lu3BTmaKwCfIJMO5aMs4wHwYDVR0jBBgwFoAUtyLBueMoMi7TborRvM7CnwOi
-SQ4wEwYDVR0lBAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAAB1rNFg
-wdK79r7WO0OvE90uvtFf8sO2kqwW/7JIP/kcnIwIIkNiffUEfLfVr7aecK0rPer4
-DDZFAciuaOcts7dTxXRU+la1ZEPaEyx1mHaC6HJbgFYC9cG30L6GJGkZkIGOCTn+
-/yPxTM//dSc7YACc90GNTeUFVnAw6vskH91Ph4VYbdYxt7L1d1pzvBeun6Qi0eJq
-rkWQ2DOO9h9E6Rnt8Jea3w7WzX5P8pBjm74bv38YBKefawPeiiXck2Q/lUehLePV
-U1MRdy1QWC924+p6cXbR1GEhg0FZyvS/9WdpLMGIat/j/98juN6qyAbw7XXhlB1g
-fBHlfXbx+KMZAuY=
+MIIDBzCCAe+gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA9jbGll
+bnRhdXRob3JpdHkwHhcNMTgwNDIzMjAxNjM0WhcNMjgwNDIwMjAxNjM0WjAQMQ4w
+DAYDVQQDDAV1c2VyMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ0k
+FC9D1LDt0as0Kk3EbMKR9IXBtKazVOXq1y3VYmSM+r8l70HViKZOQ13vWHBt+iYI
+2ATt+lFfKrAo2xO74d7bJD6ag12Ar60mpfVWO1lrmbSzGGsfJZl1kI7Z9SJ4RQCp
+xqAKu+ZtIY40fO7YqRFT+yPjjdcsNOYHedATa4coq1ZHnFbU4HZgerFIeMCHr2Mb
+MPuqraJuk4G7yJgPWMwNawKKfWWiH4aRNGgmVqInVTh6hLLFC2po0koF8h4fyVz9
+BmptVyn7+/V5OOWteiaaNanRlSc9ozljSxVnqSUD9JuaIINd4+0Lf5Yp2hcPj54l
+Mt8q51euv2JGzk5NLOcCAwEAAaNiMGAwCQYDVR0TBAIwADAdBgNVHQ4EFgQUZOyE
++fTDi2XHfAg9q9Ci4B3/PKIwHwYDVR0jBBgwFoAU+TlPoMTEPn2GHUDuD49Nm+iq
+vwwwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAADdlG1z
+kHKAI4HQojtx8yWM/D5q48/5wQjmsx6oBfaWPobL1mkc0iPQ6GNARY1Mv8OPbGkk
+8M00qVikaUyA3K14mZBzNY1Pprr06JRlDuYZABU7Jcfd6pe1LAfM0GMlng5KbHlK
+NqsECNQNIihEECdJ9UxEl191aAf4hnfvnL+RRaalCCeM9LZY+CTCuG1RH61H8Dxl
+Fq615+4DP7bKHUf2FiYVcqu9MqLCw6YasrCNFcBQuZuzO/3HUyBWHOQ2jb5w5uID
+cDsV5rGtQjc0DNc7v34lHYsfP8BWRF+z/VE865wgupQ3f5OTTHPBeMy1bO0t5rU6
+iDdImoz2KZ3ZwDc=
 -----END CERTIFICATE-----
diff --git a/tests/standalone_2/io/certificates/client1_key.p12 b/tests/standalone_2/io/certificates/client1_key.p12
index 5d11e73..8f5681d 100644
--- a/tests/standalone_2/io/certificates/client1_key.p12
+++ b/tests/standalone_2/io/certificates/client1_key.p12
Binary files differ
diff --git a/tests/standalone_2/io/certificates/client1_key.pem b/tests/standalone_2/io/certificates/client1_key.pem
index 0e2ef5e..16c513c 100644
--- a/tests/standalone_2/io/certificates/client1_key.pem
+++ b/tests/standalone_2/io/certificates/client1_key.pem
@@ -1,29 +1,29 @@
 -----BEGIN ENCRYPTED PRIVATE KEY-----
-MIIE4jAcBgoqhkiG9w0BDAEBMA4ECF4ZB27y60SWAgIIAASCBMCEL3ZCzfC0q+m+
-B8gM9jQe1JFRD5reAuwK6+3speBS4KE+wjbcyQq09/5UoQu3Dci1WG1nKLB1u0Bk
-w9NuRahWCpvVLzz/GQ6Psesixq3V69zD3N6iMl/XQKymQBwGK51xIkeJO+6Skh2d
-+qoyBHINTlKY9+548Zgqu+Z3mI3pGmdhd7hCiamiffDwCLEqRxbXdZdLpC9GpAP5
-HOqXHzN2aZbAGHb1GkHVxskSNzAwlEEZhh4Ibe6o7U65hoL9borewT+gj6sQohI5
-/LHL0P2bVvtRZiwBVPUX8HZWuVYIFb6GEGTTqOofNhNHvHaKUlD8Uxi5/h/Xi8fq
-xpdkjIn7VXj9e+I3TkfiphDtk0+Q+f+UkuPyuzU1PafinPfRK1J6gk+ZqAQHW/sp
-g6GVr2r4PkOrBPsA6jmCnQhs2C4MlZyR2p65qjVutdkKU5NgftW+giK9shgglcza
-38RF8i01THOnD3j+2teM/t/Ziqb2PGWv/bmvhcYqt1aG186Pe3bBCxhh/L7bqNKD
-q7sxDmaDE2pTkfyvh07udarmBQc5gvfXYqwghbqP/n7wizqjeEJgAwwHyi8LLsFV
-XreBQ/8Z2gQwXurrh5WD+7KSgvgopW/oVC8a3++8Hmf5Nkj27lACzoDWTG2/Swah
-O1MmdtPyy/KCbf5ujt2BlXM9D206Rsr6hoO9UZ1s1ohRdJReVGc4NZ4XrVWc4TKT
-gUAFTaHIKgFe/DgLaQn8L8Pqb8B/JfoSgQ74r69S434Kc+EDKui8wnkgso5bqrr1
-M07H9Xo+OtG1D6rma2EUlpoU06CAIcyqNx5fHJ3xfk9GHScQi4U6vEDCAQTNTS65
-I5AOHthZ2kZzfXvP6TF39S5D37NrV7/WJu7ZFaJx3bUGwnS2HYTwjFPABHpVLMwJ
-nBylVJs+h7bCZdBNCWgTytcn1mYMCvXVmrW8VTwBRjUQsy4rgE2wjpZuIM9rx+gZ
-HtNvy5t2RlOSqVKapyvV0ll7qbT1lwGIePxjttiWmNbgbwRBQzjv6FZ1Yo331Fl4
-qgXGcvZWgsgQFPXviKmDx+9KJ2oL35cLnDcMCRN7lLPdAhk8J/XrUq/iIYXNxud6
-f9mfVOsd0LT030je/N25IdEoPimTnps/INGGNug+FuJ3dCeIQGwB7uQB5ozoHL5h
-hzdQYq5+FWksuHPCOL1YLRJux9sH6OYxlXy2oigLtA05EHhq83Wwb2oTW6boo+rs
-gKqzc7OtFgYDsV8R1raoqlzAv3GNgkzyuHTSUakDdnJYmfcoOuK+Ch+MjVeZW5bS
-Ir7uqugUqqI/AiO/eHkvoGpQs0c67ao0qPR7ZQna/1FBj1O8J/dI4JBUtPvDa0tW
-7U+Ja/twJWri+Nn6/iEEWEuM/xx/xFmxrTb4WYza1ysrCls5l6POjQu2n6dT52+o
-cobwltkJmSNoIT2SYRuvEfgGlwyzY5p5B8U24HIAkNJIkO7hc9oD1mbq+K526HNl
-h6TG7RGUOffXIYuykrMmCTRRnv3bXmjTgsvWhVFujpCSQf9PqkQpv+KQPeFmy12h
-TA1QNtdVOZlh2GLEUgZuJVytyEz4m+3BfvBql5K9rlAUSQqsLJDKVxsmBDl132o3
-yy9JR7iC
+MIIE5DAcBgoqhkiG9w0BDAEBMA4ECDBZgjf6kratAgIIAASCBML/IWUC3eylBatQ
+SawxuYM81Ak+LnjidlC+/3APnYNFdppoUbZu8WK9Nj/SPQBXnpuGpVuUWWaIkjzI
+d3tivlboh17M6TBSBiI6wopmi4uO7k+BKTCH0chdqKM8OjJajpeGOfejW7Jojnr8
+Yx8G3IYO5DWWXSU7kp4w5WwN93vvRZh4pmLwOIFLwdGVNooBu1FRBaguPFQoWgO+
+JFbT3qDYvpttdsgtOalqpudHcQteapgQkUfKwk+unB+dgxS3sTTY+Zy9ClnArd0d
+1wlgOm34jgDxxWIdfaa/l/hcz82F45HeA/jwvP7/EXTni3hkDT92vTMHJQPKguhL
+V+be+XNnGihNT3k6fXpHAr6Y+HXN+4nqd/ndKRkfzVeZkNMzjFgeWy/LQ1bruMSP
+Cz/RdpatxH/fRvazCXe160YIB25cwFMUvt4saiN3SvHETxC02SsA6hY1TZB2UOmO
+/PjyXiXB6nyHchwEbTkzwnHKJSDX5FlAvweOkJ9PhKZIgfXRG/5orqXWqczUV+Vk
+FyC4338kCtY8sGYlbBvusNqugkbOEMaKUtJd4R2vvXUUbcybrAmjHg10To1uHAxw
+2xE/gewcvrPTdo4upV4JzyGszJte3MWspv/tyXY/s8F1/ENwatPOZWqMDAa3WSaz
+dzi8cfQFVo2Pq2b2TtrBE0KPKt1Zw7zIHYcyWnGJaLTzXhFdaw+8jY1+tudnBtzE
+l84fqwBX/9sAjOdCz1TkIskdpDhWQm33MvTbWluj1FvEQMYgLpLpLIOs1kw8DMNE
+TH6rrVnMDpdr9bGOPwmxBa/SC6n0EHGczSJ0IyGt5GrjOLGhPgYvETUDCH00GUY7
+cH+v6S4Lh4Z19aBcDEcW+drU/I+HfoC1qhnqksvNJFeYbEDqTcXD3De2zd6MzMiL
+qoxaNWshoAYqMbNdZNeCjlJTFq4mU2v+CxLKxUmnoLzkPsrfdniEfTwCg+LoERCk
+t588o6N8g3JfPDjpTWiH17KEuiKvDYPfheKr3Zu2Zzgd3Rm63l80vINtYffTfKB+
+U/nuGRzX0bRqWLZlEEnUJxnSYurG7DH7uozCgozbkVqYRE75/wxBDNSeOWSy5HDq
+0UeRafBOJmGU/7jhNLnKP8YZ5o+XBI3oQMfLb2q3uNbLTc73vqWoFCC7hCUJnKq9
+z8yD7mETNYTyS1g7uGt2yWmuYinyn+VQkg/f2ExQ36HCjzkoaJyobpNgdzoTF0+q
+dhzCAfb3C04p/iUIXFQCD1YdZVgwXCmAgxRKbfJaW6B1FFHe3PYzac5RQtvLJQ0q
+u8sUFlkhr/ax5wUXhILXnvH0S7QtEcGTRJawna7TBZWk4kvTlU0N0DcLU+LKUmws
+3seuvYROHZ6VSrGikL5IMVZl+h47Ub4HMTvdWAiaSMchl3fxVFW5kGJcAMvoI9ZO
+ENIWeZVgXrz7FPfnfYnLLNXeHC1LM0hYHztkaXuBC4ujupPmy4/oHNmQXx/yufDK
+wmQEWsFPf/JrwraW6PAX+/FvZ2G97LIDoxB4TjaIdBXKr17YRAOD9PCcqWBtFrHu
+4HXwSF4tALbDlMryhjMNOOs0jWjl+jx1LtZ+I+USOjX+3G1ZBWgl5Ps29YMJYF5e
+NRqyXPpLaco=
 -----END ENCRYPTED PRIVATE KEY-----
diff --git a/tests/standalone_2/io/certificates/client2.pem b/tests/standalone_2/io/certificates/client2.pem
index f34bde4..3999216 100644
--- a/tests/standalone_2/io/certificates/client2.pem
+++ b/tests/standalone_2/io/certificates/client2.pem
@@ -1,19 +1,19 @@
 -----BEGIN CERTIFICATE-----
-MIIDBzCCAe+gAwIBAgIBAzANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDEw9jbGll
-bnRhdXRob3JpdHkwHhcNMTUxMDI3MTAyNjM1WhcNMjUxMDI0MTAyNjM1WjAQMQ4w
-DAYDVQQDDAV1c2VyMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMay
-a0BYpNJHlwcNz6TyX+D6dKnqxUfdHQDgW9/5Hl4RiHDKAH+2iVYEsedksOmxNDlV
-HqZg4fBsyPVRzeGqia7nCsN3KlMbaqZgNI3ynvvMFIJkb3e/ZJtodg+cYzqnOu2F
-G3LijzRJG363aavTnjLdFumLnsOtSDdYnjRM43eeE3X2ajAiKkE9r6b6/wt8Ki5T
-GVIm9kG674iCloawK6dgCBA1dDPsKmzhcFoAl5UMpQSvd1OuW034qryE+RzQ0RCe
-G5u2leVgiuoq2rpmPL6fA0BHsyJ3wP1Gs74i+NhZdhiBhv+E89sfKaJOPpmDBW7b
-3jCpEmgRSm5h5SDm8KsCAwEAAaNiMGAwCQYDVR0TBAIwADAdBgNVHQ4EFgQUj0t8
-BdHrTqd7aKIV4+OLWvT6WX4wHwYDVR0jBBgwFoAUtyLBueMoMi7TborRvM7CnwOi
-SQ4wEwYDVR0lBAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBABQ4PKRG
-VJYhWtktqpilP+C8CXsMArsqkEdMwHgQi8Xv3WVvXZpiLZHvO0To9J3+dgD2sOys
-MphZBXMJuOfX/+3IGerxsBxVj7Pnx37nn83g6PfCvGgVQQw7cGUjn5/Dw6apH2HH
-eO3yG+fgYeMNXyKt1KVWYeIToZfXUFvm+oMbWxxdpcctsKLRgCRvf1+r5EK9xE8+
-jYYk3S3pXvsk3qwWJz3pjg6zR3IbakkEuhE1Gl0Wrf4zZ9DOB8rd00/xirAuuYwm
-aIZ3KcFCTgVdGtB41q03D31xWNZPODCxAEADiICNE+3cuUMCi3wwBeCrybXSLhj/
-6St8K4NBvg+xL/w=
+MIIDBzCCAe+gAwIBAgIBAzANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA9jbGll
+bnRhdXRob3JpdHkwHhcNMTgwNDIzMjAxNjM0WhcNMjgwNDIwMjAxNjM0WjAQMQ4w
+DAYDVQQDDAV1c2VyMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMBX
+SxFoCWZxTjBXABqf9ygEicJDLcBEnStDbo+XE7CGDNkf6AmYy9cFpNK3brxfmU3x
+ZKizie8fLeTMpaEAAR73epPn9Ui3JzP4e12HacLXVIZkDdoOjCcksf1n6CTXSTeC
+K2h8aO5oqC7ouwUcWbCbdLu+OxohAMg/vmDXvRhJC9uoJyW8hYJwpAuErh/W/DuX
+LUgAAGNnztth5UWmrD4b9vdhU6yR2t5Gj2DP44Ow5rlurqC0vY87pe+rMal26mF0
+GLYCzrJOdEwy4WGCuTxXtbqvud9NIV++61cPtOu+GQKwI6/KJ5TEKsLGEbqQViM4
+rUguOwndm/7HK00nbPECAwEAAaNiMGAwCQYDVR0TBAIwADAdBgNVHQ4EFgQUKpNM
+YZQHavaPs/m1k7d3a9QbbTQwHwYDVR0jBBgwFoAU+TlPoMTEPn2GHUDuD49Nm+iq
+vwwwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAJSyKalJ
+wh1wQvmZ6sa7imzsWwQ70Kr8NgDZFm8Ds1dkfzxsP6lBey8HVY6nDQD2LzJth9ny
+2AXcHvT9DKRto1cJI5z8/H+E7oKzPAlJjnmhL2dIk6als2KYfBHu5eLyaoWOCvNx
+wd4wk+JrMIQuVeIQwrG2PPDSUffScb5y5OeW1PvmnAJNTI9bHSIA4/GN45/l3FEW
+IZuOBfv5DjubYoWT+OJMfSXoqIU/wciyx+SsSPHQ8F8Q6eLgxhF74eqIrIWstZIf
+bwo83QHOpqXxEkzny4Pbdcis6rGWagH6JXHoiIHcHlsRveMEUGLUJaV0nxN2DgUa
+Umod67RaTcbdses=
 -----END CERTIFICATE-----
diff --git a/tests/standalone_2/io/certificates/client2_key.pem b/tests/standalone_2/io/certificates/client2_key.pem
index b4074f9..8bb2fd8 100644
--- a/tests/standalone_2/io/certificates/client2_key.pem
+++ b/tests/standalone_2/io/certificates/client2_key.pem
@@ -1,29 +1,29 @@
 -----BEGIN ENCRYPTED PRIVATE KEY-----
-MIIE5DAcBgoqhkiG9w0BDAEBMA4ECC/vc3ONj4KfAgIIAASCBMI1liT+B00kYYj+
-VRcEHQVrWsvD648OCd6BNQ9gKTYL5767lHUN0iG2JAdTHTKJy7XeEVVdPweU58jb
-HnS1yWbs0IuUFkCGy9wH3Lb6SkZtEScoAmzsNRdSY3WwmNhUG/yHrLITKM1SGkg3
-nf3ywIJYwO3YH22InVK0puVT/y943F1GXZSvklG/TGawR0uIyNuZOl0rg+5bsCaf
-1VSCWvt/Czgqm9Pc+Iz2PAKwyyjmvqRMBCtKvJTGNEPB63eDyHWQTtvQe0un06AF
-lvB7JYWaTXiwccSww2BuqTdJdBYKWxzPbdBfcqUT5Q9/LE0JhwvfZY/oDeJFP0HC
-HVBajuESZPJgb06xcsiX1qmk/iqAjZVZQ/CQ9K08qXem7YRFxJCy90wjLu3abjzQ
-Nvq0VsI8a8vlODQlr/Z5iXSYEKMYvUwh5Y9e8fc0BOOc1QzOYV2vxy28OVHmigOn
-tVHdj/FXK6N97QgtFzVUTjisO3YFygI2wybrz1BEys/vwqfCBiT+/hu+ur/lCrkn
-E2S6I967TyTvaxn+WCo9EW2Rb66XdI7tL09AkV2VZqJN4PTyis9YYgkr2uKjj4qX
-ySAQp/XHGEF1mmvjeptKTb2CMut0vcP+nl1bsUUXpSiKYGQ2BBcqgTcEFUEd75ms
-kcPMOuHdioaYh72nCRVzsRoDTDGF08NMTndW5PC8RpFsNS0vx8dq/A3VHAvJa2Rc
-9lP939FAU/Ck9b3NxH6hUgfDEFHQ61oW2Inpu4s3eRoClkgyf+aQEZZI7GTiNICm
-xqHosZ+hLe2mYoGk6xl1AruMk7kGeebRaPxzvS0UKfftOQDahFcDp8iEtLAcM1nx
-8Pdu4csyWFk+eBsTT6sPur2ZkD2LO0gLjR+N2nZNTqEJYy7n1jyV7M/JZBfh0fGi
-VX+sb+urTBAlDszX6b1LV7M78MDs6QwziDsrytjuClOWN47wzYbYYnSZZnDtTR+B
-CDHyK5wa8gNs4A+643HvD6sJz6zALOu2UI/9SrvuyYPltCwCUmWJ3A2XxoBmdJ/e
-yHEj/VdsNi6TtQ5qpBWqm43LpF0WAKNgksGnbFjOc/0QsUVk0txB9D6/oC9HyCd8
-u9nR8vLUC7l1dtYL0CwpocqU67qzVoRxrkkyCE4iblusKjr1ZlfstHDS0tPELodo
-8RroSs4vKXV9dzhzLQyqp6PzzdB7y/5Bpn0grxXrwln6/shoSR462h2CB4z9chGA
-Vdsp+KE8LDogIwZDT6iVVrpaBQDLoSxmX+E2IKRCUcj/l+gepEPyHbhOAn8/NxGX
-h16v89aDMtnyWqUcc/Gm2/Qep3o7goRfodyoyWvwy8nq9Lgf/wJIfEGn0lEeR0I/
-/Om/UAiId1o47C3LsGMm+qO+FcWesLA67eMQnp1WYoWpnanb3q4t8PWATzAlW05n
-cA59dYjutUmKJEjrh595AptMLXn6RM1GzA7x53+uAKvXaI+aR8wrtujiJLg9DwY2
-+f4ehwfwNptBxzZX97a7/3lGZ5U7BgDeJhNo9T02VQTvXxB29H6J/v6XYyPCKpuM
-upPhiHzrs9UyMvINfDnd/fJ58qr6TvEuBi0QxMMmOCfccYlj6Q5Bfqp+iuST0igg
-SLmBml+LkIM=
+MIIE5DAcBgoqhkiG9w0BDAEBMA4ECOesX1fugaR0AgIIAASCBMIl6TrcBn0oHRHl
+X3MSXdAyEMLYBaSVgyRUt1gu0WhyT9uu1xlB1VGu14QHY3uqvTMZpJabSYsafV+P
+3dbFmk9YHg3Ss0GPaRcx4Q74NR/3BzMIB3q429JSK+GYKHNkRtdMNiQ9OcFVavhD
+BDApEkavka/A9U5YOB4+/20BPYpfSZT9Z+hLffH6vl6PSsuRzYHdqbbTi44Rff+R
+m62xzgSxG2+n9J68XPaVxVOLAoNQAlPVfq+lxYF04PdZGz8euJMw2C281Ddpo+sU
+Jtvbp0JuAa24GNLM5DnmHvRbfQVxlm6dKJi40Gi0g4ellSs0roqUY+RXUC6VqL/R
+qPWiJhtnvue8zOA6F0C2nFF+Qdtm0UiwEp4TR5jhC5y1+uWzy190mM2fuo0m/7/0
+6FRv2Oc3tnYXTYg0m8h8QjPGCp3A1TwDlTOoeG81GD4sYvu/kPQH0cKmytwAqMJw
+LP6OCgOjEFwWxKkYaBVSnr7aP7f/26F8Rf8eGJO0VH2P67F8usweof30bP9eQ9MR
+rrA9uA0+odpufNMaVbA9Vnj4ipCWR0xqU0Uq+UODVwvI3Vnf1c8gWm9rFCi3hZb5
+kuxtDpXWlR7SgiRejt1cZmWTWijToF81HkFZf9XoS8jdN26XLlhqy45h9G2N3mVQ
+jS0uSAjZVk4A1k/HbicOcj92eL1nXK0QFY7OPL9XBSms+KlwAVN15M2tnfQ5mlxC
+mVAFqho5KQmYipViO/VI5aS/CxVnABSqLxhhj/ge9SQFONjsNDKkaIz7tYtz5KJ+
+dvJAg2IMcOtV4jZIBrNdfslw0TP17GZwrCUibLzEdPQ02awpemyi1sHquR/B9uoi
+3CDsPoDABzVp79wsiYz2sEwY23AaKZtMuQRSbR8BtvmMIArgJ273/vfx92skMdjn
+dpJbxTlNZ/xPo3NSXVTQYxlfeNrGelXvJYT0LxZ4uapMa91gRXRvJsjC3JGu4o+T
+CeMtclG9uYrSOlbyg4WzVKpwIHTjSCp/CkWCBJIkdxKkScwhDoG3mAcglwMikUEt
+Eg60+jPBHH3dTOvuaRXvYDVdPG8SPa3txrR1tetKGB6g7eMjYgbmYDOxQESS0j1H
+cUCIfK+NwKMBRJFy1wjWqZLKhCWrtevAMhpPFa3HWv2fLY0Vf2s6n9W9mr/hA3Tt
+tPo+c5r7M/I2jzxiHSo1bJD/0yeZDegWrB+8+8PzHoFY05458ei1rc9iNTziogl1
+DYOOcBlROOitO3VZYjbab0iwX0zqEuSYQy41zVJHbMQFp+rbIpuPWQpNAC3FxZuW
+iTVchbpHiCHZ+I1Lud3aqN2z3CBC6GLONUoyCvLfmCKoLIbjusZ/xFH9Q7INPOkH
+g2Sr/bw+8oC+FCujORB2iUmFo5fcgrF1FLxFEbYaB629ed8vE+2aII2OA4amsiD5
+1RkylPMD4Tv6FOvp4G37ph98vfdQvZeX9OdkqS3rGdbwSCf6+AngomJEJ7uVA/c7
+Won/1j0eF6JtcRPBo+jFKfdzr6ynu2AoAyKg0Rn/S7HC0YLEB1iPDWpOC39yQp+A
+x4NNJm1NJjR3oby6LdVp2J8GlKuhztxqkJ6aV9BZDM0rEpP4EdA0QClhXnIJ9H6e
+7bQ8uhT8sW8=
 -----END ENCRYPTED PRIVATE KEY-----
diff --git a/tests/standalone_2/io/certificates/client_authority.p12 b/tests/standalone_2/io/certificates/client_authority.p12
index 545282e..76b0575 100644
--- a/tests/standalone_2/io/certificates/client_authority.p12
+++ b/tests/standalone_2/io/certificates/client_authority.p12
Binary files differ
diff --git a/tests/standalone_2/io/certificates/client_authority.pem b/tests/standalone_2/io/certificates/client_authority.pem
index ae9ae5b..142756f 100644
--- a/tests/standalone_2/io/certificates/client_authority.pem
+++ b/tests/standalone_2/io/certificates/client_authority.pem
@@ -1,19 +1,19 @@
 -----BEGIN CERTIFICATE-----
-MIIDKjCCAhKgAwIBAgIBATANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDEw9jbGll
-bnRhdXRob3JpdHkwHhcNMTUxMDI3MTAyNjM1WhcNMjUxMDI0MTAyNjM1WjAaMRgw
-FgYDVQQDEw9jbGllbnRhdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQCi6wJAs6nppNmTZ3e/wE9l0pAmkMtDONwB9o115XXTG3rmSKfZOxa8
-TFjSn818Pr1OYb9fPdI1Y6x4WY9PELUtQyEBlNcKjwg96vhrP4p2DhqbWsI5nASH
-DSjJsM75bQ7D7qHYzriuAl0Fk1C4LcodRj+5wmErMtvGJG0x06qFbxCCMAJ2kC+h
-SneTN955/YHSXADgxjFlt3s1T0QPnqrr+G7Ro6PrVKLPBulglq7wAeTwrGkPRUt0
-3lDGOSi6i97NbpiXwrGp5XiLUtVCiID6Ro0xKWH4sjJ4JnVjIUG8CQWERc6sFDJM
-4adgFQJagkTUoxWtDGL58+WcbcJa73XJAgMBAAGjezB5MBIGA1UdEwEB/wQIMAYB
-Af8CAQAwHQYDVR0OBBYEFLciwbnjKDIu026K0bzOwp8DokkOMB8GA1UdIwQYMBaA
-FLciwbnjKDIu026K0bzOwp8DokkOMA4GA1UdDwEB/wQEAwICBDATBgNVHSUEDDAK
-BggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAh8rryWFoGjFdm0i4FLRktF8B
-aUqVCCpFVHIYlFcsQstznIb01X2Zq5nfSfrFxbr5STVGzGJ0HGDuFpicT8+qMnJX
-dou5AuaqubIDWeKL+oAgvI71Nt1gsesixqzFQAoCTRgUjrSGpY2fL7rElV0Ndy9b
-YepVouktP1/GULc8XbIG9ZLx70Id7YTyrITDgbH3hSnbjmmZSr9RKyKas4MXN0s8
-oKGHEgAx7KyNQRppjydz3bDeH/jVbM4W98vwL6rjKUJlOlo0Ru+3+oioFHqLMSvN
-w4f5rQEiuF260h7y8KKxRxQ8rw188gsBapZr4Rcp+y8gdQvlzJONtv3d1dap5A==
+MIIDKjCCAhKgAwIBAgIBATANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA9jbGll
+bnRhdXRob3JpdHkwHhcNMTgwNDIzMjAxNjM0WhcNMjgwNDIwMjAxNjM0WjAaMRgw
+FgYDVQQDDA9jbGllbnRhdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDckwmIcOYIRbH1jcuBCC/y1a4aiqXhvUCty59Cdqzlx0gbrhkVGmf0
+B0Tmo/PW4p9rcl0hwwxGvGoCvsxVpodHQmIxYwwn1sRl2C7Yo2ZHPMYbv9uq+D0d
+kS8SxHb5l4HvpcT7WoqUq8ZWEm0Losbp8cOcrvLiBQgo8xIOKQzKbwrXydnviQKL
+E5iBmUswzHwb7ZK84u6dS3iHbl9iPy+QTfiboT6BNMsO/dm6Nqmdj35fOPQgFUN/
+QR3NsPWL9GtzB9iZc3D7c30FqqqQO/THjaLJIyzdFdF3Fsp+omSuZw/q1d4/R8M3
+FRCcqzbWLA9Dy12kK/9asmlpf/fdHByVAgMBAAGjezB5MBIGA1UdEwEB/wQIMAYB
+Af8CAQAwHQYDVR0OBBYEFPk5T6DExD59hh1A7g+PTZvoqr8MMB8GA1UdIwQYMBaA
+FPk5T6DExD59hh1A7g+PTZvoqr8MMA4GA1UdDwEB/wQEAwICBDATBgNVHSUEDDAK
+BggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAh4f1I0kXK88S3yC8k0zRAp4n
+RyyjnPW9Sr2nIuC27RgfH0lxWGOlAVVrFUlgifECD/RSoMuQk5yYgAJiALbnfdlP
+AutjtwClWZ6u1BXnwdUxS+ypWtq4Fb4+vz/VRSK24ZNcrI9NF3wkqKHxnjccxROA
+BratiMbHi5VxU63iec2XqAEhqi+ArWks8XJyTvv/tBYOqmmP4Fi0i/wbpzxmFJ61
+ZGUiHFifkYHKBI/HhjDazdeAhAwcFHSbVInea10+V0dkW7sOGnJFW5PyW1F/TBBe
+3dsp8Tz88+oHbSGwV7qF/Qf6U6kRxeVVctmSSCAohUbPH26xhPhk+t1TVdb3EA==
 -----END CERTIFICATE-----
diff --git a/tests/standalone_2/io/certificates/server_chain.p12 b/tests/standalone_2/io/certificates/server_chain.p12
index 79e412d..9ef96a7 100644
--- a/tests/standalone_2/io/certificates/server_chain.p12
+++ b/tests/standalone_2/io/certificates/server_chain.p12
Binary files differ
diff --git a/tests/standalone_2/io/certificates/server_chain.pem b/tests/standalone_2/io/certificates/server_chain.pem
index 341a86f..0d18b96 100644
--- a/tests/standalone_2/io/certificates/server_chain.pem
+++ b/tests/standalone_2/io/certificates/server_chain.pem
@@ -1,59 +1,60 @@
 -----BEGIN CERTIFICATE-----
 MIIDZDCCAkygAwIBAgIBATANBgkqhkiG9w0BAQsFADAgMR4wHAYDVQQDDBVpbnRl
-cm1lZGlhdGVhdXRob3JpdHkwHhcNMTUxMDI3MTAyNjM1WhcNMjUxMDI0MTAyNjM1
+cm1lZGlhdGVhdXRob3JpdHkwHhcNMTgwNDIzMjAxNjM0WhcNMjgwNDIwMjAxNjM0
 WjAUMRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQCkg/Qr8RQeLTOSgCkyiEX2ztgkgscX8hKGHEHdvlkmVK3JVEIIwkvu
-/Y9LtHZUia3nPAgqEEbexzTENZjSCcC0V6I2XW/e5tIE3rO0KLZyhtZhN/2SfJ6p
-KbOh0HLr1VtkKJGp1tzUmHW/aZI32pK60ZJ/N917NLPCJpCaL8+wHo3+w3oNqln6
-oJsfgxy9SUM8Bsc9WMYKMUdqLO1QKs1A5YwqZuO7Mwj+4LY2QDixC7Ua7V9YAPo2
-1SBeLvMCHbYxSPCuxcZ/kDkgax/DF9u7aZnGhMImkwBka0OQFvpfjKtTIuoobTpe
-PAG7MQYXk4RjnjdyEX/9XAQzvNo1CDObAgMBAAGjgbQwgbEwPAYDVR0RBDUwM4IJ
+ggEKAoIBAQDZE0gF3bAFxBaxAZUFGkeFkF5B8nJD//+14rcz/Kr/Rau38g38jNyp
+K3bsyWIBq/4A/cPykwncG6Z04WD2FrLR1xDdAbO2zD3cQKbOoFOYXeYMmP4FZcbq
+nSngCzfUfJkwXXHfCC6v3XZkmR0ojWp9tGHJ6G4f9QI8wwT/Y9pvAVQVR9+S43C0
+ZAPkuNiMBN3lAH4QF2WTC5GTQo4hR+IAWN28lnqAbVoRMNvFoDenDZxURq2kT/6j
+ot6UB9f6AOugCUlEpVovTX3evPKrIZz68BM4DttA/r2wo6dw3fouZk/REJ38fi7x
+lg5n5ccCmguE2fF5PoAMH7WCc7EupYKNAgMBAAGjgbQwgbEwPAYDVR0RBDUwM4IJ
 bG9jYWxob3N0ggkxMjcuMC4wLjGCAzo6MYcEfwAAAYcQAAAAAAAAAAAAAAAAAAAA
-ATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBSvhJo6taTggJQBukEvMo/PDk8tKTAf
-BgNVHSMEGDAWgBS98L4T5RaIToE3DkBRsoeWPil0eDAOBgNVHQ8BAf8EBAMCA6gw
-EwYDVR0lBAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQELBQADggEBAHLOt0mL2S4A
-B7vN7KsfQeGlVgZUVlEjem6kqBh4fIzl4CsQuOO8oJ0FlO1z5JAIo98hZinymJx1
-phBVpyGIKakT/etMH0op5evLe9dD36VA3IM/FEv5ibk35iGnPokiJXIAcdHd1zam
-YaTHRAnZET5S03+7BgRTKoRuszhbvuFz/vKXaIAnVNOF4Gf2NUJ/Ax7ssJtRkN+5
-UVxe8TZVxzgiRv1uF6NTr+J8PDepkHCbJ6zEQNudcFKAuC56DN1vUe06gRDrNbVq
-2JHEh4pRfMpdsPCrS5YHBjVq/XHtFHgwDR6g0WTwSUJvDeM4OPQY5f61FB0JbFza
-PkLkXmoIod8=
+ATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBSFtW0d7VGk7g7ywHgrf+bbg/BhQTAf
+BgNVHSMEGDAWgBQqU7R8m4wyfyc9ubiPQcYpHNZrmDAOBgNVHQ8BAf8EBAMCA6gw
+EwYDVR0lBAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQELBQADggEBAKL0FaPO+YM+
+JJgQryvkf2/WqdnnTGg/7A/HCOk1rkT9q0282Bj1OT4GiyOIOTyHkxrF72dSiN4Q
+0hg1YoUITR1uR5odQsnK3YKSfmGfn+IRNuHf/Oy1XfRrjuIgo3syeqquIJM4W1MO
+uZBkqwdXQIYqBGj4E+y32bxGVhI53rb9MyKfugajRxImTO7UnUydHsIgqNG6MfuH
+LXBNUAw6uPLyW6srfWiiDVlkUzSmXYFoScCXTj7u12Ar/hffGKrXqHojSE0XtcRz
+WuncYKJE/pflgClA5Qe64erD3q2w2SfOZDFwizP7aZU9uAMin8NbiE8Nd6h8hoRc
+ztJfeC+1gro=
 -----END CERTIFICATE-----
 -----BEGIN CERTIFICATE-----
 MIIDLjCCAhagAwIBAgIBAjANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1yb290
-YXV0aG9yaXR5MB4XDTE1MTAyNzEwMjYzNVoXDTI1MTAyNDEwMjYzNVowIDEeMBwG
+YXV0aG9yaXR5MB4XDTE4MDQyMzIwMTYzM1oXDTI4MDQyMDIwMTYzM1owIDEeMBwG
 A1UEAwwVaW50ZXJtZWRpYXRlYXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA6GndRFiXk+2q+Ig7ZOWKKGta+is8137qyXz+eVFs5sA0ajMN
-ZBAMWS0TIXw/Yks+y6fEcV/tfv91k1eUN4YXPcoxTdDF97d2hO9wxumeYOMnQeDy
-VZVDKQBZ+jFMeI+VkNpMEdmsLErpZDGob/1dC8tLEuR6RuRR8X6IDGMPOCMw1jLK
-V1bQjPtzqKadTscfjLuKxuLgspJdTrzsu6hdcl1mm8K6CjTY2HNXWxs1yYmwfuQ2
-Z4/8sOMNqFqLjN+ChD7pksTMq7IosqGiJzi2bpd5f44ek/k822Y0ATncJHk4h1Z+
-kZBnW6kgcLna1gDri9heRwSZ+M8T8nlHgIMZIQIDAQABo3sweTASBgNVHRMBAf8E
-CDAGAQH/AgEAMB0GA1UdDgQWBBS98L4T5RaIToE3DkBRsoeWPil0eDAfBgNVHSME
-GDAWgBRxD5DQHTmtpDFKDOiMf5FAi6vfbzAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0l
-BAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQELBQADggEBAD+4KpUeV5mUPw5IG/7w
-eOXnUpeS96XFGuS1JuFo/TbgntPWSPyo+rD4GrPIkUXyoHaMCDd2UBEjyGbBIKlB
-NZA3RJOAEp7DTkLNK4RFn/OEcLwG0J5brL7kaLRO4vwvItVIdZ2XIqzypRQTc0MG
-MmF08zycnSlaN01ryM67AsMhwdHqVa+uXQPo8R8sdFGnZ33yywTYD73FeImXilQ2
-rDnFUVqmrW1fjl0Fi4rV5XI0EQiPrzKvRtmF8ZqjGATPOsRd64cwQX6V+P5hNeIR
-9pba6td7AbNGausHfacRYMyoGJWWWkFPd+7jWOCPqW7Fk1tmBgdB8GzXa3inWIRM
-RUE=
+AQ8AMIIBCgKCAQEAsSFr3/sYhGFF7gEZSn7Am8ATtPhTo5ypQqSAv/4Uy+k4zvT3
+b3OZyYpzr5Wsa6NXcEKwNipyR1GBpYwaYI/W4DSi+COdH4DQSZDQFr+hvmXRazzj
+VSsOxF6veGLcza53meLPRb4o4yVoZARd6xR5i3OUD4kezvOjpmlFT3OKNU0Di+Vq
+qeS14/at6Vt6G0rS8CluafD7Z0/5zp6vrImKwC6OWzlmmcAqBGsE/BTzrAxLdt4K
+uw3Xs3uvS3YZIAC536C1Mop1n4FBUGxeUMWH+I/llzK9ol1pmQHJrxfOD5WdFuuE
+iFfpiOmBdUfDBbEPllmIvzUBFOo5VhxVmq8EHQIDAQABo3sweTASBgNVHRMBAf8E
+CDAGAQH/AgEAMB0GA1UdDgQWBBQqU7R8m4wyfyc9ubiPQcYpHNZrmDAfBgNVHSME
+GDAWgBT0rD9lRUhqJvAg7hfBEz/ZqHCzHjAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0l
+BAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQELBQADggEBAGjRSFvVeIrRF3iuA5vr
+SgufTCNzAyEz7+pDKflzHSQXF1fdItiOdPGv1i57gIr7HaYuxvBiEklhmnWreYye
+Tn6ghfhEHhdZHBpihDXuIvLizhtR/lg9CDZrHjuY6nukyx4JnWwUBR3TulPK5gJu
+jB9YISY8tjXrvVNqdi0a+G0T4HHnVs3v6Nd/Qdsxfp4maAB1U3HFmR3DXKTxDtBK
+mNNMqf9PpX4lw4o6UieiEwOMd+4REhmwLNTwhWrhVg5q6GKQl873Ge/7J2nXvgkH
+nUbEsncLsArqqrz201f2m32A6pinwY/j85vEeRkHwlsU0jOvVnHzAlggP0u/kFAF
+EjE=
 -----END CERTIFICATE-----
 -----BEGIN CERTIFICATE-----
-MIIC+zCCAeOgAwIBAgIBATANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1yb290
-YXV0aG9yaXR5MB4XDTE1MTAyNzEwMjYzNFoXDTI1MTAyNDEwMjYzNFowGDEWMBQG
+MIIC/jCCAeagAwIBAgIBATANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1yb290
+YXV0aG9yaXR5MB4XDTE4MDQyMzIwMTYzM1oXDTI4MDQyMDIwMTYzM1owGDEWMBQG
 A1UEAwwNcm9vdGF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAMl+dcraUM/E7E6zl7+7hK9oUJYXJLnfiMtP/TRFVbH4+2aEN8vXzPbzKdR3
-FfaHczXQTwnTCaYA4u4uSDvSOsFFEfxEwYORsdKmQEM8nGpVX2NVvKsMcGIhh8kh
-ZwJfkMIOcAxmGIHGdMhF8VghonJ8uGiuqktxdfpARq0g3fqIjDHsF9/LpfshUfk9
-wsRyTF0yr90U/dsfnE+u8l7GvVl8j2Zegp0sagAGtLaNv7tP17AibqEGg2yDBrBN
-9r9ihe4CqMjx+Q2kQ2S9Gz2V2ReO/n6vm2VQxsPRB/lV/9jh7cUcS0/9mggLYrDy
-cq1v7rLLQrWuxMz1E3gOhyCYJ38CAwEAAaNQME4wHQYDVR0OBBYEFHEPkNAdOa2k
-MUoM6Ix/kUCLq99vMB8GA1UdIwQYMBaAFHEPkNAdOa2kMUoM6Ix/kUCLq99vMAwG
-A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBABrhjnWC6b+z9Kw73C/niOwo
-9sPdufjS6tb0sCwDjt3mjvE4NdNWt+/+ZOugW6dqtvqhtqZM1q0u9pJkNwIrqgFD
-ZHcfNaf31G6Z2YE+Io7woTVw6fFobg/EFo+a/qwbvWL26McmiRL5yiSBjVjpX4a5
-kdZ+aPQUCBaLrTWwlCDqzSVIULWUQvveRWbToMFKPNID58NtEpymAx3Pgir7YjV9
-UnlU2l5vZrh1PTCqZxvC/IdRESUfW80LdHaeyizRUP+6vKxGgSz2MRuYINjbd6GO
-hGiCpWlwziW2xLV1l2qSRLko2kIafLZP18N0ThM9zKbU5ps9NgFOf//wqSGtLaE=
+ggEBALkvRWdbx9GwxePkh0nnpht4MrPW5NkZBORqfhFi7PFbQ7Rwgl39hm9iAmci
+pOWZGSJi7AaqLuSID0UEeRdG/fNFawI5XIoxP+TmdKdrk/SaTJQKKJiZ9B8+EG0z
+hV8/v6jrlwj0gq9eBBAmOInnmQiEYE4gKFNvh9xdP//gi+otBf30gmtJ4AxXOTu/
+M+XEigXelmIvy57b+B+qnonTFcGkXhSr+JfCA1l6ta7OtknQtItpV0FDr/d8hA+6
+Bn25ZSisd00GC3CUMX1tM5V8cQE6GO/W2mnpUFVvWycYx9wDyU7rlyNUf8nWeoIW
+3d3s/6KAppa07KrkLiTantIrqMUCAwEAAaNTMFEwHQYDVR0OBBYEFPSsP2VFSGom
+8CDuF8ETP9mocLMeMB8GA1UdIwQYMBaAFPSsP2VFSGom8CDuF8ETP9mocLMeMA8G
+A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ1VynTevPnNtwevQpUa
+zlur64N+Dx/yF4gvd4byjO+JouMJLaJqV2dwnqgAahg6YKasVtv4xX9MVJR2IjIb
+Tfa0nYQxM5clwk3J78nh82Ncb2RNeYJyNmSdocnOkmTSoOGUFOxtRz1vmKUcrfwl
+yENO/qGe/sYmOv0IWJjeGQ2OZPblRumV4dJy3qTHFmOLpYwA0BGiIV5uj5Ou7QU1
+R5PY2pnJg4RXeaq95Pr50lkO9vpRyFUJHjR+P+J05M9FbjLPOQIFkpMYx/GyBg5n
+P+omyagOGW8bXfBTtUYu+rP/k+BC5AxI3Kdv/AD5vyHKi/JXhP3ycb8AYx5ENHoK
+qjA=
 -----END CERTIFICATE-----
diff --git a/tests/standalone_2/io/certificates/server_key.p12 b/tests/standalone_2/io/certificates/server_key.p12
index 204d42d..c95c46b 100644
--- a/tests/standalone_2/io/certificates/server_key.p12
+++ b/tests/standalone_2/io/certificates/server_key.p12
Binary files differ
diff --git a/tests/standalone_2/io/certificates/server_key.pem b/tests/standalone_2/io/certificates/server_key.pem
index 895b7d2..7598e59 100644
--- a/tests/standalone_2/io/certificates/server_key.pem
+++ b/tests/standalone_2/io/certificates/server_key.pem
@@ -1,29 +1,29 @@
 -----BEGIN ENCRYPTED PRIVATE KEY-----
-MIIE4zAcBgoqhkiG9w0BDAEBMA4ECBMCjlg8JYZ4AgIIAASCBMFd9cBoZ5xcTock
-AVQcg/HzYJtMceKn1gtMDdC7mmXuyN0shoxhG4BpQInHkFARL+nenesXFxEm4X5e
-L603Pcgw72/ratxVpTW7hPMjiLTEBqza0GjQm7Sarbdy+Vzdp/6XFrAcPfFl1juY
-oyYzbozPsvFHz3Re44y1KmI4HAzU/qkjJUbNTTiPPVI2cDP6iYN2XXxBb1wwp8jR
-iqdZqFG7lU/wvPEbD7BVPpmJBHWNG681zb4ea5Zn4hW8UaxpiIBiaH0/IWc2SVZd
-RliAFo3NEsGxCcsnBo/n00oudGbOJxdOp7FbH5hJpeqX2WhCyJRxIeHOWmeuMAet
-03HFriiEmJ99m2nEJN1x0A3QUUM7ji6vZAb4qb1dyq7LlX4M2aaqixRnaTcQkapf
-DOxX35DEBXSKrDpyWp6Rx4wNpUyi1TKyhaVnYgD3Gn0VfC/2w86gSFlrf9PMYGM0
-PvFxTDzTyjOuPBRa728gZOGXgDOL7qvdInU/opVew7kFeRQHXxHzFCLK5dD+Vrig
-5fS3m0++f55ODkxqHXB8gbXbd3GMmsW6MrGpU7VsCNtbVPdSMW0FalovEB0M+2lj
-1VfuvL+0F5huTe+BgZAt6xgET/CIcZXdNMRPVhraqUjqWtI9Rdk4STPCpU1rDkjG
-YDl/fo4W2T6qQWFUpiC9IvVVGkVxaqfZZ4Qu+V5xPUi6vk95QiTNkN1t+m+sCCgS
-Llkea8Um0aHMy33Lj3NsfL0LMrnpniqcAks8BvcgIZwk1VRqcj7BQVCygJSYrmAR
-DBhMpjWlXuSggnyVPuduZDtnTN+8lCHLOKL3a3bDb6ySaKX49Km6GutDLfpDtEA0
-3mQvmEG4XVm7zy+AlN72qFbtSLDRi/D/uQh2q/ZrFQLOBQBQB56TvEbKouLimUDM
-ascQA3aUyhOE7e+d02NOFIFTozwc/C//CIFeA+ZEwxyfha/3Bor6Jez7PC/eHNxZ
-w7YMXzPW9NhcCcerhYGebuCJxLwzqJ+IGdukjKsGV2ytWDoB2xZiJNu096j4RKcq
-YSJoen0R7IH8N4eDujXR8m9kAl724Uqs1OoAs4VNICvzTutbsgVZ6Z+NMOcfnPw9
-jZkFhot16w8znD+OmhBR7/bzOLpaeUhk7EhNq5M6U0NNWx3WwkDlvU/jx+6/EQe3
-iLEHptH2HYBF1xscaKGbtKNtuQsfdzgWpOX0qK2YbK3yCKvL/xIm1DQmDZDKkWdW
-VNh8oGV1H96CivWlvxhAgXKz9F/83CjMw8YXRk7RJvWR4vtNvXFAvGkFIYCN9Jv9
-p+1ukaYoxSLGBik907I6gWSHqumJiCprUyAX/bVfZfNiYh4hzeA3lhwxZSax3JG4
-7QFPvyepOmF/3AAzS/Pusx6jOZnuCMCkfQi6Wpem1o3s4x+fP7kz00Xuj01ErucM
-S10ixfIh84kXBN3dTRDtDdeCyoMsBKO0W5jDBBlWL02YfdF6Opo1Q4cPh2DYgXMh
-XEszNZSK5LB0y+f3A6Kdx/hkZzHVvMONA70OyrkoZzGyWENhcB0c7ntTJyPPD2qM
-s0HRA2VwF/0ypU3OKERM1Ua5NSkTgvnnVTlV9GO90Tkn5v4fxdl8NzIuJLyGguTP
-Xc0tRM34Lg==
+MIIE4zAcBgoqhkiG9w0BDAEBMA4ECDmmTgwIo/3yAgIIAASCBMHPUDfzHGi72H4W
+nKLepeD31Upra9tvQx6UrRQaBmf0frh5Coo4Yw3Z+IOZQ4ZwxoIv0/kty7FvXVDU
+BMdFqFeVvKKlsMm7Ub0hC5ks7A0mTVqcc9nW/aBL87W4nZsJ3LSLiPYXptBWOGRh
+kVghEsySowsK8OmYDwauLi5ZoZC/3cwy2YIaOC9/J8sbnzAq3EVEpJwI0GIQgYET
+aGGELjpariWrcPUa16dRU5vrBlFL2Sn3BVJU24DFq/8RJwsL2rpWXxg9x5QxoraW
+WPvxIGvanBphthRABjZ4A8mtQwvkKfdqMuJ7bWAA2YqcZnk7N5zh4XmARKvjlM5K
+ujpjRFu4+NjyQ65vqTfAwQptxj9l/nzaSZqV5K8ROlpa+UODNzLsL/gf4l/22zZ+
+/rnyko97NQ0Jhy/m0xPhXd620IWjmsjNZk+txYWx4K0srBTptRTqKWkQuY7DV/N0
+4xEA0y3T1kLXZmGmvoidB8VwWD7ZC4/fhuFKAKQmEccMsR9AUsI0h4bAjJ419AK2
+G1jsirQS5P1vBweddwbzCtztUNuCCFy9LHmJCLE/yJ2JMmnePi7eOiyvsjU4es6b
+yj9/ekbWQwZO5L15UkY9T/pP8kSR+gAvn/92DB+e2U4R+ZK886unDyLCCp0rGsPK
+ijdcwMkAJampirw3iO5FkXbGO4GoVggNUxTTCDnYenY8jcKePlP0YM7A9XZ+kmmS
+1gcNuNikKmfzusvUuvOX4Dt24gCOGa5dDEOeYHsC7SZT40IFogshZyVdKNzlyIxj
+yqIlr9LOGo7vL84aUYUUF2mRJ9n2+ivqRadQ9s59iH96uYjvZ12KztCjHEPVSVHk
++rwd4WJ5ByBV7MeB8370JtwN/ZfzAIB7ONfXP9rrfcP19VC+MpsIuOCYPJERlhBT
+9w/UuThPhM/cXp9YiDJepa0T2vmCRKHSz932WKGe3dZn+0saKa5ShdMSepp9CroE
+ot2aF+uU9rMh+DIeNVLmHFwa5+3UC18G6rIB9wpZCHmg6LyMDf/OwW2/yao/GKXN
+WayHbex+Z4yXrVUo+5m9rFwFgo2Hl8fVdSJhKmvp9HQKQjEgxUhUC9B46ErS5efM
+SPlMOYfWST5eOG55vr04dWI5t2AXAKWAxxowO1OBhj3J0FjCS/vtUkUiFohc91oV
+b11afVtizPQJOJ9D1xNEADemnJq6KNT1pRaeKOA94JKODwBMi4K3KmEN51l1uJZ8
+U5h1CjweXZjmq81Da2LMLtGgJuTUuAT6LWIXLSck7EX35D1mY4lGHcuMqVCQ1St1
+UvRjRFx3rd6aBEgj7M/FNsUAIlq4X6+58wdh3mx31608CYGyQ8p5kPhj26ZxziJj
+WSFW+YiVrLPBXhIn6Q9DIqvMPdTbLM/fDy9G0ZinhHZH+a41t7v+UZh2FtiT+p52
+n+hiHTbkGQgQ8SYZT0WAjiaS+1pVVvv+MRqpsYpnNPYxI5bp6orSFOudF3pdAbqQ
+f4WDOY0kGg2tPmaNpZSz+FPuuiWC7Y0J1+o3fMnrUMvY4XrUwkstFfROdnM0W9YG
+I1MsVM4NhcKPHcVxKWgsmL5yAVl92mz88rhgbsArhcpO5K4lxE1LB/giUZRdTkRP
+bKFBVqrcpg==
 -----END ENCRYPTED PRIVATE KEY-----
diff --git a/tests/standalone_2/io/certificates/server_trusted.pem b/tests/standalone_2/io/certificates/server_trusted.pem
index b943cf9..c6c2cc3 100644
--- a/tests/standalone_2/io/certificates/server_trusted.pem
+++ b/tests/standalone_2/io/certificates/server_trusted.pem
@@ -1,57 +1,58 @@
 -----BEGIN CERTIFICATE-----
 MIIDLjCCAhagAwIBAgIBAjANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1yb290
-YXV0aG9yaXR5MB4XDTE1MTAyNzEwMjYzNVoXDTI1MTAyNDEwMjYzNVowIDEeMBwG
+YXV0aG9yaXR5MB4XDTE4MDQyMzIwMTYzM1oXDTI4MDQyMDIwMTYzM1owIDEeMBwG
 A1UEAwwVaW50ZXJtZWRpYXRlYXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA6GndRFiXk+2q+Ig7ZOWKKGta+is8137qyXz+eVFs5sA0ajMN
-ZBAMWS0TIXw/Yks+y6fEcV/tfv91k1eUN4YXPcoxTdDF97d2hO9wxumeYOMnQeDy
-VZVDKQBZ+jFMeI+VkNpMEdmsLErpZDGob/1dC8tLEuR6RuRR8X6IDGMPOCMw1jLK
-V1bQjPtzqKadTscfjLuKxuLgspJdTrzsu6hdcl1mm8K6CjTY2HNXWxs1yYmwfuQ2
-Z4/8sOMNqFqLjN+ChD7pksTMq7IosqGiJzi2bpd5f44ek/k822Y0ATncJHk4h1Z+
-kZBnW6kgcLna1gDri9heRwSZ+M8T8nlHgIMZIQIDAQABo3sweTASBgNVHRMBAf8E
-CDAGAQH/AgEAMB0GA1UdDgQWBBS98L4T5RaIToE3DkBRsoeWPil0eDAfBgNVHSME
-GDAWgBRxD5DQHTmtpDFKDOiMf5FAi6vfbzAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0l
-BAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQELBQADggEBAD+4KpUeV5mUPw5IG/7w
-eOXnUpeS96XFGuS1JuFo/TbgntPWSPyo+rD4GrPIkUXyoHaMCDd2UBEjyGbBIKlB
-NZA3RJOAEp7DTkLNK4RFn/OEcLwG0J5brL7kaLRO4vwvItVIdZ2XIqzypRQTc0MG
-MmF08zycnSlaN01ryM67AsMhwdHqVa+uXQPo8R8sdFGnZ33yywTYD73FeImXilQ2
-rDnFUVqmrW1fjl0Fi4rV5XI0EQiPrzKvRtmF8ZqjGATPOsRd64cwQX6V+P5hNeIR
-9pba6td7AbNGausHfacRYMyoGJWWWkFPd+7jWOCPqW7Fk1tmBgdB8GzXa3inWIRM
-RUE=
+AQ8AMIIBCgKCAQEAsSFr3/sYhGFF7gEZSn7Am8ATtPhTo5ypQqSAv/4Uy+k4zvT3
+b3OZyYpzr5Wsa6NXcEKwNipyR1GBpYwaYI/W4DSi+COdH4DQSZDQFr+hvmXRazzj
+VSsOxF6veGLcza53meLPRb4o4yVoZARd6xR5i3OUD4kezvOjpmlFT3OKNU0Di+Vq
+qeS14/at6Vt6G0rS8CluafD7Z0/5zp6vrImKwC6OWzlmmcAqBGsE/BTzrAxLdt4K
+uw3Xs3uvS3YZIAC536C1Mop1n4FBUGxeUMWH+I/llzK9ol1pmQHJrxfOD5WdFuuE
+iFfpiOmBdUfDBbEPllmIvzUBFOo5VhxVmq8EHQIDAQABo3sweTASBgNVHRMBAf8E
+CDAGAQH/AgEAMB0GA1UdDgQWBBQqU7R8m4wyfyc9ubiPQcYpHNZrmDAfBgNVHSME
+GDAWgBT0rD9lRUhqJvAg7hfBEz/ZqHCzHjAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0l
+BAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQELBQADggEBAGjRSFvVeIrRF3iuA5vr
+SgufTCNzAyEz7+pDKflzHSQXF1fdItiOdPGv1i57gIr7HaYuxvBiEklhmnWreYye
+Tn6ghfhEHhdZHBpihDXuIvLizhtR/lg9CDZrHjuY6nukyx4JnWwUBR3TulPK5gJu
+jB9YISY8tjXrvVNqdi0a+G0T4HHnVs3v6Nd/Qdsxfp4maAB1U3HFmR3DXKTxDtBK
+mNNMqf9PpX4lw4o6UieiEwOMd+4REhmwLNTwhWrhVg5q6GKQl873Ge/7J2nXvgkH
+nUbEsncLsArqqrz201f2m32A6pinwY/j85vEeRkHwlsU0jOvVnHzAlggP0u/kFAF
+EjE=
 -----END CERTIFICATE-----
 -----BEGIN CERTIFICATE-----
-MIIC+zCCAeOgAwIBAgIBATANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1yb290
-YXV0aG9yaXR5MB4XDTE1MTAyNzEwMjYzNFoXDTI1MTAyNDEwMjYzNFowGDEWMBQG
+MIIC/jCCAeagAwIBAgIBATANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1yb290
+YXV0aG9yaXR5MB4XDTE4MDQyMzIwMTYzM1oXDTI4MDQyMDIwMTYzM1owGDEWMBQG
 A1UEAwwNcm9vdGF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAMl+dcraUM/E7E6zl7+7hK9oUJYXJLnfiMtP/TRFVbH4+2aEN8vXzPbzKdR3
-FfaHczXQTwnTCaYA4u4uSDvSOsFFEfxEwYORsdKmQEM8nGpVX2NVvKsMcGIhh8kh
-ZwJfkMIOcAxmGIHGdMhF8VghonJ8uGiuqktxdfpARq0g3fqIjDHsF9/LpfshUfk9
-wsRyTF0yr90U/dsfnE+u8l7GvVl8j2Zegp0sagAGtLaNv7tP17AibqEGg2yDBrBN
-9r9ihe4CqMjx+Q2kQ2S9Gz2V2ReO/n6vm2VQxsPRB/lV/9jh7cUcS0/9mggLYrDy
-cq1v7rLLQrWuxMz1E3gOhyCYJ38CAwEAAaNQME4wHQYDVR0OBBYEFHEPkNAdOa2k
-MUoM6Ix/kUCLq99vMB8GA1UdIwQYMBaAFHEPkNAdOa2kMUoM6Ix/kUCLq99vMAwG
-A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBABrhjnWC6b+z9Kw73C/niOwo
-9sPdufjS6tb0sCwDjt3mjvE4NdNWt+/+ZOugW6dqtvqhtqZM1q0u9pJkNwIrqgFD
-ZHcfNaf31G6Z2YE+Io7woTVw6fFobg/EFo+a/qwbvWL26McmiRL5yiSBjVjpX4a5
-kdZ+aPQUCBaLrTWwlCDqzSVIULWUQvveRWbToMFKPNID58NtEpymAx3Pgir7YjV9
-UnlU2l5vZrh1PTCqZxvC/IdRESUfW80LdHaeyizRUP+6vKxGgSz2MRuYINjbd6GO
-hGiCpWlwziW2xLV1l2qSRLko2kIafLZP18N0ThM9zKbU5ps9NgFOf//wqSGtLaE=
+ggEBALkvRWdbx9GwxePkh0nnpht4MrPW5NkZBORqfhFi7PFbQ7Rwgl39hm9iAmci
+pOWZGSJi7AaqLuSID0UEeRdG/fNFawI5XIoxP+TmdKdrk/SaTJQKKJiZ9B8+EG0z
+hV8/v6jrlwj0gq9eBBAmOInnmQiEYE4gKFNvh9xdP//gi+otBf30gmtJ4AxXOTu/
+M+XEigXelmIvy57b+B+qnonTFcGkXhSr+JfCA1l6ta7OtknQtItpV0FDr/d8hA+6
+Bn25ZSisd00GC3CUMX1tM5V8cQE6GO/W2mnpUFVvWycYx9wDyU7rlyNUf8nWeoIW
+3d3s/6KAppa07KrkLiTantIrqMUCAwEAAaNTMFEwHQYDVR0OBBYEFPSsP2VFSGom
+8CDuF8ETP9mocLMeMB8GA1UdIwQYMBaAFPSsP2VFSGom8CDuF8ETP9mocLMeMA8G
+A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ1VynTevPnNtwevQpUa
+zlur64N+Dx/yF4gvd4byjO+JouMJLaJqV2dwnqgAahg6YKasVtv4xX9MVJR2IjIb
+Tfa0nYQxM5clwk3J78nh82Ncb2RNeYJyNmSdocnOkmTSoOGUFOxtRz1vmKUcrfwl
+yENO/qGe/sYmOv0IWJjeGQ2OZPblRumV4dJy3qTHFmOLpYwA0BGiIV5uj5Ou7QU1
+R5PY2pnJg4RXeaq95Pr50lkO9vpRyFUJHjR+P+J05M9FbjLPOQIFkpMYx/GyBg5n
+P+omyagOGW8bXfBTtUYu+rP/k+BC5AxI3Kdv/AD5vyHKi/JXhP3ycb8AYx5ENHoK
+qjA=
 -----END CERTIFICATE-----
 -----BEGIN CERTIFICATE-----
-MIIDKjCCAhKgAwIBAgIBATANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDEw9jbGll
-bnRhdXRob3JpdHkwHhcNMTUxMDI3MTAyNjM1WhcNMjUxMDI0MTAyNjM1WjAaMRgw
-FgYDVQQDEw9jbGllbnRhdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQCi6wJAs6nppNmTZ3e/wE9l0pAmkMtDONwB9o115XXTG3rmSKfZOxa8
-TFjSn818Pr1OYb9fPdI1Y6x4WY9PELUtQyEBlNcKjwg96vhrP4p2DhqbWsI5nASH
-DSjJsM75bQ7D7qHYzriuAl0Fk1C4LcodRj+5wmErMtvGJG0x06qFbxCCMAJ2kC+h
-SneTN955/YHSXADgxjFlt3s1T0QPnqrr+G7Ro6PrVKLPBulglq7wAeTwrGkPRUt0
-3lDGOSi6i97NbpiXwrGp5XiLUtVCiID6Ro0xKWH4sjJ4JnVjIUG8CQWERc6sFDJM
-4adgFQJagkTUoxWtDGL58+WcbcJa73XJAgMBAAGjezB5MBIGA1UdEwEB/wQIMAYB
-Af8CAQAwHQYDVR0OBBYEFLciwbnjKDIu026K0bzOwp8DokkOMB8GA1UdIwQYMBaA
-FLciwbnjKDIu026K0bzOwp8DokkOMA4GA1UdDwEB/wQEAwICBDATBgNVHSUEDDAK
-BggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAh8rryWFoGjFdm0i4FLRktF8B
-aUqVCCpFVHIYlFcsQstznIb01X2Zq5nfSfrFxbr5STVGzGJ0HGDuFpicT8+qMnJX
-dou5AuaqubIDWeKL+oAgvI71Nt1gsesixqzFQAoCTRgUjrSGpY2fL7rElV0Ndy9b
-YepVouktP1/GULc8XbIG9ZLx70Id7YTyrITDgbH3hSnbjmmZSr9RKyKas4MXN0s8
-oKGHEgAx7KyNQRppjydz3bDeH/jVbM4W98vwL6rjKUJlOlo0Ru+3+oioFHqLMSvN
-w4f5rQEiuF260h7y8KKxRxQ8rw188gsBapZr4Rcp+y8gdQvlzJONtv3d1dap5A==
+MIIDKjCCAhKgAwIBAgIBATANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA9jbGll
+bnRhdXRob3JpdHkwHhcNMTgwNDIzMjAxNjM0WhcNMjgwNDIwMjAxNjM0WjAaMRgw
+FgYDVQQDDA9jbGllbnRhdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDckwmIcOYIRbH1jcuBCC/y1a4aiqXhvUCty59Cdqzlx0gbrhkVGmf0
+B0Tmo/PW4p9rcl0hwwxGvGoCvsxVpodHQmIxYwwn1sRl2C7Yo2ZHPMYbv9uq+D0d
+kS8SxHb5l4HvpcT7WoqUq8ZWEm0Losbp8cOcrvLiBQgo8xIOKQzKbwrXydnviQKL
+E5iBmUswzHwb7ZK84u6dS3iHbl9iPy+QTfiboT6BNMsO/dm6Nqmdj35fOPQgFUN/
+QR3NsPWL9GtzB9iZc3D7c30FqqqQO/THjaLJIyzdFdF3Fsp+omSuZw/q1d4/R8M3
+FRCcqzbWLA9Dy12kK/9asmlpf/fdHByVAgMBAAGjezB5MBIGA1UdEwEB/wQIMAYB
+Af8CAQAwHQYDVR0OBBYEFPk5T6DExD59hh1A7g+PTZvoqr8MMB8GA1UdIwQYMBaA
+FPk5T6DExD59hh1A7g+PTZvoqr8MMA4GA1UdDwEB/wQEAwICBDATBgNVHSUEDDAK
+BggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAh4f1I0kXK88S3yC8k0zRAp4n
+RyyjnPW9Sr2nIuC27RgfH0lxWGOlAVVrFUlgifECD/RSoMuQk5yYgAJiALbnfdlP
+AutjtwClWZ6u1BXnwdUxS+ypWtq4Fb4+vz/VRSK24ZNcrI9NF3wkqKHxnjccxROA
+BratiMbHi5VxU63iec2XqAEhqi+ArWks8XJyTvv/tBYOqmmP4Fi0i/wbpzxmFJ61
+ZGUiHFifkYHKBI/HhjDazdeAhAwcFHSbVInea10+V0dkW7sOGnJFW5PyW1F/TBBe
+3dsp8Tz88+oHbSGwV7qF/Qf6U6kRxeVVctmSSCAohUbPH26xhPhk+t1TVdb3EA==
 -----END CERTIFICATE-----
diff --git a/tests/standalone_2/io/certificates/trusted_certs.p12 b/tests/standalone_2/io/certificates/trusted_certs.p12
index 76c76ec..f45af0a 100644
--- a/tests/standalone_2/io/certificates/trusted_certs.p12
+++ b/tests/standalone_2/io/certificates/trusted_certs.p12
Binary files differ
diff --git a/tests/standalone_2/io/certificates/trusted_certs.pem b/tests/standalone_2/io/certificates/trusted_certs.pem
index 8b5bf3e..dd8edb4 100644
--- a/tests/standalone_2/io/certificates/trusted_certs.pem
+++ b/tests/standalone_2/io/certificates/trusted_certs.pem
@@ -1,18 +1,19 @@
 -----BEGIN CERTIFICATE-----
-MIIC+zCCAeOgAwIBAgIBATANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1yb290
-YXV0aG9yaXR5MB4XDTE1MTAyNzEwMjYzNFoXDTI1MTAyNDEwMjYzNFowGDEWMBQG
+MIIC/jCCAeagAwIBAgIBATANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1yb290
+YXV0aG9yaXR5MB4XDTE4MDQyMzIwMTYzM1oXDTI4MDQyMDIwMTYzM1owGDEWMBQG
 A1UEAwwNcm9vdGF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAMl+dcraUM/E7E6zl7+7hK9oUJYXJLnfiMtP/TRFVbH4+2aEN8vXzPbzKdR3
-FfaHczXQTwnTCaYA4u4uSDvSOsFFEfxEwYORsdKmQEM8nGpVX2NVvKsMcGIhh8kh
-ZwJfkMIOcAxmGIHGdMhF8VghonJ8uGiuqktxdfpARq0g3fqIjDHsF9/LpfshUfk9
-wsRyTF0yr90U/dsfnE+u8l7GvVl8j2Zegp0sagAGtLaNv7tP17AibqEGg2yDBrBN
-9r9ihe4CqMjx+Q2kQ2S9Gz2V2ReO/n6vm2VQxsPRB/lV/9jh7cUcS0/9mggLYrDy
-cq1v7rLLQrWuxMz1E3gOhyCYJ38CAwEAAaNQME4wHQYDVR0OBBYEFHEPkNAdOa2k
-MUoM6Ix/kUCLq99vMB8GA1UdIwQYMBaAFHEPkNAdOa2kMUoM6Ix/kUCLq99vMAwG
-A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBABrhjnWC6b+z9Kw73C/niOwo
-9sPdufjS6tb0sCwDjt3mjvE4NdNWt+/+ZOugW6dqtvqhtqZM1q0u9pJkNwIrqgFD
-ZHcfNaf31G6Z2YE+Io7woTVw6fFobg/EFo+a/qwbvWL26McmiRL5yiSBjVjpX4a5
-kdZ+aPQUCBaLrTWwlCDqzSVIULWUQvveRWbToMFKPNID58NtEpymAx3Pgir7YjV9
-UnlU2l5vZrh1PTCqZxvC/IdRESUfW80LdHaeyizRUP+6vKxGgSz2MRuYINjbd6GO
-hGiCpWlwziW2xLV1l2qSRLko2kIafLZP18N0ThM9zKbU5ps9NgFOf//wqSGtLaE=
+ggEBALkvRWdbx9GwxePkh0nnpht4MrPW5NkZBORqfhFi7PFbQ7Rwgl39hm9iAmci
+pOWZGSJi7AaqLuSID0UEeRdG/fNFawI5XIoxP+TmdKdrk/SaTJQKKJiZ9B8+EG0z
+hV8/v6jrlwj0gq9eBBAmOInnmQiEYE4gKFNvh9xdP//gi+otBf30gmtJ4AxXOTu/
+M+XEigXelmIvy57b+B+qnonTFcGkXhSr+JfCA1l6ta7OtknQtItpV0FDr/d8hA+6
+Bn25ZSisd00GC3CUMX1tM5V8cQE6GO/W2mnpUFVvWycYx9wDyU7rlyNUf8nWeoIW
+3d3s/6KAppa07KrkLiTantIrqMUCAwEAAaNTMFEwHQYDVR0OBBYEFPSsP2VFSGom
+8CDuF8ETP9mocLMeMB8GA1UdIwQYMBaAFPSsP2VFSGom8CDuF8ETP9mocLMeMA8G
+A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ1VynTevPnNtwevQpUa
+zlur64N+Dx/yF4gvd4byjO+JouMJLaJqV2dwnqgAahg6YKasVtv4xX9MVJR2IjIb
+Tfa0nYQxM5clwk3J78nh82Ncb2RNeYJyNmSdocnOkmTSoOGUFOxtRz1vmKUcrfwl
+yENO/qGe/sYmOv0IWJjeGQ2OZPblRumV4dJy3qTHFmOLpYwA0BGiIV5uj5Ou7QU1
+R5PY2pnJg4RXeaq95Pr50lkO9vpRyFUJHjR+P+J05M9FbjLPOQIFkpMYx/GyBg5n
+P+omyagOGW8bXfBTtUYu+rP/k+BC5AxI3Kdv/AD5vyHKi/JXhP3ycb8AYx5ENHoK
+qjA=
 -----END CERTIFICATE-----
diff --git a/tests/standalone_2/io/certificates/untrusted_server_chain.pem b/tests/standalone_2/io/certificates/untrusted_server_chain.pem
index ff6e568..4845069 100644
--- a/tests/standalone_2/io/certificates/untrusted_server_chain.pem
+++ b/tests/standalone_2/io/certificates/untrusted_server_chain.pem
@@ -1,59 +1,60 @@
 -----BEGIN CERTIFICATE-----
 MIIDZDCCAkygAwIBAgIBATANBgkqhkiG9w0BAQsFADAgMR4wHAYDVQQDDBVpbnRl
-cm1lZGlhdGVhdXRob3JpdHkwHhcNMTUxMDE5MTE1NTEyWhcNMjUxMDE2MTE1NTEy
+cm1lZGlhdGVhdXRob3JpdHkwHhcNMTgwNDIzMTcxNTEzWhcNMjgwNDIwMTcxNTEz
 WjAUMRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQDca2l3VIWhnlTqazrA07hiHjgXACUYS/nVox+a2Jar383kBz2kzN6B
-u4K7IwD2msym2IOBp1YT9OKPh9/KkSGvpPelu7ToCoehala32W+0ozh53CR8IpzQ
-tmh7J9oHtN2PcbLgEzHfAWyrY3xp9RpWUONjxoG8xXPedNsZL0Rj65Z3fKAjOypl
-+XJsgrqrNNAi3x0OMdhextMmLrYl+YQjgdND8UpykTSc8Q0vwngDZuLH/Nhx0cAA
-Ade0ZfXS6snwWVxrWke+zGF6yANoiV00gsBhq+WZZ50SmE2mz5LT9uj4t5WpcOI/
-2TlbV9HSjdOEAFD8cJIrK5FkEmz383E1AgMBAAGjgbQwgbEwPAYDVR0RBDUwM4IJ
+ggEKAoIBAQDO+XxT1pAvzkIWvAZJFGEjuIuXz1kNoCDxBHAilptAOCX5sKyLaWTc
+YvzYpDf0LOwU3T/ZtlSinkX2xCY7EXgsGJEFc1RDmhmPmSsY9Az/ewS1TNrTOkD5
+VGUwnRKpl3o+140A/aNYGQfHJRz0+BCLftv7b95HinLDq26d01eTHLOozfGqkcfA
+LfUauiwXRV817ceLiliGUtgW8DDNTVqtHA2aeKVisZZtyeEMc3BsnJDGmU6kcQ4B
+KeLHaaxCufy4bMlObwSLcdlp7R6MTudzKVEjXVz/WRLz7yZYaYDrcacUvsI8v+jX
+B7quGGkLGJH+GxDGMObFWKsAB229c9ZlAgMBAAGjgbQwgbEwPAYDVR0RBDUwM4IJ
 bG9jYWxob3N0ggkxMjcuMC4wLjGCAzo6MYcEfwAAAYcQAAAAAAAAAAAAAAAAAAAA
-ATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQO+6Atr6tkTBmPasN4oTDUlbxQ1zAf
-BgNVHSMEGDAWgBRrkK4hOni2neySWQNmMfb9imn/+DAOBgNVHQ8BAf8EBAMCA6gw
-EwYDVR0lBAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQELBQADggEBACdVUzrhfXoW
-wG0zI9aT6CxD7T0i0WK4fC6Yrx0Pqz53xnuiwBfvuAJ/PRXKYsJMxa2LuHGJKU/A
-nImCXGJHoUwL6x4Eor6fg7L9nPNqtIrQ6tzubxNtVPpLj4tK6Ps3IM+FICYUSX0b
-FLSfnv74afUp/2+0OHsoUVsL1rCTO2WgEkEShLERdJvdcvUSTWHfC5IQORS9vfzG
-+cZGOOPebfm8TY2DJxMYj/t7CHs1Sk550x590sKb/prwtJAYtQxGe7v0m9rihiM3
-dFKZiNh99yXbQ1ELYyhkFP8WAdK8ZTnynGqgAYJmV89Dg8k2uU8z+dahlE3foORD
-Y/Gn0CZE1NY=
+ATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBR6zQbX0GnDCsjksKYXlzovO2yplDAf
+BgNVHSMEGDAWgBSkX16pB/ZB0hzdYIUgMhWO89CxZzAOBgNVHQ8BAf8EBAMCA6gw
+EwYDVR0lBAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQELBQADggEBAIDPqZllHvJa
+XSpqOFaT7oFzKbBnV8lLMvYnbDWHL8N+23q+y803GGNRMkDJG98OalqqKMskk4/v
+ek6dhkTHKnB7hunhogIICXCcHOJGaHN67vvkxkP5mTx6AMaPT+q6NXzu2y9YBTkr
+BIw6ZUyPxqIcH4/GezVe+pokvNZHghDePBChALXEmQLBuJy+gM55w4nB5eq8pNnP
+1r9vVhlr4jqiVNd95MglwB4xLQV5SeG8gGwGvad0vvIpHljOwT9TmlofeqqGpPLf
+3LtqrBK5qdxWcn0jDxG/Qe2EfsdmzsCQ+imu5rTc1YMCGZD52mnnq4tZj0hroWLn
+Wys+JpPMdKo=
 -----END CERTIFICATE-----
 -----BEGIN CERTIFICATE-----
-MIIDLjCCAhagAwIBAgIBATANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1yb290
-YXV0aG9yaXR5MB4XDTE1MTAxOTExNTUxMloXDTI1MTAxNjExNTUxMlowIDEeMBwG
+MIIDLjCCAhagAwIBAgIBAjANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1yb290
+YXV0aG9yaXR5MB4XDTE4MDQyMzE3MTUxMloXDTI4MDQyMDE3MTUxMlowIDEeMBwG
 A1UEAwwVaW50ZXJtZWRpYXRlYXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA1OV9iea75DPQ18NppXxEFW26J7IfjUvp4wVnj9m7pOhsByqd
-wwS6hpjlkpEwCyugKD/t7u/VGwp2BB+BeaX7FPj6rnYY82bOJQlyB/vvDmOZfAe2
-84ug9O7QcsQHSQ7YQFuvYKaeYCKdrGjzQPVYkoVdv2js2dYTDG3QSIxpbi305Vef
-ia6Zfs5CAW/SfL36+ETo2pXNlD1ZBGRL8H3z+mMnIEj1Tbaipf+1Npr2l3xqIs1k
-RWsM3X+9xMkWGyvsDdbLIGiTTVxM9kOF0aNLdQIKb2tZsg4jRrFIgiO+5TXwp0FW
-4ldc5/GhtaoPDcsIALyIQc7CJ/PpPm9hnxIy7QIDAQABo3sweTASBgNVHRMBAf8E
-CDAGAQH/AgEAMB0GA1UdDgQWBBRrkK4hOni2neySWQNmMfb9imn/+DAfBgNVHSME
-GDAWgBRpz+jRK9iGqijrL/4WCsGsIjxoETAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0l
-BAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQELBQADggEBACcwiLJUPzYGIeGIYGlo
-XlP4++adiPlXvsyTxLdGVSFWJMBV5EhtiXQXaUsOs2PyC7SWxiiUdAgE8Y2tMsF3
-Bh5LY/kKxZQXZuFa+RN1kPlhlYJWdiPyqcBziSPFBtqwudWLDUVSaVAQDhYYVB3K
-5+pFaeQKfhYmPvJKR9U2nTvukOhN1fZM8GUBnm2uaiA3giQ0wxXyQIuqC9S52qbh
-x4D4ZdbshQAgThPkHBoZVmd/NF1TNzitZZy7uaU7GpGrS1dcevN7pEUwm3+KIkIT
-AOSLB2FbFOwPUg6a/lWkFPotT3gl0tdyCaqkfneGCHzVciT0JTS/AqpdYEtuxEMe
-PJk=
+AQ8AMIIBCgKCAQEAvpFatw9XMWQDbKzWtsA5NfjQsddw5wlDpFeRYghyqo/mgWru
+Rapcz6tEpEodc3SZ/4PCwE1PmYZuxhcYnaDCM3YdmJAMPUhqi+YO+Gc7WNTbrOR0
+aJGzS2HEPxjbC4OsFG7TVuKMH1uI4rWOZxBn4rODkTmiH7epuyu65nzUJemct8GV
+OcPChjPVKvXzbHVtk8UVreD/DVyuYwsBMSAuYWiq2pgAAQV/7TKVDAQ8yRVW28J7
++QrNXqV+I6MZeMho45xgLNQmi5os9vqTuEu3oGyLFWxXz6uJ2MOFOFTjxMhHGcGn
+aICAA9BIcCeaWWRN9nZkvQuS2nysvJwBu/LROQIDAQABo3sweTASBgNVHRMBAf8E
+CDAGAQH/AgEAMB0GA1UdDgQWBBSkX16pB/ZB0hzdYIUgMhWO89CxZzAfBgNVHSME
+GDAWgBR9W+i1d5oZtiZAEjI9RDLd9SnUnDAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0l
+BAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQELBQADggEBAIdIh5sIk9Qi2KZfzJUQ
+/DmMTv6NZzAGROJGA+o6jfrMh/plzBre7QM2vzw6iHxFokepLnsXtgrqdtr1lluO
+R6apN2QLp5AJeT8gZfn0V35Wz2iYn+fJR77Map3u57IOj08gvk/BZmJxxqMT/qH/
+1H5qpd934aFLSgqsmpGOVIzrdwHVmwOKU9SDNxOILVpvgtjQ/KWEUxftKtU7Z/dd
+WGN56Vu3Ul0gzgCFifj8mnHnHpug/wEHLl0l2hk3BD1AUrCyCK4yalvsDV7vFex7
+8+Whuh4OijTP/yomn8VGPN5lMmGT4XN8Z3h97PUHF9yF4FYGJJ/lilIhxctashk+
+HuE=
 -----END CERTIFICATE-----
 -----BEGIN CERTIFICATE-----
-MIIC+zCCAeOgAwIBAgIBATANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1yb290
-YXV0aG9yaXR5MB4XDTE1MTAxOTExNTUxMloXDTI1MTAxNjExNTUxMlowGDEWMBQG
+MIIC/jCCAeagAwIBAgIBATANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1yb290
+YXV0aG9yaXR5MB4XDTE4MDQyMzE3MTUxMloXDTI4MDQyMDE3MTUxMlowGDEWMBQG
 A1UEAwwNcm9vdGF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAMDzkcftGzdNJz5vXEAZSCAO2J6bCPz896pK3qtaViR/aF8I2vHZQm0IEoJc
-Y1NUMF3F50d6fMYCkEoORAkC0d7iAwTprhBdIg35+TxwGObcStrohDtEgwFmFRzg
-LtYeXiU0t0dBWOOQ9k2f9VGqbzKwZ2dbhOHSTXMTFoEcMStbeFc++oiOLY+QSq/J
-Xd/BXqvwVM3Mt+OwLvyUu45Kw18ENo77qubIPJUwoyaf+N2nFRqcc7bmNy0Wvk2Q
-StvQXy6DpN3KOoZx/sR7Ff8hYuHXcxbSsJ1hOO+tIJyOZyEJvU2BBOYVlKr4E4JU
-mkex0CM1IfIFqfcEkbvjwLjaojsCAwEAAaNQME4wHQYDVR0OBBYEFGnP6NEr2Iaq
-KOsv/hYKwawiPGgRMB8GA1UdIwQYMBaAFGnP6NEr2IaqKOsv/hYKwawiPGgRMAwG
-A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJKl4RCEaXwtosNeurZlS3b9
-owXdsXDRdnfEawcc//AbRkrS4bHCQyOJNp/3DibEKkeAXCJrJ5cvXRjE5gb3Q+rl
-0AqziLY15xuMAxUK3zv0e8Zir21PQzQ9x8zbmlucEoT/jn7KvMSSqfEoer77cXev
-BpmQDQzE3FNgKohmHIzIDoTPiU3ahv6x8IhJ1e47UmRsSPFgtqglHcdCYIEclXpY
-bHvctT6+pFZuJfIs9+BATMXPJWSX7NhlMcnyP+xdDxDKuF/nwVFy6xA+njuWnnZT
-TyiGCnx+u/VpKzOrwMfzv2DW8Db80UERoox5n6QNQLnXNWPMddUL92/p9lMzWJY=
+ggEBAMuTL5lztughNg/G/9Ge8c6EmROymW0zGTN6hRp3rG2SkpJdag08ntKAmny3
+ilpnlEoxGOk1L9jq/lJsCsiqsSETCadkLsXFNeKOG+S48nc8ThOrmJe5WV6NDNmn
+qaQeek5rjvuRSdukhyZVLzmIyTYNErwkMuo+Jk1V7IS1X2pFyTfF+SLlYrOuDQIW
+qXYfWqdMSYpI8s3onIwR/qVapGu55D0CECzNyX6ZBnqYK0cGzmRaZToT84VPsJwB
+DmALQw9WNNn1CHAIt17CwsdSSasgaKz/XDDjwgKL7CI6bFttDIWVLBt8ikrsrjZN
+6L5b8PZx/dHwJJ7QjYOMKKSUjyECAwEAAaNTMFEwHQYDVR0OBBYEFH1b6LV3mhm2
+JkASMj1EMt31KdScMB8GA1UdIwQYMBaAFH1b6LV3mhm2JkASMj1EMt31KdScMA8G
+A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJTJx9nh+fTJ6a0aIzPY
+FUX5tg+MdUxsAG5QA2jrwZIKCSrHa/ka0vjwLO+94EWcWgKdNDu8lt2FPnJh0nzN
+Ad/CaQNSMesihlmGOgxvLgd3ndYDVYjsCrXx3ESoRavgAWXY+/p69KR1ibVLpKF/
+yr/YURqT9SLKAlgrZt5I/syzxhWdAND62oxqiDCMzPoVR2cLswIUDNRvq5nRiCIt
+1TLPDINjG1EdmwzV2jyPxphL8esopopVm/d9wgD0xQ2Ocb2Nj6Jduuli0sm+dVBL
+3t2pldRq0hXZt/9qhu38tF41TlKSpCz2oFyx2D6ObLSX0MeFp6zXM0c1lGqSCDIM
+ubk=
 -----END CERTIFICATE-----
diff --git a/tests/standalone_2/io/certificates/untrusted_server_key.pem b/tests/standalone_2/io/certificates/untrusted_server_key.pem
index 29a9e32..b281bb3 100644
--- a/tests/standalone_2/io/certificates/untrusted_server_key.pem
+++ b/tests/standalone_2/io/certificates/untrusted_server_key.pem
@@ -1,29 +1,29 @@
 -----BEGIN ENCRYPTED PRIVATE KEY-----
-MIIE5TAcBgoqhkiG9w0BDAEBMA4ECKAry4fwmB/TAgIIAASCBMNsKbVVvIs/l6/N
-/1J9WXSiA1gnRTd2n58GJUV6mkiaRUMiWu3fK+V7iHpIi7KeLeD+JGsDeqxw0bB5
-lmS/RJy0wNBP0PL0oiI8VUe3wxTUU2b5wW9fomeOTGWOIUL5VZXHkTCf5KMcFWMY
-GMnDpIN/f/m9zvz/3FogxIZlIAxG7gKKrfEcKExIShAJ5wYDbDSFZWfNcjMODGPn
-xz3W04aRsJGf3KlOQvSuNtcBpsuwXuAXezzuFETM20xrWW3iJIsO5UmqJ1OJcdet
-A+k5k0K+1/WwLkceWJYSd19O+7LNULsZhKUJ515ZSO1TJGgfd5DznkgRXYUx5ucS
-tvJLYvShGbaYulsVKn8q2nkIxnQCov3my1hIRk/qCKb+uOvRD9dIkjSlNubqaRb6
-geEOfTh1g5PCeKPlSTkVueLQqWxKMye4eWYqUxExkUNuGJ0d2ndBGJRo6bulnc7I
-kt44DzEufV5OLvyTufimpohqRm3Yzq87DWSSThCKOGkhfGutn8B7cJR8ZPrG2euT
-J7Bv4EuFjhpKDieqDi8yoXgIkWSgyzFNMsewV4lxFNP/wbvoKPFrKsU4ny6jRfzy
-WTjMN1UOTBvsyZbVvjLII79cBKLqlowHAZQ7YwuxtbjeB9FRH+ZwkzYeyn4GNHdf
-QoVwOMKAiOMjzAK9qdW7isVXy/7v9EXaZplRmwMRhCZevC9zeY2Rueahq8qpHpH1
-GPjrew5elPkBRQhxX6IiL7kI7upE65UI5hnnTnrdrZkRmMYOFEZLyLbTU4wMCxui
-4BmEiGp6qCWe3UND1b8YhG+gsRYzHK5oEJV+Ck7m+e9iU3/axggUfAhZeBmdlgqd
-bUajlzcgbtfaSgZ08XXU1YPw0aLlmJGzb+oWMFwBJHAUYpOV2uqDHiXZZt4SoAF9
-gJQaXvqMGzY8JyP5ZQauljVtPGcopA+jbix3Rbwf97lLqJHSpWoHpcCa6FrfaMqG
-dx8oQsO67WN0gm5DIN3kB2jHOj9Nf7kr3HGjyC5tPq8s1+aT6baZcHWzVfyVr10c
-9X13Pz5XzEa1oiaO7JDPkzb9T7aPJZwskATNB8h6tWfqdGyUY5eURtsCnVrtG/1p
-pAXyY/0vAksfDPjMChKLKxZ7rBbscoNzr2f7Vw4CTnIpaxA4eLEx6UdpG4/5RzYJ
-0YuR+SzCkuNti7uZGi9DCGkZkYl6VndatW+Pk/+JVBexdKt6MsER6aVsS8ev9UbW
-JG+2C8bjMlfKy21644KwYOtZbVcE9jwlsz8w+e6YbOzBvbwiPmoCi0xcMxRJPa2y
-cKMrs2hSKmhUP6uIH0b0qNcHEPA32mVzGC0MToC5R+yb6OdyvoEsisqS7tEAMfTJ
-0yowcZr2lPehaMr4efSB8JY6DuofitfgI6X6bmiIPQ9v//djxhkxkRAbpTRGmFZx
-1YIKDa72S8jUxHWlVvmoqTWI8T+jltF2pYBctS6IMKEot/CcBCHb5l1zfMyo5a0x
-73ooh5tq+vRWJGaLRMj66VVSWGQoJmfAGwWpjBpTLa0UQoHO0/J1IbfjFOj5HV3J
-bscmoGWhVwuJM5ActB0MOvXGQe9mf2X4p/1Rp+yBuipH1SJzFEzbOZ3kE50Z6aXH
-CoJJOKkcuf43
+MIIE5TAcBgoqhkiG9w0BDAEBMA4ECI8YmURjepD4AgIIAASCBMMwp7gfo4FvSVuR
+5w7+OcjkXNQmvrwTRFDaMWV3ORgVFMQx02Q325SnoQsmulB+dk19uj2Piel5j/+j
+xHLvC0rBQC8BjHg/uLmN/f9yW6qolDthmeJEad/L8slB7rziilOGmlPh7H1voJgr
+94uoTn6L2tE9GfoPDsksedRtGIlgSOM3UmLvCkCMcZBqrDi4uqzbhrW3bIbqdoeo
+1lbNsvFuNzF+P3cBHyUUZpPGwCZ8M/XCsCAB+9eH7TM2FJnbuffA6BfkanpQR0ul
+PLo5KDjcS5lQ4YUkI2+lYMSZMiIf50Y8eHP0QnDAuYunA2cPLd90rPpdBCgNtQqk
+aUI7FHvtLFZsTJ1s8EPnZhZOZq1LYUTFQuimMWz+nvC0oQy925brwyjfnrm44KS7
+xpJqsYMBHYflDCwE4LbxjFSeneOy4wwNMurupSdcLCm02Sm1wUMrzRrNsAy3jxP6
+TfJjHRBSt3XEDwDG3olQoK/Ewa1qP0JhAZOd7SrKw9eLQltH+djy0iDUblf5uIHj
+pDC+T1pY9tTwSVxhsJI5a0qxXYNgdaxhr0Fv8BbdScd8Tzdw7g4AByjvgCKArlNJ
+alR1ZaJP/JYuzb3VH8uXEO4b6Tjqw9O4tkZGrc8He5HTAOnSZKbclDxyRH8hkDy+
+apIJUjbE3Gc1mCbyo2nc6WDrGfQNrXDWAVIz4/lb8e8P5k1Rex4rVNhb/VA0Vh4m
+T2BSQ3pvZtKTFedvWgIFIk85rVaYyuB7Icb0YLs2cPppMCfbv+6bOMkJ4hVk5tbX
+AGk6FOjgqsQSY/gzDo9ReCJooETP2AmvHEi2b7LKs+M0Pw+CfvKD/dOkQp62WMpt
+vZJVSXIQ2bHarbhxmUxcT//G+i3QBgkM2xTRvARfRMBiCoBh0Ta3gd4/GJDwv8pr
+pkJi3Q6u88NfGG0eyYyHz+kqTtptqJj1hbAFPdt6d6sFL/wpwhK/L5MOECQ3m100
+N3/aGT7yizM0w/m6PSycSbXycRafRF3XNMBXsUWeFpSWxpJV9GH+T3z8k46GrsM6
+c3YrLG6nvmersDI2AuS9KuhIQQvp+sgwjt3HeURsDv3X4edgCILRTjv3nVuU+DGD
+Xd8CuPYmRei4eJ4nkzxY6fM7ticuArnyE+INVtA0T8yL4UbRxQV/f9jOZWJ1LXLr
+caxCOZP9YcDVG9JUK4WGUC3LVWfhJW+i51cLJk9iGZ8qDLSvgJhj+/7Ajsg6/4xO
+IPon0DVMD9jgMSWLdfpCPawyY+VLVH2CXB2z83c2818gAs85QGUlsW+xLkELSTIU
+6p+mtTF5B2IhsjEdMDAWOpAp/Gj/U9OKapTyE1sGxn66jG/UvxcgYqZo3JGjNaDE
+rMnBhOH4VQQ+FxCA6lXKYCcU1UEze5BuCzJCA7gmCceMlMe+1Car2F+nJCuLNtzB
+uJhlXDbIVhMb5cZBBd3LSjmuRZ/gWbMvV3UqoCROBXqLzVGTufpcn/MgYQKYYHkp
+I+vKDypj0a4IPovDdxg8aMKNn59mtvmMDyrt0716H9DP4SCU/nuxVSeT/HywRBo/
+53fxqtdH3hTAUXqcOLzHnvLUENiABKMeJOtGTV9MFCxgGsnzgYNXnB9hDhm84+IX
+JQdMjj+BNFE6
 -----END ENCRYPTED PRIVATE KEY-----
diff --git a/tests/standalone/io/create_sample_certificates.sh b/tests/standalone_2/io/create_sample_certificates.sh
similarity index 87%
rename from tests/standalone/io/create_sample_certificates.sh
rename to tests/standalone_2/io/create_sample_certificates.sh
index cabe747..c2060c1 100755
--- a/tests/standalone/io/create_sample_certificates.sh
+++ b/tests/standalone_2/io/create_sample_certificates.sh
@@ -43,6 +43,9 @@
 openssl req -subj /CN=localhost -batch -verbose -passout $password -new \
     -keyout localhost_key.pem -out localhost_request.pem
 
+openssl req -subj /CN=badlocalhost -batch -verbose -passout $password -new \
+    -keyout badlocalhost_key.pem -out badlocalhost_request.pem
+
 # Sign the server certificate with the intermediate authority.  Add the
 # certificate extensions for SubjectAltName and that it is not a CA itself.
 openssl x509 -req -in localhost_request.pem -out localhost.pem -set_serial 1 \
@@ -50,6 +53,11 @@
     -passin $password -extfile ../sample_certificate_v3_extensions \
     -extensions localhost -days 3650
 
+openssl x509 -req -in badlocalhost_request.pem -out badlocalhost.pem -set_serial 1 \
+    -CA intermediate_authority.pem -CAkey intermediate_authority_key.pem \
+    -passin $password -extfile ../sample_certificate_v3_extensions \
+    -extensions badlocalhost -days 3650
+
 # Create a self-signed client certificate authority.
 openssl req -subj /CN=clientauthority -set_serial 1 -batch -verbose \
     -passout $password -new -x509 -keyout client_authority_key.pem \
@@ -72,30 +80,35 @@
     -passin $password -extfile ../sample_certificate_v3_extensions \
     -extensions client_certificate -days 3650
 
-# Delete all the signing keys for the authorities, so testers that add
-# them as trusted are less vulnerable: only the sample server certificate
-# and client certificates will be signed by them. No more certificates
-# will ever be signed.
-rm root_authority_key.pem
-rm intermediate_authority.pem
-rm client_authority_key.pem
-
 # Copy the certificates we will use to the 'certificates' directory.
 CERTS=../certificates
 cat localhost.pem intermediate_authority.pem root_authority.pem \
     > $CERTS/server_chain.pem
 
+cat badlocalhost.pem intermediate_authority.pem root_authority.pem \
+    > $CERTS/bad_server_chain.pem
+
 cat intermediate_authority.pem root_authority.pem client_authority.pem \
     > $CERTS/server_trusted.pem
 
 # BoringSSL only accepts private keys signed with the PBE-SHA1-RC4-128 cipher.
 openssl pkcs8 -in localhost_key.pem -out $CERTS/server_key.pem \
     -topk8 -v1 PBE-SHA1-RC4-128 -passin $password -passout $password
+openssl pkcs8 -in badlocalhost_key.pem -out $CERTS/bad_server_key.pem \
+    -topk8 -v1 PBE-SHA1-RC4-128 -passin $password -passout $password
 openssl pkcs8 -in client1_key.pem -out $CERTS/client1_key.pem \
     -topk8 -v1 PBE-SHA1-RC4-128 -passin $password -passout $password
 openssl pkcs8 -in client2_key.pem -out $CERTS/client2_key.pem \
     -topk8 -v1 PBE-SHA1-RC4-128 -passin $password -passout $password
 
+# Delete all the signing keys for the authorities, so testers that add
+# them as trusted are less vulnerable: only the sample server certificate
+# and client certificates will be signed by them. No more certificates
+# will ever be signed.
+rm root_authority_key.pem
+rm intermediate_authority.pem
+rm client_authority_key.pem
+
 cp root_authority.pem $CERTS/trusted_certs.pem
 cp client_authority.pem $CERTS
 cp client1.pem $CERTS
diff --git a/tests/standalone_2/io/http_server_test.dart b/tests/standalone_2/io/http_server_test.dart
index fa3b1ea7..1a9829d 100644
--- a/tests/standalone_2/io/http_server_test.dart
+++ b/tests/standalone_2/io/http_server_test.dart
@@ -137,13 +137,13 @@
 
 void testHttpServerZone() {
   asyncStart();
-  Expect.equals(Zone.ROOT, Zone.current);
+  Expect.equals(Zone.root, Zone.current);
   runZoned(() {
-    Expect.notEquals(Zone.ROOT, Zone.current);
+    Expect.notEquals(Zone.root, Zone.current);
     HttpServer.bind("127.0.0.1", 0).then((server) {
-      Expect.notEquals(Zone.ROOT, Zone.current);
+      Expect.notEquals(Zone.root, Zone.current);
       server.listen((request) {
-        Expect.notEquals(Zone.ROOT, Zone.current);
+        Expect.notEquals(Zone.root, Zone.current);
         request.response.close();
         server.close();
       });
@@ -158,15 +158,15 @@
 
 void testHttpServerZoneError() {
   asyncStart();
-  Expect.equals(Zone.ROOT, Zone.current);
+  Expect.equals(Zone.root, Zone.current);
   runZoned(() {
-    Expect.notEquals(Zone.ROOT, Zone.current);
+    Expect.notEquals(Zone.root, Zone.current);
     HttpServer.bind("127.0.0.1", 0).then((server) {
-      Expect.notEquals(Zone.ROOT, Zone.current);
+      Expect.notEquals(Zone.root, Zone.current);
       server.listen((request) {
-        Expect.notEquals(Zone.ROOT, Zone.current);
+        Expect.notEquals(Zone.root, Zone.current);
         request.listen((_) {}, onError: (error) {
-          Expect.notEquals(Zone.ROOT, Zone.current);
+          Expect.notEquals(Zone.root, Zone.current);
           server.close();
           throw error;
         });
diff --git a/tests/standalone/io/sample_certificate_v3_extensions b/tests/standalone_2/io/sample_certificate_v3_extensions
similarity index 85%
rename from tests/standalone/io/sample_certificate_v3_extensions
rename to tests/standalone_2/io/sample_certificate_v3_extensions
index f9e741e..f17764d 100644
--- a/tests/standalone/io/sample_certificate_v3_extensions
+++ b/tests/standalone_2/io/sample_certificate_v3_extensions
@@ -25,6 +25,13 @@
 IP.1 = 127.0.0.1
 IP.2 = ::1
 
+[badlocalhost]
+basicConstraints = critical,CA:false
+subjectKeyIdentifier = hash
+authorityKeyIdentifier=keyid,issuer
+keyUsage=critical, digitalSignature, keyEncipherment, keyAgreement
+extendedKeyUsage=serverAuth
+
 [intermediate_authority]
 basicConstraints = critical, CA:true, pathlen:0
 subjectKeyIdentifier=hash
diff --git a/tests/standalone_2/io/secure_bad_certificate_test.dart b/tests/standalone_2/io/secure_bad_certificate_test.dart
index 60a2623..e002313 100644
--- a/tests/standalone_2/io/secure_bad_certificate_test.dart
+++ b/tests/standalone_2/io/secure_bad_certificate_test.dart
@@ -4,6 +4,8 @@
 
 // OtherResources=certificates/server_chain.pem
 // OtherResources=certificates/server_key.pem
+// OtherResources=certificates/bad_server_chain.pem
+// OtherResources=certificates/bad_server_key.pem
 // OtherResources=certificates/trusted_certs.pem
 
 // This test verifies that the bad certificate callback works.
@@ -22,6 +24,11 @@
   ..usePrivateKey(localFile('certificates/server_key.pem'),
       password: 'dartdart');
 
+SecurityContext badServerContext = new SecurityContext()
+  ..useCertificateChain(localFile('certificates/bad_server_chain.pem'))
+  ..usePrivateKey(localFile('certificates/bad_server_key.pem'),
+      password: 'dartdart');
+
 class CustomException {}
 
 main() async {
@@ -35,6 +42,15 @@
     if (e is! HandshakeException) throw e;
   });
 
+  var badServer = await SecureServerSocket.bind(HOST_NAME, 0, badServerContext);
+  badServer.listen((SecureSocket socket) {
+    socket.listen((_) {}, onDone: () {
+      socket.close();
+    });
+  }, onError: (e) {
+    if (e is! HandshakeException) throw e;
+  });
+
   SecurityContext goodContext = new SecurityContext()
     ..setTrustedCertificates(localFile('certificates/trusted_certs.pem'));
   SecurityContext badContext = new SecurityContext();
@@ -52,14 +68,18 @@
   await runClient(server.port, defaultContext, false, 'fail');
   await runClient(server.port, defaultContext, 'fisk', 'fail');
   await runClient(server.port, defaultContext, 'exception', 'throw');
+
+  await runClient(badServer.port, goodContext, false, 'fail');
+
   server.close();
+  badServer.close();
 }
 
 Future runClient(
     int port, SecurityContext context, callbackReturns, result) async {
   bool badCertificateCallback(X509Certificate certificate) {
-    Expect.isTrue(certificate.subject.contains('rootauthority'));
-    Expect.isTrue(certificate.issuer.contains('rootauthority'));
+    Expect.isNotNull(certificate.subject);
+    Expect.isNotNull(certificate.issuer);
     // Throw exception if one is requested.
     if (callbackReturns == 'exception') throw new CustomException();
     if (callbackReturns is bool) return callbackReturns;
diff --git a/tools/VERSION b/tools/VERSION
index 4229ed2..5c6fbcc 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 0
 PATCH 0
-PRERELEASE 49
+PRERELEASE 50
 PRERELEASE_PATCH 0
diff --git a/tools/apps/update_homebrew/lib/update_homebrew.dart b/tools/apps/update_homebrew/lib/update_homebrew.dart
index 477ddb0..0d2fcbb 100644
--- a/tools/apps/update_homebrew/lib/update_homebrew.dart
+++ b/tools/apps/update_homebrew/lib/update_homebrew.dart
@@ -185,10 +185,6 @@
   def caveats; <<~EOS
     Please note the path to the Dart SDK:
       #{opt_libexec}
-
-    --with-dartium:
-      To use with IntelliJ, set the Dartium execute home to:
-        #{opt_prefix}/Chromium.app
     EOS
   end
 
