diff --git a/.packages b/.packages
index d559cca..1f0b101 100644
--- a/.packages
+++ b/.packages
@@ -45,6 +45,7 @@
 http:third_party/pkg/http/lib
 http_multi_server:third_party/pkg/http_multi_server/lib
 http_parser:third_party/pkg/http_parser/lib
+http_retry:third_party/pkg/http_retry/lib
 http_throttle:third_party/pkg/http_throttle/lib
 intl:third_party/pkg/intl/lib
 isolate:third_party/pkg/isolate/lib
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9941193..4a385e7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -122,59 +122,93 @@
     }
     ```
 
-* Pub
+#### Pub
 
-  * Git dependencies may now include a `path` parameter, indicating that the
-    package exists in a subdirectory of the Git repository. For example:
+##### SDK Constraints
 
-    ```yaml
-    dependencies:
-      foobar:
-        git:
-          url: git://github.com/dart-lang/multi_package_repo
-          path: pkg/foobar
-    ```
+There is now a default SDK constraint of `<2.0.0` for any package with no
+existing upper bound. This allows us to move more safely to 2.0.0. All new
+packages published on pub will now require an upper bound SDK constraint so
+future major releases of Dart don't destabilize the package ecosystem.
 
-  * `pub get` and `pub upgrade` properly produce an error message and exit code
-    when no network is present.
+All SDK constraint exclusive upper bounds are now treated as though they allow
+pre-release versions of that upper bound. For example, the SDK constraint
+`>=1.8.0 <2.0.0` now allows pre-release SDK versions such as `2.0.0-beta.3.0`.
+This allows early adopters to try out packages that don't explicitly declare
+support for the new version yet. You can disable this functionality by setting
+the `PUB_ALLOW_PRERELEASE_SDK` environment variable to `false`.
 
-  * `pub serve` now waits for file watcher events to stabilize before scheduling
-     new builds. This helps specifically with `safe-write` features in editors,
-     as well as other situations such as `save all` which cause many fast edits.
+##### Other Features
 
-  * Added the `--build-delay` argument to `pub serve` which sets the amount of
-    time (in ms) to wait between file watcher events before scheduling a build.
-    Defaults to 50.
+* Git dependencies may now include a `path` parameter, indicating that the
+  package exists in a subdirectory of the Git repository. For example:
 
-  * Removed require.js module loading timeout for dartdevc, which resolves an
-    issue where the initial load of an app might give a timeout error.
+  ```yaml
+  dependencies:
+    foobar:
+      git:
+        url: git://github.com/dart-lang/multi_package_repo
+        path: pkg/foobar
+  ```
 
-  * There is now a default SDK constraint of `<2.0.0` for any package with
-    no existing upper bound. This allows us to move more safely to 2.0.0.
+* Added an `--executables` option to `pub deps` command. This will list all
+  available executables that can be run with `pub run`.
 
-  * All new packages published on pub will now require an upper bound SDK
-    constraint so future major releases of Dart don't destabilize the package
-    ecosystem.
+* Added a `PUB_MAX_WORKERS_PER_TASK` environment variable which can be set to
+  configure the number of dartdevc/analyzer workers that are used when compiling
+  with `--web-compiler=dartdevc`.
 
-  * When on a pre-release SDK build, all upper bounds matching exactly the
-    current SDK version but with no pre-release or build modifier will be
-    upgraded to be <= the current SDK version. This allows early adopters to
-    try out packages that don't explicitly declare support yet. You can disable
-    this functionality by setting the PUB_ALLOW_PRERELEASE_SDK system
-    environment variable to `false`.
+* Pub will now automatically retry HTTP requests that fail with a 502, 503, of
+  504 error code ([issue 1556][pub#1556]).
 
-  * Added `--executables` option to `pub deps` command. This will list all
-    available executables that can be run with `pub run`.
+* Emit exit code 66 when a path dependency doesn't exist ([issue 1747][pub#1747]).
 
-  * Fixed https://github.com/dart-lang/pub/issues/1684 so root package analysis
-    options are not enforced for dependencies when compiling with dartdevc.
+[pub#1556]: https://github.com/dart-lang/pub/issues/1556
+[pub#1747]: https://github.com/dart-lang/pub/issues/1747
 
-  * Fixed https://github.com/dart-lang/sdk/issues/30246 so you can include dart
-    scripts from subdirectories with dartdevc.
+##### Bug Fixes
 
-  * Added a PUB_MAX_WORKERS_PER_TASK system environment variable which can be
-    set to configure the number of dartdevc/analyzer workers that are used
-    when compiling with --web-compiler=dartdevc.
+* Added a `--build-delay` argument to `pub serve` which sets the amount of time
+  (in ms) to wait between file watcher events before scheduling a build.
+  Defaults to 50.
+
+* `pub get` and `pub upgrade` properly produce an error message and exit code
+  when no network is present.
+
+* `pub serve` now waits for file watcher events to stabilize before scheduling
+   new builds. This helps specifically with `safe-write` features in editors,
+   as well as other situations such as `save all` which cause many fast edits.
+
+* Removed the require.js module loading timeout for dartdevc, which resolves an
+  issue where the initial load of an app might give a timeout error.
+
+* Root package analysis options are no longer enforced for dependencies when
+  compiling with dartdevc ([issue 1684][pub#1684]).
+
+* Dart scripts can be included from subdirectories with dartdevc
+  ([issue 30246][]).
+
+* The `barback` infrastructure now supports `async` 2.0.0.
+
+* Print a more informative error message when the Flutter SDK isn't
+  available ([issue 1719][pub#1719]).
+
+* Don't crash when publishing a package that contains an empty submodule
+  ([issue 1679][pub#1679]).
+
+* Emit exit code 69 for TLS errors ([issue 1729][pub#1729]).
+
+* Fix `pub global run` for packages activated from a local path that also have
+  relative path dependencies ([issue 1751][pub#1751]).
+
+[pub#1684]: https://github.com/dart-lang/pub/issues/1684
+[pub#1719]: https://github.com/dart-lang/pub/issues/1719
+[pub#1679]: https://github.com/dart-lang/pub/issues/1679
+[pub#1729]: https://github.com/dart-lang/pub/issues/1729
+[pub#1751]: https://github.com/dart-lang/pub/issues/1751
+[issue 30246]: https://github.com/dart-lang/sdk/issues/30246
+
+#### Other Tools
 
 * dartfmt
 
diff --git a/DEPS b/DEPS
index 642a59a..6f4f5f2 100644
--- a/DEPS
+++ b/DEPS
@@ -84,6 +84,7 @@
   "html_tag" : "@0.13.2",
   "http_multi_server_tag" : "@2.0.4",
   "http_parser_tag" : "@3.1.1",
+  "http_retry_tag": "@0.1.0",
   "http_tag" : "@0.11.3+14",
   "http_throttle_tag" : "@1.0.1",
   "idl_parser_rev": "@7fbe68cab90c38147dee4f48c30ad0d496c17915",
@@ -107,13 +108,13 @@
   "ply_rev": "@604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_tag": "@1.3.3",
   "protobuf_tag": "@0.5.4",
-  "pub_rev": "@cde958f157d3662bf968bcbed05580d5c0355e89",
+  "pub_rev": "@667281eef93b4be648cceca400e954e000edba38",
   "pub_semver_tag": "@1.3.2",
   "quiver_tag": "@0.25.0",
   "resource_rev":"@af5a5bf65511943398146cf146e466e5f0b95cb9",
   "root_certificates_rev": "@a4c7c6f23a664a37bc1b6f15a819e3f2a292791a",
   "scheduled_test_tag": "@0.12.11+1",
-  "shelf_static_tag": "@0.2.5",
+  "shelf_static_rev": "@3558aa35a0d2f0f35868c3fd64b258e140db0122",
   "shelf_packages_handler_tag": "@1.0.3",
   "shelf_tag": "@0.7.1",
   "shelf_web_socket_tag": "@0.2.2",
@@ -227,6 +228,9 @@
       Var("http_multi_server_tag"),
   Var("dart_root") + "/third_party/pkg/http_parser":
       Var("github_mirror") + "http_parser.git" + Var("http_parser_tag"),
+  Var("dart_root") + "/third_party/pkg/http_retry":
+      Var("github_mirror") + "http_retry.git" +
+      Var("http_retry_tag"),
   Var("dart_root") + "/third_party/pkg/http_throttle":
       Var("github_mirror") + "http_throttle.git" +
       Var("http_throttle_tag"),
@@ -289,7 +293,7 @@
       Var("github_mirror") + "shelf_packages_handler.git"
       + Var("shelf_packages_handler_tag"),
   Var("dart_root") + "/third_party/pkg/shelf_static":
-      Var("github_mirror") + "shelf_static.git" + Var("shelf_static_tag"),
+      Var("github_mirror") + "shelf_static.git" + Var("shelf_static_rev"),
   Var("dart_root") + "/third_party/pkg/shelf_web_socket":
       Var("github_mirror") + "shelf_web_socket.git" +
       Var("shelf_web_socket_tag"),
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 2df2b21..bd4e9c9 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -387,6 +387,7 @@
 
     contextManager = new ContextManagerImpl(
         resourceProvider,
+        fileContentOverlay,
         sdkManager,
         packageResolverProvider,
         packageMapProvider,
@@ -442,7 +443,8 @@
         '**/*.${AnalysisEngine.SUFFIX_HTML}',
         '**/*.${AnalysisEngine.SUFFIX_HTM}',
         '**/${AnalysisEngine.ANALYSIS_OPTIONS_FILE}',
-        '**/${AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE}'
+        '**/${AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE}',
+        '**/${AnalysisEngine.PUBSPEC_YAML_FILE}'
       ];
       for (String pattern in patterns) {
         try {
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index 8892823..9fca4c5 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -21,6 +21,7 @@
 import 'package:analyzer/source/sdk_ext.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/generated/engine.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
@@ -28,10 +29,12 @@
 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/pubspec/pubspec_validator.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;
 import 'package:analyzer_plugin/utilities/analyzer_converter.dart';
 import 'package:package_config/packages.dart';
 import 'package:package_config/packages_file.dart' as pkgfile show parse;
@@ -432,6 +435,11 @@
   final ResourceProvider resourceProvider;
 
   /**
+   * The file content overlay.
+   */
+  final FileContentOverlay fileContentOverlay;
+
+  /**
    * The manager used to access the SDK that should be associated with a
    * particular context.
    */
@@ -522,6 +530,7 @@
 
   ContextManagerImpl(
       this.resourceProvider,
+      this.fileContentOverlay,
       this.sdkManager,
       this.packageResolverProvider,
       this._packageMapProvider,
@@ -885,19 +894,54 @@
    * options file at the given [path].
    */
   void _analyzeAnalysisOptionsFile(AnalysisDriver driver, String path) {
-    String content = driver.fsState.getFileForPath(path).content;
-    List<AnalysisError> errors =
-        GenerateOptionsErrorsTask.analyzeAnalysisOptions(
-            resourceProvider.getFile(path).createSource(),
-            content,
-            driver.sourceFactory);
-    AnalyzerConverter converter = new AnalyzerConverter();
-    LineInfo lineInfo = _computeLineInfo(content);
+    List<protocol.AnalysisError> convertedErrors;
+    try {
+      String content = _readFile(path);
+      LineInfo lineInfo = _computeLineInfo(content);
+      List<AnalysisError> errors =
+          GenerateOptionsErrorsTask.analyzeAnalysisOptions(
+              resourceProvider.getFile(path).createSource(),
+              content,
+              driver.sourceFactory);
+      AnalyzerConverter converter = new AnalyzerConverter();
+      convertedErrors = converter.convertAnalysisErrors(errors,
+          lineInfo: lineInfo, options: driver.analysisOptions);
+    } catch (exception) {
+      // If the file cannot be analyzed, fall through to clear any previous
+      // errors.
+    }
     callbacks.notificationManager.recordAnalysisErrors(
         NotificationManager.serverId,
         path,
-        converter.convertAnalysisErrors(errors,
-            lineInfo: lineInfo, options: driver.analysisOptions));
+        convertedErrors ?? <protocol.AnalysisError>[]);
+  }
+
+  /**
+   * Use the given analysis [driver] to analyze the content of the pubspec file
+   * at the given [path].
+   */
+  void _analyzePubspecFile(AnalysisDriver driver, String path) {
+    List<protocol.AnalysisError> convertedErrors;
+    try {
+      String content = _readFile(path);
+      YamlNode node = loadYamlNode(content);
+      if (node is YamlMap) {
+        PubspecValidator validator = new PubspecValidator(
+            resourceProvider, resourceProvider.getFile(path).createSource());
+        LineInfo lineInfo = _computeLineInfo(content);
+        List<AnalysisError> errors = validator.validate(node.nodes);
+        AnalyzerConverter converter = new AnalyzerConverter();
+        convertedErrors = converter.convertAnalysisErrors(errors,
+            lineInfo: lineInfo, options: driver.analysisOptions);
+      }
+    } catch (exception) {
+      // If the file cannot be analyzed, fall through to clear any previous
+      // errors.
+    }
+    callbacks.notificationManager.recordAnalysisErrors(
+        NotificationManager.serverId,
+        path,
+        convertedErrors ?? <protocol.AnalysisError>[]);
   }
 
   void _checkForAnalysisOptionsUpdate(
@@ -941,6 +985,20 @@
     }
   }
 
+  void _checkForPubspecUpdate(
+      String path, ContextInfo info, ChangeType changeType) {
+    if (_isPubspec(path)) {
+      AnalysisDriver driver = info.analysisDriver;
+      if (driver == null) {
+        // I suspect that this happens as a result of a race condition: server
+        // has determined that the file (at [path]) is in a context, but hasn't
+        // yet created a driver for that context.
+        return;
+      }
+      _analyzePubspecFile(driver, path);
+    }
+  }
+
   /**
    * Compute the set of files that are being flushed, this is defined as
    * the set of sources in the removed context (context.sources), that are
@@ -1107,6 +1165,10 @@
     if (optionsFile != null) {
       _analyzeAnalysisOptionsFile(info.analysisDriver, optionsFile.path);
     }
+    File pubspecFile = folder.getChildAssumingFile(PUBSPEC_NAME);
+    if (pubspecFile.exists) {
+      _analyzePubspecFile(info.analysisDriver, pubspecFile.path);
+    }
     return info;
   }
 
@@ -1425,6 +1487,7 @@
     }
     _checkForPackagespecUpdate(path, info, info.folder);
     _checkForAnalysisOptionsUpdate(path, info, type);
+    _checkForPubspecUpdate(path, info, type);
   }
 
   /**
@@ -1515,6 +1578,15 @@
     }
   }
 
+  /**
+   * Read the contents of the file at the given [path], or throw an exception if
+   * the contents cannot be read.
+   */
+  String _readFile(String path) {
+    return fileContentOverlay[path] ??
+        resourceProvider.getFile(path).readAsStringSync();
+  }
+
   Packages _readPackagespec(File specFile) {
     try {
       String contents = specFile.readAsStringSync();
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
index 4667311..2e80f58 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
@@ -48,6 +48,12 @@
       : this.request = request,
         this.entity = request.target.entity;
 
+  Token get droppedToken => request.target.droppedToken;
+
+  bool isEmptyBody(FunctionBody body) =>
+      body is EmptyFunctionBody ||
+      (body is BlockFunctionBody && body.beginToken.isSynthetic);
+
   @override
   visitArgumentList(ArgumentList node) {
     if (request is DartCompletionRequestImpl) {
@@ -150,7 +156,7 @@
       _addClassBodyKeywords();
       int index = node.members.indexOf(entity);
       ClassMember previous = index > 0 ? node.members[index - 1] : null;
-      if (previous is MethodDeclaration && previous.body is EmptyFunctionBody) {
+      if (previous is MethodDeclaration && isEmptyBody(previous.body)) {
         _addSuggestion(Keyword.ASYNC);
         _addSuggestion2(ASYNC_STAR);
         _addSuggestion2(SYNC_STAR);
@@ -202,7 +208,7 @@
     if (entity == null || entity is Declaration) {
       if (previousMember is FunctionDeclaration &&
           previousMember.functionExpression is FunctionExpression &&
-          previousMember.functionExpression.body is EmptyFunctionBody) {
+          isEmptyBody(previousMember.functionExpression.body)) {
         _addSuggestion(Keyword.ASYNC, DART_RELEVANCE_HIGH);
         _addSuggestion2(ASYNC_STAR, relevance: DART_RELEVANCE_HIGH);
         _addSuggestion2(SYNC_STAR, relevance: DART_RELEVANCE_HIGH);
@@ -335,6 +341,23 @@
   }
 
   @override
+  visitParenthesizedExpression(ParenthesizedExpression node) {
+    Expression expression = node.expression;
+    if (expression is Identifier || expression is PropertyAccess) {
+      if (entity == node.rightParenthesis) {
+        var next = expression.endToken.next;
+        if (next == entity || next == droppedToken) {
+          // Fasta parses `if (x i^)` as `if (x ^) where the `i` is in the token
+          // stream but not part of the ParenthesizedExpression.
+          _addSuggestion(Keyword.IS, DART_RELEVANCE_HIGH);
+          return;
+        }
+      }
+    }
+    _addExpressionKeywords(node);
+  }
+
+  @override
   visitIfStatement(IfStatement node) {
     if (_isPreviousTokenSynthetic(entity, TokenType.CLOSE_PAREN)) {
       // Actual: if (x i^)
@@ -390,7 +413,7 @@
   @override
   visitMethodDeclaration(MethodDeclaration node) {
     if (entity == node.body) {
-      if (node.body is EmptyFunctionBody) {
+      if (isEmptyBody(node.body)) {
         _addClassBodyKeywords();
         _addSuggestion(Keyword.ASYNC);
         _addSuggestion2(ASYNC_STAR);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
index 22aa8ee..9c10cdb 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
@@ -19,6 +19,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/ast_provider.dart';
 import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/source.dart';
 
 /**
  * Checks if creating a method with the given [name] in [classElement] will
@@ -270,7 +271,9 @@
       // Check local elements that might shadow the reference.
       var localElements = await getLocalElements(match.element);
       for (LocalElement localElement in localElements) {
-        if (localElement.visibleRange.intersects(match.sourceRange)) {
+        SourceRange elementRange = localElement.visibleRange;
+        if (elementRange != null &&
+            elementRange.intersects(match.sourceRange)) {
           return new _MatchShadowedByLocal(match, localElement);
         }
       }
diff --git a/pkg/analysis_server/test/analysis/get_errors_test.dart b/pkg/analysis_server/test/analysis/get_errors_test.dart
index 431f5ed..af094d1 100644
--- a/pkg/analysis_server/test/analysis/get_errors_test.dart
+++ b/pkg/analysis_server/test/analysis/get_errors_test.dart
@@ -46,12 +46,12 @@
   test_errorInPart() async {
     String libPath = '$testFolder/main.dart';
     String partPath = '$testFolder/main_part.dart';
-    addFile(libPath, r'''
+    newFile(libPath, content: r'''
 library main;
 part 'main_part.dart';
 class A {}
 ''');
-    addFile(partPath, r'''
+    newFile(partPath, content: r'''
 part of main;
 class A {}
 ''');
@@ -77,7 +77,7 @@
   test_fileWithoutContext() {
     // Broken under the new driver.
     String file = '/outside.dart';
-    addFile(file, '''
+    newFile(file, content: '''
 main() {
   print(42);
 }
@@ -124,7 +124,7 @@
     Request request = _createGetErrorsRequest(testFile);
     server.handleRequest(request);
     // remove context, causes sending an "invalid file" error
-    resourceProvider.deleteFolder(projectPath);
+    deleteFolder(projectPath);
     // wait for an error response
     Response response = await serverChannel.waitForResponse(request);
     expect(response.error, isNotNull);
diff --git a/pkg/analysis_server/test/analysis/get_navigation_test.dart b/pkg/analysis_server/test/analysis/get_navigation_test.dart
index 6df1179..85945fc 100644
--- a/pkg/analysis_server/test/analysis/get_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/get_navigation_test.dart
@@ -55,7 +55,7 @@
   }
 
   test_fileOutsideOfRoot() async {
-    testFile = '/outside.dart';
+    testFile = resourceProvider.convertPath('/outside.dart');
     addTestFile('''
 main() {
   var test = 0;
@@ -198,7 +198,7 @@
     server.handleRequest(request);
     // remove context, causes sending an "invalid file" error
     {
-      Folder projectFolder = resourceProvider.getResource(projectPath);
+      Folder projectFolder = getFolder(projectPath);
       server.contextManager.callbacks.removeContext(projectFolder, <String>[]);
     }
     // wait for an error response
diff --git a/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart b/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart
index 4293c6c..4fc4eb1 100644
--- a/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart
@@ -43,11 +43,7 @@
   List<AnalysisError> get testFileErrors => filesErrors[testFile];
 
   void addOptionsFile(String contents) {
-    addFile(optionsFilePath, contents);
-  }
-
-  void deleteFile(String filePath) {
-    resourceProvider.deleteFile(filePath);
+    newFile(optionsFilePath, content: contents);
   }
 
   @override
diff --git a/pkg/analysis_server/test/analysis/notification_analyzedFiles_test.dart b/pkg/analysis_server/test/analysis/notification_analyzedFiles_test.dart
index c7a1196..8cfbfad 100644
--- a/pkg/analysis_server/test/analysis/notification_analyzedFiles_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_analyzedFiles_test.dart
@@ -73,9 +73,7 @@
   }
 
   test_beforeAnalysis_excludeYamlFiles() async {
-    File yamlFile = resourceProvider
-        .getFolder(projectPath)
-        .getChildAssumingFile('sample.yaml');
+    File yamlFile = getFolder(projectPath).getChildAssumingFile('sample.yaml');
     yamlFile.writeAsStringSync('');
     addTestFile('''
 class A {}
@@ -117,7 +115,7 @@
     // Making a change that *does* affect the set of reachable files should
     // trigger the notification to be re-sent.
     addTestFile('class A {}');
-    addFile('/foo.dart', 'library foo;');
+    newFile('/foo.dart', content: 'library foo;');
     await prepareAnalyzedFiles();
     expect(analyzedFilesReceived, isTrue);
 
diff --git a/pkg/analysis_server/test/analysis/notification_errors_test.dart b/pkg/analysis_server/test/analysis/notification_errors_test.dart
index 904a0e4..161eb85 100644
--- a/pkg/analysis_server/test/analysis/notification_errors_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_errors_test.dart
@@ -45,6 +45,30 @@
     ];
   }
 
+  test_analysisOptionsFile() async {
+    String analysisOptionsFile =
+        newFile('$projectPath/analysis_options.yaml', content: '''
+linter:
+  rules:
+    - invalid_lint_rule_name
+''').path;
+
+    Request request =
+        new AnalysisSetAnalysisRootsParams([projectPath], []).toRequest('0');
+    handleSuccessfulRequest(request);
+    await waitForTasksFinished();
+    await pumpEventQueue();
+    //
+    // Verify the error result.
+    //
+    List<AnalysisError> errors = filesErrors[analysisOptionsFile];
+    expect(errors, hasLength(1));
+    AnalysisError error = errors[0];
+    expect(error.location.file, '/project/analysis_options.yaml');
+    expect(error.severity, AnalysisErrorSeverity.WARNING);
+    expect(error.type, AnalysisErrorType.STATIC_WARNING);
+  }
+
   test_importError() async {
     createProject();
 
@@ -66,7 +90,7 @@
   test_lintError() async {
     var camelCaseTypesLintName = 'camel_case_types';
 
-    addFile('$projectPath/.analysis_options', '''
+    newFile('$projectPath/.analysis_options', content: '''
 linter:
   rules:
     - $camelCaseTypesLintName
@@ -81,7 +105,7 @@
     await waitForTasksFinished();
     List<Linter> lints;
     AnalysisDriver testDriver = (server.contextManager as ContextManagerImpl)
-        .getContextInfoFor(resourceProvider.getFolder(projectPath))
+        .getContextInfoFor(getFolder(projectPath))
         .analysisDriver;
     lints = testDriver.analysisOptions.lintRules;
     // Registry should only contain single lint rule.
@@ -100,8 +124,7 @@
 
   test_notInAnalysisRoot() async {
     createProject();
-    String otherFile = '/other.dart';
-    addFile(otherFile, 'UnknownType V;');
+    String otherFile = newFile('/other.dart', content: 'UnknownType V;').path;
     addTestFile('''
 import '/other.dart';
 main() {
@@ -128,6 +151,39 @@
     expect(error.message, isNotNull);
   }
 
+  test_pubspecFile() async {
+    String pubspecFile = newFile('$projectPath/pubspec.yaml', content: '''
+version: 1.3.2
+''').path;
+
+    Request setRootsRequest =
+        new AnalysisSetAnalysisRootsParams([projectPath], []).toRequest('0');
+    handleSuccessfulRequest(setRootsRequest);
+    await waitForTasksFinished();
+    await pumpEventQueue();
+    //
+    // Verify the error result.
+    //
+    List<AnalysisError> errors = filesErrors[pubspecFile];
+    expect(errors, hasLength(1));
+    AnalysisError error = errors[0];
+    expect(error.location.file, '/project/pubspec.yaml');
+    expect(error.severity, AnalysisErrorSeverity.WARNING);
+    expect(error.type, AnalysisErrorType.STATIC_WARNING);
+    //
+    // Fix the error and verify the new results.
+    //
+    modifyFile(pubspecFile, '''
+name: sample
+version: 1.3.2
+''');
+    await waitForTasksFinished();
+    await pumpEventQueue();
+
+    errors = filesErrors[pubspecFile];
+    expect(errors, hasLength(0));
+  }
+
   test_StaticWarning() async {
     createProject();
     addTestFile('''
diff --git a/pkg/analysis_server/test/analysis/notification_highlights_test.dart b/pkg/analysis_server/test/analysis/notification_highlights_test.dart
index ceabbce..16df572 100644
--- a/pkg/analysis_server/test/analysis/notification_highlights_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_highlights_test.dart
@@ -344,7 +344,7 @@
 main() {
   var part = 42;
 }''');
-    addFile('/project/bin/my_part.dart', 'part of lib;');
+    newFile('/project/bin/my_part.dart', content: 'part of lib;');
     await prepareHighlights();
     assertHasRegion(HighlightRegionType.BUILT_IN, 'part "my_');
     assertNoRegion(HighlightRegionType.BUILT_IN, 'part = 42');
@@ -934,7 +934,7 @@
   }
 
   void _addLibraryForTestPart() {
-    addFile('$testFolder/my_lib.dart', '''
+    newFile('$testFolder/my_lib.dart', content: '''
 library lib;
 part 'test.dart';
     ''');
diff --git a/pkg/analysis_server/test/analysis/notification_highlights_test2.dart b/pkg/analysis_server/test/analysis/notification_highlights_test2.dart
index df9b59d..56491fe 100644
--- a/pkg/analysis_server/test/analysis/notification_highlights_test2.dart
+++ b/pkg/analysis_server/test/analysis/notification_highlights_test2.dart
@@ -345,7 +345,7 @@
 main() {
   var part = 42;
 }''');
-    addFile('/project/bin/my_part.dart', 'part of lib;');
+    newFile('/project/bin/my_part.dart', content: 'part of lib;');
     await prepareHighlights();
     assertHasRegion(HighlightRegionType.BUILT_IN, 'part "my_');
     assertNoRegion(HighlightRegionType.BUILT_IN, 'part = 42');
@@ -1085,7 +1085,7 @@
   }
 
   void _addLibraryForTestPart() {
-    addFile('$testFolder/my_lib.dart', '''
+    newFile('$testFolder/my_lib.dart', content: '''
 library lib;
 part 'test.dart';
     ''');
diff --git a/pkg/analysis_server/test/analysis/notification_implemented_test.dart b/pkg/analysis_server/test/analysis/notification_implemented_test.dart
index cc80eb9..7a6e597 100644
--- a/pkg/analysis_server/test/analysis/notification_implemented_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_implemented_test.dart
@@ -271,7 +271,7 @@
   }
 
   test_method_withMethod_private_differentLib() async {
-    addFile('$testFolder/lib.dart', r'''
+    newFile('$testFolder/lib.dart', content: r'''
 import 'test.dart';
 class B extends A {
   void _m() {}
diff --git a/pkg/analysis_server/test/analysis/notification_navigation_test.dart b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
index f57c6715..075acf7 100644
--- a/pkg/analysis_server/test/analysis/notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
@@ -229,7 +229,7 @@
   }
 
   test_annotationConstructor_importPrefix() async {
-    addFile('$testFolder/my_annotation.dart', r'''
+    newFile('$testFolder/my_annotation.dart', content: r'''
 library an;
 class MyAnnotation {
   const MyAnnotation();
@@ -304,7 +304,7 @@
   }
 
   test_annotationField_importPrefix() async {
-    addFile('$testFolder/mayn.dart', r'''
+    newFile('$testFolder/mayn.dart', content: r'''
 library an;
 const myan = new Object();
 ''');
@@ -697,8 +697,8 @@
   }
 
   test_multiplyDefinedElement() async {
-    addFile('$projectPath/bin/libA.dart', 'library A; int TEST = 1;');
-    addFile('$projectPath/bin/libB.dart', 'library B; int TEST = 2;');
+    newFile('$projectPath/bin/libA.dart', content: 'library A; int TEST = 1;');
+    newFile('$projectPath/bin/libB.dart', content: 'library B; int TEST = 2;');
     addTestFile('''
 import 'libA.dart';
 import 'libB.dart';
@@ -776,7 +776,7 @@
 
   test_partOf() async {
     var libCode = 'library lib; part "test.dart";';
-    var libFile = addFile('$projectPath/bin/lib.dart', libCode);
+    var libFile = newFile('$projectPath/bin/lib.dart', content: libCode).path;
     addTestFile('part of lib;');
     await prepareNavigation();
     assertHasRegionString('lib');
@@ -808,7 +808,7 @@
 
   test_string_export() async {
     var libCode = 'library lib;';
-    var libFile = addFile('$projectPath/bin/lib.dart', libCode);
+    var libFile = newFile('$projectPath/bin/lib.dart', content: libCode).path;
     addTestFile('export "lib.dart";');
     await prepareNavigation();
     assertHasRegionString('"lib.dart"');
@@ -823,7 +823,7 @@
 
   test_string_import() async {
     var libCode = 'library lib;';
-    var libFile = addFile('$projectPath/bin/lib.dart', libCode);
+    var libFile = newFile('$projectPath/bin/lib.dart', content: libCode).path;
     addTestFile('import "lib.dart";');
     await prepareNavigation();
     assertHasRegionString('"lib.dart"');
@@ -844,7 +844,8 @@
 
   test_string_part() async {
     var unitCode = 'part of lib;  f() {}';
-    var unitFile = addFile('$projectPath/bin/test_unit.dart', unitCode);
+    var unitFile =
+        newFile('$projectPath/bin/test_unit.dart', content: unitCode).path;
     addTestFile('''
 library lib;
 part "test_unit.dart";
diff --git a/pkg/analysis_server/test/analysis/notification_overrides_test.dart b/pkg/analysis_server/test/analysis/notification_overrides_test.dart
index 10abe23..86cac68 100644
--- a/pkg/analysis_server/test/analysis/notification_overrides_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_overrides_test.dart
@@ -232,7 +232,7 @@
   }
 
   test_BAD_privateByPrivate_inDifferentLib() async {
-    addFile('$testFolder/lib.dart', r'''
+    newFile('$testFolder/lib.dart', content: r'''
 class A {
   void _m() {}
 }
diff --git a/pkg/analysis_server/test/analysis/reanalyze_test.dart b/pkg/analysis_server/test/analysis/reanalyze_test.dart
index c78dd97..886b200 100644
--- a/pkg/analysis_server/test/analysis/reanalyze_test.dart
+++ b/pkg/analysis_server/test/analysis/reanalyze_test.dart
@@ -46,8 +46,8 @@
 
   test_reanalyze_with_overlay() async {
     createProject();
-    resourceProvider.newFolder(testFolder);
-    resourceProvider.newFile(testFile, 'main() {}');
+    newFolder(testFolder);
+    newFile(testFile, content: 'main() {}');
     // Update the content with an overlay that contains a syntax error.
     server.updateContent('1', {testFile: new AddContentOverlay('main() {')});
     await _resultsAvailable.future;
diff --git a/pkg/analysis_server/test/analysis/set_priority_files_test.dart b/pkg/analysis_server/test/analysis/set_priority_files_test.dart
index 1de25bf..993fb07 100644
--- a/pkg/analysis_server/test/analysis/set_priority_files_test.dart
+++ b/pkg/analysis_server/test/analysis/set_priority_files_test.dart
@@ -57,49 +57,49 @@
 
   test_fileNotInAnalysisRoot() async {
     String path = '/other/file.dart';
-    addFile(path, '');
+    newFile(path);
     await _setPriorityFile(path);
     _verifyPriorityFiles(path);
   }
 
   test_ignoredInAnalysisOptions() async {
     String sampleFile = '$projectPath/samples/sample.dart';
-    addFile('$projectPath/.analysis_options', r'''
+    newFile('$projectPath/.analysis_options', content: r'''
 analyzer:
   exclude:
     - 'samples/**'
 ''');
-    addFile(sampleFile, '');
+    newFile(sampleFile);
     // attempt to set priority file
     await _setPriorityFile(sampleFile);
     _verifyPriorityFiles(sampleFile);
   }
 
   test_ignoredInAnalysisOptions_inChildContext() async {
-    addFile('$projectPath/.packages', '');
-    addFile('$projectPath/child/.packages', '');
+    newFile('$projectPath/.packages');
+    newFile('$projectPath/child/.packages');
     String sampleFile = '$projectPath/child/samples/sample.dart';
-    addFile('$projectPath/child/.analysis_options', r'''
+    newFile('$projectPath/child/.analysis_options', content: r'''
 analyzer:
   exclude:
     - 'samples/**'
 ''');
-    addFile(sampleFile, '');
+    newFile(sampleFile);
     // attempt to set priority file
     await _setPriorityFile(sampleFile);
     _verifyPriorityFiles(sampleFile);
   }
 
   test_ignoredInAnalysisOptions_inRootContext() async {
-    addFile('$projectPath/.packages', '');
-    addFile('$projectPath/child/.packages', '');
+    newFile('$projectPath/.packages');
+    newFile('$projectPath/child/.packages');
     String sampleFile = '$projectPath/child/samples/sample.dart';
-    addFile('$projectPath/.analysis_options', r'''
+    newFile('$projectPath/.analysis_options', content: r'''
 analyzer:
   exclude:
     - 'child/samples/**'
 ''');
-    addFile(sampleFile, '');
+    newFile(sampleFile);
     // attempt to set priority file
     await _setPriorityFile(sampleFile);
     _verifyPriorityFiles(sampleFile);
diff --git a/pkg/analysis_server/test/analysis/update_content_test.dart b/pkg/analysis_server/test/analysis/update_content_test.dart
index f2733f8..a4fc364 100644
--- a/pkg/analysis_server/test/analysis/update_content_test.dart
+++ b/pkg/analysis_server/test/analysis/update_content_test.dart
@@ -61,21 +61,18 @@
   }
 
   test_multiple_contexts() async {
-    String fooPath = '/project1/foo.dart';
-    resourceProvider.newFile(fooPath, '''
+    String fooPath = newFile('/project1/foo.dart', content: '''
 library foo;
 import '../project2/baz.dart';
-main() { f(); }''');
-    String barPath = '/project2/bar.dart';
-    resourceProvider.newFile(barPath, '''
+main() { f(); }''').path;
+    String barPath = newFile('/project2/bar.dart', content: '''
 library bar;
 import 'baz.dart';
-main() { f(); }''');
-    String bazPath = '/project2/baz.dart';
-    resourceProvider.newFile(bazPath, '''
+main() { f(); }''').path;
+    String bazPath = newFile('/project2/baz.dart', content: '''
 library baz;
 f(int i) {}
-''');
+''').path;
     Request request =
         new AnalysisSetAnalysisRootsParams(['/project1', '/project2'], [])
             .toRequest('0');
@@ -106,7 +103,7 @@
   @failingTest
   test_overlay_addPreviouslyImported() async {
     // The list of errors doesn't include errors for '/project/target.dart'.
-    Folder project = resourceProvider.newFolder('/project');
+    Folder project = newFolder('/project');
     handleSuccessfulRequest(
         new AnalysisSetAnalysisRootsParams([project.path], []).toRequest('0'));
 
@@ -130,8 +127,8 @@
 
   test_overlayOnly() async {
     String filePath = '/User/project1/test.dart';
-    Folder folder1 = resourceProvider.newFolder('/User/project1');
-    Folder folder2 = resourceProvider.newFolder('/User/project2');
+    Folder folder1 = newFolder('/User/project1');
+    Folder folder2 = newFolder('/User/project2');
     Request request =
         new AnalysisSetAnalysisRootsParams([folder1.path, folder2.path], [])
             .toRequest('0');
diff --git a/pkg/analysis_server/test/analysis_abstract.dart b/pkg/analysis_server/test/analysis_abstract.dart
index 2546cd8..1f797a9 100644
--- a/pkg/analysis_server/test/analysis_abstract.dart
+++ b/pkg/analysis_server/test/analysis_abstract.dart
@@ -14,11 +14,11 @@
 import 'package:analysis_server/src/plugin/plugin_manager.dart';
 import 'package:analyzer/context/context_root.dart' as analyzer;
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:analyzer_plugin/src/protocol/protocol_internal.dart' as plugin;
@@ -47,10 +47,9 @@
 /**
  * An abstract base for all 'analysis' domain tests.
  */
-class AbstractAnalysisTest {
+class AbstractAnalysisTest extends Object with ResourceProviderMixin {
   bool generateSummaryFiles = false;
   MockServerChannel serverChannel;
-  MemoryResourceProvider resourceProvider;
   MockPackageMapProvider packageMapProvider;
   TestPluginManager pluginManager;
   AnalysisServer server;
@@ -89,12 +88,6 @@
     handleSuccessfulRequest(request);
   }
 
-  String addFile(String path, String content) {
-    path = resourceProvider.convertPath(path);
-    resourceProvider.newFile(path, content);
-    return path;
-  }
-
   void addGeneralAnalysisSubscription(GeneralAnalysisService service) {
     generalServices.add(service);
     Request request = new AnalysisSetGeneralSubscriptionsParams(generalServices)
@@ -103,7 +96,7 @@
   }
 
   String addTestFile(String content) {
-    addFile(testFile, content);
+    newFile(testFile, content: content);
     this.testCode = content;
     return testFile;
   }
@@ -137,7 +130,7 @@
    * Creates a project `/project`.
    */
   void createProject({Map<String, String> packageRoots}) {
-    resourceProvider.newFolder(projectPath);
+    newFolder(projectPath);
     Request request = new AnalysisSetAnalysisRootsParams([projectPath], [],
             packageRoots: packageRoots)
         .toRequest('0');
@@ -149,7 +142,7 @@
    * Fails if not found.
    */
   int findFileOffset(String path, String search) {
-    File file = resourceProvider.getResource(path) as File;
+    File file = getFile(path);
     String code = file.createSource().contents.data;
     int offset = code.indexOf(search);
     expect(offset, isNot(-1), reason: '"$search" in\n$code');
@@ -177,8 +170,7 @@
   }
 
   String modifyTestFile(String content) {
-    String path = resourceProvider.convertPath(testFile);
-    resourceProvider.updateFile(path, content);
+    modifyFile(testFile, content);
     this.testCode = content;
     return testFile;
   }
@@ -204,7 +196,6 @@
 
   void setUp() {
     serverChannel = new MockServerChannel();
-    resourceProvider = new MemoryResourceProvider();
     projectPath = resourceProvider.convertPath('/project');
     testFolder = resourceProvider.convertPath('/project/bin');
     testFile = resourceProvider.convertPath('/project/bin/test.dart');
@@ -225,7 +216,6 @@
     server.done();
     handler = null;
     server = null;
-    resourceProvider = null;
     serverChannel = null;
   }
 
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index 31c8a50..9ba47f2 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -10,10 +10,10 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_server.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:plugin/manager.dart';
 import 'package:test/test.dart';
@@ -29,10 +29,9 @@
 }
 
 @reflectiveTest
-class AnalysisServerTest {
+class AnalysisServerTest extends Object with ResourceProviderMixin {
   MockServerChannel channel;
   AnalysisServer server;
-  MemoryResourceProvider resourceProvider;
   MockPackageMapProvider packageMapProvider;
 
   /**
@@ -42,10 +41,10 @@
   Future do_not_test_no_duplicate_notifications() async {
     // Subscribe to STATUS so we'll know when analysis is done.
     server.serverServices = [ServerService.STATUS].toSet();
-    resourceProvider.newFolder('/foo');
-    resourceProvider.newFolder('/bar');
-    resourceProvider.newFile('/foo/foo.dart', 'import "../bar/bar.dart";');
-    File bar = resourceProvider.newFile('/bar/bar.dart', 'library bar;');
+    newFolder('/foo');
+    newFolder('/bar');
+    newFile('/foo/foo.dart', content: 'import "../bar/bar.dart";');
+    File bar = newFile('/bar/bar.dart', content: 'library bar;');
     server.setAnalysisRoots('0', ['/foo', '/bar'], [], {});
     Map<AnalysisService, Set<String>> subscriptions =
         <AnalysisService, Set<String>>{};
@@ -92,7 +91,6 @@
   void setUp() {
     processRequiredPlugins();
     channel = new MockServerChannel();
-    resourceProvider = new MemoryResourceProvider();
     // Create an SDK in the mock file system.
     new MockSdk(resourceProvider: resourceProvider);
     packageMapProvider = new MockPackageMapProvider();
@@ -116,9 +114,9 @@
 
   Future test_serverStatusNotifications() {
     server.serverServices.add(ServerService.STATUS);
-    resourceProvider.newFolder('/pkg');
-    resourceProvider.newFolder('/pkg/lib');
-    resourceProvider.newFile('/pkg/lib/test.dart', 'class C {}');
+    newFolder('/pkg');
+    newFolder('/pkg/lib');
+    newFile('/pkg/lib/test.dart', content: 'class C {}');
     server.setAnalysisRoots('0', ['/pkg'], [], {});
     // Pump the event queue to make sure the server has finished any
     // analysis.
@@ -144,8 +142,8 @@
 
   test_setAnalysisSubscriptions_fileInIgnoredFolder_newOptions() async {
     String path = '/project/samples/sample.dart';
-    resourceProvider.newFile(path, '');
-    resourceProvider.newFile('/project/analysis_options.yaml', r'''
+    newFile(path);
+    newFile('/project/analysis_options.yaml', content: r'''
 analyzer:
   exclude:
     - 'samples/**'
@@ -163,8 +161,8 @@
 
   test_setAnalysisSubscriptions_fileInIgnoredFolder_oldOptions() async {
     String path = '/project/samples/sample.dart';
-    resourceProvider.newFile(path, '');
-    resourceProvider.newFile('/project/.analysis_options', r'''
+    newFile(path);
+    newFile('/project/.analysis_options', content: r'''
 analyzer:
   exclude:
     - 'samples/**'
diff --git a/pkg/analysis_server/test/completion_test_support.dart b/pkg/analysis_server/test/completion_test_support.dart
index af60220..75833ab 100644
--- a/pkg/analysis_server/test/completion_test_support.dart
+++ b/pkg/analysis_server/test/completion_test_support.dart
@@ -74,12 +74,12 @@
     super.setUp();
     return new Future(() {
       String content = spec.source;
-      addFile(testFile, content);
+      newFile(testFile, content: content);
       this.testCode = content;
       completionOffset = spec.testLocation;
       if (extraFiles != null) {
         extraFiles.forEach((String fileName, String content) {
-          addFile(fileName, content);
+          newFile(fileName, content: content);
         });
       }
     }).then((_) => getSuggestions()).then((_) {
diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart
index 566c06c..7933584 100644
--- a/pkg/analysis_server/test/context_manager_test.dart
+++ b/pkg/analysis_server/test/context_manager_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library test.context.directory.manager;
-
 import 'dart:async';
 
 import 'package:analysis_server/src/context_manager.dart';
@@ -12,7 +10,6 @@
 import 'package:analyzer/context/context_root.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/instrumentation/instrumentation.dart';
 import 'package:analyzer/source/error_processor.dart';
 import 'package:analyzer/src/context/builder.dart';
@@ -25,6 +22,7 @@
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/services/lint.dart';
 import 'package:analyzer/src/summary/summary_file_builder.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer/src/util/glob.dart';
 import 'package:front_end/src/api_prototype/byte_store.dart';
 import 'package:front_end/src/base/performance_logger.dart';
@@ -90,16 +88,16 @@
     //return super.test_embedder_added();
     fail('NoSuchMethodError');
     // Create files.
-    String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]);
-    newFile([libPath, 'main.dart']);
-    newFile([libPath, 'nope.dart']);
-    String embedderPath = newFolder([projPath, 'embedder']);
-    newFile([embedderPath, 'entry.dart']);
-    String embedderSrcPath = newFolder([projPath, 'embedder', 'src']);
-    newFile([embedderSrcPath, 'part.dart']);
+    String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
+    newFile('$libPath/main.dart');
+    newFile('$libPath/nope.dart');
+    String embedderPath = '$projPath/embedder';
+    newFile('$embedderPath/entry.dart');
+    String embedderSrcPath = '$projPath/embedder/src';
+    newFile('$embedderSrcPath/part.dart');
 
     // Setup _embedder.yaml.
-    newFile([libPath, '_embedder.yaml'], r'''
+    newFile('$libPath/_embedder.yaml', content: r'''
 embedded_libs:
   "dart:foobar": "../embedder/entry.dart"
   "dart:typed_data": "../embedder/src/part"
@@ -122,7 +120,7 @@
     expect(sourceFactory.forUri('dart:typed_data'), isNull);
 
     // Add .packages file that introduces a dependency with embedded libs.
-    newFile([projPath, '.packages'], r'''
+    newFile('$projPath/.packages', content: r'''
 test_pack:lib/''');
 
     await pumpEventQueue();
@@ -138,21 +136,21 @@
 
   test_embedder_packagespec() async {
     // Create files.
-    String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]);
-    newFile([libPath, 'main.dart']);
-    newFile([libPath, 'nope.dart']);
-    String sdkExtPath = newFolder([projPath, 'sdk_ext']);
-    newFile([sdkExtPath, 'entry.dart']);
-    String sdkExtSrcPath = newFolder([projPath, 'sdk_ext', 'src']);
-    newFile([sdkExtSrcPath, 'part.dart']);
+    String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
+    newFile('$libPath/main.dart');
+    newFile('$libPath/nope.dart');
+    String sdkExtPath = '$projPath/sdk_ext';
+    newFile('$sdkExtPath/entry.dart');
+    String sdkExtSrcPath = '$projPath/sdk_ext/src';
+    newFile('$sdkExtSrcPath/part.dart');
     // Setup _embedder.yaml.
-    newFile([libPath, '_embedder.yaml'], r'''
+    newFile('$libPath/_embedder.yaml', content: r'''
 embedded_libs:
   "dart:foobar": "../sdk_ext/entry.dart"
   "dart:typed_data": "../sdk_ext/src/part"
   ''');
     // Setup .packages file
-    newFile([projPath, '.packages'], r'''
+    newFile('$projPath/.packages', content: r'''
 test_pack:lib/''');
     // Setup context.
 
@@ -240,14 +238,14 @@
     manager.setIgnorePatternsForContext(
         rootInfo, ['sdk_ext/**', 'lib/ignoreme.dart']);
     // Start creating files.
-    newFile([projPath, ContextManagerImpl.PUBSPEC_NAME]);
-    String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]);
-    newFile([libPath, 'main.dart']);
-    newFile([libPath, 'ignoreme.dart']);
-    String sdkExtPath = newFolder([projPath, 'sdk_ext']);
-    newFile([sdkExtPath, 'entry.dart']);
-    String sdkExtSrcPath = newFolder([projPath, 'sdk_ext', 'src']);
-    newFile([sdkExtSrcPath, 'part.dart']);
+    newFile('$projPath/${ContextManagerImpl.PUBSPEC_NAME}');
+    String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
+    newFile('$libPath/main.dart');
+    newFile('$libPath/ignoreme.dart');
+    String sdkExtPath = '$projPath/sdk_ext';
+    newFile('$sdkExtPath/entry.dart');
+    String sdkExtSrcPath = '$projPath/sdk_ext/src';
+    newFile('$sdkExtSrcPath/part.dart');
     // Pump event loop so new files are discovered and added to context.
     await pumpEventQueue();
     // Verify that ignored files were ignored.
@@ -368,21 +366,21 @@
 
   test_sdk_ext_packagespec() async {
     // Create files.
-    String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]);
-    newFile([libPath, 'main.dart']);
-    newFile([libPath, 'nope.dart']);
-    String sdkExtPath = newFolder([projPath, 'sdk_ext']);
-    newFile([sdkExtPath, 'entry.dart']);
-    String sdkExtSrcPath = newFolder([projPath, 'sdk_ext', 'src']);
-    newFile([sdkExtSrcPath, 'part.dart']);
+    String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
+    newFile('$libPath/main.dart');
+    newFile('$libPath/nope.dart');
+    String sdkExtPath = '$projPath/sdk_ext';
+    newFile('$sdkExtPath/entry.dart');
+    String sdkExtSrcPath = '$projPath/sdk_ext/src';
+    newFile('$sdkExtSrcPath/part.dart');
     // Setup sdk extension mapping.
-    newFile([libPath, '_sdkext'], r'''
+    newFile('$libPath/_sdkext', content: r'''
 {
   "dart:foobar": "../sdk_ext/entry.dart"
 }
 ''');
     // Setup .packages file
-    newFile([projPath, '.packages'], r'''
+    newFile('$projPath/.packages', content: r'''
 test_pack:lib/''');
     // Setup context.
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
@@ -429,13 +427,13 @@
   }
 
   void test_setRoots_addFolderWithNestedPackageSpec() {
-    String examplePath = newFolder([projPath, ContextManagerTest.EXAMPLE_NAME]);
-    String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]);
+    String examplePath = '$projPath/${ContextManagerTest.EXAMPLE_NAME}';
+    String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
 
-    newFile([projPath, ContextManagerImpl.PACKAGE_SPEC_NAME]);
-    newFile([libPath, 'main.dart']);
-    newFile([examplePath, ContextManagerImpl.PACKAGE_SPEC_NAME]);
-    newFile([examplePath, 'example.dart']);
+    newFile('$projPath/${ContextManagerImpl.PACKAGE_SPEC_NAME}');
+    newFile('$libPath/main.dart');
+    newFile('$examplePath/${ContextManagerImpl.PACKAGE_SPEC_NAME}');
+    newFile('$examplePath/example.dart');
 
     packageMapProvider.packageMap['proj'] = <Folder>[
       resourceProvider.getResource(libPath)
@@ -458,14 +456,15 @@
   }
 
   void test_setRoots_addFolderWithNestedPubspec() {
-    String examplePath = newFolder([projPath, ContextManagerTest.EXAMPLE_NAME]);
-    String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]);
+    String examplePath = '$projPath/${ContextManagerTest.EXAMPLE_NAME}';
+    String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
 
-    newFile([projPath, ContextManagerImpl.PUBSPEC_NAME]);
-    newFile([projPath, ContextManagerImpl.PACKAGE_SPEC_NAME], 'proj:lib/');
-    newFile([libPath, 'main.dart']);
-    newFile([examplePath, ContextManagerImpl.PUBSPEC_NAME]);
-    newFile([examplePath, 'example.dart']);
+    newFile('$projPath/${ContextManagerImpl.PUBSPEC_NAME}');
+    newFile('$projPath/${ContextManagerImpl.PACKAGE_SPEC_NAME}',
+        content: 'proj:lib/');
+    newFile('$libPath/main.dart');
+    newFile('$examplePath/${ContextManagerImpl.PUBSPEC_NAME}');
+    newFile('$examplePath/example.dart');
 
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
 
@@ -495,7 +494,7 @@
     String packagespecPath = path.posix.join(projPath, '.packages');
     resourceProvider.newFile(packagespecPath,
         'unittest:file:///home/somebody/.pub/cache/unittest-0.9.9/lib/');
-    String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]);
+    String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
     File mainFile =
         resourceProvider.newFile(path.posix.join(libPath, 'main.dart'), '');
     Source source = mainFile.createSource();
@@ -546,17 +545,18 @@
   }
 
   void test_setRoots_addFolderWithPubspecAndLib() {
-    String binPath = newFolder([projPath, ContextManagerTest.BIN_NAME]);
-    String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]);
-    String srcPath = newFolder([libPath, ContextManagerTest.SRC_NAME]);
-    String testPath = newFolder([projPath, ContextManagerTest.TEST_NAME]);
+    String binPath = '$projPath/${ContextManagerTest.BIN_NAME}';
+    String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
+    String srcPath = '$libPath/${ContextManagerTest.SRC_NAME}';
+    String testPath = '$projPath/${ContextManagerTest.TEST_NAME}';
 
-    newFile([projPath, ContextManagerImpl.PUBSPEC_NAME]);
-    newFile([projPath, ContextManagerImpl.PACKAGE_SPEC_NAME], 'proj:lib/');
-    String appPath = newFile([binPath, 'app.dart']);
-    newFile([libPath, 'main.dart']);
-    newFile([srcPath, 'internal.dart']);
-    String testFilePath = newFile([testPath, 'main_test.dart']);
+    newFile('$projPath/${ContextManagerImpl.PUBSPEC_NAME}');
+    newFile('$projPath/${ContextManagerImpl.PACKAGE_SPEC_NAME}',
+        content: 'proj:lib/');
+    String appPath = newFile('$binPath/app.dart').path;
+    newFile('$libPath/main.dart');
+    newFile('$srcPath/internal.dart');
+    String testFilePath = newFile('$testPath/main_test.dart').path;
 
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
     Iterable<Source> sources = callbacks.currentFileSources(projPath);
@@ -609,10 +609,12 @@
     String projectBLib = '$root/sub/sub2/bbb/lib';
     String subProjectB_file = '$projectB/bin/b.dart';
     // create files
-    newFile([projectA, ContextManagerImpl.PUBSPEC_NAME]);
-    newFile([projectA, ContextManagerImpl.PACKAGE_SPEC_NAME], 'foo:lib/');
-    newFile([projectB, ContextManagerImpl.PUBSPEC_NAME]);
-    newFile([projectB, ContextManagerImpl.PACKAGE_SPEC_NAME], 'bar:lib/');
+    newFile('$projectA/${ContextManagerImpl.PUBSPEC_NAME}');
+    newFile('$projectA/${ContextManagerImpl.PACKAGE_SPEC_NAME}',
+        content: 'foo:lib/');
+    newFile('$projectB/${ContextManagerImpl.PUBSPEC_NAME}');
+    newFile('$projectB/${ContextManagerImpl.PACKAGE_SPEC_NAME}',
+        content: 'bar:lib/');
     resourceProvider.newFile(rootFile, 'library root;');
     resourceProvider.newFile(subProjectA_file, 'library a;');
     resourceProvider.newFile(subProjectB_file, 'library b;');
@@ -640,8 +642,8 @@
   void test_setRoots_addPackageRoot() {
     String packagePathFoo = '/package1/foo';
     String packageRootPath = '/package2/foo';
-    newFile([projPath, ContextManagerImpl.PACKAGE_SPEC_NAME],
-        'foo:file:///package1/foo');
+    newFile('$projPath/${ContextManagerImpl.PACKAGE_SPEC_NAME}',
+        content: 'foo:file:///package1/foo');
     Folder packageFolder = resourceProvider.newFolder(packagePathFoo);
     List<String> includedPaths = <String>[projPath];
     List<String> excludedPaths = <String>[];
@@ -893,8 +895,8 @@
 
   void test_setRoots_newlyAddedFoldersGetProperPackageMap() {
     String packagePath = '/package/foo';
-    newFile([projPath, ContextManagerImpl.PACKAGE_SPEC_NAME],
-        'foo:file:///package/foo');
+    newFile('$projPath/${ContextManagerImpl.PACKAGE_SPEC_NAME}',
+        content: 'foo:file:///package/foo');
     Folder packageFolder = resourceProvider.newFolder(packagePath);
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
     expect(
@@ -939,7 +941,8 @@
 
   void test_setRoots_packageResolver() {
     String filePath = path.posix.join(projPath, 'lib', 'foo.dart');
-    newFile([projPath, ContextManagerImpl.PACKAGE_SPEC_NAME], 'foo:lib/');
+    newFile('$projPath/${ContextManagerImpl.PACKAGE_SPEC_NAME}',
+        content: 'foo:lib/');
     resourceProvider.newFile(filePath, 'contents');
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
 
@@ -1077,8 +1080,8 @@
     String packagePathFoo = '/package1/foo';
     String packageRootPath = '/package2/foo';
     Folder packageFolder = resourceProvider.newFolder(packagePathFoo);
-    newFile([projPath, ContextManagerImpl.PACKAGE_SPEC_NAME],
-        'foo:file:///package1/foo');
+    newFile('$projPath/${ContextManagerImpl.PACKAGE_SPEC_NAME}',
+        content: 'foo:file:///package1/foo');
     List<String> includedPaths = <String>[projPath];
     List<String> excludedPaths = <String>[];
     manager.setRoots(includedPaths, excludedPaths,
@@ -1655,7 +1658,7 @@
   }
 }
 
-abstract class ContextManagerTest {
+abstract class ContextManagerTest extends Object with ResourceProviderMixin {
   /**
    * The name of the 'bin' directory.
    */
@@ -1685,8 +1688,6 @@
 
   TestContextManagerCallbacks callbacks;
 
-  MemoryResourceProvider resourceProvider;
-
   MockPackageMapProvider packageMapProvider;
 
   UriResolver packageResolver = null;
@@ -1737,11 +1738,6 @@
 
   Map<String, List<Folder>> get _currentPackageMap => _packageMap(projPath);
 
-  void deleteFile(List<String> pathComponents) {
-    String filePath = path.posix.joinAll(pathComponents);
-    resourceProvider.deleteFile(filePath);
-  }
-
   /**
    * TODO(brianwilkerson) This doesn't add the strong mode processor when using
    * the new analysis driver.
@@ -1749,24 +1745,6 @@
   ErrorProcessor getProcessor(AnalysisError error) => errorProcessors
       .firstWhere((ErrorProcessor p) => p.appliesTo(error), orElse: () => null);
 
-  String newFile(List<String> pathComponents, [String content = '']) {
-    String filePath = path.posix.joinAll(pathComponents);
-    resourceProvider.newFile(filePath, content);
-    return filePath;
-  }
-
-  String newFileFromBytes(List<String> pathComponents, List<int> bytes) {
-    String filePath = path.posix.joinAll(pathComponents);
-    resourceProvider.newFileWithBytes(filePath, bytes);
-    return filePath;
-  }
-
-  String newFolder(List<String> pathComponents) {
-    String folderPath = path.posix.joinAll(pathComponents);
-    resourceProvider.newFolder(folderPath);
-    return folderPath;
-  }
-
   void processRequiredPlugins() {
     ExtensionManager manager = new ExtensionManager();
     manager.processPlugins(AnalysisEngine.instance.requiredPlugins);
@@ -1778,7 +1756,6 @@
 
   void setUp() {
     processRequiredPlugins();
-    resourceProvider = new MemoryResourceProvider();
     resourceProvider.newFolder(projPath);
     packageMapProvider = new MockPackageMapProvider();
     // Create an SDK in the mock file system.
@@ -1786,6 +1763,7 @@
     DartSdkManager sdkManager = new DartSdkManager('/', true);
     manager = new ContextManagerImpl(
         resourceProvider,
+        new FileContentOverlay(),
         sdkManager,
         providePackageResolver,
         packageMapProvider,
@@ -1833,9 +1811,13 @@
 abstract class ContextManagerWithOptionsTest extends ContextManagerTest {
   String get optionsFileName;
 
+  void deleteOptionsFile() {
+    deleteFile('$projPath/$optionsFileName');
+  }
+
   test_analysis_options_file_delete() async {
     // Setup analysis options
-    newFile([projPath, optionsFileName], r'''
+    newFile('$projPath/$optionsFileName', content: r'''
 embedded_libs:
   "dart:foobar": "../sdk_ext/entry.dart"
 analyzer:
@@ -1858,7 +1840,7 @@
     expect(analysisOptions.enableStrictCallChecks, isTrue);
 
     // Remove options.
-    deleteFile([projPath, optionsFileName]);
+    deleteOptionsFile();
     await pumpEventQueue();
 
     // Verify defaults restored.
@@ -1872,8 +1854,8 @@
     // This fails because the ContextBuilder doesn't pick up the strongMode
     // flag from the embedder.yaml file.
     // Setup _embedder.yaml.
-    String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]);
-    newFile([libPath, '_embedder.yaml'], r'''
+    String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
+    newFile('$libPath/_embedder.yaml', content: r'''
 analyzer:
   strong-mode: true
   errors:
@@ -1884,11 +1866,11 @@
 ''');
 
     // Setup .packages file
-    newFile([projPath, '.packages'], r'''
+    newFile('$projPath/.packages', content: r'''
 test_pack:lib/''');
 
     // Setup analysis options
-    newFile([projPath, optionsFileName], r'''
+    newFile('$projPath/$optionsFileName', content: r'''
 analyzer:
   language:
     enableStrictCallChecks: true
@@ -1910,7 +1892,7 @@
     expect(lints, hasLength(2));
 
     // Remove options.
-    deleteFile([projPath, optionsFileName]);
+    deleteOptionsFile();
     await pumpEventQueue();
 
     // Verify defaults restored.
@@ -1923,17 +1905,17 @@
 
   test_analysis_options_include() async {
     // Create files.
-    String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]);
-    newFile([libPath, 'main.dart']);
-    String sdkExtPath = newFolder([projPath, 'sdk_ext']);
-    newFile([sdkExtPath, 'entry.dart']);
-    String sdkExtSrcPath = newFolder([projPath, 'sdk_ext', 'src']);
-    newFile([sdkExtSrcPath, 'part.dart']);
+    String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
+    newFile('$libPath/main.dart');
+    String sdkExtPath = '$projPath/sdk_ext';
+    newFile('$sdkExtPath/entry.dart');
+    String sdkExtSrcPath = '$projPath/sdk_ext/src';
+    newFile('$sdkExtSrcPath/part.dart');
     // Setup analysis options file which includes another options file.
-    newFile([projPath, optionsFileName], r'''
+    newFile('$projPath/$optionsFileName', content: r'''
 include: other_options.yaml
 ''');
-    newFile([projPath, 'other_options.yaml'], r'''
+    newFile('$projPath/other_options.yaml', content: r'''
 analyzer:
   language:
     enableStrictCallChecks: true
@@ -1955,15 +1937,15 @@
 
   test_analysis_options_include_package() async {
     // Create files.
-    String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]);
-    newFile([libPath, 'main.dart']);
-    String sdkExtPath = newFolder([projPath, 'sdk_ext']);
-    newFile([sdkExtPath, 'entry.dart']);
-    String sdkExtSrcPath = newFolder([projPath, 'sdk_ext', 'src']);
-    newFile([sdkExtSrcPath, 'part.dart']);
+    String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
+    newFile('$libPath/main.dart');
+    String sdkExtPath = '$projPath/sdk_ext';
+    newFile('$sdkExtPath/entry.dart');
+    String sdkExtSrcPath = '$projPath/sdk_ext/src';
+    newFile('$sdkExtSrcPath/part.dart');
     // Setup package
     String booLibPosixPath = '/my/pkg/boo/lib';
-    newFile([booLibPosixPath, 'other_options.yaml'], r'''
+    newFile('$booLibPosixPath/other_options.yaml', content: r'''
 analyzer:
   language:
     enableStrictCallChecks: true
@@ -1974,9 +1956,9 @@
     - camel_case_types
 ''');
     // Setup analysis options file which includes another options file.
-    newFile([projPath, ContextManagerImpl.PACKAGE_SPEC_NAME],
-        'boo:$booLibPosixPath\n');
-    newFile([projPath, optionsFileName], r'''
+    newFile('$projPath/${ContextManagerImpl.PACKAGE_SPEC_NAME}',
+        content: 'boo:$booLibPosixPath\n');
+    newFile('$projPath/$optionsFileName', content: r'''
 include: package:boo/other_options.yaml
 ''');
     // Setup context.
@@ -1991,16 +1973,16 @@
 
   test_analysis_options_parse_failure() async {
     // Create files.
-    String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]);
-    newFile([libPath, 'main.dart']);
-    String sdkExtPath = newFolder([projPath, 'sdk_ext']);
-    newFile([sdkExtPath, 'entry.dart']);
-    String sdkExtSrcPath = newFolder([projPath, 'sdk_ext', 'src']);
-    newFile([sdkExtSrcPath, 'part.dart']);
+    String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
+    newFile('$libPath/main.dart');
+    String sdkExtPath = '$projPath/sdk_ext';
+    newFile('$sdkExtPath/entry.dart');
+    String sdkExtSrcPath = '$projPath/sdk_ext/src';
+    newFile('$sdkExtSrcPath/part.dart');
     // Setup analysis options file with ignore list.
-    String optionsFilePath = newFile([projPath, optionsFileName], r'''
+    String optionsFilePath = newFile('$projPath/$optionsFileName', content: r'''
 ;
-''');
+''').path;
     // Setup context.
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
 
@@ -2012,7 +1994,7 @@
   }
 
   test_deleteRoot_hasAnalysisOptions() async {
-    newFile([projPath, optionsFileName], '');
+    newFile('$projPath/$optionsFileName');
 
     // Add the root.
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
@@ -2029,14 +2011,14 @@
     // This fails because the ContextBuilder doesn't pick up the strongMode
     // flag from the embedder.yaml file.
     // Create files.
-    String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]);
-    String sdkExtPath = newFolder([projPath, 'sdk_ext']);
-    newFile([projPath, 'test', 'test.dart']);
-    newFile([sdkExtPath, 'entry.dart']);
+    String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
+    String sdkExtPath = '$projPath/sdk_ext';
+    newFile('$projPath/test', content: 'test.dart');
+    newFile('$sdkExtPath/entry.dart');
     List<int> bytes = new SummaryBuilder([], null, true).build();
-    newFileFromBytes([projPath, 'sdk.ds'], bytes);
+    newFileWithBytes('$projPath/sdk.ds', bytes);
     // Setup _embedder.yaml.
-    newFile([libPath, '_embedder.yaml'], r'''
+    newFile('$libPath/_embedder.yaml', content: r'''
 embedded_libs:
   "dart:foobar": "../sdk_ext/entry.dart"
 analyzer:
@@ -2050,11 +2032,11 @@
     - avoid_as
 ''');
     // Setup .packages file
-    newFile([projPath, '.packages'], r'''
+    newFile('$projPath/.packages', content: r'''
 test_pack:lib/''');
 
     // Setup analysis options
-    newFile([projPath, optionsFileName], r'''
+    newFile('$projPath/$optionsFileName', content: r'''
 analyzer:
   exclude:
     - 'test/**'
@@ -2114,7 +2096,7 @@
 
   test_error_filter_analysis_option() async {
     // Create files.
-    newFile([projPath, optionsFileName], r'''
+    newFile('$projPath/$optionsFileName', content: r'''
 analyzer:
   errors:
     unused_local_variable: ignore
@@ -2129,7 +2111,7 @@
 
   test_error_filter_analysis_option_multiple_filters() async {
     // Create files.
-    newFile([projPath, optionsFileName], r'''
+    newFile('$projPath/$optionsFileName', content: r'''
 analyzer:
   errors:
     invalid_assignment: ignore
@@ -2147,7 +2129,7 @@
 
   test_error_filter_analysis_option_synonyms() async {
     // Create files.
-    newFile([projPath, optionsFileName], r'''
+    newFile('$projPath/$optionsFileName', content: r'''
 analyzer:
   errors:
     unused_local_variable: ignore
@@ -2163,7 +2145,7 @@
 
   test_error_filter_analysis_option_unpsecified() async {
     // Create files.
-    newFile([projPath, optionsFileName], r'''
+    newFile('$projPath/$optionsFileName', content: r'''
 analyzer:
 #  errors:
 #    unused_local_variable: ignore
@@ -2229,15 +2211,15 @@
   test_path_filter_analysis_option() async {
     // This fails because we're not analyzing the analysis options file.
     // Create files.
-    String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]);
-    newFile([libPath, 'main.dart']);
-    newFile([libPath, 'nope.dart']);
-    String sdkExtPath = newFolder([projPath, 'sdk_ext']);
-    newFile([sdkExtPath, 'entry.dart']);
-    String sdkExtSrcPath = newFolder([projPath, 'sdk_ext', 'src']);
-    newFile([sdkExtSrcPath, 'part.dart']);
+    String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
+    newFile('$libPath/main.dart');
+    newFile('$libPath/nope.dart');
+    String sdkExtPath = '$projPath/sdk_ext';
+    newFile('$sdkExtPath/entry.dart');
+    String sdkExtSrcPath = '$projPath/sdk_ext/src';
+    newFile('$sdkExtSrcPath/part.dart');
     // Setup analysis options file with ignore list.
-    newFile([projPath, optionsFileName], r'''
+    newFile('$projPath/$optionsFileName', content: r'''
 analyzer:
   exclude:
     - lib/nope.dart
@@ -2259,19 +2241,19 @@
 
   test_path_filter_child_contexts_option() async {
     // Create files.
-    String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]);
-    newFile([libPath, 'main.dart']);
-    newFile([libPath, 'pubspec.yaml'], r'''
+    String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
+    newFile('$libPath/main.dart');
+    newFile('$libPath/pubspec.yaml', content: r'''
 name: foobar
 ''');
-    String otherLibPath = newFolder([projPath, 'other_lib']);
-    newFile([otherLibPath, 'entry.dart']);
-    newFile([otherLibPath, 'pubspec.yaml'], r'''
+    String otherLibPath = '$projPath/other_lib';
+    newFile('$otherLibPath/entry.dart');
+    newFile('$otherLibPath/pubspec.yaml', content: r'''
 name: other_lib
 ''');
     // Setup analysis options file with ignore list that ignores the 'other_lib'
     // directory by name.
-    newFile([projPath, optionsFileName], r'''
+    newFile('$projPath/$optionsFileName', content: r'''
 analyzer:
   exclude:
     - 'other_lib'
@@ -2289,19 +2271,19 @@
 
   test_path_filter_recursive_wildcard_child_contexts_option() async {
     // Create files.
-    String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]);
-    newFile([libPath, 'main.dart']);
-    newFile([libPath, 'pubspec.yaml'], r'''
+    String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
+    newFile('$libPath/main.dart');
+    newFile('$libPath/pubspec.yaml', content: r'''
   name: foobar
   ''');
-    String otherLibPath = newFolder([projPath, 'other_lib']);
-    newFile([otherLibPath, 'entry.dart']);
-    newFile([otherLibPath, 'pubspec.yaml'], r'''
+    String otherLibPath = '$projPath/other_lib';
+    newFile('$otherLibPath/entry.dart');
+    newFile('$otherLibPath/pubspec.yaml', content: r'''
   name: other_lib
   ''');
     // Setup analysis options file with ignore list that ignores 'other_lib'
     // and all descendants.
-    newFile([projPath, optionsFileName], r'''
+    newFile('$projPath/$optionsFileName', content: r'''
 analyzer:
   exclude:
     - 'other_lib/**'
@@ -2320,19 +2302,19 @@
 
   test_path_filter_wildcard_child_contexts_option() async {
     // Create files.
-    String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]);
-    newFile([libPath, 'main.dart']);
-    newFile([libPath, 'pubspec.yaml'], r'''
+    String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
+    newFile('$libPath/main.dart');
+    newFile('$libPath/pubspec.yaml', content: r'''
 name: foobar
 ''');
-    String otherLibPath = newFolder([projPath, 'other_lib']);
-    newFile([otherLibPath, 'entry.dart']);
-    newFile([otherLibPath, 'pubspec.yaml'], r'''
+    String otherLibPath = '$projPath/other_lib';
+    newFile('$otherLibPath/entry.dart');
+    newFile('$otherLibPath/pubspec.yaml', content: r'''
 name: other_lib
 ''');
     // Setup analysis options file with ignore list that ignores 'other_lib'
     // and all immediate children.
-    newFile([projPath, optionsFileName], r'''
+    newFile('$projPath/$optionsFileName', content: r'''
 analyzer:
   exclude:
     - 'other_lib/*'
@@ -2355,7 +2337,7 @@
     // create files
     resourceProvider.newFile(projectPubspec, 'name: project');
     resourceProvider.newFile(examplePubspec, 'name: example');
-    newFile([project, optionsFileName], r'''
+    newFile('$project/$optionsFileName', content: r'''
 analyzer:
   exclude:
     - 'example'
@@ -2389,7 +2371,7 @@
     // create files
     resourceProvider.newFile(aPubspec, 'name: aaa');
     resourceProvider.newFile(cPubspec, 'name: ccc');
-    newFile([a, optionsFileName], r'''
+    newFile('$a/$optionsFileName', content: r'''
 analyzer:
   exclude:
     - 'b**'
@@ -2416,12 +2398,12 @@
 
   test_strong_mode_analysis_option() async {
     // Create files.
-    newFile([projPath, optionsFileName], r'''
+    newFile('$projPath/$optionsFileName', content: r'''
 analyzer:
   strong-mode: true
 ''');
-    String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]);
-    newFile([libPath, 'main.dart']);
+    String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
+    newFile('$libPath/main.dart');
     // Setup context.
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
     // Verify that analysis options was parsed and strong-mode set.
@@ -2429,9 +2411,9 @@
   }
 
   test_watchEvents() async {
-    String libPath = newFolder([projPath, ContextManagerTest.LIB_NAME]);
+    String libPath = newFolder('$projPath/${ContextManagerTest.LIB_NAME}').path;
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
-    newFile([libPath, 'main.dart']);
+    newFile('$libPath/main.dart');
     await new Future.delayed(new Duration(milliseconds: 1));
     expect(callbacks.watchEvents, hasLength(1));
   }
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index 334e7f9..f79993c 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -9,10 +9,10 @@
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:plugin/manager.dart';
@@ -26,346 +26,271 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisDomainTest);
+    defineReflectiveTests(AnalysisDomainHandlerTest);
     defineReflectiveTests(SetSubscriptionsTest);
   });
-
-  MockServerChannel serverChannel;
-  MemoryResourceProvider resourceProvider;
-  AnalysisServer server;
-  AnalysisDomainHandler handler;
-
-  void processRequiredPlugins() {
-    ExtensionManager manager = new ExtensionManager();
-    manager.processPlugins(AnalysisEngine.instance.requiredPlugins);
-  }
-
-  setUp(() {
-    serverChannel = new MockServerChannel();
-    resourceProvider = new MemoryResourceProvider();
-    processRequiredPlugins();
-    // Create an SDK in the mock file system.
-    new MockSdk(resourceProvider: resourceProvider);
-    server = new AnalysisServer(
-        serverChannel,
-        resourceProvider,
-        new MockPackageMapProvider(),
-        new AnalysisServerOptions(),
-        new DartSdkManager('/', false),
-        InstrumentationService.NULL_SERVICE);
-    handler = new AnalysisDomainHandler(server);
-  });
-
-  group('updateContent', testUpdateContent);
-
-  group('AnalysisDomainHandler', () {
-    // TODO(brianwilkerson) Re-enable these tests if we re-enable the
-    // analysis.getReachableSources request.
-//    group('getReachableSources', () {
-//      test('valid sources', () async {
-//        String fileA = '/project/a.dart';
-//        String fileB = '/project/b.dart';
-//        resourceProvider.newFile(fileA, 'import "b.dart";');
-//        resourceProvider.newFile(fileB, '');
-//
-//        server.setAnalysisRoots('0', ['/project/'], [], {});
-//
-//        await server.onAnalysisComplete;
-//
-//        var request =
-//            new AnalysisGetReachableSourcesParams(fileA).toRequest('0');
-//        var response = handler.handleRequest(request);
-//
-//        Map json = response.toJson()[Response.RESULT];
-//
-//        // Sanity checks.
-//        expect(json['sources'], hasLength(6));
-//        expect(json['sources']['file:///project/a.dart'],
-//            unorderedEquals(['dart:core', 'file:///project/b.dart']));
-//        expect(json['sources']['file:///project/b.dart'], ['dart:core']);
-//      });
-//
-//      test('invalid source', () async {
-//        resourceProvider.newFile('/project/a.dart', 'import "b.dart";');
-//        server.setAnalysisRoots('0', ['/project/'], [], {});
-//
-//        await server.onAnalysisComplete;
-//
-//        var request =
-//            new AnalysisGetReachableSourcesParams('/does/not/exist.dart')
-//                .toRequest('0');
-//        var response = handler.handleRequest(request);
-//        expect(response.error, isNotNull);
-//        expect(response.error.code,
-//            RequestErrorCode.GET_REACHABLE_SOURCES_INVALID_FILE);
-//      });
-//    });
-
-    group('setAnalysisRoots', () {
-      Response testSetAnalysisRoots(
-          List<String> included, List<String> excluded) {
-        Request request = new AnalysisSetAnalysisRootsParams(included, excluded)
-            .toRequest('0');
-        return handler.handleRequest(request);
-      }
-
-      group('excluded', () {
-        test('excluded folder', () async {
-          String fileA = '/project/aaa/a.dart';
-          String fileB = '/project/bbb/b.dart';
-          resourceProvider.newFile(fileA, '// a');
-          resourceProvider.newFile(fileB, '// b');
-          var response = testSetAnalysisRoots(['/project'], ['/project/bbb']);
-          expect(response, isResponseSuccess('0'));
-        });
-
-        test('not absolute', () async {
-          var response = testSetAnalysisRoots([], ['foo/bar']);
-          expect(
-              response,
-              isResponseFailure(
-                  '0', RequestErrorCode.INVALID_FILE_PATH_FORMAT));
-        });
-
-        test('not normalized', () async {
-          var response = testSetAnalysisRoots([], ['/foo/../bar']);
-          expect(
-              response,
-              isResponseFailure(
-                  '0', RequestErrorCode.INVALID_FILE_PATH_FORMAT));
-        });
-      });
-
-      group('included', () {
-        test('new folder', () async {
-          String file = '/project/bin/test.dart';
-          resourceProvider.newFile('/project/pubspec.yaml', 'name: project');
-          resourceProvider.newFile(file, 'main() {}');
-          var response = testSetAnalysisRoots(['/project'], []);
-          var serverRef = server;
-          expect(response, isResponseSuccess('0'));
-          // verify that unit is resolved eventually
-          await server.onAnalysisComplete;
-          var unit = await serverRef.getResolvedCompilationUnit(file);
-          expect(unit, isNotNull);
-        });
-
-        test('nonexistent folder', () async {
-          String fileB = '/project_b/b.dart';
-          resourceProvider.newFile(fileB, '// b');
-          var response = testSetAnalysisRoots(['/project_a', '/project_b'], []);
-          var serverRef = server;
-          expect(response, isResponseSuccess('0'));
-          // Non-existence of /project_a should not prevent files in /project_b
-          // from being analyzed.
-          await server.onAnalysisComplete;
-          var unit = await serverRef.getResolvedCompilationUnit(fileB);
-          expect(unit, isNotNull);
-        });
-
-        test('not absolute', () async {
-          var response = testSetAnalysisRoots(['foo/bar'], []);
-          expect(
-              response,
-              isResponseFailure(
-                  '0', RequestErrorCode.INVALID_FILE_PATH_FORMAT));
-        });
-
-        test('not normalized', () async {
-          var response = testSetAnalysisRoots(['/foo/../bar'], []);
-          expect(
-              response,
-              isResponseFailure(
-                  '0', RequestErrorCode.INVALID_FILE_PATH_FORMAT));
-        });
-      });
-    });
-
-    group('setPriorityFiles', () {
-      test('invalid', () {
-        var request = new AnalysisSetPriorityFilesParams(['/project/lib.dart'])
-            .toRequest('0');
-        var response = handler.handleRequest(request);
-        expect(response, isResponseSuccess('0'));
-      });
-
-      test('valid', () {
-        resourceProvider.newFolder('/p1');
-        resourceProvider.newFile('/p1/a.dart', 'library a;');
-        resourceProvider.newFolder('/p2');
-        resourceProvider.newFile('/p2/b.dart', 'library b;');
-        resourceProvider.newFile('/p2/c.dart', 'library c;');
-
-        var setRootsRequest =
-            new AnalysisSetAnalysisRootsParams(['/p1', '/p2'], [])
-                .toRequest('0');
-        var setRootsResponse = handler.handleRequest(setRootsRequest);
-        expect(setRootsResponse, isResponseSuccess('0'));
-
-        void setPriorityFiles(List<String> fileList) {
-          var request =
-              new AnalysisSetPriorityFilesParams(fileList).toRequest('0');
-          var response = handler.handleRequest(request);
-          expect(response, isResponseSuccess('0'));
-          // TODO(brianwilkerson) Enable the line below after getPriorityFiles
-          // has been implemented.
-          // expect(server.getPriorityFiles(), unorderedEquals(fileList));
-        }
-
-        setPriorityFiles(['/p1/a.dart', '/p2/b.dart']);
-        setPriorityFiles(['/p2/b.dart', '/p2/c.dart']);
-        setPriorityFiles([]);
-      });
-    });
-
-    group('updateOptions', () {
-      test('invalid', () {
-        var request = new Request('0', ANALYSIS_REQUEST_UPDATE_OPTIONS, {
-          ANALYSIS_REQUEST_UPDATE_OPTIONS_OPTIONS: {'not-an-option': true}
-        });
-        var response = handler.handleRequest(request);
-        // Invalid options should be silently ignored.
-        expect(response, isResponseSuccess('0'));
-      });
-
-      test('null', () {
-        // null is allowed as a synonym for {}.
-        var request = new Request('0', ANALYSIS_REQUEST_UPDATE_OPTIONS,
-            {ANALYSIS_REQUEST_UPDATE_OPTIONS_OPTIONS: null});
-        var response = handler.handleRequest(request);
-        expect(response, isResponseSuccess('0'));
-      });
-    });
-  });
 }
 
-testUpdateContent() {
-  test('bad type', () {
+@reflectiveTest
+class AnalysisDomainHandlerTest extends AbstractAnalysisTest {
+  Future outOfRangeTest(SourceEdit edit) async {
+    AnalysisTestHelper helper = new AnalysisTestHelper();
+    helper.createSingleFileProject('library A;');
+    await helper.onAnalysisComplete;
+    helper.sendContentChange(new AddContentOverlay('library B;'));
+    await helper.onAnalysisComplete;
+    ChangeContentOverlay contentChange = new ChangeContentOverlay([edit]);
+    Request request =
+        new AnalysisUpdateContentParams({helper.testFile: contentChange})
+            .toRequest('0');
+    Response response = helper.handler.handleRequest(request);
+    expect(response,
+        isResponseFailure('0', RequestErrorCode.INVALID_OVERLAY_CHANGE));
+  }
+
+  test_setAnalysisRoots_excludedFolder() async {
+    newFile('/project/aaa/a.dart', content: '// a');
+    newFile('/project/bbb/b.dart', content: '// b');
+    var response = testSetAnalysisRoots(['/project'], ['/project/bbb']);
+    expect(response, isResponseSuccess('0'));
+  }
+
+  test_setAnalysisRoots_included_newFolder() async {
+    newFile('/project/pubspec.yaml', content: 'name: project');
+    String file = newFile('/project/bin/test.dart', content: 'main() {}').path;
+    var response = testSetAnalysisRoots(['/project'], []);
+    var serverRef = server;
+    expect(response, isResponseSuccess('0'));
+    // verify that unit is resolved eventually
+    await server.onAnalysisComplete;
+    var unit = await serverRef.getResolvedCompilationUnit(file);
+    expect(unit, isNotNull);
+  }
+
+  test_setAnalysisRoots_included_nonexistentFolder() async {
+    String fileB = newFile('/project_b/b.dart', content: '// b').path;
+    var response = testSetAnalysisRoots(['/project_a', '/project_b'], []);
+    var serverRef = server;
+    expect(response, isResponseSuccess('0'));
+    // Non-existence of /project_a should not prevent files in /project_b
+    // from being analyzed.
+    await server.onAnalysisComplete;
+    var unit = await serverRef.getResolvedCompilationUnit(fileB);
+    expect(unit, isNotNull);
+  }
+
+  test_setAnalysisRoots_included_notAbsolute() async {
+    var response = testSetAnalysisRoots(['foo/bar'], []);
+    expect(response,
+        isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT));
+  }
+
+  test_setAnalysisRoots_included_notNormalized() async {
+    var response = testSetAnalysisRoots(['/foo/../bar'], []);
+    expect(response,
+        isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT));
+  }
+
+  test_setAnalysisRoots_notAbsolute() async {
+    var response = testSetAnalysisRoots([], ['foo/bar']);
+    expect(response,
+        isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT));
+  }
+
+  test_setAnalysisRoots_notNormalized() async {
+    var response = testSetAnalysisRoots([], ['/foo/../bar']);
+    expect(response,
+        isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT));
+  }
+
+  test_setPriorityFiles_invalid() {
+    var request = new AnalysisSetPriorityFilesParams(['/project/lib.dart'])
+        .toRequest('0');
+    var response = handler.handleRequest(request);
+    expect(response, isResponseSuccess('0'));
+  }
+
+  test_setPriorityFiles_valid() {
+    newFile('/p1/a.dart', content: 'library a;');
+    newFile('/p2/b.dart', content: 'library b;');
+    newFile('/p2/c.dart', content: 'library c;');
+
+    var setRootsRequest =
+        new AnalysisSetAnalysisRootsParams(['/p1', '/p2'], []).toRequest('0');
+    var setRootsResponse = handler.handleRequest(setRootsRequest);
+    expect(setRootsResponse, isResponseSuccess('0'));
+
+    void setPriorityFiles(List<String> fileList) {
+      var request = new AnalysisSetPriorityFilesParams(fileList).toRequest('0');
+      var response = handler.handleRequest(request);
+      expect(response, isResponseSuccess('0'));
+      // TODO(brianwilkerson) Enable the line below after getPriorityFiles
+      // has been implemented.
+      // expect(server.getPriorityFiles(), unorderedEquals(fileList));
+    }
+
+    setPriorityFiles(['/p1/a.dart', '/p2/b.dart']);
+    setPriorityFiles(['/p2/b.dart', '/p2/c.dart']);
+    setPriorityFiles([]);
+  }
+
+  test_updateContent_badType() async {
     AnalysisTestHelper helper = new AnalysisTestHelper();
     helper.createSingleFileProject('// empty');
-    return helper.onAnalysisComplete.then((_) {
-      Request request = new Request('0', ANALYSIS_REQUEST_UPDATE_CONTENT, {
-        ANALYSIS_REQUEST_UPDATE_CONTENT_FILES: {
-          helper.testFile: {
-            'type': 'foo',
-          }
+    await helper.onAnalysisComplete;
+    Request request = new Request('0', ANALYSIS_REQUEST_UPDATE_CONTENT, {
+      ANALYSIS_REQUEST_UPDATE_CONTENT_FILES: {
+        helper.testFile: {
+          'type': 'foo',
         }
-      });
-      Response response = helper.handler.handleRequest(request);
-      expect(response, isResponseFailure('0'));
+      }
     });
-  });
+    Response response = helper.handler.handleRequest(request);
+    expect(response, isResponseFailure('0'));
+  }
 
-  test('full content', () {
+  test_updateContent_changeOnDisk_duringOverride() async {
+    AnalysisTestHelper helper = new AnalysisTestHelper();
+    helper.createSingleFileProject('library A;');
+    await helper.onAnalysisComplete;
+    // update code
+    helper.sendContentChange(new AddContentOverlay('library B;'));
+    // There should be no errors
+    await helper.onAnalysisComplete;
+    expect(helper.getTestErrors(), hasLength(0));
+    // Change file on disk, adding a syntax error.
+    helper.resourceProvider.modifyFile(helper.testFile, 'library lib');
+    // There should still be no errors (file should not have been reread).
+    await helper.onAnalysisComplete;
+    expect(helper.getTestErrors(), hasLength(0));
+    // Send a content change with a null content param--file should be
+    // reread from disk.
+    helper.sendContentChange(new RemoveContentOverlay());
+    // There should be errors now.
+    await helper.onAnalysisComplete;
+    expect(helper.getTestErrors(), hasLength(1));
+  }
+
+  test_updateContent_changeOnDisk_normal() async {
+    AnalysisTestHelper helper = new AnalysisTestHelper();
+    helper.createSingleFileProject('library A;');
+    await helper.onAnalysisComplete;
+    // There should be no errors
+    expect(helper.getTestErrors(), hasLength(0));
+    // Change file on disk, adding a syntax error.
+    helper.resourceProvider.modifyFile(helper.testFile, 'library lib');
+    // There should be errors now.
+    await pumpEventQueue();
+    await helper.onAnalysisComplete;
+    expect(helper.getTestErrors(), hasLength(1));
+  }
+
+  test_updateContent_fullContent() async {
     AnalysisTestHelper helper = new AnalysisTestHelper();
     helper.createSingleFileProject('// empty');
-    return helper.onAnalysisComplete.then((_) {
-      // no errors initially
-      List<AnalysisError> errors = helper.getTestErrors();
-      expect(errors, isEmpty);
-      // update code
-      helper.sendContentChange(new AddContentOverlay('library lib'));
-      // wait, there is an error
-      return helper.onAnalysisComplete.then((_) {
-        List<AnalysisError> errors = helper.getTestErrors();
-        expect(errors, hasLength(1));
-      });
-    });
-  });
+    await helper.onAnalysisComplete;
+    // no errors initially
+    List<AnalysisError> errors = helper.getTestErrors();
+    expect(errors, isEmpty);
+    // update code
+    helper.sendContentChange(new AddContentOverlay('library lib'));
+    // wait, there is an error
+    await helper.onAnalysisComplete;
+    errors = helper.getTestErrors();
+    expect(errors, hasLength(1));
+  }
 
-  test('incremental', () {
+  test_updateContent_incremental() async {
     AnalysisTestHelper helper = new AnalysisTestHelper();
     String initialContent = 'library A;';
     helper.createSingleFileProject(initialContent);
-    return helper.onAnalysisComplete.then((_) {
-      // no errors initially
-      List<AnalysisError> errors = helper.getTestErrors();
-      expect(errors, isEmpty);
-      // Add the file to the cache
-      helper.sendContentChange(new AddContentOverlay(initialContent));
-      // update code
-      helper.sendContentChange(new ChangeContentOverlay(
-          [new SourceEdit('library '.length, 'A;'.length, 'lib')]));
-      // wait, there is an error
-      return helper.onAnalysisComplete.then((_) {
-        List<AnalysisError> errors = helper.getTestErrors();
-        expect(errors, hasLength(1));
-      });
-    });
-  });
+    await helper.onAnalysisComplete;
+    // no errors initially
+    List<AnalysisError> errors = helper.getTestErrors();
+    expect(errors, isEmpty);
+    // Add the file to the cache
+    helper.sendContentChange(new AddContentOverlay(initialContent));
+    // update code
+    helper.sendContentChange(new ChangeContentOverlay(
+        [new SourceEdit('library '.length, 'A;'.length, 'lib')]));
+    // wait, there is an error
+    await helper.onAnalysisComplete;
+    errors = helper.getTestErrors();
+    expect(errors, hasLength(1));
+  }
 
-  test('change on disk, normal', () {
-    AnalysisTestHelper helper = new AnalysisTestHelper();
-    helper.createSingleFileProject('library A;');
-    return helper.onAnalysisComplete.then((_) {
-      // There should be no errors
-      expect(helper.getTestErrors(), hasLength(0));
-      // Change file on disk, adding a syntax error.
-      helper.resourceProvider.modifyFile(helper.testFile, 'library lib');
-      // There should be errors now.
-      return pumpEventQueue().then((_) {
-        return helper.onAnalysisComplete.then((_) {
-          expect(helper.getTestErrors(), hasLength(1));
-        });
-      });
-    });
-  });
+  test_updateContent_outOfRange_beyondEnd() {
+    return outOfRangeTest(new SourceEdit(6, 6, 'foo'));
+  }
 
-  test('change on disk, during override', () {
-    AnalysisTestHelper helper = new AnalysisTestHelper();
-    helper.createSingleFileProject('library A;');
-    return helper.onAnalysisComplete.then((_) {
-      // update code
-      helper.sendContentChange(new AddContentOverlay('library B;'));
-      // There should be no errors
-      return helper.onAnalysisComplete.then((_) {
-        expect(helper.getTestErrors(), hasLength(0));
-        // Change file on disk, adding a syntax error.
-        helper.resourceProvider.modifyFile(helper.testFile, 'library lib');
-        // There should still be no errors (file should not have been reread).
-        return helper.onAnalysisComplete.then((_) {
-          expect(helper.getTestErrors(), hasLength(0));
-          // Send a content change with a null content param--file should be
-          // reread from disk.
-          helper.sendContentChange(new RemoveContentOverlay());
-          // There should be errors now.
-          return helper.onAnalysisComplete.then((_) {
-            expect(helper.getTestErrors(), hasLength(1));
-          });
-        });
-      });
-    });
-  });
+  test_updateContent_outOfRange_negativeLength() {
+    return outOfRangeTest(new SourceEdit(3, -1, 'foo'));
+  }
 
-  group('out of range', () {
-    Future outOfRangeTest(SourceEdit edit) {
-      AnalysisTestHelper helper = new AnalysisTestHelper();
-      helper.createSingleFileProject('library A;');
-      return helper.onAnalysisComplete.then((_) {
-        helper.sendContentChange(new AddContentOverlay('library B;'));
-        return helper.onAnalysisComplete.then((_) {
-          ChangeContentOverlay contentChange = new ChangeContentOverlay([edit]);
-          Request request =
-              new AnalysisUpdateContentParams({helper.testFile: contentChange})
-                  .toRequest('0');
-          Response response = helper.handler.handleRequest(request);
-          expect(response,
-              isResponseFailure('0', RequestErrorCode.INVALID_OVERLAY_CHANGE));
-        });
-      });
-    }
+  test_updateContent_outOfRange_negativeOffset() {
+    return outOfRangeTest(new SourceEdit(-1, 3, 'foo'));
+  }
 
-    test('negative length', () {
-      return outOfRangeTest(new SourceEdit(3, -1, 'foo'));
+  test_updateOptions_invalid() {
+    var request = new Request('0', ANALYSIS_REQUEST_UPDATE_OPTIONS, {
+      ANALYSIS_REQUEST_UPDATE_OPTIONS_OPTIONS: {'not-an-option': true}
     });
+    var response = handler.handleRequest(request);
+    // Invalid options should be silently ignored.
+    expect(response, isResponseSuccess('0'));
+  }
 
-    test('negative offset', () {
-      return outOfRangeTest(new SourceEdit(-1, 3, 'foo'));
-    });
+  test_updateOptions_null() {
+    // null is allowed as a synonym for {}.
+    var request = new Request('0', ANALYSIS_REQUEST_UPDATE_OPTIONS,
+        {ANALYSIS_REQUEST_UPDATE_OPTIONS_OPTIONS: null});
+    var response = handler.handleRequest(request);
+    expect(response, isResponseSuccess('0'));
+  }
 
-    test('beyond end', () {
-      return outOfRangeTest(new SourceEdit(6, 6, 'foo'));
-    });
-  });
+  Response testSetAnalysisRoots(List<String> included, List<String> excluded) {
+    Request request =
+        new AnalysisSetAnalysisRootsParams(included, excluded).toRequest('0');
+    return handler.handleRequest(request);
+  }
+
+  xtest_getReachableSources_invalidSource() async {
+    // TODO(brianwilkerson) Re-enable this test if we re-enable the
+    // analysis.getReachableSources request.
+    newFile('/project/a.dart', content: 'import "b.dart";');
+    server.setAnalysisRoots('0', ['/project/'], [], {});
+
+    await server.onAnalysisComplete;
+
+    var request = new AnalysisGetReachableSourcesParams('/does/not/exist.dart')
+        .toRequest('0');
+    var response = handler.handleRequest(request);
+    expect(response.error, isNotNull);
+    expect(response.error.code,
+        RequestErrorCode.GET_REACHABLE_SOURCES_INVALID_FILE);
+  }
+
+  xtest_getReachableSources_validSources() async {
+    // TODO(brianwilkerson) Re-enable this test if we re-enable the
+    // analysis.getReachableSources request.
+    String fileA = newFile('/project/a.dart', content: 'import "b.dart";').path;
+    newFile('/project/b.dart');
+
+    server.setAnalysisRoots('0', ['/project/'], [], {});
+
+    await server.onAnalysisComplete;
+
+    var request = new AnalysisGetReachableSourcesParams(fileA).toRequest('0');
+    var response = handler.handleRequest(request);
+
+    Map json = response.toJson()[Response.RESULT];
+
+    // Sanity checks.
+    expect(json['sources'], hasLength(6));
+    expect(json['sources']['file:///project/a.dart'],
+        unorderedEquals(['dart:core', 'file:///project/b.dart']));
+    expect(json['sources']['file:///project/b.dart'], ['dart:core']);
+  }
 }
 
 @reflectiveTest
@@ -381,13 +306,11 @@
 
   test_setRoots_packages() {
     // prepare package
-    String pkgFile = '/packages/pkgA/libA.dart';
-    resourceProvider.newFile(pkgFile, '''
+    String pkgFile = newFile('/packages/pkgA/libA.dart', content: '''
 library lib_a;
 class A {}
-''');
-    resourceProvider.newFile(
-        '/project/.packages', 'pkgA:file:///packages/pkgA');
+''').path;
+    newFile('/project/.packages', content: 'pkgA:file:///packages/pkgA');
     addTestFile('''
 import 'package:pkgA/libA.dart';
 main(A a) {
@@ -407,9 +330,8 @@
 /**
  * A helper to test 'analysis.*' requests.
  */
-class AnalysisTestHelper {
+class AnalysisTestHelper extends Object with ResourceProviderMixin {
   MockServerChannel serverChannel;
-  MemoryResourceProvider resourceProvider;
   AnalysisServer server;
   AnalysisDomainHandler handler;
 
@@ -425,7 +347,6 @@
   AnalysisTestHelper() {
     processRequiredPlugins();
     serverChannel = new MockServerChannel();
-    resourceProvider = new MemoryResourceProvider();
     // Create an SDK in the mock file system.
     new MockSdk(resourceProvider: resourceProvider);
     server = new AnalysisServer(
@@ -490,7 +411,7 @@
    * Creates an empty project `/project`.
    */
   void createEmptyProject() {
-    resourceProvider.newFolder('/project');
+    newFolder('/project');
     Request request =
         new AnalysisSetAnalysisRootsParams(['/project'], []).toRequest('0');
     handleSuccessfulRequest(request);
@@ -502,8 +423,8 @@
    */
   void createSingleFileProject(code) {
     this.testCode = _getCodeString(code);
-    resourceProvider.newFolder('/project');
-    resourceProvider.newFile(testFile, testCode);
+    newFolder('/project');
+    newFile(testFile, content: testCode);
     Request request =
         new AnalysisSetAnalysisRootsParams(['/project'], []).toRequest('0');
     handleSuccessfulRequest(request);
@@ -601,11 +522,6 @@
     handleSuccessfulRequest(request);
   }
 
-  String setFileContent(String path, String content) {
-    resourceProvider.newFile(path, content);
-    return path;
-  }
-
   /**
    * Stops the associated server.
    */
@@ -663,13 +579,11 @@
   }
 
   test_afterAnalysis_packageFile_external() async {
-    String pkgFile = '/packages/pkgA/lib/libA.dart';
-    resourceProvider.newFile(pkgFile, '''
+    String pkgFile = newFile('/packages/pkgA/lib/libA.dart', content: '''
 library lib_a;
 class A {}
-''');
-    resourceProvider.newFile(
-        '/project/.packages', 'pkgA:file:///packages/pkgA/lib');
+''').path;
+    newFile('/project/.packages', content: 'pkgA:file:///packages/pkgA/lib');
     //
     addTestFile('''
 import 'package:pkgA/libA.dart';
@@ -691,30 +605,23 @@
   test_afterAnalysis_packageFile_inRoot() async {
     String pkgA = '/pkgA';
     String pkgB = '/pkgA';
-    String pkgFileA = '$pkgA/lib/libA.dart';
-    String pkgFileB = '$pkgA/lib/libB.dart';
-    resourceProvider.newFile(pkgFileA, '''
+    String pkgFileA = newFile('$pkgA/lib/libA.dart', content: '''
 library lib_a;
 class A {}
-''');
-    resourceProvider.newFile(pkgFileB, '''
+''').path;
+    newFile('$pkgA/lib/libB.dart', content: '''
 import 'package:pkgA/libA.dart';
 main() {
   new A();
 }
 ''');
     packageMapProvider.packageMap = {
-      'pkgA': [
-        resourceProvider.newFolder('$pkgA/lib'),
-        resourceProvider.newFolder('$pkgB/lib')
-      ]
+      'pkgA': [newFolder('$pkgA/lib'), newFolder('$pkgB/lib')]
     };
     // add 'pkgA' and 'pkgB' as projects
-    {
-      resourceProvider.newFolder(projectPath);
-      handleSuccessfulRequest(
-          new AnalysisSetAnalysisRootsParams([pkgA, pkgB], []).toRequest('0'));
-    }
+    newFolder(projectPath);
+    handleSuccessfulRequest(
+        new AnalysisSetAnalysisRootsParams([pkgA, pkgB], []).toRequest('0'));
     // wait for analysis, no results initially
     await waitForTasksFinished();
     expect(filesHighlights[pkgFileA], isNull);
@@ -726,12 +633,11 @@
   }
 
   test_afterAnalysis_packageFile_notUsed() async {
-    String pkgFile = '/packages/pkgA/lib/libA.dart';
-    resourceProvider.newFile(pkgFile, '''
+    String pkgFile = newFile('/packages/pkgA/lib/libA.dart', content: '''
 library lib_a;
 class A {}
-''');
-    resourceProvider.newFile('/project/.packages', 'pkgA:/packages/pkgA/lib');
+''').path;
+    newFile('/project/.packages', content: 'pkgA:/packages/pkgA/lib');
     //
     addTestFile('// no "pkgA" reference');
     createProject();
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index 5aad7e4..90b92b4 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -239,7 +239,7 @@
     //
     // We no longer support the analysis of non-dart files.
     //
-    testFile = '/project/web/test.html';
+    testFile = resourceProvider.convertPath('/project/web/test.html');
     addTestFile('''
       <html>^</html>
     ''');
@@ -251,7 +251,7 @@
   }
 
   test_import_uri_with_trailing() {
-    addFile('/project/bin/testA.dart', 'library libA;');
+    newFile('/project/bin/testA.dart', content: 'library libA;');
     addTestFile('''
       import '/project/bin/t^.dart';
       main() {}''');
@@ -499,7 +499,7 @@
   }
 
   test_inDartDoc_reference1() async {
-    addFile('/testA.dart', '''
+    newFile('/testA.dart', content: '''
   part of libA;
   foo(bar) => 0;''');
     addTestFile('''
@@ -528,7 +528,7 @@
   }
 
   test_inherited() {
-    addFile('/libA.dart', 'class A {m() {}}');
+    newFile('/libA.dart', content: 'class A {m() {}}');
     addTestFile('''
 import '/libA.dart';
 class B extends A {
@@ -606,7 +606,7 @@
   }
 
   test_local_override() {
-    addFile('/libA.dart', 'class A {m() {}}');
+    newFile('/libA.dart', content: 'class A {m() {}}');
     addTestFile('''
 import '/libA.dart';
 class B extends A {
@@ -649,7 +649,7 @@
   }
 
   test_overrides() {
-    addFile('/libA.dart', 'class A {m() {}}');
+    newFile('/libA.dart', content: 'class A {m() {}}');
     addTestFile('''
 import '/libA.dart';
 class B extends A {m() {^}}
@@ -663,7 +663,7 @@
   }
 
   test_partFile() {
-    addFile('/project/bin/testA.dart', '''
+    newFile('/project/bin/testA.dart', content: '''
       library libA;
       part "$testFile";
       import 'dart:html';
@@ -683,7 +683,7 @@
   }
 
   test_partFile2() {
-    addFile('/testA.dart', '''
+    newFile('/testA.dart', content: '''
       part of libA;
       class A { }''');
     addTestFile('''
diff --git a/pkg/analysis_server/test/domain_diagnostic_test.dart b/pkg/analysis_server/test/domain_diagnostic_test.dart
index 913294f..c3ff619 100644
--- a/pkg/analysis_server/test/domain_diagnostic_test.dart
+++ b/pkg/analysis_server/test/domain_diagnostic_test.dart
@@ -26,9 +26,8 @@
   }
 
   test_getDiagnostics() async {
-    String file = '/project/bin/test.dart';
-    resourceProvider.newFile('/project/pubspec.yaml', 'name: project');
-    resourceProvider.newFile(file, 'main() {}');
+    newFile('/project/pubspec.yaml', content: 'name: project');
+    newFile('/project/bin/test.dart', content: 'main() {}');
 
     server.setAnalysisRoots('0', ['/project/'], [], {});
 
diff --git a/pkg/analysis_server/test/domain_execution_test.dart b/pkg/analysis_server/test/domain_execution_test.dart
index b46daaa..8ccdb16 100644
--- a/pkg/analysis_server/test/domain_execution_test.dart
+++ b/pkg/analysis_server/test/domain_execution_test.dart
@@ -178,8 +178,7 @@
   }
 
   void test_mapUri_file() {
-    String path = '/a/b.dart';
-    resourceProvider.newFile(path, '');
+    String path = newFile('/a/b.dart').path;
     // map the file
     ExecutionMapUriResult result = _mapUri(file: path);
     expect(result.file, isNull);
@@ -189,7 +188,7 @@
   void test_mapUri_file_dartUriKind() {
     String path = server.findSdk().mapDartUri('dart:async').fullName;
     // hack - pretend that the SDK file exists in the project FS
-    resourceProvider.newFile(path, '// hack');
+    newFile(path, content: '// hack');
     // map file
     ExecutionMapUriResult result = _mapUri(file: path);
     expect(result.file, isNull);
@@ -198,7 +197,7 @@
 
   void test_mapUri_uri() {
     String path = '/a/b.dart';
-    resourceProvider.newFile(path, '');
+    newFile(path);
     // map the uri
     ExecutionMapUriResult result = _mapUri(uri: 'file://$path');
     expect(result.file, '/a/b.dart');
diff --git a/pkg/analysis_server/test/edit/fixes_test.dart b/pkg/analysis_server/test/edit/fixes_test.dart
index 90732cd..684506f 100644
--- a/pkg/analysis_server/test/edit/fixes_test.dart
+++ b/pkg/analysis_server/test/edit/fixes_test.dart
@@ -111,20 +111,21 @@
 
   test_suggestImportFromDifferentAnalysisRoot() async {
     // Set up two projects.
-    resourceProvider..newFolder("/project1")..newFolder("/project2");
+    newFolder("/project1");
+    newFolder("/project2");
     handleSuccessfulRequest(
         new AnalysisSetAnalysisRootsParams(["/project1", "/project2"], [])
             .toRequest('0'),
         handler: analysisHandler);
 
     // Set up files.
-    testFile = "/project1/main.dart";
-    testCode = "main() { print(new Foo()); }";
+    testFile = resourceProvider.convertPath('/project1/main.dart');
+    testCode = 'main() { print(new Foo()); }';
     _addOverlay(testFile, testCode);
     // Add another file in the same project that imports the target file.
     // This ensures it will be analyzed as an implicit Source.
-    _addOverlay("/project1/another.dart", 'import "../project2/target.dart";');
-    _addOverlay("/project2/target.dart", "class Foo() {}");
+    _addOverlay('/project1/another.dart', 'import "../project2/target.dart";');
+    _addOverlay('/project2/target.dart', 'class Foo() {}');
 
     await waitForTasksFinished();
 
diff --git a/pkg/analysis_server/test/edit/organize_directives_test.dart b/pkg/analysis_server/test/edit/organize_directives_test.dart
index cf320de..351891f 100644
--- a/pkg/analysis_server/test/edit/organize_directives_test.dart
+++ b/pkg/analysis_server/test/edit/organize_directives_test.dart
@@ -84,8 +84,8 @@
   }
 
   Future test_OK_remove_unresolvedDirectives() {
-    addFile('$testFolder/existing_part1.dart', 'part of lib;');
-    addFile('$testFolder/existing_part2.dart', 'part of lib;');
+    newFile('$testFolder/existing_part1.dart', content: 'part of lib;');
+    newFile('$testFolder/existing_part2.dart', content: 'part of lib;');
     addTestFile('''
 library lib;
 
diff --git a/pkg/analysis_server/test/edit/refactoring_test.dart b/pkg/analysis_server/test/edit/refactoring_test.dart
index fd225c6..9fe5e02 100644
--- a/pkg/analysis_server/test/edit/refactoring_test.dart
+++ b/pkg/analysis_server/test/edit/refactoring_test.dart
@@ -271,8 +271,7 @@
 
   test_analysis_onlyOneFile() async {
     shouldWaitForFullAnalysis = false;
-    String otherFile = '$testFolder/other.dart';
-    addFile(otherFile, r'''
+    newFile('$testFolder/other.dart', content: r'''
 foo(int myName) {}
 ''');
     addTestFile('''
@@ -445,7 +444,7 @@
 
   test_resetOnAnalysisSetChanged_watch_otherFile() async {
     String otherFile = '$testFolder/other.dart';
-    addFile(otherFile, '// other 1');
+    newFile(otherFile, content: '// other 1');
     addTestFile('''
 main() {
   foo(1 + 2);
@@ -465,7 +464,7 @@
     // The refactoring is reset, even though it's a different file. It is up to
     // analyzer to track dependencies and provide resolved units fast when
     // possible.
-    addFile(otherFile, '// other 2');
+    newFile(otherFile, content: '// other 2');
     await pumpEventQueue();
     expect(test_resetCount, initialResetCount + 1);
   }
@@ -980,7 +979,7 @@
   test_analysis_onlyOneFile() async {
     shouldWaitForFullAnalysis = false;
     String otherFile = '$testFolder/other.dart';
-    addFile(otherFile, r'''
+    newFile(otherFile, content: r'''
 foo(int p) {}
 ''');
     addTestFile('''
@@ -1048,8 +1047,7 @@
   }
 
   test_resetOnAnalysisSetChanged() async {
-    String otherFile = '$testFolder/other.dart';
-    addFile(otherFile, '// other 1');
+    newFile('$testFolder/other.dart', content: '// other 1');
     addTestFile('''
 main() {
   int res = 1 + 2;
@@ -1217,7 +1215,7 @@
   @failingTest
   test_OK() {
     fail('The move file refactoring is not supported under the new driver');
-    resourceProvider.newFile('/project/bin/lib.dart', '');
+    newFile('/project/bin/lib.dart');
     addTestFile('''
 import 'dart:math';
 import 'lib.dart';
@@ -1754,7 +1752,7 @@
   }
 
   test_library_partOfDirective() {
-    addFile('$testFolder/my_lib.dart', '''
+    newFile('$testFolder/my_lib.dart', content: '''
 library aaa.bbb.ccc;
 part 'test.dart';
 ''');
diff --git a/pkg/analysis_server/test/edit/sort_members_test.dart b/pkg/analysis_server/test/edit/sort_members_test.dart
index abce2a0..d6b70c1 100644
--- a/pkg/analysis_server/test/edit/sort_members_test.dart
+++ b/pkg/analysis_server/test/edit/sort_members_test.dart
@@ -178,7 +178,7 @@
   }
 
   test_OK_genericFunctionType() async {
-    addFile(projectPath + '/analysis_options.yaml', '''
+    newFile('$projectPath/analysis_options.yaml', content: '''
 analyzer:
   strong-mode: true
 ''');
diff --git a/pkg/analysis_server/test/search/type_hierarchy_test.dart b/pkg/analysis_server/test/search/type_hierarchy_test.dart
index c2d1547..19e5b52 100644
--- a/pkg/analysis_server/test/search/type_hierarchy_test.dart
+++ b/pkg/analysis_server/test/search/type_hierarchy_test.dart
@@ -164,17 +164,16 @@
 
   test_class_extends_fileAndPackageUris() async {
     // prepare packages
-    String pkgFile = '/packages/pkgA/lib/libA.dart';
-    resourceProvider.newFile(pkgFile, '''
+    newFile('/packages/pkgA/lib/libA.dart', content: '''
 library lib_a;
 class A {}
 class B extends A {}
 ''');
-    resourceProvider.newFile(
-        '/packages/pkgA/.packages', 'pkgA:file:///packages/pkgA/lib');
+    newFile('/packages/pkgA/.packages',
+        content: 'pkgA:file:///packages/pkgA/lib');
     // reference the package from a project
-    resourceProvider.newFile(
-        '$projectPath/.packages', 'pkgA:file:///packages/pkgA/lib');
+    newFile('$projectPath/.packages',
+        content: 'pkgA:file:///packages/pkgA/lib');
     addTestFile('''
 import 'package:pkgA/libA.dart';
 class C extends A {}
@@ -696,7 +695,7 @@
   }
 
   test_member_method_private_differentLib() async {
-    addFile('$testFolder/lib.dart', r'''
+    newFile('$testFolder/lib.dart', content: r'''
 import 'test.dart';
 class A {
   void _m() {}
diff --git a/pkg/analysis_server/test/services/completion/dart/common_usage_sorter_test.dart b/pkg/analysis_server/test/services/completion/dart/common_usage_sorter_test.dart
index b578713..7f455ec 100644
--- a/pkg/analysis_server/test/services/completion/dart/common_usage_sorter_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/common_usage_sorter_test.dart
@@ -84,8 +84,8 @@
 
   test_PrefixedIdentifier_field_inPart() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addFile('/project/bin/myLib.dart',
-        'library L; part "$testFile"; class A {static int s2;}');
+    newFile('/project/bin/myLib.dart',
+        content: 'library L; part "$testFile"; class A {static int s2;}');
     addTestFile('part of L; foo() {A.^}');
     await getSuggestionsWith({
       'L.A': ['s2']
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
index 469bc3a..2e3f899 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
@@ -12,6 +12,7 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/generated/parser.dart' as analyzer;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
@@ -45,6 +46,8 @@
    */
   bool get isNullExpectedReturnTypeConsideredDynamic => true;
 
+  bool get usingFastaParser => analyzer.Parser.useFasta;
+
   void addTestSource(String content) {
     expect(completionOffset, isNull, reason: 'Call addTestUnit exactly once');
     completionOffset = content.indexOf('^');
diff --git a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
index d8a0b4b..da2dc8a 100644
--- a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/keyword_contributor.dart';
-import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
@@ -321,7 +320,7 @@
     // and reports a single function expression argument
     // while analyzer adds the closing paren before the `a`
     // and adds synthetic `;`s making `a` a statement.
-    if (request.target.entity is BlockFunctionBody) {
+    if (usingFastaParser) {
       assertSuggestKeywords([],
           pseudoKeywords: ['async', 'async*', 'sync*'],
           relevance: DART_RELEVANCE_HIGH);
@@ -363,9 +362,8 @@
     addTestSource('main() {foo("bar", () as^ => null');
     await computeSuggestions();
     assertSuggestKeywords([],
-        pseudoKeywords: request.target.entity is ExpressionFunctionBody
-            ? ['async']
-            : ['async', 'async*', 'sync*'],
+        pseudoKeywords:
+            usingFastaParser ? ['async'] : ['async', 'async*', 'sync*'],
         relevance: DART_RELEVANCE_HIGH);
   }
 
@@ -382,7 +380,7 @@
     await computeSuggestions();
     // Fasta interprets the argument as a function expression
     // while analyzer adds synthetic `;`s making `a` a statement.
-    if (request.target.entity is BlockFunctionBody) {
+    if (usingFastaParser) {
       assertSuggestKeywords([],
           pseudoKeywords: ['async', 'async*', 'sync*'],
           relevance: DART_RELEVANCE_HIGH);
@@ -740,7 +738,7 @@
     addTestSource('class A e^ implements foo');
     await computeSuggestions();
     assertSuggestKeywords(
-        request.target.containingNode is ClassDeclaration
+        usingFastaParser
             ? [Keyword.EXTENDS]
             : [Keyword.EXTENDS, Keyword.IMPLEMENTS],
         relevance: DART_RELEVANCE_HIGH);
@@ -750,7 +748,7 @@
     addTestSource('class A e^ implements foo { }');
     await computeSuggestions();
     assertSuggestKeywords(
-        request.target.containingNode is ClassDeclaration
+        usingFastaParser
             ? [Keyword.EXTENDS]
             : [Keyword.EXTENDS, Keyword.IMPLEMENTS],
         relevance: DART_RELEVANCE_HIGH);
@@ -919,7 +917,7 @@
   test_function_async() async {
     addTestSource('main()^');
     await computeSuggestions();
-    assertSuggestKeywords(DECLARATION_KEYWORDS,
+    assertSuggestKeywords(usingFastaParser ? [] : DECLARATION_KEYWORDS,
         pseudoKeywords: ['async', 'async*', 'sync*'],
         relevance: DART_RELEVANCE_HIGH);
   }
@@ -943,7 +941,7 @@
   test_function_async4() async {
     addTestSource('main()a^{}');
     await computeSuggestions();
-    assertSuggestKeywords(DECLARATION_KEYWORDS,
+    assertSuggestKeywords(usingFastaParser ? [] : DECLARATION_KEYWORDS,
         pseudoKeywords: ['async', 'async*', 'sync*'],
         relevance: DART_RELEVANCE_HIGH);
   }
@@ -1475,8 +1473,14 @@
   test_method_async4() async {
     addTestSource('class A { foo() a^{}}');
     await computeSuggestions();
-    assertSuggestKeywords(CLASS_BODY_KEYWORDS,
-        pseudoKeywords: ['async', 'async*', 'sync*']);
+    if (usingFastaParser) {
+      assertSuggestKeywords([],
+          pseudoKeywords: ['async', 'async*', 'sync*'],
+          relevance: DART_RELEVANCE_HIGH);
+    } else {
+      assertSuggestKeywords(CLASS_BODY_KEYWORDS,
+          pseudoKeywords: ['async', 'async*', 'sync*']);
+    }
   }
 
   test_method_async5() async {
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 678806c..1e93e6a 100644
--- a/pkg/analysis_server/test/services/search/search_engine_test.dart
+++ b/pkg/analysis_server/test/services/search/search_engine_test.dart
@@ -8,13 +8,13 @@
 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/file_system/memory_file_system.dart';
 import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.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';
 import 'package:test/test.dart';
@@ -29,8 +29,7 @@
 }
 
 @reflectiveTest
-class SearchEngineImplTest {
-  final MemoryResourceProvider provider = new MemoryResourceProvider();
+class SearchEngineImplTest extends Object with ResourceProviderMixin {
   DartSdk sdk;
   final ByteStore byteStore = new MemoryByteStore();
   final FileContentOverlay contentOverlay = new FileContentOverlay();
@@ -41,36 +40,32 @@
   AnalysisDriverScheduler scheduler;
 
   void setUp() {
-    sdk = new MockSdk(resourceProvider: provider);
+    sdk = new MockSdk(resourceProvider: resourceProvider);
     logger = new PerformanceLog(logBuffer);
     scheduler = new AnalysisDriverScheduler(logger);
     scheduler.start();
   }
 
   test_membersOfSubtypes_hasMembers() async {
-    var a = _p('/test/a.dart');
-    var b = _p('/test/b.dart');
-    var c = _p('/test/c.dart');
-
-    provider.newFile(a, '''
+    var a = newFile('/test/a.dart', content: '''
 class A {
   void a() {}
   void b() {}
   void c() {}
 }
-''');
-    provider.newFile(b, '''
+''').path;
+    var b = newFile('/test/b.dart', content: '''
 import 'a.dart';
 class B extends A {
   void a() {}
 }
-''');
-    provider.newFile(c, '''
+''').path;
+    var c = newFile('/test/c.dart', content: '''
 import 'a.dart';
 class C extends A {
   void b() {}
 }
-''');
+''').path;
 
     var driver1 = _newDriver();
     var driver2 = _newDriver();
@@ -89,20 +84,17 @@
   }
 
   test_membersOfSubtypes_noMembers() async {
-    var a = _p('/test/a.dart');
-    var b = _p('/test/b.dart');
-
-    provider.newFile(a, '''
+    var a = newFile('/test/a.dart', content: '''
 class A {
   void a() {}
   void b() {}
   void c() {}
 }
-''');
-    provider.newFile(b, '''
+''').path;
+    var b = newFile('/test/b.dart', content: '''
 import 'a.dart';
 class B extends A {}
-''');
+''').path;
 
     var driver = _newDriver();
 
@@ -119,22 +111,19 @@
   }
 
   test_membersOfSubtypes_noSubtypes() async {
-    var a = _p('/test/a.dart');
-    var b = _p('/test/b.dart');
-
-    provider.newFile(a, '''
+    var a = newFile('/test/a.dart', content: '''
 class A {
   void a() {}
   void b() {}
   void c() {}
 }
-''');
-    provider.newFile(b, '''
+''').path;
+    var b = newFile('/test/b.dart', content: '''
 import 'a.dart';
 class B {
   void a() {}
 }
-''');
+''').path;
 
     var driver = _newDriver();
 
@@ -151,10 +140,7 @@
   }
 
   test_membersOfSubtypes_private() async {
-    var a = _p('/test/a.dart');
-    var b = _p('/test/b.dart');
-
-    provider.newFile(a, '''
+    var a = newFile('/test/a.dart', content: '''
 class A {
   void a() {}
   void _b() {}
@@ -163,8 +149,8 @@
 class B extends A {
   void _b() {}
 }
-''');
-    provider.newFile(b, '''
+''').path;
+    var b = newFile('/test/b.dart', content: '''
 import 'a.dart';
 class C extends A {
   void a() {}
@@ -173,7 +159,7 @@
 class D extends B {
   void _c() {}
 }
-''');
+''').path;
 
     var driver1 = _newDriver();
     var driver2 = _newDriver();
@@ -191,14 +177,12 @@
   }
 
   test_searchAllSubtypes() async {
-    var p = _p('/test.dart');
-
-    provider.newFile(p, '''
+    var p = newFile('/test.dart', content: '''
 class T {}
 class A extends T {}
 class B extends A {}
 class C implements B {}
-''');
+''').path;
 
     var driver = _newDriver();
     driver.addFile(p);
@@ -215,18 +199,15 @@
   }
 
   test_searchAllSubtypes_acrossDrivers() async {
-    var a = _p('/test/a.dart');
-    var b = _p('/test/b.dart');
-
-    provider.newFile(a, '''
+    var a = newFile('/test/a.dart', content: '''
 class T {}
 class A extends T {}
-''');
-    provider.newFile(b, '''
+''').path;
+    var b = newFile('/test/b.dart', content: '''
 import 'a.dart';
 class B extends A {}
 class C extends B {}
-''');
+''').path;
 
     var driver1 = _newDriver();
     var driver2 = _newDriver();
@@ -246,9 +227,6 @@
   }
 
   test_searchMemberDeclarations() async {
-    var a = _p('/test/a.dart');
-    var b = _p('/test/b.dart');
-
     var codeA = '''
 class A {
   int test; // 1
@@ -263,8 +241,8 @@
 int test;
 ''';
 
-    provider.newFile(a, codeA);
-    provider.newFile(b, codeB);
+    var a = newFile('/test/a.dart', content: codeA).path;
+    var b = newFile('/test/b.dart', content: codeB).path;
 
     var driver1 = _newDriver();
     var driver2 = _newDriver();
@@ -295,23 +273,20 @@
   }
 
   test_searchMemberReferences() async {
-    var a = _p('/test/a.dart');
-    var b = _p('/test/b.dart');
-
-    provider.newFile(a, '''
+    var a = newFile('/test/a.dart', content: '''
 class A {
   int test;
 }
 foo(p) {
   p.test;
 }
-''');
-    provider.newFile(b, '''
+''').path;
+    var b = newFile('/test/b.dart', content: '''
 import 'a.dart';
 bar(p) {
   p.test = 1;
 }
-''');
+''').path;
 
     var driver1 = _newDriver();
     var driver2 = _newDriver();
@@ -334,17 +309,14 @@
   }
 
   test_searchReferences() async {
-    var a = _p('/test/a.dart');
-    var b = _p('/test/b.dart');
-
-    provider.newFile(a, '''
+    var a = newFile('/test/a.dart', content: '''
 class T {}
 T a;
-''');
-    provider.newFile(b, '''
+''').path;
+    var b = newFile('/test/b.dart', content: '''
 import 'a.dart';
 T b;
-''');
+''').path;
 
     var driver1 = _newDriver();
     var driver2 = _newDriver();
@@ -365,17 +337,14 @@
   }
 
   test_searchTopLevelDeclarations() async {
-    var a = _p('/test/a.dart');
-    var b = _p('/test/b.dart');
-
-    provider.newFile(a, '''
+    var a = newFile('/test/a.dart', content: '''
 class A {}
 int a;
-''');
-    provider.newFile(b, '''
+''').path;
+    var b = newFile('/test/b.dart', content: '''
 class B {}
 get b => 42;
-''');
+''').path;
 
     var driver1 = _newDriver();
     var driver2 = _newDriver();
@@ -406,25 +375,23 @@
   }
 
   test_searchTopLevelDeclarations_dependentPackage() async {
-    var a = _p('/a/lib/a.dart');
-    provider.newFile(a, '''
+    var a = newFile('/a/lib/a.dart', content: '''
 class A {}
 ''');
     var driver1 = _newDriver();
-    driver1.addFile(a);
+    driver1.addFile(a.path);
 
     // The package:b uses the class A from the package:a,
     // so it sees the declaration the element A.
-    var b = _p('/b/lib/b.dart');
-    provider.newFile(b, '''
+    var b = newFile('/b/lib/b.dart', content: '''
 import 'package:a/a.dart';
 class B extends A {}
 ''');
     var driver2 = _newDriver(
-        packageUriResolver: new PackageMapUriResolver(provider, {
-      'a': [provider.getFile(a).parent]
+        packageUriResolver: new PackageMapUriResolver(resourceProvider, {
+      'a': [a.parent]
     }));
-    driver2.addFile(b);
+    driver2.addFile(b.path);
 
     while (scheduler.isAnalyzing) {
       await new Future.delayed(new Duration(milliseconds: 1));
@@ -451,23 +418,21 @@
   AnalysisDriver _newDriver({UriResolver packageUriResolver}) {
     var resolvers = <UriResolver>[
       new DartUriResolver(sdk),
-      new ResourceUriResolver(provider)
+      new ResourceUriResolver(resourceProvider)
     ];
     if (packageUriResolver != null) {
       resolvers.add(packageUriResolver);
     }
-    resolvers.add(new ResourceUriResolver(provider));
+    resolvers.add(new ResourceUriResolver(resourceProvider));
 
     return new AnalysisDriver(
         scheduler,
         logger,
-        provider,
+        resourceProvider,
         byteStore,
         contentOverlay,
         null,
-        new SourceFactory(resolvers, null, provider),
+        new SourceFactory(resolvers, null, resourceProvider),
         new AnalysisOptionsImpl()..strongMode = true);
   }
-
-  String _p(String path) => provider.convertPath(path);
 }
diff --git a/pkg/analysis_server/test/src/plugin/plugin_locator_test.dart b/pkg/analysis_server/test/src/plugin/plugin_locator_test.dart
index 38e71a9..db3d3f9 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_locator_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_locator_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/plugin/plugin_locator.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -14,17 +14,14 @@
 }
 
 @reflectiveTest
-class PluginLocatorTest {
-  MemoryResourceProvider resourceProvider;
+class PluginLocatorTest extends Object with ResourceProviderMixin {
   String packageRoot;
   String pubspecPath;
   String defaultDirPath;
   PluginLocator locator;
 
   void setUp() {
-    resourceProvider = new MemoryResourceProvider();
-    packageRoot = resourceProvider.convertPath('/package');
-    resourceProvider.newFolder(packageRoot);
+    packageRoot = newFolder('/package').path;
     locator = new PluginLocator(resourceProvider);
   }
 
@@ -66,25 +63,23 @@
   }
 
   void _createDefaultDir() {
-    defaultDirPath = resourceProvider.pathContext.join(packageRoot,
-        PluginLocator.toolsFolderName, PluginLocator.defaultPluginFolderName);
-    resourceProvider.newFolder(defaultDirPath);
+    defaultDirPath = newFolder(
+            '/package/${PluginLocator.toolsFolderName}/${PluginLocator.defaultPluginFolderName}')
+        .path;
   }
 
   void _createPubspec(String content) {
-    pubspecPath = resourceProvider.pathContext
-        .join(packageRoot, PluginLocator.pubspecFileName);
-    resourceProvider.newFile(pubspecPath, content);
+    pubspecPath =
+        newFile('/package/${PluginLocator.pubspecFileName}', content: content)
+            .path;
   }
 
   String _createPubspecWithKey() {
-    String nonDefaultPath =
-        resourceProvider.pathContext.join(packageRoot, 'pluginDir');
+    String nonDefaultPath = newFolder('/package/pluginDir').path;
     _createPubspec('''
 name: test_project
 ${PluginLocator.analyzerPluginKey}: $nonDefaultPath
 ''');
-    resourceProvider.newFolder(nonDefaultPath);
     return nonDefaultPath;
   }
 
diff --git a/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart b/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
index c9665cd..5d3e5b9a 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
@@ -9,9 +9,9 @@
 import 'package:analysis_server/src/plugin/plugin_manager.dart';
 import 'package:analyzer/context/context_root.dart';
 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/instrumentation/instrumentation.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/channel/channel.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -105,7 +105,6 @@
 
 @reflectiveTest
 class DiscoveredPluginInfoTest {
-  MemoryResourceProvider resourceProvider;
   TestNotificationManager notificationManager;
   String pluginPath = '/pluginDir';
   String executionPath = '/pluginDir/bin/plugin.dart';
@@ -113,7 +112,6 @@
   DiscoveredPluginInfo plugin;
 
   void setUp() {
-    resourceProvider = new MemoryResourceProvider();
     notificationManager = new TestNotificationManager();
     plugin = new DiscoveredPluginInfo(pluginPath, executionPath, packagesPath,
         notificationManager, InstrumentationService.NULL_SERVICE);
@@ -401,15 +399,13 @@
 }
 
 @reflectiveTest
-class PluginManagerTest {
-  MemoryResourceProvider resourceProvider;
+class PluginManagerTest extends Object with ResourceProviderMixin {
   String byteStorePath;
   String sdkPath;
   TestNotificationManager notificationManager;
   PluginManager manager;
 
   void setUp() {
-    resourceProvider = new MemoryResourceProvider();
     byteStorePath = resourceProvider.convertPath('/byteStore');
     sdkPath = resourceProvider.convertPath('/sdk');
     notificationManager = new TestNotificationManager();
@@ -433,16 +429,13 @@
   }
 
   void test_pathsFor_withPackagesFile() {
-    path.Context context = resourceProvider.pathContext;
     //
     // Build the minimal directory structure for a plugin package that includes
     // a .packages file.
     //
-    String pluginDirPath = resourceProvider.convertPath('/plugin');
-    String pluginFilePath = context.join(pluginDirPath, 'bin', 'plugin.dart');
-    resourceProvider.newFile(pluginFilePath, '');
-    String packagesFilePath = context.join(pluginDirPath, '.packages');
-    resourceProvider.newFile(packagesFilePath, '');
+    String pluginDirPath = newFolder('/plugin').path;
+    String pluginFilePath = newFile('/plugin/bin/plugin.dart').path;
+    String packagesFilePath = newFile('/plugin/.packages').path;
     //
     // Test path computation.
     //
@@ -453,20 +446,17 @@
   }
 
   void test_pathsFor_withPubspec_inBazelWorkspace() {
-    path.Context context = resourceProvider.pathContext;
     //
     // Build a Bazel workspace containing four packages, including the plugin.
     //
-    String rootPath = resourceProvider.convertPath('/workspaceRoot');
-    resourceProvider.newFile(context.join(rootPath, 'WORKSPACE'), '');
-    resourceProvider.newFolder(context.join(rootPath, 'bazel-bin'));
-    resourceProvider.newFolder(context.join(rootPath, 'bazel-genfiles'));
+    newFile('/workspaceRoot/WORKSPACE');
+    newFolder('/workspaceRoot/bazel-bin');
+    newFolder('/workspaceRoot/bazel-genfiles');
 
     String newPackage(String packageName, [List<String> dependencies]) {
       String packageRoot =
-          context.join(rootPath, 'third_party', 'dart', packageName);
-      resourceProvider.newFile(
-          context.join(packageRoot, 'lib', packageName + '.dart'), '');
+          newFolder('/workspaceRoot/third_party/dart/$packageName').path;
+      newFile('$packageRoot/lib/$packageName.dart');
       StringBuffer buffer = new StringBuffer();
       if (dependencies != null) {
         buffer.writeln('dependencies:');
@@ -474,8 +464,7 @@
           buffer.writeln('  $dependency: any');
         }
       }
-      resourceProvider.newFile(
-          context.join(packageRoot, 'pubspec.yaml'), buffer.toString());
+      newFile('$packageRoot/pubspec.yaml', content: buffer.toString());
       return packageRoot;
     }
 
@@ -483,15 +472,14 @@
     newPackage('b', ['d']);
     newPackage('c', ['d']);
     newPackage('d');
-    String pluginFilePath = context.join(pluginDirPath, 'bin', 'plugin.dart');
-    resourceProvider.newFile(pluginFilePath, '');
+    String pluginFilePath = newFile('$pluginDirPath/bin/plugin.dart').path;
     //
     // Test path computation.
     //
     List<String> paths = manager.pathsFor(pluginDirPath);
     expect(paths, hasLength(2));
     expect(paths[0], pluginFilePath);
-    File packagesFile = resourceProvider.getFile(paths[1]);
+    File packagesFile = getFile(paths[1]);
     expect(packagesFile.exists, isTrue);
     String content = packagesFile.readAsStringSync();
     List<String> lines = content.split('\n');
@@ -539,8 +527,7 @@
 }
 
 @reflectiveTest
-class PluginSessionTest {
-  MemoryResourceProvider resourceProvider;
+class PluginSessionTest extends Object with ResourceProviderMixin {
   TestNotificationManager notificationManager;
   String pluginPath;
   String executionPath;
@@ -550,7 +537,6 @@
   PluginSession session;
 
   void setUp() {
-    resourceProvider = new MemoryResourceProvider();
     notificationManager = new TestNotificationManager();
     pluginPath = resourceProvider.convertPath('/pluginDir');
     executionPath = resourceProvider.convertPath('/pluginDir/bin/plugin.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 27f99f5..2707c57 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
@@ -17,6 +17,7 @@
 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/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';
 import 'package:path/path.dart' as path;
@@ -32,29 +33,22 @@
 }
 
 @reflectiveTest
-class PluginWatcherTest {
-  MemoryResourceProvider resourceProvider;
+class PluginWatcherTest extends Object with ResourceProviderMixin {
   TestPluginManager manager;
   PluginWatcher watcher;
 
   void setUp() {
-    resourceProvider = new MemoryResourceProvider();
     manager = new TestPluginManager();
     watcher = new PluginWatcher(resourceProvider, manager);
   }
 
   test_addedDriver() async {
-    String pkg1Path = resourceProvider.convertPath('/pkg1');
-    resourceProvider.newFile(
-        resourceProvider.convertPath('/pkg1/lib/test1.dart'), '');
-    resourceProvider.newFile(
-        resourceProvider.convertPath('/pkg2/lib/pkg2.dart'), '');
-    resourceProvider.newFile(
-        resourceProvider.convertPath('/pkg2/pubspec.yaml'), 'name: pkg2');
-    resourceProvider.newFile(
-        resourceProvider.convertPath(
-            '/pkg2/${PluginLocator.toolsFolderName}/${PluginLocator.defaultPluginFolderName}/bin/plugin.dart'),
-        '');
+    String pkg1Path = newFolder('/pkg1').path;
+    newFile('/pkg1/lib/test1.dart');
+    newFile('/pkg2/lib/pkg2.dart');
+    newFile('/pkg2/pubspec.yaml', content: 'name: pkg2');
+    newFile(
+        '/pkg2/${PluginLocator.toolsFolderName}/${PluginLocator.defaultPluginFolderName}/bin/plugin.dart');
 
     ContextRoot contextRoot = new ContextRoot(pkg1Path, []);
     TestDriver driver = new TestDriver(resourceProvider, contextRoot);
@@ -82,9 +76,8 @@
   }
 
   test_addedDriver_missingPackage() async {
-    String pkg1Path = resourceProvider.convertPath('/pkg1');
-    resourceProvider.newFile(
-        resourceProvider.convertPath('/pkg1/lib/test1.dart'), '');
+    String pkg1Path = newFolder('/pkg1').path;
+    newFile('/pkg1/lib/test1.dart');
 
     ContextRoot contextRoot = new ContextRoot(pkg1Path, []);
     TestDriver driver = new TestDriver(resourceProvider, contextRoot);
@@ -106,7 +99,7 @@
   }
 
   test_removedDriver() {
-    String pkg1Path = resourceProvider.convertPath('/pkg1');
+    String pkg1Path = newFolder('/pkg1').path;
     ContextRoot contextRoot = new ContextRoot(pkg1Path, []);
     TestDriver driver = new TestDriver(resourceProvider, contextRoot);
     watcher.addedDriver(driver, contextRoot);
diff --git a/pkg/analysis_server/test/src/watch_manager_test.dart b/pkg/analysis_server/test/src/watch_manager_test.dart
index 19b72c9..2fe0471 100644
--- a/pkg/analysis_server/test/src/watch_manager_test.dart
+++ b/pkg/analysis_server/test/src/watch_manager_test.dart
@@ -6,7 +6,7 @@
 
 import 'package:analysis_server/src/watch_manager.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:watcher/watcher.dart';
@@ -72,67 +72,66 @@
 }
 
 @reflectiveTest
-class WatchManagerTest {
-  MemoryResourceProvider provider;
+class WatchManagerTest extends Object with ResourceProviderMixin {
   WatchListener listener;
   WatchManager<Token> manager;
 
   void setUp() {
-    provider = new MemoryResourceProvider();
     listener = new WatchListener();
-    manager = new WatchManager<Token>(provider, listener.handleWatchEvent);
+    manager =
+        new WatchManager<Token>(resourceProvider, listener.handleWatchEvent);
   }
 
   Future test_addFolder_folderAndSubfolder() async {
-    Folder topFolder = provider.getFolder('/a/b');
-    Folder childFolder = provider.getFolder('/a/b/c/d');
+    Folder topFolder = getFolder('/a/b');
+    Folder childFolder = getFolder('/a/b/c/d');
     Token topToken = new Token('topToken');
     Token childToken = new Token('childToken');
     manager.addFolder(topFolder, topToken);
     manager.addFolder(childFolder, childToken);
 
-    File newFile1 = provider.newFile('/a/b/c/lib.dart', '');
+    File newFile1 = newFile('/a/b/c/lib.dart');
     await _expectEvent(ChangeType.ADD, newFile1.path, [topToken]);
 
-    File newFile2 = provider.newFile('/a/b/c/d/lib.dart', '');
+    File newFile2 = newFile('/a/b/c/d/lib.dart');
     return _expectEvent(ChangeType.ADD, newFile2.path, [topToken, childToken]);
   }
 
   Future test_addFolder_singleFolder_multipleTokens() {
-    Folder folder = provider.getFolder('/a/b');
+    Folder folder = getFolder('/a/b');
     Token token1 = new Token('token1');
     Token token2 = new Token('token2');
     manager.addFolder(folder, token1);
     manager.addFolder(folder, token2);
 
-    File newFile = provider.newFile('/a/b/lib.dart', '');
-    return _expectEvent(ChangeType.ADD, newFile.path, [token1, token2]);
+    File addedFile = newFile('/a/b/lib.dart');
+    return _expectEvent(ChangeType.ADD, addedFile.path, [token1, token2]);
   }
 
   Future test_addFolder_singleFolder_singleToken() async {
-    Folder folder = provider.getFolder('/a/b');
+    Folder folder = getFolder('/a/b');
     Token token = new Token('token');
     manager.addFolder(folder, token);
 
-    Folder newFolder = provider.newFolder('/a/b/c');
-    await _expectEvent(ChangeType.ADD, newFolder.path, [token]);
+    Folder addedFolder = newFolder('/a/b/c');
+    await _expectEvent(ChangeType.ADD, addedFolder.path, [token]);
 
-    File newFile = provider.newFile('/a/b/c/lib.dart', '');
-    return _expectEvent(ChangeType.ADD, newFile.path, [token]);
+    File addedFile = newFile('/a/b/c/lib.dart');
+    return _expectEvent(ChangeType.ADD, addedFile.path, [token]);
   }
 
   Future test_addFolder_unrelatedFolders() async {
-    Folder folder1 = provider.getFolder('/a/b');
-    Folder folder2 = provider.getFolder('/c/d');
+    Folder folder1 = getFolder('/a/b');
+    Folder folder2 = getFolder('/c/d');
     Token token1 = new Token('token1');
     Token token2 = new Token('token2');
     manager.addFolder(folder1, token1);
     manager.addFolder(folder2, token2);
 
-    File newFile1 = provider.newFile('/a/b/lib.dart', '');
+    File newFile1 = newFile('/a/b/lib.dart');
     await _expectEvent(ChangeType.ADD, newFile1.path, [token1]);
 
-    File newFile2 = provider.newFile('/c/d/lib.dart', '');
+    File newFile2 = newFile('/c/d/lib.dart');
     return _expectEvent(ChangeType.ADD, newFile2.path, [token2]);
   }
 
@@ -141,40 +140,40 @@
   }
 
   Future test_removeFolder_multipleTokens() {
-    Folder folder = provider.getFolder('/a/b');
+    Folder folder = getFolder('/a/b');
     Token token1 = new Token('token1');
     Token token2 = new Token('token2');
     manager.addFolder(folder, token1);
     manager.addFolder(folder, token2);
     manager.removeFolder(folder, token2);
 
-    File newFile = provider.newFile('/a/b/lib.dart', '');
-    return _expectEvent(ChangeType.ADD, newFile.path, [token1]);
+    File addedFile = newFile('/a/b/lib.dart');
+    return _expectEvent(ChangeType.ADD, addedFile.path, [token1]);
   }
 
   Future test_removeFolder_withChildren() async {
-    Folder topFolder = provider.getFolder('/a/b');
-    Folder childFolder = provider.getFolder('/a/b/c/d');
+    Folder topFolder = getFolder('/a/b');
+    Folder childFolder = getFolder('/a/b/c/d');
     Token topToken = new Token('topToken');
     Token childToken = new Token('childToken');
     manager.addFolder(topFolder, topToken);
     manager.addFolder(childFolder, childToken);
     manager.removeFolder(topFolder, topToken);
 
-    File newFile = provider.newFile('/a/b/c/d/lib.dart', '');
-    await _expectEvent(ChangeType.ADD, newFile.path, [childToken]);
+    File addedFile = newFile('/a/b/c/d/lib.dart');
+    await _expectEvent(ChangeType.ADD, addedFile.path, [childToken]);
 
-    provider.newFile('/a/b/lib.dart', '');
+    newFile('/a/b/lib.dart');
     return _expectNoEvent();
   }
 
   Future test_removeFolder_withNoChildren() {
-    Folder folder = provider.getFolder('/a/b');
+    Folder folder = getFolder('/a/b');
     Token token = new Token('token');
     manager.addFolder(folder, token);
     manager.removeFolder(folder, token);
 
-    provider.newFile('/a/b/lib.dart', '');
+    newFile('/a/b/lib.dart');
     return _expectNoEvent();
   }
 
@@ -197,11 +196,9 @@
 }
 
 @reflectiveTest
-class WatchNodeTest {
-  MemoryResourceProvider provider = new MemoryResourceProvider();
-
+class WatchNodeTest extends Object with ResourceProviderMixin {
   void test_creation_folder() {
-    Folder folder = provider.getFolder('/a/b');
+    Folder folder = getFolder('/a/b');
     WatchNode node = new WatchNode(folder);
     expect(node, isNotNull);
     expect(node.children, isEmpty);
@@ -223,9 +220,9 @@
 
   void test_delete_nested_child() {
     WatchNode rootNode = new WatchNode(null);
-    WatchNode topNode = new WatchNode(provider.getFolder('/a/b'));
-    WatchNode childNode = new WatchNode(provider.getFolder('/a/b/c/d'));
-    WatchNode grandchildNode = new WatchNode(provider.getFolder('/a/b/c/d/e'));
+    WatchNode topNode = new WatchNode(getFolder('/a/b'));
+    WatchNode childNode = new WatchNode(getFolder('/a/b/c/d'));
+    WatchNode grandchildNode = new WatchNode(getFolder('/a/b/c/d/e'));
     rootNode.insert(topNode);
     rootNode.insert(childNode);
     rootNode.insert(grandchildNode);
@@ -239,8 +236,8 @@
 
   void test_delete_nested_noChild() {
     WatchNode rootNode = new WatchNode(null);
-    WatchNode topNode = new WatchNode(provider.getFolder('/a/b'));
-    WatchNode childNode = new WatchNode(provider.getFolder('/a/b/c/d'));
+    WatchNode topNode = new WatchNode(getFolder('/a/b'));
+    WatchNode childNode = new WatchNode(getFolder('/a/b/c/d'));
     rootNode.insert(topNode);
     rootNode.insert(childNode);
 
@@ -252,8 +249,8 @@
 
   void test_delete_top_child() {
     WatchNode rootNode = new WatchNode(null);
-    WatchNode topNode = new WatchNode(provider.getFolder('/a/b'));
-    WatchNode childNode = new WatchNode(provider.getFolder('/a/b/c/d'));
+    WatchNode topNode = new WatchNode(getFolder('/a/b'));
+    WatchNode childNode = new WatchNode(getFolder('/a/b/c/d'));
     rootNode.insert(topNode);
     rootNode.insert(childNode);
 
@@ -264,7 +261,7 @@
 
   void test_delete_top_noChild() {
     WatchNode rootNode = new WatchNode(null);
-    WatchNode topNode = new WatchNode(provider.getFolder('/a/b'));
+    WatchNode topNode = new WatchNode(getFolder('/a/b'));
     rootNode.insert(topNode);
 
     topNode.delete();
@@ -273,7 +270,7 @@
 
   void test_findParent_childOfLeaf() {
     WatchNode rootNode = new WatchNode(null);
-    WatchNode topNode = new WatchNode(provider.getFolder('/a/b'));
+    WatchNode topNode = new WatchNode(getFolder('/a/b'));
     rootNode.insert(topNode);
 
     expect(rootNode.findParent('/a/b/c'), topNode);
@@ -281,8 +278,8 @@
 
   void test_findParent_childOfNonLeaf() {
     WatchNode rootNode = new WatchNode(null);
-    WatchNode topNode = new WatchNode(provider.getFolder('/a/b'));
-    WatchNode childNode = new WatchNode(provider.getFolder('/a/b/c/d'));
+    WatchNode topNode = new WatchNode(getFolder('/a/b'));
+    WatchNode childNode = new WatchNode(getFolder('/a/b/c/d'));
     rootNode.insert(topNode);
     rootNode.insert(childNode);
 
@@ -291,7 +288,7 @@
 
   void test_findParent_noMatch() {
     WatchNode rootNode = new WatchNode(null);
-    WatchNode topNode = new WatchNode(provider.getFolder('/a/b'));
+    WatchNode topNode = new WatchNode(getFolder('/a/b'));
     rootNode.insert(topNode);
 
     expect(rootNode.findParent('/c/d'), rootNode);
@@ -299,9 +296,9 @@
 
   void test_insert_intermediate_afterParentAndChild() {
     WatchNode rootNode = new WatchNode(null);
-    WatchNode topNode = new WatchNode(provider.getFolder('/a/b'));
-    WatchNode childNode = new WatchNode(provider.getFolder('/a/b/c/d'));
-    WatchNode intermediateNode = new WatchNode(provider.getFolder('/a/b/c'));
+    WatchNode topNode = new WatchNode(getFolder('/a/b'));
+    WatchNode childNode = new WatchNode(getFolder('/a/b/c/d'));
+    WatchNode intermediateNode = new WatchNode(getFolder('/a/b/c'));
 
     rootNode.insert(topNode);
     rootNode.insert(childNode);
@@ -316,8 +313,8 @@
 
   void test_insert_nested_afterParent() {
     WatchNode rootNode = new WatchNode(null);
-    WatchNode topNode = new WatchNode(provider.getFolder('/a/b'));
-    WatchNode childNode = new WatchNode(provider.getFolder('/a/b/c/d'));
+    WatchNode topNode = new WatchNode(getFolder('/a/b'));
+    WatchNode childNode = new WatchNode(getFolder('/a/b/c/d'));
 
     rootNode.insert(topNode);
     rootNode.insert(childNode);
@@ -328,8 +325,8 @@
 
   void test_insert_nested_beforeParent() {
     WatchNode rootNode = new WatchNode(null);
-    WatchNode topNode = new WatchNode(provider.getFolder('/a/b'));
-    WatchNode childNode = new WatchNode(provider.getFolder('/a/b/c/d'));
+    WatchNode topNode = new WatchNode(getFolder('/a/b'));
+    WatchNode childNode = new WatchNode(getFolder('/a/b/c/d'));
 
     rootNode.insert(childNode);
     rootNode.insert(topNode);
@@ -340,7 +337,7 @@
 
   void test_insert_top() {
     WatchNode rootNode = new WatchNode(null);
-    WatchNode topNode = new WatchNode(provider.getFolder('/a/b'));
+    WatchNode topNode = new WatchNode(getFolder('/a/b'));
 
     rootNode.insert(topNode);
     expect(rootNode.children, equals([topNode]));
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 20bd277..b06f3f7 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -551,6 +551,7 @@
         for (ImportElement importElement in _libraryElement.imports) {
           if (matchNodeElement(directive, importElement)) {
             directive.element = importElement;
+            directive.prefix?.staticElement = importElement.prefix;
             Source source = importElement.importedLibrary?.source;
             if (source != null && !_isLibrarySource(source)) {
               ErrorCode errorCode = importElement.isDeferred
@@ -1227,22 +1228,15 @@
       kernel.VariableDeclaration variable = kernelType.function.variable;
       FunctionElement element = declarationToElement[variable];
       return element.type;
-    } else if (kernelType is kernel.MemberInvocationDartType) {
-      kernel.Member member = kernelType.member;
-      if (member is kernel.Procedure &&
-          member.kind == kernel.ProcedureKind.Method) {
-        ExecutableElementImpl element =
-            resynthesizer.getElementFromCanonicalName(member.canonicalName);
-        return resynthesizer.instantiateFunctionType(
-            context,
-            element,
-            member.function,
-            member.function.functionType.withoutTypeParameters,
-            kernelType.type);
-      }
-      return DynamicTypeImpl.instance;
     } else if (kernelType is kernel.IndexAssignNullFunctionType) {
       return null;
+    } else if (kernelType is kernel.TypeArgumentsDartType) {
+      List<kernel.DartType> kernelTypes = kernelType.types;
+      var types = new List<DartType>(kernelTypes.length);
+      for (var i = 0; i < kernelTypes.length; i++) {
+        types[i] = translateType(kernelTypes[i]);
+      }
+      return new TypeArgumentsDartType(types);
     } else {
       return resynthesizer.getType(context, kernelType);
     }
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 0f26c2c..8da11b2 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -8603,11 +8603,11 @@
 
   @override
   String get name {
-    if (_kernel != null) {
-      return _kernel.name;
-    }
-    if (_unlinkedImport != null) {
-      if (_name == null) {
+    if (_name == null) {
+      if (_kernel != null) {
+        return _name = _kernel.name;
+      }
+      if (_unlinkedImport != null) {
         LibraryElementImpl library = enclosingElement as LibraryElementImpl;
         int prefixId = _unlinkedImport.prefixReference;
         return _name = library._unlinkedDefiningUnit.references[prefixId].name;
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index f5c683c..61f5a19 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -19,7 +19,6 @@
         MemberKind,
         optional,
         Parser;
-import 'package:front_end/src/fasta/scanner/string_scanner.dart';
 import 'package:front_end/src/fasta/scanner.dart' hide StringToken;
 import 'package:front_end/src/scanner/token.dart'
     show
@@ -2696,83 +2695,10 @@
   }
 
   @override
-  Token injectGenericCommentTypeAssign(Token token) {
-    // TODO(paulberry,scheglov,ahe): figure out how to share these generic
-    // comment methods with BodyBuilder.
-    return _injectGenericComment(
-        token, TokenType.GENERIC_METHOD_TYPE_ASSIGN, 3);
-  }
-
-  @override
-  Token injectGenericCommentTypeList(Token token) {
-    return _injectGenericComment(token, TokenType.GENERIC_METHOD_TYPE_LIST, 2);
-  }
-
-  @override
-  Token replaceTokenWithGenericCommentTypeAssign(
-      Token tokenToStartReplacing, Token tokenWithComment) {
-    Token injected = injectGenericCommentTypeAssign(tokenWithComment);
-    if (!identical(injected, tokenWithComment)) {
-      Token prev = tokenToStartReplacing.previous;
-      prev.setNextWithoutSettingPrevious(injected);
-      tokenToStartReplacing = injected;
-      tokenToStartReplacing.previous = prev;
-    }
-    return tokenToStartReplacing;
-  }
-
-  @override
   void discardTypeReplacedWithCommentTypeAssign() {
     pop();
   }
 
-  /// Check if the given [token] has a comment token with the given [type],
-  /// which should be either [TokenType.GENERIC_METHOD_TYPE_ASSIGN] or
-  /// [TokenType.GENERIC_METHOD_TYPE_LIST].  If found, parse the comment
-  /// into tokens and inject into the token stream before the [token].
-  Token _injectGenericComment(Token token, TokenType type, int prefixLen) {
-    if (parseGenericMethodComments) {
-      CommentToken t = token.precedingComments;
-      for (; t != null; t = t.next) {
-        if (t.type == type) {
-          String code = t.lexeme.substring(prefixLen, t.lexeme.length - 2);
-          Token tokens = _scanGenericMethodComment(code, t.offset + prefixLen);
-          if (tokens != null) {
-            // Remove the token from the comment stream.
-            t.remove();
-            // Insert the tokens into the stream.
-            _injectTokenList(token, tokens);
-            return tokens;
-          }
-        }
-      }
-    }
-    return token;
-  }
-
-  void _injectTokenList(Token beforeToken, Token firstToken) {
-    // Scanner creates a cyclic EOF token.
-    Token lastToken = firstToken;
-    while (lastToken.next.type != TokenType.EOF) {
-      lastToken = lastToken.next;
-    }
-    // Inject these new tokens into the stream.
-    Token previous = beforeToken.previous;
-    lastToken.setNext(beforeToken);
-    previous.setNext(firstToken);
-    beforeToken = firstToken;
-  }
-
-  /// Scans the given [code], and returns the tokens, otherwise returns `null`.
-  Token _scanGenericMethodComment(String code, int offset) {
-    var scanner = new SubStringScanner(offset, code);
-    Token firstToken = scanner.tokenize();
-    if (scanner.hasErrors) {
-      return null;
-    }
-    return firstToken;
-  }
-
   @override
   void addCompileTimeError(Message message, int offset, int length) {
     if (directives.isEmpty &&
diff --git a/pkg/analyzer/lib/src/fasta/error_converter.dart b/pkg/analyzer/lib/src/fasta/error_converter.dart
index 02e3688..0976bb8 100644
--- a/pkg/analyzer/lib/src/fasta/error_converter.dart
+++ b/pkg/analyzer/lib/src/fasta/error_converter.dart
@@ -18,8 +18,10 @@
   /// [errorReporter].
   FastaErrorReporter(this.errorReporter);
 
-  void reportByCode(String analyzerCode, int offset, int length,
-      Map<String, dynamic> arguments) {
+  void reportByCode(
+      String analyzerCode, int offset, int length, Message message) {
+    Map<String, dynamic> arguments = message.arguments;
+
     String stringOrTokenLexeme() {
       var text = arguments['string'];
       if (text == null) {
@@ -293,8 +295,8 @@
             StrongModeCode.INVALID_CAST_NEW_EXPR, offset, length);
         return;
       case "INVALID_MODIFIER_ON_SETTER":
-        errorReporter?.reportErrorForOffset(
-            CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, offset, length);
+        _reportByCode(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, message,
+            offset, length);
         return;
       case "INVALID_OPERATOR":
         String text = stringOrTokenLexeme();
@@ -302,8 +304,8 @@
             ParserErrorCode.INVALID_OPERATOR, offset, length, [text]);
         return;
       case "INVALID_OPERATOR_FOR_SUPER":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, offset, length);
+        _reportByCode(ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, message,
+            offset, length);
         return;
       case "LIBRARY_DIRECTIVE_NOT_FIRST":
         errorReporter?.reportErrorForOffset(
@@ -547,6 +549,19 @@
   void reportMessage(Message message, int offset, int length) {
     Code code = message.code;
 
-    reportByCode(code.analyzerCode, offset, length, message.arguments);
+    reportByCode(code.analyzerCode, offset, length, message);
+  }
+
+  void _reportByCode(
+      ErrorCode errorCode, Message message, int offset, int length) {
+    if (errorReporter != null) {
+      errorReporter.reportError(new AnalysisError.forValues(
+          errorReporter.source,
+          offset,
+          length,
+          errorCode,
+          message.message,
+          null));
+    }
   }
 }
diff --git a/pkg/analyzer/lib/src/fasta/resolution_applier.dart b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
index ccc7295..99dcdc7 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_applier.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
@@ -11,7 +11,6 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/fasta/resolution_storer.dart';
-import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:front_end/src/base/syntactic_entity.dart';
 import 'package:front_end/src/scanner/token.dart';
 import 'package:kernel/kernel.dart' as kernel;
@@ -95,6 +94,7 @@
         operatorType != TokenType.BAR_BAR) {
       node.staticElement = _getReferenceFor(node.operator);
       _getTypeFor(node.operator); // function type of the operator
+      _getTypeFor(node.operator); // type arguments
     }
 
     // Record the return type of the expression.
@@ -290,6 +290,7 @@
 
     // We cannot use the detached FunctionType of `[]` or `[]=`.
     _getTypeFor(node.leftBracket);
+    _getTypeFor(node.leftBracket); // type arguments
 
     node.staticType = _getTypeFor(node.leftBracket);
 
@@ -303,13 +304,14 @@
     DartType type = _getTypeFor(constructorName);
     ConstructorElement element = _getReferenceFor(constructorName);
 
+    constructorName.staticElement = element;
+
     node.staticElement = element;
     node.staticType = type;
 
     applyConstructorElement(type, element, constructorName);
 
     ArgumentList argumentList = node.argumentList;
-    _associateArgumentsWithParameters(element?.parameters, argumentList);
     _applyResolutionToArguments(argumentList);
   }
 
@@ -348,6 +350,7 @@
 
     Element invokeElement = _getReferenceFor(node.methodName);
     DartType invokeType = _getTypeFor(node.methodName);
+    DartType typeArgumentsDartType = _getTypeFor(argumentList);
     DartType resultType = _getTypeFor(argumentList);
 
     if (invokeElement is PropertyInducingElement) {
@@ -361,10 +364,11 @@
     node.methodName.staticType = invokeType;
 
     if (invokeType is FunctionType) {
-      if (node.typeArguments != null) {
-        _applyTypeArgumentsToList(invokeType, node.typeArguments.arguments);
+      if (node.typeArguments != null &&
+          typeArgumentsDartType is TypeArgumentsDartType) {
+        _applyTypeArgumentsToList(
+            typeArgumentsDartType, node.typeArguments.arguments);
       }
-      _associateArgumentsWithParameters(invokeType.parameters, argumentList);
     }
 
     _applyResolutionToArguments(argumentList);
@@ -415,6 +419,7 @@
       SyntacticEntity entity = node.operator;
       node.staticElement = _getReferenceFor(entity);
       _getTypeFor(entity); // The function type of the operator.
+      _getTypeFor(entity); // The type arguments (empty).
       node.staticType = _getTypeFor(entity);
     }
   }
@@ -436,7 +441,6 @@
     constructorName?.staticElement = element;
 
     ArgumentList argumentList = node.argumentList;
-    _associateArgumentsWithParameters(element?.parameters, argumentList);
     _applyResolutionToArguments(argumentList);
   }
 
@@ -543,33 +547,6 @@
     }
   }
 
-  /// Associate arguments of the [argumentList] with the [parameters].
-  void _associateArgumentsWithParameters(
-      List<ParameterElement> parameters, ArgumentList argumentList) {
-    if (parameters != null) {
-      List<Expression> arguments = argumentList.arguments;
-      var correspondingParameters =
-          new List<ParameterElement>(arguments.length);
-      for (int i = 0; i < arguments.length; i++) {
-        var argument = arguments[i];
-        if (argument is NamedExpression) {
-          for (var parameter in parameters) {
-            SimpleIdentifier label = argument.name.label;
-            if (parameter.parameterKind == ParameterKind.NAMED &&
-                parameter.name == label.name) {
-              label.staticElement = parameter;
-              correspondingParameters[i] = parameter;
-              break;
-            }
-          }
-        } else {
-          correspondingParameters[i] = parameters[i];
-        }
-      }
-      argumentList.correspondingStaticParameters = correspondingParameters;
-    }
-  }
-
   /// Return the [SyntacticEntity] with which the front-end associates
   /// assignment to the given [leftHandSide].
   SyntacticEntity _getAssignmentEntity(Expression leftHandSide) {
@@ -775,6 +752,24 @@
   }
 }
 
+/// A container with [typeArguments].
+class TypeArgumentsDartType implements ParameterizedType {
+  @override
+  final List<DartType> typeArguments;
+
+  TypeArgumentsDartType(this.typeArguments);
+
+  @override
+  bool get isUndefined => false;
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+
+  @override
+  String toString() {
+    return '<${typeArguments.join(', ')}>';
+  }
+}
+
 /// Context for translating types.
 abstract class TypeContext {
   /// The enclosing [ClassElement], or `null` if not in a class.
diff --git a/pkg/analyzer/lib/src/fasta/resolution_storer.dart b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
index d1d04a9..e059b8b 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_storer.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
@@ -160,21 +160,6 @@
   }
 }
 
-/// Information about invocation of the [member] and its instantiated [type].
-class MemberInvocationDartType implements DartType {
-  final Member member;
-  final FunctionType type;
-
-  MemberInvocationDartType(this.member, this.type);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  String toString() {
-    return '($member, $type)';
-  }
-}
-
 /// A reference to the setter represented by the [member].
 /// The [member] might be either a setter itself, or a field.
 class MemberSetterNode implements TreeNode {
@@ -381,6 +366,7 @@
   void indexAssignAfterReceiver(Expression write, DartType typeContext) {
     _deferReference(write.fileOffset);
     _recordType(const IndexAssignNullFunctionType(), write.fileOffset);
+    _recordType(new TypeArgumentsDartType(<DartType>[]), write.fileOffset);
     _deferType(write.fileOffset);
   }
 
@@ -438,6 +424,7 @@
       _deferType(expression.fileOffset);
     }
     _deferType(expression.fileOffset);
+    _deferType(expression.fileOffset);
     super.methodInvocationBeforeArgs(expression, isImplicitCall);
   }
 
@@ -450,11 +437,11 @@
       FunctionType calleeType,
       Substitution substitution,
       DartType inferredType) {
-    _replaceType(
-        inferredType,
-        arguments.fileOffset != -1
-            ? arguments.fileOffset
-            : expression.fileOffset);
+    int resultOffset = arguments.fileOffset != -1
+        ? arguments.fileOffset
+        : expression.fileOffset;
+    _replaceType(inferredType, resultOffset);
+    _replaceType(new TypeArgumentsDartType(arguments.types), resultOffset);
     if (!isImplicitCall) {
       if (interfaceMember is ForwardingStub) {
         interfaceMember = ForwardingStub.getInterfaceTarget(interfaceMember);
@@ -463,7 +450,7 @@
       FunctionType invokeType = substitution == null
           ? calleeType
           : substitution.substituteType(calleeType.withoutTypeParameters);
-      _replaceType(new MemberInvocationDartType(interfaceMember, invokeType));
+      _replaceType(invokeType);
     }
     super.genericExpressionExit("methodInvocation", expression, inferredType);
   }
@@ -471,11 +458,11 @@
   @override
   void methodInvocationExitCall(Expression expression, Arguments arguments,
       bool isImplicitCall, DartType inferredType) {
-    _replaceType(
-        inferredType,
-        arguments.fileOffset != -1
-            ? arguments.fileOffset
-            : expression.fileOffset);
+    int resultOffset = arguments.fileOffset != -1
+        ? arguments.fileOffset
+        : expression.fileOffset;
+    _replaceType(inferredType, resultOffset);
+    _replaceType(new TypeArgumentsDartType(arguments.types), resultOffset);
     if (!isImplicitCall) {
       throw new UnimplementedError(); // TODO(scheglov): handle this case
     }
@@ -620,6 +607,7 @@
     // type later.
     _deferType(expression.fileOffset);
     _deferType(expression.arguments.fileOffset);
+    _deferType(expression.arguments.fileOffset);
     return super.staticInvocationEnter(
         expression, prefixName, targetOffset, targetClass, typeContext);
   }
@@ -632,10 +620,11 @@
       DartType inferredType) {
     _replaceType(inferredType);
     _replaceReference(expression.target);
+    _replaceType(new TypeArgumentsDartType(expression.arguments.types));
     FunctionType invokeType = substitution == null
         ? calleeType
         : substitution.substituteType(calleeType.withoutTypeParameters);
-    _replaceType(new MemberInvocationDartType(expression.target, invokeType));
+    _replaceType(invokeType);
     super.genericExpressionExit("staticInvocation", expression, inferredType);
   }
 
@@ -768,3 +757,17 @@
     _types[slot] = type;
   }
 }
+
+/// A [DartType] wrapper around invocation type arguments.
+class TypeArgumentsDartType implements DartType {
+  final List<DartType> types;
+
+  TypeArgumentsDartType(this.types);
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+
+  @override
+  String toString() {
+    return '<${types.join(', ')}>';
+  }
+}
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 1b8b79e..75a93ec 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -750,6 +750,11 @@
   static const String ANALYSIS_OPTIONS_YAML_FILE = 'analysis_options.yaml';
 
   /**
+   * The file name used for pubspec files.
+   */
+  static const String PUBSPEC_YAML_FILE = 'pubspec.yaml';
+
+  /**
    * The unique instance of this class.
    */
   static final AnalysisEngine instance = new AnalysisEngine._();
diff --git a/pkg/analyzer/lib/src/kernel/resynthesize.dart b/pkg/analyzer/lib/src/kernel/resynthesize.dart
index a3a6ee3..0b13b05 100644
--- a/pkg/analyzer/lib/src/kernel/resynthesize.dart
+++ b/pkg/analyzer/lib/src/kernel/resynthesize.dart
@@ -238,87 +238,13 @@
     }
 
     if (kernelType is kernel.FunctionType) {
-      var typedef = kernelType.typedef;
-      if (typedef != null) {
-        GenericTypeAliasElementImpl typedefElement =
-            getElementFromCanonicalName(typedef.canonicalName);
-        GenericFunctionTypeElementImpl functionElement =
-            typedefElement.function;
-        return instantiateFunctionType(
-            context, functionElement, typedef, typedef.type, kernelType);
-      }
-      var typeElement =
-          new GenericFunctionTypeElementImpl.forKernel(context, kernelType);
-      return typeElement.type;
+      return _getFunctionType(context, kernelType);
     }
 
     // TODO(scheglov) Support other kernel types.
     throw new UnimplementedError('For ${kernelType.runtimeType}');
   }
 
-  /// Given the [executable] element that corresponds to the [kernelNode],
-  /// and the [kernelType] that is the instantiated type of [kernelNode],
-  /// return the instantiated type of the [executable].
-  FunctionType instantiateFunctionType(
-      ElementImpl context,
-      FunctionTypedElement executable,
-      kernel.TreeNode kernelNode,
-      kernel.FunctionType kernelRawType,
-      kernel.FunctionType kernelType) {
-    // Prepare all kernel type parameters.
-    var kernelTypeParameters = <kernel.TypeParameter>[];
-    for (kernel.TreeNode node = kernelNode; node != null; node = node.parent) {
-      if (node is kernel.Class) {
-        kernelTypeParameters.addAll(node.typeParameters);
-      } else if (node is kernel.FunctionNode) {
-        kernelTypeParameters.addAll(node.typeParameters);
-      } else if (node is kernel.Typedef) {
-        kernelTypeParameters.addAll(node.typeParameters);
-      }
-    }
-
-    // If no type parameters, the raw type of the element will do.
-    FunctionTypeImpl rawType = executable.type;
-    if (kernelTypeParameters.isEmpty) {
-      return rawType;
-    }
-
-    // Compute type arguments for kernel type parameters.
-    var kernelMap = kernel.unifyTypes(
-        kernelRawType, kernelType, kernelTypeParameters.toSet());
-
-    // Prepare Analyzer type parameters, in the same order as kernel ones.
-    var astTypeParameters = <TypeParameterElement>[];
-    for (Element element = executable;
-        element != null;
-        element = element.enclosingElement) {
-      if (element is TypeParameterizedElement) {
-        astTypeParameters.addAll(element.typeParameters);
-      }
-    }
-
-    // Convert kernel type arguments into Analyzer types.
-    int length = astTypeParameters.length;
-    var usedTypeParameters = <TypeParameterElement>[];
-    var usedTypeArguments = <DartType>[];
-    for (var i = 0; i < length; i++) {
-      var kernelParameter = kernelTypeParameters[i];
-      var kernelArgument = kernelMap[kernelParameter];
-      if (kernelArgument != null) {
-        DartType astArgument = getType(context, kernelArgument);
-        usedTypeParameters.add(astTypeParameters[i]);
-        usedTypeArguments.add(astArgument);
-      }
-    }
-
-    if (usedTypeParameters.isEmpty) {
-      return rawType;
-    }
-
-    // Replace Analyzer type parameters with type arguments.
-    return rawType.substitute4(usedTypeParameters, usedTypeArguments);
-  }
-
   void _buildTypeProvider() {
     var coreLibrary = getLibrary('dart:core');
     var asyncLibrary = getLibrary('dart:async');
@@ -330,6 +256,44 @@
     asyncLibrary.createLoadLibraryFunction(_typeProvider);
   }
 
+  /// Return the [FunctionType] that corresponds to the given [kernelType].
+  FunctionType _getFunctionType(
+      ElementImpl context, kernel.FunctionType kernelType) {
+    if (kernelType.typedef != null) {
+      return _getTypedefType(context, kernelType);
+    }
+
+    var element = new FunctionElementImpl('', -1);
+    context.encloseElement(element);
+
+    // Set type parameters.
+    {
+      List<kernel.TypeParameter> typeParameters = kernelType.typeParameters;
+      int count = typeParameters.length;
+      var astTypeParameters = new List<TypeParameterElement>(count);
+      for (int i = 0; i < count; i++) {
+        astTypeParameters[i] =
+            new TypeParameterElementImpl.forKernel(element, typeParameters[i]);
+      }
+      element.typeParameters = astTypeParameters;
+    }
+
+    // Set formal parameters.
+    var parameters = _getFunctionTypeParameters(kernelType);
+    var positionalParameters = parameters[0];
+    var namedParameters = parameters[1];
+    var astParameters = ParameterElementImpl.forKernelParameters(
+        element,
+        kernelType.requiredParameterCount,
+        positionalParameters,
+        namedParameters);
+    element.parameters = astParameters;
+
+    element.returnType = getType(element, kernelType.returnType);
+
+    return new FunctionTypeImpl(element);
+  }
+
   InterfaceType _getInterfaceType(ElementImpl context,
       kernel.CanonicalName className, List<kernel.DartType> kernelArguments) {
     var libraryName = className.parent;
@@ -358,6 +322,52 @@
         uri, () => _analysisContext.sourceFactory.forUri(uri));
   }
 
+  /// Return the [FunctionType] for the given typedef based [kernelType].
+  FunctionType _getTypedefType(
+      ElementImpl context, kernel.FunctionType kernelType) {
+    kernel.Typedef typedef = kernelType.typedef;
+
+    GenericTypeAliasElementImpl typedefElement =
+        getElementFromCanonicalName(typedef.canonicalName);
+    GenericFunctionTypeElementImpl functionElement = typedefElement.function;
+
+    var kernelTypeParameters = typedef.typeParameters;
+
+    // If no type parameters, the raw type of the element will do.
+    FunctionTypeImpl rawType = functionElement.type;
+    if (kernelTypeParameters.isEmpty) {
+      return rawType;
+    }
+
+    // Compute type arguments for kernel type parameters.
+    var kernelMap = kernel.unifyTypes(
+        typedef.type, kernelType, kernelTypeParameters.toSet());
+
+    // Prepare Analyzer type parameters, in the same order as kernel ones.
+    var astTypeParameters = typedefElement.typeParameters;
+
+    // Convert kernel type arguments into Analyzer types.
+    int length = astTypeParameters.length;
+    var usedTypeParameters = <TypeParameterElement>[];
+    var usedTypeArguments = <DartType>[];
+    for (var i = 0; i < length; i++) {
+      var kernelParameter = kernelTypeParameters[i];
+      var kernelArgument = kernelMap[kernelParameter];
+      if (kernelArgument != null) {
+        DartType astArgument = getType(context, kernelArgument);
+        usedTypeParameters.add(astTypeParameters[i]);
+        usedTypeArguments.add(astArgument);
+      }
+    }
+
+    if (usedTypeParameters.isEmpty) {
+      return rawType;
+    }
+
+    // Replace Analyzer type parameters with type arguments.
+    return rawType.substitute4(usedTypeParameters, usedTypeArguments);
+  }
+
   /// Return the [TypeParameterElement] for the given [kernelTypeParameter].
   TypeParameterElement _getTypeParameter(
       ElementImpl context, kernel.TypeParameter kernelTypeParameter) {
@@ -391,6 +401,28 @@
     libraryElement.exportNamespace = new Namespace({});
     return libraryElement;
   }
+
+  /// Return the list with exactly two elements - positional and named
+  /// parameter lists.
+  static List<List<kernel.VariableDeclaration>> _getFunctionTypeParameters(
+      kernel.FunctionType type) {
+    int positionalCount = type.positionalParameters.length;
+    var positionalParameters =
+        new List<kernel.VariableDeclaration>(positionalCount);
+    for (int i = 0; i < positionalCount; i++) {
+      String name = i < type.positionalParameterNames.length
+          ? type.positionalParameterNames[i]
+          : 'arg_$i';
+      positionalParameters[i] = new kernel.VariableDeclaration(name,
+          type: type.positionalParameters[i]);
+    }
+
+    var namedParameters = type.namedParameters
+        .map((k) => new kernel.VariableDeclaration(k.name, type: k.type))
+        .toList(growable: false);
+
+    return [positionalParameters, namedParameters];
+  }
 }
 
 /**
@@ -1090,22 +1122,7 @@
   @override
   List<List<kernel.VariableDeclaration>> getFunctionTypeParameters(
       kernel.FunctionType type) {
-    int positionalCount = type.positionalParameters.length;
-    var positionalParameters =
-        new List<kernel.VariableDeclaration>(positionalCount);
-    for (int i = 0; i < positionalCount; i++) {
-      String name = i < type.positionalParameterNames.length
-          ? type.positionalParameterNames[i]
-          : 'arg_$i';
-      positionalParameters[i] = new kernel.VariableDeclaration(name,
-          type: type.positionalParameters[i]);
-    }
-
-    var namedParameters = type.namedParameters
-        .map((k) => new kernel.VariableDeclaration(k.name, type: k.type))
-        .toList(growable: false);
-
-    return [positionalParameters, namedParameters];
+    return KernelResynthesizer._getFunctionTypeParameters(type);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
new file mode 100644
index 0000000..3753998
--- /dev/null
+++ b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
@@ -0,0 +1,181 @@
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/pubspec/pubspec_warning_code.dart';
+import 'package:path/path.dart' as path;
+import 'package:source_span/src/span.dart';
+import 'package:yaml/yaml.dart';
+
+class PubspecValidator {
+  /**
+   * The name of the sub-field (under `flutter`) whose value is a list of assets
+   * available to Flutter apps at runtime.
+   */
+  static const String ASSETS_FIELD = 'assets';
+
+  /**
+   * The name of the field whose value is a map of dependencies.
+   */
+  static const String DEPENDENCIES_FIELD = 'dependencies';
+
+  /**
+   * The name of the field whose value is a map of development dependencies.
+   */
+  static const String DEV_DEPENDENCIES_FIELD = 'dev_dependencies';
+
+  /**
+   * The name of the field whose value is a specification of Flutter-specific
+   * configuration data.
+   */
+  static const String FLUTTER_FIELD = 'flutter';
+
+  /**
+   * The name of the field whose value is the name of the package.
+   */
+  static const String NAME_FIELD = 'name';
+
+  /**
+   * The resource provider used to access the file system.
+   */
+  final ResourceProvider provider;
+
+  /**
+   * The source representing the file being validated.
+   */
+  final Source source;
+
+  /**
+   * Initialize a newly create validator to validate the content of the given
+   * [source].
+   */
+  PubspecValidator(this.provider, this.source);
+
+  /**
+   * Validate the given [contents].
+   */
+  List<AnalysisError> validate(Map<dynamic, YamlNode> contents) {
+    RecordingErrorListener recorder = new RecordingErrorListener();
+    ErrorReporter reporter = new ErrorReporter(recorder, source);
+
+    _validateDependencies(reporter, contents);
+    _validateFlutter(reporter, contents);
+    _validateName(reporter, contents);
+
+    return recorder.errors;
+  }
+
+  /**
+   * Return a map whose keys are the names of declared dependencies and whose
+   * values are the specifications of those dependencies. The map is extracted
+   * from the given [contents] using the given [key].
+   */
+  Map<dynamic, YamlNode> _getDeclaredDependencies(
+      ErrorReporter reporter, Map<String, YamlNode> contents, String key) {
+    YamlNode field = contents[key];
+    if (field == null) {
+      return <String, YamlNode>{};
+    } else if (field is YamlMap) {
+      return field.nodes;
+    }
+    _reportErrorForNode(
+        reporter, field, PubspecWarningCode.DEPENDENCIES_FIELD_NOT_MAP, [key]);
+    return <String, YamlNode>{};
+  }
+
+  /**
+   * Report an error for the given node.
+   */
+  void _reportErrorForNode(
+      ErrorReporter reporter, YamlNode node, ErrorCode errorCode,
+      [List<Object> arguments]) {
+    SourceSpan span = node.span;
+    reporter.reportErrorForOffset(
+        errorCode, span.start.offset, span.length, arguments);
+  }
+
+  /**
+   * Validate the value of the required `name` field.
+   */
+  void _validateDependencies(
+      ErrorReporter reporter, Map<dynamic, YamlNode> contents) {
+    Map<dynamic, YamlNode> declaredDependencies =
+        _getDeclaredDependencies(reporter, contents, DEPENDENCIES_FIELD);
+    Map<dynamic, YamlNode> declaredDevDependencies =
+        _getDeclaredDependencies(reporter, contents, DEV_DEPENDENCIES_FIELD);
+
+    for (YamlNode packageName in declaredDevDependencies.keys) {
+      if (declaredDependencies.containsKey(packageName)) {
+        _reportErrorForNode(reporter, packageName,
+            PubspecWarningCode.UNNECESSARY_DEV_DEPENDENCY, [packageName.value]);
+      }
+    }
+  }
+
+  /**
+   * Validate the value of the optional `flutter` field.
+   */
+  void _validateFlutter(
+      ErrorReporter reporter, Map<dynamic, YamlNode> contents) {
+    YamlNode flutterField = contents[FLUTTER_FIELD];
+    if (flutterField is YamlMap) {
+      YamlNode assetsField = flutterField.nodes[ASSETS_FIELD];
+      if (assetsField is YamlList) {
+        path.Context context = provider.pathContext;
+        String packageRoot = context.dirname(source.fullName);
+        for (YamlNode entryValue in assetsField.nodes) {
+          if (entryValue is YamlScalar) {
+            Object entry = entryValue.value;
+            if (entry is String) {
+              String normalizedEntry = context.joinAll(path.posix.split(entry));
+              String assetPath = context.join(packageRoot, normalizedEntry);
+              if (!provider.getFile(assetPath).exists) {
+                _reportErrorForNode(
+                    reporter,
+                    entryValue,
+                    PubspecWarningCode.ASSET_DOES_NOT_EXIST,
+                    [entryValue.value]);
+              }
+            } else {
+              _reportErrorForNode(
+                  reporter, entryValue, PubspecWarningCode.ASSET_NOT_STRING);
+            }
+          } else {
+            _reportErrorForNode(
+                reporter, entryValue, PubspecWarningCode.ASSET_NOT_STRING);
+          }
+        }
+      } else if (assetsField != null) {
+        _reportErrorForNode(
+            reporter, assetsField, PubspecWarningCode.ASSET_FIELD_NOT_LIST);
+      } else {
+        // TODO(brianwilkerson) Should we report an error if `assets` is
+        // missing?
+      }
+      if (flutterField.length > 1) {
+        // TODO(brianwilkerson) Should we report an error if `flutter` contains
+        // keys other than `assets`?
+      }
+    } else if (flutterField != null) {
+      _reportErrorForNode(
+          reporter, flutterField, PubspecWarningCode.FLUTTER_FIELD_NOT_MAP);
+    }
+  }
+
+  /**
+   * Validate the value of the required `name` field.
+   */
+  void _validateName(ErrorReporter reporter, Map<dynamic, YamlNode> contents) {
+    YamlNode nameField = contents[NAME_FIELD];
+    if (nameField == null) {
+      reporter.reportErrorForOffset(PubspecWarningCode.MISSING_NAME, 0, 0);
+    } else if (nameField is! YamlScalar || nameField.value is! String) {
+      _reportErrorForNode(
+          reporter, nameField, PubspecWarningCode.NAME_NOT_STRING);
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart b/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart
new file mode 100644
index 0000000..6629300
--- /dev/null
+++ b/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart
@@ -0,0 +1,102 @@
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/error/error.dart';
+
+/**
+ * The error codes used for warnings in analysis options files. The convention
+ * for this class is for the name of the error code to indicate the problem that
+ * caused the error to be generated and for the error message to explain what is
+ * wrong and, when appropriate, how the problem can be corrected.
+ */
+class PubspecWarningCode extends ErrorCode {
+  /**
+   * A code indicating that a specified asset does not exist.
+   *
+   * Parameters:
+   * 0: the path to the asset as given in the file.
+   */
+  static const PubspecWarningCode ASSET_DOES_NOT_EXIST =
+      const PubspecWarningCode(
+          'ASSET_DOES_NOT_EXIST',
+          "The asset {0} does not exist.",
+          "Try creating the file or fixing the path to the file.");
+
+  /**
+   * A code indicating that the value of the asset field is not a list.
+   */
+  static const PubspecWarningCode ASSET_FIELD_NOT_LIST = const PubspecWarningCode(
+      'ASSET_FIELD_NOT_LIST',
+      "The value of the 'asset' field is expected to be a list of relative file paths.",
+      "Try converting the value to be a list of relative file paths.");
+
+  /**
+   * A code indicating that an element in the asset list is not a string.
+   */
+  static const PubspecWarningCode ASSET_NOT_STRING = const PubspecWarningCode(
+      'ASSET_NOT_STRING',
+      "Assets are expected to be a file paths (strings).",
+      "Try converting the value to be a string.");
+
+  /**
+   * A code indicating that the value of a dependencies field is not a map.
+   */
+  static const PubspecWarningCode DEPENDENCIES_FIELD_NOT_MAP =
+      const PubspecWarningCode(
+          'DEPENDENCIES_FIELD_NOT_MAP',
+          "The value of the '{0}' field is expected to be a map.",
+          "Try converting the value to be a map.");
+
+  /**
+   * A code indicating that the value of the flutter field is not a map.
+   */
+  static const PubspecWarningCode FLUTTER_FIELD_NOT_MAP =
+      const PubspecWarningCode(
+          'FLUTTER_FIELD_NOT_MAP',
+          "The value of the 'flutter' field is expected to be a map.",
+          "Try converting the value to be a map.");
+
+  /**
+   * A code indicating that the name field is missing.
+   */
+  static const PubspecWarningCode MISSING_NAME = const PubspecWarningCode(
+      'MISSING_NAME',
+      "The name field is required but missing.",
+      "Try adding a field named 'name'.");
+
+  /**
+   * A code indicating that the name field is not a string.
+   */
+  static const PubspecWarningCode NAME_NOT_STRING = const PubspecWarningCode(
+      'NAME_NOT_STRING',
+      "The value of the name field is expected to be a string.",
+      "Try converting the value to be a string.");
+
+  /**
+   * A code indicating that a package listed as a dev dependency is also listed
+   * as a normal dependency.
+   *
+   * Parameters:
+   * 0: the name of the package in the dev_dependency list.
+   */
+  static const PubspecWarningCode UNNECESSARY_DEV_DEPENDENCY =
+      const PubspecWarningCode(
+          'UNNECESSARY_DEV_DEPENDENCY',
+          "The dev dependency on {0} is unnecessary because there is also a "
+          "normal dependency on that package.",
+          "Try removing the dev dependency.");
+
+  /**
+   * Initialize a newly created warning code to have the given [name], [message]
+   * and [correction].
+   */
+  const PubspecWarningCode(String name, String message, [String correction])
+      : super(name, message, correction);
+
+  @override
+  ErrorSeverity get errorSeverity => ErrorSeverity.WARNING;
+
+  @override
+  ErrorType get type => ErrorType.STATIC_WARNING;
+}
diff --git a/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart b/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
new file mode 100644
index 0000000..a85b628
--- /dev/null
+++ b/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+
+/**
+ * A mixin for test classes that adds a [ResourceProvider] and utility methods
+ * for manipulating the file system. The utility methods all take a posix style
+ * path and convert it as appropriate for the actual platform.
+ */
+class ResourceProviderMixin {
+  final MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
+
+  void deleteFile(String path) {
+    String convertedPath = resourceProvider.convertPath(path);
+    resourceProvider.deleteFile(convertedPath);
+  }
+
+  void deleteFolder(String path) {
+    String convertedPath = resourceProvider.convertPath(path);
+    resourceProvider.deleteFolder(convertedPath);
+  }
+
+  File getFile(String path) {
+    String convertedPath = resourceProvider.convertPath(path);
+    return resourceProvider.getFile(convertedPath);
+  }
+
+  Folder getFolder(String path) {
+    String convertedPath = resourceProvider.convertPath(path);
+    return resourceProvider.getFolder(convertedPath);
+  }
+
+  void modifyFile(String path, String content) {
+    String convertedPath = resourceProvider.convertPath(path);
+    resourceProvider.modifyFile(convertedPath, content);
+  }
+
+  File newFile(String path, {String content = ''}) {
+    String convertedPath = resourceProvider.convertPath(path);
+    return resourceProvider.newFile(convertedPath, content);
+  }
+
+  File newFileWithBytes(String path, List<int> bytes) {
+    String convertedPath = resourceProvider.convertPath(path);
+    return resourceProvider.newFileWithBytes(convertedPath, bytes);
+  }
+
+  Folder newFolder(String path) {
+    String convertedPath = resourceProvider.convertPath(path);
+    return resourceProvider.newFolder(convertedPath);
+  }
+}
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
index dcd7eb6..5fcef73 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
@@ -89,13 +89,6 @@
 
   @override
   @failingTest
-  test_async_used_as_identifier_in_suffix() async {
-    // Bad state: Expected element reference for analyzer offset 46; got one for kernel offset 48
-    await super.test_async_used_as_identifier_in_suffix();
-  }
-
-  @override
-  @failingTest
   test_async_used_as_identifier_in_switch_label() async {
     // Bad state: No reference information for async at 31
     await super.test_async_used_as_identifier_in_switch_label();
@@ -1716,48 +1709,6 @@
 
   @override
   @failingTest
-  test_invalidModifierOnSetter_member_async() async {
-    // AnalysisException: Element mismatch in /test.dart at /test.dart
-    await super.test_invalidModifierOnSetter_member_async();
-  }
-
-  @override
-  @failingTest
-  test_invalidModifierOnSetter_member_asyncStar() async {
-    // AnalysisException: Element mismatch in /test.dart at /test.dart
-    await super.test_invalidModifierOnSetter_member_asyncStar();
-  }
-
-  @override
-  @failingTest
-  test_invalidModifierOnSetter_member_syncStar() async {
-    // AnalysisException: Element mismatch in /test.dart at /test.dart
-    await super.test_invalidModifierOnSetter_member_syncStar();
-  }
-
-  @override
-  @failingTest
-  test_invalidModifierOnSetter_topLevel_async() async {
-    // AnalysisException: Element mismatch in /test.dart at /test.dart
-    await super.test_invalidModifierOnSetter_topLevel_async();
-  }
-
-  @override
-  @failingTest
-  test_invalidModifierOnSetter_topLevel_asyncStar() async {
-    // AnalysisException: Element mismatch in /test.dart at /test.dart
-    await super.test_invalidModifierOnSetter_topLevel_asyncStar();
-  }
-
-  @override
-  @failingTest
-  test_invalidModifierOnSetter_topLevel_syncStar() async {
-    // AnalysisException: Element mismatch in /test.dart at /test.dart
-    await super.test_invalidModifierOnSetter_topLevel_syncStar();
-  }
-
-  @override
-  @failingTest
   test_invalidReferenceToThis_factoryConstructor() async {
     // Expected 1 errors of type CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, found 0
     await super.test_invalidReferenceToThis_factoryConstructor();
diff --git a/pkg/analyzer/test/generated/hint_code_kernel_test.dart b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
index 7bbdb16..ef9fde2 100644
--- a/pkg/analyzer/test/generated/hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
@@ -164,13 +164,6 @@
 
   @failingTest
   @override
-  test_importDeferredLibraryWithLoadFunction() async {
-    // ad state: Expected element reference for analyzer offset 60; got one for kernel offset 65
-    return super.test_importDeferredLibraryWithLoadFunction();
-  }
-
-  @failingTest
-  @override
   test_invalidAssignment_instanceVariable() async {
     // Expected 1 errors of type HintCode.INVALID_ASSIGNMENT, found 0
     return super.test_invalidAssignment_instanceVariable();
diff --git a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
index 6b1c577..7532ea0 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
@@ -31,16 +31,17 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/31625')
-  test_ambiguousImport_showCombinator() async {
-    return super.test_ambiguousImport_showCombinator();
+  @potentialAnalyzerProblem
+  test_abstractSuperMemberReference_superHasNoSuchMethod() async {
+    // super.m() is not resolved by front-end
+    return super.test_abstractSuperMemberReference_superHasNoSuchMethod();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_assignmentToFinals_importWithPrefix() async {
-    return super.test_assignmentToFinals_importWithPrefix();
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31625')
+  test_ambiguousImport_showCombinator() async {
+    return super.test_ambiguousImport_showCombinator();
   }
 
   @override
@@ -136,13 +137,6 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_constEval_propertyExtraction_fieldStatic_targetType() async {
-    return super.test_constEval_propertyExtraction_fieldStatic_targetType();
-  }
-
-  @override
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
   test_constructorDeclaration_scope_signature() async {
     return super.test_constructorDeclaration_scope_signature();
@@ -199,7 +193,7 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/30838')
+  @potentialAnalyzerProblem
   test_genericTypeAlias_fieldAndReturnType_typeParameters_arguments() async {
     return super
         .test_genericTypeAlias_fieldAndReturnType_typeParameters_arguments();
@@ -207,7 +201,7 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/30838')
+  @potentialAnalyzerProblem
   test_genericTypeAlias_fieldAndReturnType_typeParameters_noArguments() async {
     return super
         .test_genericTypeAlias_fieldAndReturnType_typeParameters_noArguments();
@@ -236,13 +230,6 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_importPrefixes_withFirstLetterDifference() async {
-    return super.test_importPrefixes_withFirstLetterDifference();
-  }
-
-  @override
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31641')
   test_invalidAnnotation_constantVariable_field() async {
     return super.test_invalidAnnotation_constantVariable_field();
@@ -338,13 +325,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_sharedDeferredPrefix() async {
-    return super.test_sharedDeferredPrefix();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_staticAccessToInstanceMember_annotation() async {
     return super.test_staticAccessToInstanceMember_annotation();
   }
@@ -352,20 +332,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_typeType_class_prefixed() async {
-    return super.test_typeType_class_prefixed();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_typeType_functionTypeAlias_prefixed() async {
-    return super.test_typeType_functionTypeAlias_prefixed();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_undefinedIdentifier_synthetic_whenExpression() async {
     return super.test_undefinedIdentifier_synthetic_whenExpression();
   }
@@ -390,11 +356,4 @@
   test_undefinedMethod_functionExpression_directCall() async {
     return super.test_undefinedMethod_functionExpression_directCall();
   }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_undefinedSetter_importWithPrefix() async {
-    return super.test_undefinedSetter_importWithPrefix();
-  }
 }
diff --git a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
index 9f45d2e..85e8b1c 100644
--- a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/src/dart/error/hint_codes.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'non_hint_code_driver_test.dart';
@@ -18,6 +19,11 @@
 /// them, or know that this is an analyzer problem.
 const potentialAnalyzerProblem = const Object();
 
+/// Tests marked with this annotation fail because of a Fasta problem.
+class FastaProblem {
+  const FastaProblem(String issueUri);
+}
+
 @reflectiveTest
 class NonHintCodeTest_Kernel extends NonHintCodeTest_Driver {
   @override
@@ -52,14 +58,6 @@
     await super.test_duplicateImport_as();
   }
 
-  @failingTest
-  @override
-  @potentialAnalyzerProblem
-  test_importDeferredLibraryWithLoadFunction() async {
-    // Appears to be an issue with resolution of import prefixes.
-    await super.test_importDeferredLibraryWithLoadFunction();
-  }
-
   @override
   test_unnecessaryCast_generics() async {
     // dartbug.com/18953
@@ -76,6 +74,15 @@
     verify([source]);
   }
 
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
+  test_unusedImport_annotationOnDirective() async {
+    // TODO(scheglov) We don't yet parse annotations on import directives.
+    fail('This test fails in checked mode (indirectly)');
+//    await super.test_unusedImport_annotationOnDirective();
+  }
+
   @failingTest
   @override
   @potentialAnalyzerProblem
@@ -89,20 +96,4 @@
   test_unusedImport_metadata() async {
     await super.test_unusedImport_metadata();
   }
-
-  @failingTest
-  @override
-  @potentialAnalyzerProblem
-  test_unusedImport_prefix_topLevelFunction() async {
-    // Appears to be an issue with resolution of import prefixes.
-    await super.test_unusedImport_prefix_topLevelFunction();
-  }
-
-  @failingTest
-  @override
-  @potentialAnalyzerProblem
-  test_unusedImport_prefix_topLevelFunction2() async {
-    // Appears to be an issue with resolution of import prefixes.
-    await super.test_unusedImport_prefix_topLevelFunction2();
-  }
 }
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index 9e4bdb6..eef6b16 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -55,14 +55,57 @@
 
 @reflectiveTest
 class ClassMemberParserTest_Fasta extends FastaParserTestCase
-    with ClassMemberParserTestMixin {}
+    with ClassMemberParserTestMixin {
+  @override
+  void test_parseClassMember_method_generic_comment_noReturnType() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseClassMember_method_generic_comment_parameterType() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseClassMember_method_generic_comment_returnType() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseClassMember_method_generic_comment_returnType_bound() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseClassMember_method_generic_comment_returnType_complex() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseClassMember_method_generic_comment_void() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseClassMember_method_static_generic_comment_returnType() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+}
 
 /**
  * Tests of the fasta parser based on [ComplexParserTestMixin].
  */
 @reflectiveTest
 class ComplexParserTest_Fasta extends FastaParserTestCase
-    with ComplexParserTestMixin {}
+    with ComplexParserTestMixin {
+  @override
+  @failingTest
+  void test_assignableExpression_arguments_normal_chain_typeArgumentComments() {
+    // Fasta does not support the generic comment syntax.
+    super
+        .test_assignableExpression_arguments_normal_chain_typeArgumentComments();
+  }
+}
 
 /**
  * Tests of the fasta parser based on [ErrorParserTest].
@@ -715,14 +758,6 @@
 
   @override
   @failingTest
-  void test_invalidOperatorAfterSuper_assignableExpression() {
-    // TODO(brianwilkerson) Wrong errors:
-    // Expected 1 errors of type ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, found 0
-    super.test_invalidOperatorAfterSuper_assignableExpression();
-  }
-
-  @override
-  @failingTest
   void test_invalidOperatorAfterSuper_primaryExpression() {
     // TODO(brianwilkerson) Does not recover.
     //   Expected: true
@@ -1698,6 +1733,81 @@
 class ExpressionParserTest_Fasta extends FastaParserTestCase
     with ExpressionParserTestMixin {
   @override
+  void
+      test_parseAssignableExpression_expression_args_dot_typeArgumentComments() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void
+      test_parseAssignableExpression_identifier_args_dot_typeArgumentComments() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseCascadeSection_ia_typeArgumentComments() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseCascadeSection_ii_typeArgumentComments() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseCascadeSection_pa_typeArgumentComments() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseCascadeSection_paa_typeArgumentComments() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseCascadeSection_paapaa_typeArgumentComments() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseConstExpression_listLiteral_typed_genericComment() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseConstExpression_mapLiteral_typed_genericComment() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseExpression_superMethodInvocation_typeArgumentComments() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void
+      test_parseExpressionWithoutCascade_superMethodInvocation_typeArgumentComments() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseFunctionExpression_typeParameterComments() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void
+      test_parseInstanceCreationExpression_qualifiedType_named_typeArgumentComments() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void
+      test_parseInstanceCreationExpression_qualifiedType_typeArgumentComments() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
   @failingTest
   void test_parseInstanceCreationExpression_type_named_typeArgumentComments() {
     // TODO(brianwilkerson) Does not inject generic type arguments.
@@ -1706,6 +1816,33 @@
   }
 
   @override
+  void test_parseInstanceCreationExpression_type_typeArgumentComments() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void
+      test_parsePostfixExpression_none_methodInvocation_question_dot_typeArgumentComments() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void
+      test_parsePostfixExpression_none_methodInvocation_typeArgumentComments() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parsePrimaryExpression_listLiteral_typed_genericComment() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parsePrimaryExpression_mapLiteral_typed_genericComment() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
   @failingTest
   void test_parseUnaryExpression_decrement_super() {
     // TODO(brianwilkerson) Does not recover.
@@ -1742,7 +1879,8 @@
   /**
    * Whether generic method comments should be enabled for the test.
    */
-  bool enableGenericMethodComments = false;
+  bool get enableGenericMethodComments => false;
+  void set enableGenericMethodComments(bool enable) {}
 
   @override
   set enableLazyAssignmentOperators(bool value) {
@@ -2216,6 +2354,21 @@
   }
 
   @override
+  void test_parseNormalFormalParameter_function_noType_typeParameterComments() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseNormalFormalParameter_function_type_typeParameterComments() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseNormalFormalParameter_function_void_typeParameterComments() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
   @failingTest
   void test_parseNormalFormalParameter_simple_const_noType() {
     // TODO(brianwilkerson) Wrong errors:
@@ -2547,13 +2700,6 @@
 
   @override
   @failingTest
-  void test_incompleteForEach() {
-    // TODO(brianwilkerson) reportUnrecoverableErrorWithToken
-    super.test_incompleteForEach();
-  }
-
-  @override
-  @failingTest
   void test_incompleteLocalVariable_beforeIdentifier() {
     // TODO(brianwilkerson) reportUnrecoverableErrorWithToken
     super.test_incompleteLocalVariable_beforeIdentifier();
@@ -2707,6 +2853,42 @@
     // Expected 1 errors of type ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, found 0
     super.test_parseContinueStatement_noLabel();
   }
+
+  @override
+  void test_parseFunctionDeclarationStatement_typeParameterComments() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void
+      test_parseStatement_functionDeclaration_noReturnType_typeParameterComments() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseVariableDeclarationListAfterMetadata_const_typeComment() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseVariableDeclarationListAfterMetadata_dynamic_typeComment() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseVariableDeclarationListAfterMetadata_final_typeComment() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseVariableDeclarationListAfterMetadata_type_typeComment() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseVariableDeclarationListAfterMetadata_var_typeComment() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
 }
 
 /**
@@ -2800,4 +2982,14 @@
     super.test_parseCompilationUnitMember_abstractAsPrefix();
     assertNoErrors();
   }
+
+  @override
+  void test_parseFunctionDeclaration_functionWithTypeParameters_comment() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
+
+  @override
+  void test_parseFunctionDeclaration_getter_generic_comment_returnType() {
+    // Ignored: Fasta does not support the generic comment syntax.
+  }
 }
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index d0e036d..809fa22 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -834,6 +834,32 @@
     expect(method.body, isNotNull);
   }
 
+  void test_parseClassMember_method_generic_parameterType() {
+    createParser('m<T>(T p) => null;');
+    ClassMember member = parser.parseClassMember('C');
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<MethodDeclaration>());
+    MethodDeclaration method = member;
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNotNull);
+
+    FormalParameterList parameters = method.parameters;
+    expect(parameters, isNotNull);
+    expect(parameters.parameters, hasLength(1));
+    var parameter = parameters.parameters[0] as SimpleFormalParameter;
+    var parameterType = parameter.type as TypeName;
+    expect(parameterType.name.name, 'T');
+
+    expect(method.body, isNotNull);
+  }
+
   void test_parseClassMember_method_generic_returnType() {
     createParser('T m<T>() {}');
     ClassMember member = parser.parseClassMember('C');
@@ -853,6 +879,79 @@
     expect(method.body, isNotNull);
   }
 
+  void test_parseClassMember_method_generic_returnType_bound() {
+    createParser('T m<T extends num>() {}');
+    ClassMember member = parser.parseClassMember('C');
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<MethodDeclaration>());
+    MethodDeclaration method = member;
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect((method.returnType as TypeName).name.name, 'T');
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNotNull);
+    TypeParameter tp = method.typeParameters.typeParameters[0];
+    expect(tp.name.name, 'T');
+    expect(tp.extendsKeyword, isNotNull);
+    expect((tp.bound as TypeName).name.name, 'num');
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
+  }
+
+  void test_parseClassMember_method_generic_returnType_complex() {
+    createParser('Map<int, T> m<T>() => null;');
+    ClassMember member = parser.parseClassMember('C');
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<MethodDeclaration>());
+    MethodDeclaration method = member;
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+
+    {
+      var returnType = method.returnType as TypeName;
+      expect(returnType, isNotNull);
+      expect(returnType.name.name, 'Map');
+
+      List<TypeAnnotation> typeArguments = returnType.typeArguments.arguments;
+      expect(typeArguments, hasLength(2));
+      expect((typeArguments[0] as TypeName).name.name, 'int');
+      expect((typeArguments[1] as TypeName).name.name, 'T');
+    }
+
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNotNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
+  }
+
+  void test_parseClassMember_method_generic_returnType_static() {
+    createParser('static T m<T>() {}');
+    ClassMember member = parser.parseClassMember('C');
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<MethodDeclaration>());
+    MethodDeclaration method = member;
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNotNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect((method.returnType as TypeName).name.name, 'T');
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNotNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
+  }
+
   void test_parseClassMember_method_generic_void() {
     createParser('void m<T>() {}');
     ClassMember member = parser.parseClassMember('C');
@@ -4659,6 +4758,21 @@
                   ]);
   }
 
+  void test_switchCase_missingColon() {
+    SwitchStatement statement = parseStatement('switch (a) {case 1 return 0;}');
+    expect(statement, isNotNull);
+    listener
+        .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 19, 6)]);
+  }
+
+  void test_switchDefault_missingColon() {
+    SwitchStatement statement =
+        parseStatement('switch (a) {default return 0;}');
+    expect(statement, isNotNull);
+    listener
+        .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 20, 6)]);
+  }
+
   void test_switchHasCaseAfterDefaultCase() {
     SwitchStatement statement =
         parseStatement('switch (a) {default: return 0; case 1: return 1;}');
@@ -4697,21 +4811,6 @@
     ]);
   }
 
-  void test_switchCase_missingColon() {
-    SwitchStatement statement = parseStatement('switch (a) {case 1 return 0;}');
-    expect(statement, isNotNull);
-    listener
-        .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 19, 6)]);
-  }
-
-  void test_switchDefault_missingColon() {
-    SwitchStatement statement =
-        parseStatement('switch (a) {default return 0;}');
-    expect(statement, isNotNull);
-    listener
-        .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 20, 6)]);
-  }
-
   void test_switchMissingBlock() {
     SwitchStatement statement =
         parseStatement('switch (a) return;', expectedEndOffset: 11);
@@ -10502,7 +10601,8 @@
     ForStatement statement = parseStatement('for (String item i) {}');
     listener.assertErrors([
       expectedError(ParserErrorCode.EXPECTED_TOKEN, 17, 1),
-      expectedError(ParserErrorCode.EXPECTED_TOKEN, 17, 1)
+      expectedError(
+          ParserErrorCode.EXPECTED_TOKEN, usingFastaParser ? 18 : 17, 1)
     ]);
     expect(statement, new isInstanceOf<ForStatement>());
     expect(statement.toSource(), 'for (String item; i;) {}');
diff --git a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
index 8947061..9439e01 100644
--- a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
@@ -221,27 +221,6 @@
 
   @override
   @failingTest
-  test_futureOrNull_no_return() async {
-    // Bad state: Found 2 argument types for 1 type arguments
-    await super.test_futureOrNull_no_return();
-  }
-
-  @override
-  @failingTest
-  test_futureOrNull_no_return_value() async {
-    // Bad state: Found 2 argument types for 1 type arguments
-    await super.test_futureOrNull_no_return_value();
-  }
-
-  @override
-  @failingTest
-  test_futureOrNull_return_null() async {
-    // Bad state: Found 2 argument types for 1 type arguments
-    await super.test_futureOrNull_return_null();
-  }
-
-  @override
-  @failingTest
   test_generic_partial() async {
     // AnalysisException: Element mismatch in /test.dart at class A<T>
     await super.test_generic_partial();
@@ -298,27 +277,6 @@
 
   @override
   @failingTest
-  test_inference_simplePolymorphicRecursion_function() async {
-    // Expected: 'T'
-    await super.test_inference_simplePolymorphicRecursion_function();
-  }
-
-  @override
-  @failingTest
-  test_inference_simplePolymorphicRecursion_interface() async {
-    // Expected: 'T'
-    await super.test_inference_simplePolymorphicRecursion_interface();
-  }
-
-  @override
-  @failingTest
-  test_inference_simplePolymorphicRecursion_simple() async {
-    // RangeError (index): Invalid value: Valid value range is empty: 0
-    await super.test_inference_simplePolymorphicRecursion_simple();
-  }
-
-  @override
-  @failingTest
   test_inferGenericInstantiation2() async {
     // Expected 1 errors of type StrongModeCode.STRONG_MODE_COULD_NOT_INFER, found 0;
     //          1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
@@ -434,13 +392,6 @@
 
   @override
   @failingTest
-  test_genericMethod_max_doubleDouble_prefixed() async {
-    // Bad state: Expected element reference for analyzer offset 49; got one for kernel offset 54
-    await super.test_genericMethod_max_doubleDouble_prefixed();
-  }
-
-  @override
-  @failingTest
   test_genericMethod_nestedCapture() async {
     // Bad state: Found 2 argument types for 1 type arguments
     await super.test_genericMethod_nestedCapture();
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
index 7dd81a7..e1a6eee 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
@@ -25,18 +25,6 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_annotation_constructor_withNestedConstructorInvocation() async {
-    // This test is failing because analyzer and kernel disagree about how to
-    // resolve annotations and constructors. Kernel is consistent between
-    // annotations that invoke a constructor and other constructor invocations,
-    // while analyzer treats them differently. They also differ in terms of the
-    // resolution of the constructor name's element.
-    await super.test_annotation_constructor_withNestedConstructorInvocation();
-  }
-
-  @override
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31605')
   test_constructor_redirected_generic() async {
     await super.test_constructor_redirected_generic();
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 09dbb38..7331a7d 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -186,12 +186,19 @@
     var atD = AstFinder.getTopLevelFunction(result.unit, 'f').metadata[0];
     InstanceCreationExpression constC = atD.arguments.arguments[0];
 
-    expect(atD.name.staticElement, elementD);
-    expect(atD.element, constructorD);
+    if (previewDart2) {
+      expect(atD.name.staticElement, constructorD);
+      expect(atD.element, constructorD);
+    } else {
+      expect(atD.name.staticElement, elementD);
+      expect(atD.element, constructorD);
+    }
 
     expect(constC.staticElement, constructorC);
     expect(constC.staticType, elementC.type);
+
     expect(constC.constructorName.staticElement, constructorC);
+    expect(constC.constructorName.type.type, elementC.type);
   }
 
   test_annotation_kind_reference() async {
@@ -1355,14 +1362,10 @@
       expect(initializer.constructorName, isNull);
 
       List<Expression> arguments = initializer.argumentList.arguments;
-
-      Expression aArgument = arguments[0];
-      ParameterElement aElement = unnamedConstructor.parameters[0];
-      expect(aArgument.staticParameterElement, same(aElement));
-
-      Expression bArgument = arguments[1];
-      ParameterElement bElement = unnamedConstructor.parameters[1];
-      expect(bArgument.staticParameterElement, same(bElement));
+      _assertArgumentToParameter(
+          arguments[0], unnamedConstructor.parameters[0]);
+      _assertArgumentToParameter(
+          arguments[1], unnamedConstructor.parameters[1]);
     }
 
     {
@@ -1378,15 +1381,8 @@
       expect(constructorName.staticType, isNull);
 
       List<Expression> arguments = initializer.argumentList.arguments;
-
-      Expression aArgument = arguments[0];
-      ParameterElement aElement = namedConstructor.parameters[0];
-      expect(aArgument.staticParameterElement, same(aElement));
-
-      NamedExpression bArgument = arguments[1];
-      ParameterElement bElement = namedConstructor.parameters[1];
-      expect(bArgument.name.label.staticElement, same(bElement));
-      expect(bArgument.staticParameterElement, same(bElement));
+      _assertArgumentToParameter(arguments[0], namedConstructor.parameters[0]);
+      _assertArgumentToParameter(arguments[1], namedConstructor.parameters[1]);
     }
   }
 
@@ -1833,19 +1829,9 @@
 
     expect(creation.constructorName.name, isNull);
 
-    Expression aArgument = arguments[0];
-    ParameterElement aElement = constructorElement.parameters[0];
-    expect(aArgument.staticParameterElement, same(aElement));
-
-    NamedExpression bArgument = arguments[1];
-    ParameterElement bElement = constructorElement.parameters[1];
-    expect(bArgument.name.label.staticElement, same(bElement));
-    expect(bArgument.staticParameterElement, same(bElement));
-
-    NamedExpression cArgument = arguments[2];
-    ParameterElement cElement = constructorElement.parameters[2];
-    expect(cArgument.name.label.staticElement, same(cElement));
-    expect(cArgument.staticParameterElement, same(cElement));
+    _assertArgumentToParameter(arguments[0], constructorElement.parameters[0]);
+    _assertArgumentToParameter(arguments[1], constructorElement.parameters[1]);
+    _assertArgumentToParameter(arguments[2], constructorElement.parameters[2]);
   }
 
   test_instanceCreation_noTypeArguments() async {
@@ -1884,7 +1870,7 @@
       expect(value.constructorName.name, isNull);
 
       Expression argument = value.argumentList.arguments[0];
-      expect(argument.staticParameterElement, defaultConstructor.parameters[0]);
+      _assertArgumentToParameter(argument, defaultConstructor.parameters[0]);
     }
 
     {
@@ -1906,7 +1892,7 @@
       expect(constructorName.staticType, isNull);
 
       Expression argument = value.argumentList.arguments[0];
-      expect(argument.staticParameterElement, namedConstructor.parameters[0]);
+      _assertArgumentToParameter(argument, namedConstructor.parameters[0]);
     }
   }
 
@@ -1960,7 +1946,7 @@
       expect(value.constructorName.name, isNull);
 
       Expression argument = value.argumentList.arguments[0];
-      expect(argument.staticParameterElement, defaultConstructor.parameters[0]);
+      _assertArgumentToParameter(argument, defaultConstructor.parameters[0]);
     }
 
     {
@@ -1995,7 +1981,7 @@
       expect(constructorName.staticType, isNull);
 
       Expression argument = value.argumentList.arguments[0];
-      expect(argument.staticParameterElement, namedConstructor.parameters[0]);
+      _assertArgumentToParameter(argument, namedConstructor.parameters[0]);
     }
   }
 
@@ -2284,19 +2270,9 @@
       MethodInvocation invocation = statement.expression;
       List<Expression> arguments = invocation.argumentList.arguments;
 
-      Expression aArgument = arguments[0];
-      ParameterElement aElement = fElement.parameters[0];
-      expect(aArgument.staticParameterElement, same(aElement));
-
-      NamedExpression bArgument = arguments[1];
-      ParameterElement bElement = fElement.parameters[1];
-      expect(bArgument.name.label.staticElement, same(bElement));
-      expect(bArgument.staticParameterElement, same(bElement));
-
-      NamedExpression cArgument = arguments[2];
-      ParameterElement cElement = fElement.parameters[2];
-      expect(cArgument.name.label.staticElement, same(cElement));
-      expect(cArgument.staticParameterElement, same(cElement));
+      _assertArgumentToParameter(arguments[0], fElement.parameters[0]);
+      _assertArgumentToParameter(arguments[1], fElement.parameters[1]);
+      _assertArgumentToParameter(arguments[2], fElement.parameters[2]);
     }
   }
 
@@ -2394,18 +2370,9 @@
       expect(invocation.staticInvokeType.toString(), fTypeString);
 
       List<Expression> arguments = invocation.argumentList.arguments;
-
-      Expression aArgument = arguments[0];
-      ParameterElement aElement = fElement.parameters[0];
-      expect(aArgument.staticParameterElement, same(aElement));
-
-      Expression bArgument = arguments[1];
-      ParameterElement bElement = fElement.parameters[1];
-      expect(bArgument.staticParameterElement, same(bElement));
-
-      Expression cArgument = arguments[2];
-      ParameterElement cElement = fElement.parameters[2];
-      expect(cArgument.staticParameterElement, same(cElement));
+      _assertArgumentToParameter(arguments[0], fElement.parameters[0]);
+      _assertArgumentToParameter(arguments[1], fElement.parameters[1]);
+      _assertArgumentToParameter(arguments[2], fElement.parameters[2]);
     }
   }
 
@@ -2902,21 +2869,11 @@
     BlockFunctionBody body = functionDeclaration.functionExpression.body;
     ExpressionStatement statement = body.block.statements[0];
     MethodInvocation invocation = statement.expression;
+
     List<Expression> arguments = invocation.argumentList.arguments;
-
-    Expression aArgument = arguments[0];
-    ParameterElement aElement = methodElement.parameters[0];
-    expect(aArgument.staticParameterElement, same(aElement));
-
-    NamedExpression bArgument = arguments[1];
-    ParameterElement bElement = methodElement.parameters[1];
-    expect(bArgument.name.label.staticElement, same(bElement));
-    expect(bArgument.staticParameterElement, same(bElement));
-
-    NamedExpression cArgument = arguments[2];
-    ParameterElement cElement = methodElement.parameters[2];
-    expect(cArgument.name.label.staticElement, same(cElement));
-    expect(cArgument.staticParameterElement, same(cElement));
+    _assertArgumentToParameter(arguments[0], methodElement.parameters[0]);
+    _assertArgumentToParameter(arguments[1], methodElement.parameters[1]);
+    _assertArgumentToParameter(arguments[2], methodElement.parameters[2]);
   }
 
   test_methodInvocation_instanceMethod_forwardingStub() async {
@@ -2973,13 +2930,13 @@
       expect(invocation.staticType.toString(), 'void');
       expect(invocation.staticInvokeType.toString(), invokeTypeStr);
       if (previewDart2) {
-        expect(invocation.staticInvokeType.element, same(mElement));
         expect(invocation.methodName.staticElement, same(mElement));
         expect(invocation.methodName.staticType.toString(), invokeTypeStr);
+      } else {
+        expect(invocation.staticInvokeType.element, same(mElement));
       }
 
-      Expression argument = arguments[0];
-      expect(argument.staticParameterElement, mElement.parameters[0]);
+      _assertArgumentToParameter(arguments[0], mElement.parameters[0]);
     }
   }
 
@@ -3009,23 +2966,23 @@
       expect(invocation.staticType.toString(), 'Map<int, double>');
       expect(invocation.staticInvokeType.toString(), invokeTypeStr);
       if (previewDart2) {
-        expect(invocation.staticInvokeType.element, same(mElement));
         expect(invocation.methodName.staticElement, same(mElement));
         expect(invocation.methodName.staticType.toString(), invokeTypeStr);
       }
 
-      Expression aArgument = arguments[0];
-      ParameterMember aArgumentParameter = aArgument.staticParameterElement;
-      ParameterElement aElement = mElement.parameters[0];
-      expect(aArgumentParameter.type, typeProvider.intType);
-      expect(aArgumentParameter.baseElement, same(aElement));
-
-      Expression bArgument = arguments[1];
-      ParameterMember bArgumentParameter = bArgument.staticParameterElement;
-      ParameterElement bElement = mElement.parameters[1];
-      expect(bArgumentParameter.type, typeProvider.doubleType);
       if (previewDart2) {
-        expect(bArgumentParameter.baseElement, same(bElement));
+        expect(arguments[0].staticParameterElement, isNull);
+        expect(arguments[1].staticParameterElement, isNull);
+      } else {
+        Expression aArgument = arguments[0];
+        ParameterMember aArgumentParameter = aArgument.staticParameterElement;
+        ParameterElement aElement = mElement.parameters[0];
+        expect(aArgumentParameter.type, typeProvider.intType);
+        expect(aArgumentParameter.baseElement, same(aElement));
+
+        Expression bArgument = arguments[1];
+        ParameterMember bArgumentParameter = bArgument.staticParameterElement;
+        expect(bArgumentParameter.type, typeProvider.doubleType);
       }
     }
   }
@@ -3047,19 +3004,9 @@
     MethodInvocation invocation = statement.expression;
     List<Expression> arguments = invocation.argumentList.arguments;
 
-    Expression aArgument = arguments[0];
-    ParameterElement aElement = fooElement.parameters[0];
-    expect(aArgument.staticParameterElement, same(aElement));
-
-    NamedExpression bArgument = arguments[1];
-    ParameterElement bElement = fooElement.parameters[1];
-    expect(bArgument.name.label.staticElement, same(bElement));
-    expect(bArgument.staticParameterElement, same(bElement));
-
-    NamedExpression cArgument = arguments[2];
-    ParameterElement cElement = fooElement.parameters[2];
-    expect(cArgument.name.label.staticElement, same(cElement));
-    expect(cArgument.staticParameterElement, same(cElement));
+    _assertArgumentToParameter(arguments[0], fooElement.parameters[0]);
+    _assertArgumentToParameter(arguments[1], fooElement.parameters[1]);
+    _assertArgumentToParameter(arguments[2], fooElement.parameters[2]);
   }
 
   test_methodInvocation_notFunction_field_dynamic() async {
@@ -3086,13 +3033,15 @@
     ExpressionStatement statement = fooStatements[0];
     MethodInvocation invocation = statement.expression;
     expect(invocation.methodName.staticElement, same(fElement.getter));
-    expect(invocation.staticInvokeType, DynamicTypeImpl.instance);
+    if (previewDart2) {
+      _assertDynamicFunctionType(invocation.staticInvokeType);
+    } else {
+      expect(invocation.staticInvokeType, DynamicTypeImpl.instance);
+    }
     expect(invocation.staticType, DynamicTypeImpl.instance);
 
     List<Expression> arguments = invocation.argumentList.arguments;
-
-    Expression argument = arguments[0];
-    expect(argument.staticParameterElement, isNull);
+    expect(arguments[0].staticParameterElement, isNull);
   }
 
   test_methodInvocation_notFunction_getter_dynamic() async {
@@ -3118,7 +3067,11 @@
     ExpressionStatement statement = fooStatements[0];
     MethodInvocation invocation = statement.expression;
     expect(invocation.methodName.staticElement, same(fElement));
-    expect(invocation.staticInvokeType, DynamicTypeImpl.instance);
+    if (previewDart2) {
+      _assertDynamicFunctionType(invocation.staticInvokeType);
+    } else {
+      expect(invocation.staticInvokeType, DynamicTypeImpl.instance);
+    }
     expect(invocation.staticType, DynamicTypeImpl.instance);
 
     List<Expression> arguments = invocation.argumentList.arguments;
@@ -3177,9 +3130,8 @@
     expect(invocation.staticType, typeProvider.stringType);
 
     List<Expression> arguments = invocation.argumentList.arguments;
-
-    Expression argument = arguments[0];
-    expect(argument.staticParameterElement, isNotNull);
+    _assertArgumentToParameter(
+        arguments[0], (fElement.type as FunctionType).parameters[0]);
   }
 
   test_methodInvocation_notFunction_topLevelVariable_dynamic() async {
@@ -3241,12 +3193,14 @@
       var invokeTypeStr = '(int) → void';
       expect(invocation.staticType.toString(), 'void');
       expect(invocation.staticInvokeType.toString(), invokeTypeStr);
-      expect(invocation.staticInvokeType.element, same(mElement));
+      if (!previewDart2) {
+        expect(invocation.staticInvokeType.element, same(mElement));
+      }
       expect(invocation.methodName.staticElement, same(mElement));
       expect(invocation.methodName.staticType.toString(), invokeTypeStr);
 
       Expression argument = arguments[0];
-      expect(argument.staticParameterElement, mElement.parameters[0]);
+      _assertArgumentToParameter(argument, mElement.parameters[0]);
     }
 
     {
@@ -3263,12 +3217,14 @@
       var invokeTypeStr = '(int) → void';
       expect(invocation.staticType.toString(), 'void');
       expect(invocation.staticInvokeType.toString(), invokeTypeStr);
-      expect(invocation.staticInvokeType.element, same(mElement));
+      if (!previewDart2) {
+        expect(invocation.staticInvokeType.element, same(mElement));
+      }
       expect(invocation.methodName.staticElement, same(mElement));
       expect(invocation.methodName.staticType.toString(), invokeTypeStr);
 
       Expression argument = arguments[0];
-      expect(argument.staticParameterElement, mElement.parameters[0]);
+      _assertArgumentToParameter(argument, mElement.parameters[0]);
     }
   }
 
@@ -3322,13 +3278,8 @@
     expect(invocation.staticType, same(doubleType));
     expect(invocation.staticInvokeType.toString(), fTypeString);
 
-    Expression aArgument = arguments[0];
-    ParameterElement aElement = fElement.parameters[0];
-    expect(aArgument.staticParameterElement, same(aElement));
-
-    Expression bArgument = arguments[1];
-    ParameterElement bElement = fElement.parameters[1];
-    expect(bArgument.staticParameterElement, same(bElement));
+    _assertArgumentToParameter(arguments[0], fElement.parameters[0]);
+    _assertArgumentToParameter(arguments[1], fElement.parameters[1]);
   }
 
   test_methodInvocation_topLevelFunction_generic() async {
@@ -3378,21 +3329,10 @@
       expect(invocation.staticType, VoidTypeImpl.instance);
       expect(invocation.staticInvokeType.toString(), fTypeString);
 
-      Expression aArgument = arguments[0];
-      ParameterMember aArgumentParameter = aArgument.staticParameterElement;
-      ParameterElement aElement = fElement.parameters[0];
-      expect(aArgumentParameter.type, typeProvider.boolType);
-      if (previewDart2) {
-        expect(aArgumentParameter.baseElement, same(aElement));
-      }
-
-      Expression bArgument = arguments[1];
-      ParameterMember bArgumentParameter = bArgument.staticParameterElement;
-      ParameterElement bElement = fElement.parameters[1];
-      expect(bArgumentParameter.type, typeProvider.stringType);
-      if (previewDart2) {
-        expect(bArgumentParameter.baseElement, same(bElement));
-      }
+      _assertArgumentToParameter(arguments[0], fElement.parameters[0],
+          parameterMemberType: typeProvider.boolType);
+      _assertArgumentToParameter(arguments[1], fElement.parameters[1],
+          parameterMemberType: typeProvider.stringType);
     }
 
     // f(1, 2.3);
@@ -3409,21 +3349,10 @@
       expect(invocation.staticType, VoidTypeImpl.instance);
       expect(invocation.staticInvokeType.toString(), fTypeString);
 
-      Expression aArgument = arguments[0];
-      ParameterMember aArgumentParameter = aArgument.staticParameterElement;
-      ParameterElement aElement = fElement.parameters[0];
-      expect(aArgumentParameter.type, typeProvider.intType);
-      if (previewDart2) {
-        expect(aArgumentParameter.baseElement, same(aElement));
-      }
-
-      Expression bArgument = arguments[1];
-      ParameterMember bArgumentParameter = bArgument.staticParameterElement;
-      ParameterElement bElement = fElement.parameters[1];
-      expect(bArgumentParameter.type, typeProvider.doubleType);
-      if (previewDart2) {
-        expect(bArgumentParameter.baseElement, same(bElement));
-      }
+      _assertArgumentToParameter(arguments[0], fElement.parameters[0],
+          parameterMemberType: typeProvider.intType);
+      _assertArgumentToParameter(arguments[1], fElement.parameters[1],
+          parameterMemberType: typeProvider.doubleType);
     }
   }
 
@@ -4852,19 +4781,9 @@
     MethodInvocation invocation = statement.expression;
     List<Expression> arguments = invocation.argumentList.arguments;
 
-    Expression aArgument = arguments[0];
-    ParameterElement aElement = fElement.parameters[0];
-    expect(aArgument.staticParameterElement, same(aElement));
-
-    NamedExpression bArgument = arguments[1];
-    ParameterElement bElement = fElement.parameters[1];
-    expect(bArgument.name.label.staticElement, same(bElement));
-    expect(bArgument.staticParameterElement, same(bElement));
-
-    NamedExpression cArgument = arguments[2];
-    ParameterElement cElement = fElement.parameters[2];
-    expect(cArgument.name.label.staticElement, same(cElement));
-    expect(cArgument.staticParameterElement, same(cElement));
+    _assertArgumentToParameter(arguments[0], fElement.parameters[0]);
+    _assertArgumentToParameter(arguments[1], fElement.parameters[1]);
+    _assertArgumentToParameter(arguments[2], fElement.parameters[2]);
   }
 
   test_top_functionTypeAlias() async {
@@ -5141,6 +5060,39 @@
     }
   }
 
+  /// Assert that the [argument] is associated with the [expectedParameter],
+  /// if [previewDart2] is `null`. If the [argument] is a [NamedExpression],
+  /// the name must be resolved to the parameter in both cases.
+  void _assertArgumentToParameter(
+      Expression argument, ParameterElement expectedParameter,
+      {DartType parameterMemberType}) {
+    ParameterElement actualParameter = argument.staticParameterElement;
+    if (previewDart2) {
+      expect(actualParameter, isNull);
+    } else {
+      ParameterElement baseActualParameter;
+      if (actualParameter is ParameterMember) {
+        if (parameterMemberType != null) {
+          expect(actualParameter.type, parameterMemberType);
+        }
+        baseActualParameter = actualParameter.baseElement;
+        // Unwrap ParameterMember one more time.
+        // By some reason we wrap in twice.
+        if (baseActualParameter is ParameterMember) {
+          ParameterMember member = baseActualParameter;
+          baseActualParameter = member.baseElement;
+        }
+      } else {
+        baseActualParameter = actualParameter;
+      }
+      expect(baseActualParameter, same(expectedParameter));
+      // TODO(scheglov) Make this work for previewDart2 too.
+      if (argument is NamedExpression) {
+        expect(argument.name.label.staticElement, same(expectedParameter));
+      }
+    }
+  }
+
   void _assertDefaultParameter(
       DefaultFormalParameter node, ParameterElement element,
       {String name, int offset, ParameterKind kind, DartType type}) {
@@ -5150,6 +5102,12 @@
         name: name, offset: offset, kind: kind, type: type);
   }
 
+  /// Assert that the [type] is a function type `() -> dynamic`.
+  void _assertDynamicFunctionType(FunctionType type) {
+    expect(type.parameters, isEmpty);
+    expect(type.returnType, DynamicTypeImpl.instance);
+  }
+
   void _assertParameterElement(ParameterElement element,
       {String name, int offset, ParameterKind kind, DartType type}) {
     expect(element, isNotNull);
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart
new file mode 100644
index 0000000..f8078ad
--- /dev/null
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/error/syntactic_errors.dart';
+
+import 'partial_code_support.dart';
+
+main() {
+  new AnnotationTest().buildAll();
+}
+
+class AnnotationTest extends PartialCodeTest {
+  buildAll() {
+    List<TestDescriptor> descriptors = <TestDescriptor>[
+      new TestDescriptor(
+          'ampersand', '@', [ParserErrorCode.MISSING_IDENTIFIER], '@_s_',
+          allFailing: true),
+      new TestDescriptor(
+          'leftParen', '@a(', [ParserErrorCode.EXPECTED_TOKEN], '@a()',
+          allFailing: true),
+    ];
+    buildTests('annotation_topLevel', descriptors,
+        PartialCodeTest.declarationSuffixes);
+    buildTests('annotation_classMember', descriptors,
+        PartialCodeTest.classMemberSuffixes,
+        head: 'class C { ', tail: ' }');
+    buildTests(
+        'annotation_local', descriptors, PartialCodeTest.statementSuffixes,
+        head: 'f() { ', tail: ' }');
+  }
+}
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/test_all.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/test_all.dart
index 102cb02..e714b32 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/test_all.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/test_all.dart
@@ -4,6 +4,7 @@
 
 import 'package:test/test.dart';
 
+import 'annotation_test.dart' as annotation;
 import 'assert_statement_test.dart' as assert_statement;
 import 'break_statement_test.dart' as break_statement;
 import 'class_declaration_test.dart' as class_declaration;
@@ -23,11 +24,13 @@
 import 'return_statement_test.dart' as return_statement;
 import 'switch_statement_test.dart' as switch_statement;
 import 'top_level_variable_test.dart' as top_level_variable;
+import 'try_statement_test.dart' as try_statement;
 import 'while_statement_test.dart' as while_statement;
 import 'yield_statement_test.dart' as yield_statement;
 
 main() {
   group('partial_code', () {
+    annotation.main();
     assert_statement.main();
     break_statement.main();
     class_declaration.main();
@@ -47,6 +50,7 @@
     return_statement.main();
     switch_statement.main();
     top_level_variable.main();
+    try_statement.main();
     while_statement.main();
     yield_statement.main();
   });
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/try_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/try_statement_test.dart
new file mode 100644
index 0000000..a6c927d
--- /dev/null
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/try_statement_test.dart
@@ -0,0 +1,164 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/error/syntactic_errors.dart';
+
+import 'partial_code_support.dart';
+
+main() {
+  new TryStatementTest().buildAll();
+}
+
+class TryStatementTest extends PartialCodeTest {
+  buildAll() {
+    buildTests(
+        'try_statement',
+        [
+          //
+          // No clauses.
+          //
+          new TestDescriptor(
+              'keyword',
+              'try',
+              [
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.MISSING_CATCH_OR_FINALLY
+              ],
+              "try {} finally {}",
+              allFailing: true),
+          new TestDescriptor('noCatchOrFinally', 'try {}',
+              [ParserErrorCode.MISSING_CATCH_OR_FINALLY], "try {} finally {}",
+              allFailing: true),
+          //
+          // Single on clause.
+          //
+          new TestDescriptor(
+              'on',
+              'try {} on',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              "try {} on _s_ {}",
+              allFailing: true),
+          new TestDescriptor('on_identifier', 'try {} on A',
+              [ParserErrorCode.EXPECTED_TOKEN], "try {} on A {}",
+              failing: ['block']),
+          //
+          // Single catch clause.
+          //
+          new TestDescriptor(
+              'catch',
+              'try {} catch',
+              [
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              "try {} catch (e) {}",
+              allFailing: true),
+          new TestDescriptor(
+              'catch_leftParen',
+              'try {} catch (',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              "try {} catch (e) {}",
+              allFailing: true),
+          new TestDescriptor(
+              'catch_identifier',
+              'try {} catch (e',
+              [ParserErrorCode.EXPECTED_TOKEN, ParserErrorCode.EXPECTED_TOKEN],
+              "try {} catch (e) {}",
+              allFailing: true),
+          new TestDescriptor(
+              'catch_identifierComma',
+              'try {} catch (e, ',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              "try {} catch (e, _s_) {}",
+              allFailing: true),
+          new TestDescriptor(
+              'catch_identifierCommaIdentifier',
+              'try {} catch (e, s',
+              [ParserErrorCode.EXPECTED_TOKEN, ParserErrorCode.EXPECTED_TOKEN],
+              "try {} catch (e, s) {}",
+              allFailing: true),
+          new TestDescriptor('catch_rightParen', 'try {} catch (e, s)',
+              [ParserErrorCode.EXPECTED_TOKEN], "try {} catch (e, s) {}",
+              failing: ['block']),
+          //
+          // Single catch clause after an on clause.
+          //
+          new TestDescriptor(
+              'on_catch',
+              'try {} on A catch',
+              [
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              "try {} on A catch (e) {}",
+              allFailing: true),
+          new TestDescriptor(
+              'on_catch_leftParen',
+              'try {} on A catch (',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              "try {} on A catch (e) {}",
+              allFailing: true),
+          new TestDescriptor(
+              'on_catch_identifier',
+              'try {} on A catch (e',
+              [ParserErrorCode.EXPECTED_TOKEN, ParserErrorCode.EXPECTED_TOKEN],
+              "try {} on A catch (e) {}",
+              allFailing: true),
+          new TestDescriptor(
+              'on_catch_identifierComma',
+              'try {} on A catch (e, ',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              "try {} on A catch (e, _s_) {}",
+              allFailing: true),
+          new TestDescriptor(
+              'on_catch_identifierCommaIdentifier',
+              'try {} on A catch (e, s',
+              [ParserErrorCode.EXPECTED_TOKEN, ParserErrorCode.EXPECTED_TOKEN],
+              "try {} on A catch (e, s) {}",
+              allFailing: true),
+          new TestDescriptor('on_catch_rightParen', 'try {} on A catch (e, s)',
+              [ParserErrorCode.EXPECTED_TOKEN], "try {} on A catch (e, s) {}",
+              failing: ['block']),
+          //
+          // Only a finally clause.
+          //
+          new TestDescriptor('finally_noCatch_noBlock', 'try {} finally',
+              [ParserErrorCode.EXPECTED_TOKEN], "try {} finally {}",
+              failing: ['block']),
+          //
+          // A catch and finally clause.
+          //
+          new TestDescriptor(
+              'finally_catch_noBlock',
+              'try {} catch (e) {} finally',
+              [ParserErrorCode.EXPECTED_TOKEN],
+              "try {} catch (e) {} finally {}",
+              failing: ['block']),
+        ],
+        PartialCodeTest.statementSuffixes,
+        head: 'f() { ',
+        tail: ' }');
+  }
+}
diff --git a/pkg/analyzer/test/src/fasta/resolution_applier_test.dart b/pkg/analyzer/test/src/fasta/resolution_applier_test.dart
index 6c720dd..bdd7051 100644
--- a/pkg/analyzer/test/src/fasta/resolution_applier_test.dart
+++ b/pkg/analyzer/test/src/fasta/resolution_applier_test.dart
@@ -74,6 +74,7 @@
     ], <DartType>[
       typeProvider.stringType,
       new FunctionTypeImpl(new FunctionElementImpl('+', -1)),
+      new TypeArgumentsDartType([]),
       typeProvider.intType,
       typeProvider.stringType,
     ]);
@@ -91,8 +92,10 @@
     ], <DartType>[
       typeProvider.objectType,
       typeProvider.objectType,
+      new TypeArgumentsDartType([]),
       typeProvider.objectType,
       typeProvider.objectType,
+      new TypeArgumentsDartType([]),
       typeProvider.objectType
     ]);
   }
@@ -257,6 +260,7 @@
     ], <DartType>[
       typeProvider.stringType,
       typeProvider.intType,
+      new TypeArgumentsDartType([]),
       typeProvider.intType,
       typeProvider.stringType,
       typeProvider.stringType
diff --git a/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart b/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
new file mode 100644
index 0000000..c2e11d0
--- /dev/null
+++ b/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
@@ -0,0 +1,240 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/pubspec/pubspec_validator.dart';
+import 'package:analyzer/src/pubspec/pubspec_warning_code.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+import 'package:yaml/yaml.dart';
+
+import '../../generated/test_support.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(PubspecValidatorTest);
+  });
+}
+
+@reflectiveTest
+class PubspecValidatorTest extends Object with ResourceProviderMixin {
+  PubspecValidator validator;
+
+  /**
+   * Assert that when the validator is used on the given [content] the
+   * [expectedErrorCodes] are produced.
+   */
+  void assertErrors(String content, List<ErrorCode> expectedErrorCodes) {
+    YamlNode node = loadYamlNode(content);
+    if (node is! YamlMap) {
+      // The file is empty.
+      node = new YamlMap();
+    }
+    List<AnalysisError> errors = validator.validate((node as YamlMap).nodes);
+    GatheringErrorListener listener = new GatheringErrorListener();
+    listener.addAll(errors);
+    listener.assertErrorsWithCodes(expectedErrorCodes);
+  }
+
+  /**
+   * Assert that when the validator is used on the given [content] no errors are
+   * produced.
+   */
+  void assertNoErrors(String content) {
+    assertErrors(content, []);
+  }
+
+  void setUp() {
+    File pubspecFile = getFile('/sample/pubspec.yaml');
+    Source source = pubspecFile.createSource();
+    validator = new PubspecValidator(resourceProvider, source);
+  }
+
+  test_assetDoesNotExist_error() {
+    assertErrors('''
+name: sample
+flutter:
+  assets:
+    - assets/my_icon.png
+''', [PubspecWarningCode.ASSET_DOES_NOT_EXIST]);
+  }
+
+  test_assetDoesNotExist_noError() {
+    newFile('/sample/assets/my_icon.png');
+    assertNoErrors('''
+name: sample
+flutter:
+  assets:
+    - assets/my_icon.png
+''');
+  }
+
+  test_assetFieldNotList_error_empty() {
+    assertErrors('''
+name: sample
+flutter:
+  assets:
+''', [PubspecWarningCode.ASSET_FIELD_NOT_LIST]);
+  }
+
+  test_assetFieldNotList_error_string() {
+    assertErrors('''
+name: sample
+flutter:
+  assets: assets/my_icon.png
+''', [PubspecWarningCode.ASSET_FIELD_NOT_LIST]);
+  }
+
+  test_assetFieldNotList_noError() {
+    newFile('/sample/assets/my_icon.png');
+    assertNoErrors('''
+name: sample
+flutter:
+  assets:
+    - assets/my_icon.png
+''');
+  }
+
+  test_assetNotString_error_int() {
+    assertErrors('''
+name: sample
+flutter:
+  assets:
+    - 23
+''', [PubspecWarningCode.ASSET_NOT_STRING]);
+  }
+
+  test_assetNotString_error_map() {
+    assertErrors('''
+name: sample
+flutter:
+  assets:
+    - my_icon:
+      default: assets/my_icon.png
+      large: assets/large/my_icon.png
+''', [PubspecWarningCode.ASSET_NOT_STRING]);
+  }
+
+  test_assetNotString_noError() {
+    newFile('/sample/assets/my_icon.png');
+    assertNoErrors('''
+name: sample
+flutter:
+  assets:
+    - assets/my_icon.png
+''');
+  }
+
+  test_dependenciesFieldNotMap_dev_error_bool() {
+    assertErrors('''
+name: sample
+dev_dependencies: true
+''', [PubspecWarningCode.DEPENDENCIES_FIELD_NOT_MAP]);
+  }
+
+  test_dependenciesFieldNotMap_dev_error_empty() {
+    assertErrors('''
+name: sample
+dev_dependencies:
+''', [PubspecWarningCode.DEPENDENCIES_FIELD_NOT_MAP]);
+  }
+
+  test_dependenciesFieldNotMap_dev_noError() {
+    assertNoErrors('''
+name: sample
+dev_dependencies:
+  a: any
+''');
+  }
+
+  test_dependenciesFieldNotMap_error_bool() {
+    assertErrors('''
+name: sample
+dependencies: true
+''', [PubspecWarningCode.DEPENDENCIES_FIELD_NOT_MAP]);
+  }
+
+  test_dependenciesFieldNotMap_error_empty() {
+    assertErrors('''
+name: sample
+dependencies:
+''', [PubspecWarningCode.DEPENDENCIES_FIELD_NOT_MAP]);
+  }
+
+  test_dependenciesFieldNotMap_noError() {
+    assertNoErrors('''
+name: sample
+dependencies:
+  a: any
+''');
+  }
+
+  test_flutterFieldNotMap_error_bool() {
+    assertErrors('''
+name: sample
+flutter: true
+''', [PubspecWarningCode.FLUTTER_FIELD_NOT_MAP]);
+  }
+
+  test_flutterFieldNotMap_error_empty() {
+    assertErrors('''
+name: sample
+flutter:
+''', [PubspecWarningCode.FLUTTER_FIELD_NOT_MAP]);
+  }
+
+  test_flutterFieldNotMap_noError() {
+    newFile('/sample/assets/my_icon.png');
+    assertNoErrors('''
+name: sample
+flutter:
+  assets:
+    - assets/my_icon.png
+''');
+  }
+
+  test_missingName_error() {
+    assertErrors('', [PubspecWarningCode.MISSING_NAME]);
+  }
+
+  test_missingName_noError() {
+    assertNoErrors('''
+name: sample
+''');
+  }
+
+  test_nameNotString_error_int() {
+    assertErrors('''
+name: 42
+''', [PubspecWarningCode.NAME_NOT_STRING]);
+  }
+
+  test_nameNotString_noError() {
+    assertNoErrors('''
+name: sample
+''');
+  }
+
+  test_unnecessaryDevDependency_error() {
+    assertErrors('''
+name: sample
+dependencies:
+  a: any
+dev_dependencies:
+  a: any
+''', [PubspecWarningCode.UNNECESSARY_DEV_DEPENDENCY]);
+  }
+
+  test_unnecessaryDevDependency_noError() {
+    assertNoErrors('''
+name: sample
+dependencies:
+  a: any
+dev_dependencies:
+  b: any
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/pubspec/test_all.dart b/pkg/analyzer/test/src/pubspec/test_all.dart
new file mode 100644
index 0000000..a7e7ebe
--- /dev/null
+++ b/pkg/analyzer/test/src/pubspec/test_all.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'pubspec_validator_test.dart' as pubspec_validator;
+
+main() {
+  defineReflectiveSuite(() {
+    pubspec_validator.main();
+  }, name: 'pubspec');
+}
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 8db1a7e..14ef322d 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -9525,31 +9525,19 @@
   test_typedef_type_parameters_bound_recursive() async {
     shouldCompareLibraryElements = false;
     var library = await checkLibrary('typedef void F<T extends F>();');
-    if (isSharedFrontEnd) {
-      // Typedefs cannot reference themselves.
-      checkElementText(library, r'''
-typedef F<T extends dynamic> = void Function();
-''');
-    } else {
-      checkElementText(library, r'''
+    // Typedefs cannot reference themselves.
+    checkElementText(library, r'''
 typedef F<T extends () → void> = void Function();
 ''');
-    }
   }
 
   test_typedef_type_parameters_bound_recursive2() async {
     shouldCompareLibraryElements = false;
     var library = await checkLibrary('typedef void F<T extends List<F>>();');
-    if (isSharedFrontEnd) {
-      // Typedefs cannot reference themselves.
-      checkElementText(library, r'''
-typedef F<T extends List<dynamic>> = void Function();
-''');
-    } else {
-      checkElementText(library, r'''
+    // Typedefs cannot reference themselves.
+    checkElementText(library, r'''
 typedef F<T extends List<() → void>> = void Function();
 ''');
-    }
   }
 
   test_typedef_type_parameters_f_bound_complex() async {
diff --git a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
index 9e05d71..40060b1 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
@@ -383,7 +383,7 @@
   }
 
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/31213')
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31711')
   test_typedef_generic_asFieldType() async {
     await super.test_typedef_generic_asFieldType();
   }
diff --git a/pkg/analyzer/test/src/test_all.dart b/pkg/analyzer/test/src/test_all.dart
index d6d0d19..369c7b9 100644
--- a/pkg/analyzer/test/src/test_all.dart
+++ b/pkg/analyzer/test/src/test_all.dart
@@ -9,6 +9,7 @@
 import 'dart/test_all.dart' as dart;
 import 'fasta/test_all.dart' as fasta;
 import 'lint/test_all.dart' as lint;
+import 'pubspec/test_all.dart' as pubspec;
 import 'source/test_all.dart' as source;
 import 'summary/test_all.dart' as summary;
 import 'task/test_all.dart' as task;
@@ -22,6 +23,7 @@
     dart.main();
     fasta.main();
     lint.main();
+    pubspec.main();
     source.main();
     summary.main();
     task.main();
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart
index 4313841..b0dac1f 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart
@@ -88,6 +88,17 @@
   final AstNode containingNode;
 
   /**
+   * The "dropped" identifier or keyword which the completed text will replace,
+   * or `null` if none.
+   *
+   * For the purposes of code completion, a "dropped" token is an identifier
+   * or keyword that is part of the token stream, but that the parser has
+   * skipped and not reported in to the parser listeners, meaning that it is
+   * not part of the AST.
+   */
+  Token droppedToken;
+
+  /**
    * The entity which the completed text will replace (or which will be
    * displaced once the completed text is inserted).  This may be an AstNode or
    * a Token, or it may be null if the cursor is after all tokens in the file.
@@ -235,7 +246,9 @@
       Object entity, this.isCommentText)
       : this.containingNode = containingNode,
         this.entity = entity,
-        this.argIndex = _computeArgIndex(containingNode, entity);
+        this.argIndex = _computeArgIndex(containingNode, entity),
+        this.droppedToken =
+            _computeDroppedToken(containingNode, entity, offset);
 
   /**
    * Return `true` if the [containingNode] is a cascade
@@ -263,7 +276,8 @@
     bool isKeywordOrIdentifier(Token token) =>
         token.type.isKeyword || token.type == TokenType.IDENTIFIER;
 
-    Token token = entity is AstNode ? (entity as AstNode).beginToken : entity;
+    Token token = droppedToken ??
+        (entity is AstNode ? (entity as AstNode).beginToken : entity);
     if (token != null && requestOffset < token.offset) {
       token = token.previous;
     }
@@ -388,6 +402,52 @@
     return null;
   }
 
+  static Token _computeDroppedToken(
+      AstNode containingNode, Object entity, int offset) {
+    // Find the last token of the member before the entity.
+    var previousMember;
+    for (var member in containingNode.childEntities) {
+      if (entity == member) {
+        break;
+      }
+      if (member is! Comment && member is! CommentToken) {
+        previousMember = member;
+      }
+    }
+    Token token;
+    if (previousMember is AstNode) {
+      token = previousMember.endToken;
+    } else if (previousMember is Token) {
+      token = previousMember;
+    }
+    if (token == null) {
+      return null;
+    }
+
+    // Find the first token of the entity (which may be the entity itself).
+    Token endSearch;
+    if (entity is AstNode) {
+      endSearch = entity.beginToken;
+    } else if (entity is Token) {
+      endSearch = entity;
+    }
+    if (endSearch == null) {
+      return null;
+    }
+
+    // Find a dropped token that overlaps the offset.
+    token = token.next;
+    while (token != endSearch && !token.isEof) {
+      if (token.isKeywordOrIdentifier &&
+          token.offset <= offset &&
+          offset <= token.end) {
+        return token;
+      }
+      token = token.next;
+    }
+    return null;
+  }
+
   /**
    * Determine if the offset is contained in a preceding comment token
    * and return that token, otherwise return `null`.
diff --git a/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart b/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
index a555373..40c3fcd 100644
--- a/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
@@ -6,6 +6,7 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/generated/parser.dart' as analyzer;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
 import 'package:test/test.dart';
@@ -25,6 +26,8 @@
   int completionOffset;
   CompletionTarget target;
 
+  bool get usingFastaParser => analyzer.Parser.useFasta;
+
   Future<Null> addTestSource(String content) async {
     expect(completionOffset, isNull, reason: 'Call addTestSource exactly once');
     completionOffset = content.indexOf('^');
@@ -39,12 +42,16 @@
   }
 
   Future<Null> assertTarget(entityText, nodeText,
-      {int argIndex: null, bool isFunctionalArgument: false}) async {
+      {int argIndex: null,
+      bool isFunctionalArgument: false,
+      String droppedToken}) async {
     void assertCommon() {
       expect(target.entity.toString(), entityText, reason: 'entity');
       expect(target.containingNode.toString(), nodeText,
           reason: 'containingNode');
       expect(target.argIndex, argIndex, reason: 'argIndex');
+      expect(target.droppedToken?.toString(), droppedToken ?? isNull,
+          reason: 'droppedToken');
     }
 
     // Assert with parsed unit
@@ -403,6 +410,16 @@
         '// normal comment ', 'class C2 {zoo(z) {} String name;}');
   }
 
+  test_IfStatement_droppedToken() async {
+    // Comment  ClassDeclaration  CompilationUnit
+    await addTestSource('main() { if (v i^) }');
+    if (usingFastaParser) {
+      await assertTarget(')', '(v)', droppedToken: 'i');
+    } else {
+      await assertTarget('i;', 'if (v) i;');
+    }
+  }
+
   test_MethodDeclaration_inLineComment2() async {
     // Comment  ClassDeclaration  CompilationUnit
     await addTestSource('''
@@ -555,13 +572,13 @@
   test_SwitchStatement_c() async {
     // Token('c') SwitchStatement
     await addTestSource('main() { switch(x) {c^} }');
-    await assertTarget('}', 'switch (x) {}');
+    await assertTarget('}', 'switch (x) {}', droppedToken: 'c');
   }
 
   test_SwitchStatement_c2() async {
     // Token('c') SwitchStatement
     await addTestSource('main() { switch(x) { c^ } }');
-    await assertTarget('}', 'switch (x) {}');
+    await assertTarget('}', 'switch (x) {}', droppedToken: 'c');
   }
 
   test_SwitchStatement_empty() async {
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index c9319e4..7cbc7e7 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -37,6 +37,7 @@
   /// using the kernel representation.
   /// See [CompilerOptions.useKernel] for details.
   static const String useKernel = '--use-kernel';
+  static const String strongMode = '--strong';
   static const String platformBinaries = '--platform-binaries=.+';
 
   static const String minify = '--minify';
diff --git a/pkg/compiler/lib/src/constants/values.dart b/pkg/compiler/lib/src/constants/values.dart
index 8a189c9..115def6 100644
--- a/pkg/compiler/lib/src/constants/values.dart
+++ b/pkg/compiler/lib/src/constants/values.dart
@@ -8,6 +8,7 @@
 import '../common_elements.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
+import '../deferred_load.dart' show OutputUnit;
 import '../util/util.dart' show Hashing;
 
 enum ConstantValueKind {
@@ -24,6 +25,7 @@
   INTERCEPTOR,
   SYNTHETIC,
   DEFERRED,
+  DEFERRED_GLOBAL,
   NON_CONSTANT,
 }
 
@@ -45,6 +47,8 @@
       covariant InterceptorConstantValue constant, covariant A arg);
   R visitSynthetic(covariant SyntheticConstantValue constant, covariant A arg);
   R visitDeferred(covariant DeferredConstantValue constant, covariant A arg);
+  R visitDeferredGlobal(
+      covariant DeferredGlobalConstantValue constant, covariant A arg);
   R visitNonConstant(covariant NonConstantValue constant, covariant A arg);
 }
 
@@ -94,8 +98,8 @@
   /// expression from the value so the unparse of these is best effort.
   ///
   /// For the synthetic constants, [DeferredConstantValue],
-  /// [SyntheticConstantValue], [InterceptorConstantValue] the unparse is
-  /// descriptive only.
+  /// [DeferredGlobalConstantValue], [SyntheticConstantValue],
+  /// [InterceptorConstantValue] the unparse is descriptive only.
   String toDartText();
 
   /// Returns a structured representation of this constant suited for debugging.
@@ -752,7 +756,8 @@
 }
 
 /// A reference to a constant in another output unit.
-/// Used for referring to deferred constants.
+///
+/// Used for referring to deferred constants when evaluating constant values.
 class DeferredConstantValue extends ConstantValue {
   DeferredConstantValue(this.referenced, this.import);
 
@@ -784,6 +789,50 @@
   }
 }
 
+/// A reference to a constant in another output unit.
+///
+/// Used for referring to deferred constants that appear as initializers of
+/// final (non-const) global fields.
+///
+// TODO(sigmund): this should eventually not be a constant value. In particular,
+// [DeferredConstantValue] is introduced by the constant evaluator when it first
+// sees constants used in the program. [DeferredGlobalConstantValue] are
+// introduced later by the SSA builder and should be represented
+// with a dedicated JEntity instead. We currently model them as a regular
+// constant to take advantage of the machinery we already have in place to
+// generate deferred constants in the emitter.
+class DeferredGlobalConstantValue extends ConstantValue {
+  DeferredGlobalConstantValue(this.referenced, this.unit);
+
+  final ConstantValue referenced;
+  final OutputUnit unit;
+
+  bool get isReference => true;
+
+  bool operator ==(other) {
+    return other is DeferredGlobalConstantValue &&
+        referenced == other.referenced &&
+        unit == other.unit;
+  }
+
+  get hashCode => (referenced.hashCode * 17 + unit.hashCode) & 0x3fffffff;
+
+  List<ConstantValue> getDependencies() => <ConstantValue>[referenced];
+
+  accept(ConstantValueVisitor visitor, arg) =>
+      visitor.visitDeferredGlobal(this, arg);
+
+  DartType getType(CommonElements types) => referenced.getType(types);
+
+  ConstantValueKind get kind => ConstantValueKind.DEFERRED_GLOBAL;
+
+  String toDartText() => 'deferred_global(${referenced.toDartText()})';
+
+  String toStructuredText() {
+    return 'DeferredGlobalConstant(${referenced.toStructuredText()})';
+  }
+}
+
 /// A constant value resulting from a non constant or erroneous constant
 /// expression.
 // TODO(johnniwinther): Expand this to contain the error kind.
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 2fa6522..b016904 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -399,6 +399,7 @@
     new OptionHandler(Flags.useContentSecurityPolicy, passThrough),
     new OptionHandler(Flags.enableExperimentalMirrors, passThrough),
     new OptionHandler(Flags.enableAssertMessage, passThrough),
+    new OptionHandler(Flags.strongMode, passThrough),
 
     // TODO(floitsch): remove conditional directives flag.
     // We don't provide the info-message yet, since we haven't publicly
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index cbe47ff..8ba05a1 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -11,7 +11,11 @@
 import 'common_elements.dart' show ElementEnvironment;
 import 'compiler.dart' show Compiler;
 import 'constants/values.dart'
-    show ConstantValue, ConstructedConstantValue, DeferredConstantValue;
+    show
+        ConstantValue,
+        ConstructedConstantValue,
+        DeferredConstantValue,
+        DeferredGlobalConstantValue;
 import 'elements/types.dart';
 import 'elements/elements.dart'
     show AstElement, ClassElement, Element, MethodElement, LocalFunctionElement;
@@ -69,6 +73,8 @@
     return name.compareTo(other.name);
   }
 
+  Set<ImportEntity> get importsForTesting => _imports;
+
   String toString() => "OutputUnit($name, $_imports)";
 }
 
@@ -496,6 +502,8 @@
     for (ImportEntity import in allDeferredImports) {
       String result = computeImportDeferName(import, compiler);
       assert(result != null);
+      // Note: tools that process the json file to build multi-part initial load
+      // bundles depend on the fact that makeUnique appends only digits.
       _importDeferName[import] = makeUnique(result, usedImportNames);
     }
 
@@ -544,7 +552,7 @@
   ///
   /// The deferred loading algorithm maps elements and constants to an output
   /// unit. Each output unit is identified by a subset of deferred imports (an
-  /// [ImportSet]), and they will contain the elements that are inheretly used
+  /// [ImportSet]), and they will contain the elements that are inherently used
   /// by all those deferred imports. An element is used by a deferred import if
   /// it is either loaded by that import or transitively accessed by an element
   /// that the import loads.  An empty set represents the main output unit,
@@ -1091,13 +1099,6 @@
     if (!isProgramSplit) return mainOutputUnit;
     entity = entity is Element ? entity.implementation : entity;
     OutputUnit unit = _entityToUnit[entity];
-    // TODO(redemption): ensure any entity that is requested is in the map.
-    // Currently closure methods are not handled correctly. The old pipeline
-    // finds the appropriate output unit because the synthetic $call methods
-    // transitively have the member-context as an enclosing element, and those
-    // methods are found. The new pipeline doesn't expose that connection. We
-    // should handle this in the emitter or while translating OutputUnitData to
-    // the J-model.
     if (unit != null) return unit;
     if (entity is Element) {
       Element element = entity;
@@ -1171,11 +1172,11 @@
     return outputUnitTo._imports.containsAll(outputUnitFrom._imports);
   }
 
-  /// Registers that a constant is used in a deferred library.
+  /// Registers that a constant is used in the same deferred output unit as
+  /// [field].
   void registerConstantDeferredUse(
-      DeferredConstantValue constant, ImportEntity import) {
+      DeferredGlobalConstantValue constant, OutputUnit unit) {
     if (!isProgramSplit) return;
-    var unit = _importSets.singleton(import).unit;
     assert(
         _constantToUnit[constant] == null || _constantToUnit[constant] == unit);
     _constantToUnit[constant] = unit;
diff --git a/pkg/compiler/lib/src/dump_info.dart b/pkg/compiler/lib/src/dump_info.dart
index 93747d9..bc3d0c0 100644
--- a/pkg/compiler/lib/src/dump_info.dart
+++ b/pkg/compiler/lib/src/dump_info.dart
@@ -10,7 +10,7 @@
 import 'package:dart2js_info/info.dart';
 
 import '../compiler_new.dart';
-import 'closure.dart';
+import 'common/names.dart';
 import 'common/tasks.dart' show CompilerTask;
 import 'common.dart';
 import 'common_elements.dart';
@@ -50,7 +50,8 @@
     compiler.dumpInfoTask._constantToNode.forEach((constant, node) {
       // TODO(sigmund): add dependencies on other constants
       var size = compiler.dumpInfoTask._nodeToSize[node];
-      var code = jsAst.prettyPrint(node, compiler.options);
+      var code = jsAst.prettyPrint(node,
+          enableMinification: compiler.options.enableMinification);
       var info = new ConstantInfo(
           size: size, code: code, outputUnit: _unitInfoForConstant(constant));
       _constantToInfo[constant] = info;
@@ -219,18 +220,17 @@
     return classInfo;
   }
 
-  ClosureInfo visitClosureClass(ClosureClassElement element) {
+  ClosureInfo visitClosureClass(ClassEntity element) {
     ClosureInfo closureInfo = new ClosureInfo(
         name: element.name,
         outputUnit: _unitInfoForEntity(element),
         size: compiler.dumpInfoTask.sizeOf(element));
     _entityToInfo[element] = closureInfo;
 
-    ClosureRepresentationInfo closureRepresentation =
-        compiler.backendStrategy.closureDataLookup.getClosureInfo(element.node);
-    assert(closureRepresentation.closureClassEntity == element);
+    FunctionEntity callMethod = closedWorld.elementEnvironment
+        .lookupClassMember(element, Identifiers.call);
 
-    FunctionInfo functionInfo = visitFunction(closureRepresentation.callMethod);
+    FunctionInfo functionInfo = visitFunction(callMethod);
     if (functionInfo == null) return null;
     closureInfo.function = functionInfo;
     functionInfo.parent = closureInfo;
@@ -544,7 +544,8 @@
     // Concatenate rendered ASTs.
     StringBuffer sb = new StringBuffer();
     for (jsAst.Node ast in code) {
-      sb.writeln(jsAst.prettyPrint(ast, compiler.options));
+      sb.writeln(jsAst.prettyPrint(ast,
+          enableMinification: compiler.options.enableMinification));
     }
     return sb.toString();
   }
@@ -615,6 +616,7 @@
 
     result.deferredFiles = compiler.deferredLoadTask.computeDeferredMap();
     stopwatch.stop();
+
     result.program = new ProgramInfo(
         entrypoint: infoCollector
             ._entityToInfo[closedWorld.elementEnvironment.mainFunction],
diff --git a/pkg/compiler/lib/src/elements/elements.dart b/pkg/compiler/lib/src/elements/elements.dart
index ad1ca0d..c282f29 100644
--- a/pkg/compiler/lib/src/elements/elements.dart
+++ b/pkg/compiler/lib/src/elements/elements.dart
@@ -948,6 +948,7 @@
 abstract class ImportElement extends Element implements ImportEntity {
   Uri get uri;
   LibraryElement get importedLibrary;
+  LibraryElement get enclosingLibrary => library;
   bool get isDeferred;
   PrefixElement get prefix;
   String get name;
diff --git a/pkg/compiler/lib/src/elements/entities.dart b/pkg/compiler/lib/src/elements/entities.dart
index 1e6207e..8d68752 100644
--- a/pkg/compiler/lib/src/elements/entities.dart
+++ b/pkg/compiler/lib/src/elements/entities.dart
@@ -38,6 +38,9 @@
 ///
 /// The [name] property corresponds to the prefix name, if any.
 abstract class ImportEntity extends Entity {
+  /// The library where this import occurs (where the import is declared).
+  LibraryEntity get enclosingLibrary;
+
   /// Whether the import is a deferred import.
   bool get isDeferred;
 
diff --git a/pkg/compiler/lib/src/elements/modelx.dart b/pkg/compiler/lib/src/elements/modelx.dart
index 8ed5033..9d137e9 100644
--- a/pkg/compiler/lib/src/elements/modelx.dart
+++ b/pkg/compiler/lib/src/elements/modelx.dart
@@ -1002,6 +1002,9 @@
   Import get node => super.node;
 
   @override
+  LibraryElement get enclosingLibrary => library;
+
+  @override
   LibraryElement get importedLibrary => libraryDependency;
 
   @override
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_dump.dart b/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
index 336e319..116eb19 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
@@ -99,11 +99,11 @@
   ///
   /// Will never return the a given filename more than once, even if called with
   /// the same element.
-  String filenameFromElement(MemberElement element) {
+  String filenameFromElement(MemberEntity element) {
     // The toString method of elements include characters that are unsuitable
     // for URIs and file systems.
     List<String> parts = <String>[];
-    parts.add(element.library?.libraryName);
+    parts.add(element.library.canonicalUri.pathSegments.last);
     parts.add(element.enclosingClass?.name);
     if (element.isGetter) {
       parts.add('get-${element.name}');
@@ -115,19 +115,10 @@
       } else {
         parts.add(element.name);
       }
-    } else if (element.isOperator) {
+    } else {
       parts.add(Elements
           .operatorNameToIdentifier(element.name)
           .replaceAll(r'$', '-'));
-    } else {
-      parts.add(element.name);
-    }
-    if (element != element) {
-      if (element.name.isEmpty) {
-        parts.add('anon${element.sourcePosition.begin}');
-      } else {
-        parts.add(element.name);
-      }
     }
     String filename = parts.where((x) => x != null && x != '').join('.');
     if (usedFilenames.add(filename)) return filename;
@@ -149,7 +140,7 @@
   final Map<TypeInformation, int> nodeId = <TypeInformation, int>{};
   int usedIds = 0;
   final OutputSink output;
-  final MemberElement element;
+  final MemberEntity element;
   TypeInformation returnValue;
 
   _GraphGenerator(this.global, this.element, this.output) {
diff --git a/pkg/compiler/lib/src/io/kernel_source_information.dart b/pkg/compiler/lib/src/io/kernel_source_information.dart
index 421ed12..da70b55 100644
--- a/pkg/compiler/lib/src/io/kernel_source_information.dart
+++ b/pkg/compiler/lib/src/io/kernel_source_information.dart
@@ -109,6 +109,40 @@
     return _buildTreeNode(node);
   }
 
+  /// Creates the source information for a [base] and end of [member]. If [base]
+  /// is not provided, the offset of [member] is used as the start position.
+  ///
+  /// This is used function declarations and return expressions which both point
+  /// to the end of the member as the closing position.
+  SourceInformation _buildFunctionEnd(MemberEntity member, [ir.TreeNode base]) {
+    MemberDefinition definition = _elementMap.getMemberDefinition(member);
+    ir.Node node = definition.node;
+    switch (definition.kind) {
+      case MemberKind.regular:
+        if (node is ir.Procedure) {
+          return _buildFunction(base ?? node, node.function);
+        }
+        break;
+      case MemberKind.constructor:
+      case MemberKind.constructorBody:
+        if (node is ir.Procedure) {
+          return _buildFunction(base ?? node, node.function);
+        } else if (node is ir.Constructor) {
+          return _buildFunction(base ?? node, node.function);
+        }
+        break;
+      case MemberKind.closureCall:
+        if (node is ir.FunctionDeclaration) {
+          return _buildFunction(base ?? node, node.function);
+        } else if (node is ir.FunctionExpression) {
+          return _buildFunction(base ?? node, node.function);
+        }
+        break;
+      default:
+    }
+    return _buildTreeNode(base ?? node);
+  }
+
   /// Creates the source information for exiting a function definition defined
   /// by the root [node] and its [functionNode].
   ///
@@ -207,8 +241,10 @@
   }
 
   /// Creates source information based on the location of [node].
-  SourceInformation _buildTreeNode(ir.TreeNode node) {
-    return new PositionSourceInformation(_getSourceLocation(node));
+  SourceInformation _buildTreeNode(ir.TreeNode node,
+      [SourceLocation closingPosition]) {
+    return new PositionSourceInformation(
+        _getSourceLocation(node), closingPosition);
   }
 
   @override
@@ -352,7 +388,7 @@
 
   @override
   SourceInformation buildReturn(ir.Node node) {
-    return _buildTreeNode(node);
+    return _buildFunctionEnd(_member, node);
   }
 
   @override
@@ -370,34 +406,7 @@
 
   @override
   SourceInformation buildDeclaration(MemberEntity member) {
-    MemberDefinition definition = _elementMap.getMemberDefinition(member);
-    switch (definition.kind) {
-      case MemberKind.regular:
-        ir.Node node = definition.node;
-        if (node is ir.Procedure) {
-          return _buildFunction(node, node.function);
-        }
-        break;
-      case MemberKind.constructor:
-      case MemberKind.constructorBody:
-        ir.Node node = definition.node;
-        if (node is ir.Procedure) {
-          return _buildFunction(node, node.function);
-        } else if (node is ir.Constructor) {
-          return _buildFunction(node, node.function);
-        }
-        break;
-      case MemberKind.closureCall:
-        ir.Node node = definition.node;
-        if (node is ir.FunctionDeclaration) {
-          return _buildFunction(node, node.function);
-        } else if (node is ir.FunctionExpression) {
-          return _buildFunction(node, node.function);
-        }
-        break;
-      default:
-    }
-    return _buildTreeNode(definition.node);
+    return _buildFunctionEnd(member);
   }
 
   @override
diff --git a/pkg/compiler/lib/src/io/multi_information.dart b/pkg/compiler/lib/src/io/multi_information.dart
index 9f8d909..84c3421 100644
--- a/pkg/compiler/lib/src/io/multi_information.dart
+++ b/pkg/compiler/lib/src/io/multi_information.dart
@@ -310,7 +310,7 @@
   SourceLocation get endPosition => infos.first?.endPosition;
 
   @override
-  SourceLocation get closingPosition => infos.first?.closingPosition;
+  SourceLocation get innerPosition => infos.first?.innerPosition;
 
   @override
   SourceLocation get startPosition => infos.first?.startPosition;
diff --git a/pkg/compiler/lib/src/io/position_information.dart b/pkg/compiler/lib/src/io/position_information.dart
index 4363274..4e1fd6c 100644
--- a/pkg/compiler/lib/src/io/position_information.dart
+++ b/pkg/compiler/lib/src/io/position_information.dart
@@ -25,9 +25,9 @@
   final SourceLocation startPosition;
 
   @override
-  final SourceLocation closingPosition;
+  final SourceLocation innerPosition;
 
-  PositionSourceInformation(this.startPosition, [this.closingPosition]);
+  PositionSourceInformation(this.startPosition, [this.innerPosition]);
 
   @override
   List<SourceLocation> get sourceLocations {
@@ -35,8 +35,8 @@
     if (startPosition != null) {
       list.add(startPosition);
     }
-    if (closingPosition != null) {
-      list.add(closingPosition);
+    if (innerPosition != null) {
+      list.add(innerPosition);
     }
     return list;
   }
@@ -44,7 +44,7 @@
   @override
   SourceSpan get sourceSpan {
     SourceLocation location =
-        startPosition != null ? startPosition : closingPosition;
+        startPosition != null ? startPosition : innerPosition;
     Uri uri = location.sourceUri;
     int offset = location.offset;
     return new SourceSpan(uri, offset, offset);
@@ -52,14 +52,14 @@
 
   int get hashCode {
     return 0x7FFFFFFF &
-        (startPosition.hashCode * 17 + closingPosition.hashCode * 19);
+        (startPosition.hashCode * 17 + innerPosition.hashCode * 19);
   }
 
   bool operator ==(other) {
     if (identical(this, other)) return true;
     if (other is! PositionSourceInformation) return false;
     return startPosition == other.startPosition &&
-        closingPosition == other.closingPosition;
+        innerPosition == other.innerPosition;
   }
 
   /// Create a textual representation of the source information using [uriText]
@@ -72,9 +72,9 @@
       sb.write('[${startPosition.line},'
           '${startPosition.column}]');
     }
-    if (closingPosition != null) {
-      sb.write('-[${closingPosition.line},'
-          '${closingPosition.column}]');
+    if (innerPosition != null) {
+      sb.write('-[${innerPosition.line},'
+          '${innerPosition.column}]');
     }
     return sb.toString();
   }
@@ -83,7 +83,7 @@
     if (startPosition != null) {
       return _computeText(startPosition.sourceUri.pathSegments.last);
     } else {
-      return _computeText(closingPosition.sourceUri.pathSegments.last);
+      return _computeText(innerPosition.sourceUri.pathSegments.last);
     }
   }
 
@@ -91,7 +91,7 @@
     if (startPosition != null) {
       return _computeText('${startPosition.sourceUri}');
     } else {
-      return _computeText('${closingPosition.sourceUri}');
+      return _computeText('${innerPosition.sourceUri}');
     }
   }
 }
@@ -194,7 +194,17 @@
   SourceInformation buildListLiteral(Node node) => buildBegin(node);
 
   @override
-  SourceInformation buildReturn(Node node) => buildBegin(node);
+  SourceInformation buildReturn(Node node) {
+    SourceFile sourceFile = computeSourceFile(resolvedAst);
+    SourceLocation startPosition = new OffsetSourceLocation(
+        sourceFile, node.getBeginToken().charOffset, name);
+    SourceLocation endPosition;
+    if (resolvedAst.kind == ResolvedAstKind.PARSED) {
+      endPosition = new OffsetSourceLocation(
+          sourceFile, resolvedAst.node.getEndToken().charOffset, name);
+    }
+    return new PositionSourceInformation(startPosition, endPosition);
+  }
 
   @override
   SourceInformation buildImplicitReturn(MemberElement element) {
@@ -446,8 +456,7 @@
     case SourcePositionKind.START:
       return sourceInformation.startPosition;
     case SourcePositionKind.INNER:
-      return sourceInformation.closingPosition ??
-          sourceInformation.startPosition;
+      return sourceInformation.innerPosition ?? sourceInformation.startPosition;
   }
 }
 
@@ -603,6 +612,55 @@
 
   PositionTraceListener(this.sourceMapper, this.reader);
 
+  /// Registers source information for [node] on the [offset] in the JavaScript
+  /// code using [kind] to determine what information to use.
+  ///
+  /// For most nodes the start position of the source information is used.
+  /// For instance a return expression points to the the start position of the
+  /// source information, typically the start of the return statement that
+  /// created the JavaScript return node:
+  ///
+  ///     JavaScript:                    Dart:
+  ///
+  ///     @return "foo";                 return "foo";
+  ///                                    ^
+  /// (@ marks the current JavaScript position and ^ point to the mapped Dart
+  /// code position.)
+  ///
+  ///
+  /// For [StepKind.CALL] the `CallPosition.getSemanticPositionForCall` method
+  /// is called to determine whether the start or the inner position should be
+  /// used. For instance if the receiver of the JavaScript call is a "simple"
+  /// expression then the start position of the source information is used:
+  ///
+  ///     JavaScript:                    Dart:
+  ///
+  ///     t1.@foo$0()                    local.foo()
+  ///                                    ^
+  ///
+  /// If the receiver of the JavaScript call is "complex" then the inner
+  /// position of the source information is used:
+  ///
+  ///     JavaScript:                    Dart:
+  ///
+  ///     get$bar().@foo()               bar.foo()
+  ///                                        ^
+  ///
+  /// For [StepKind.FUN_EXIT] the inner position of the source information
+  /// is used. For a JavaScript function without a return statement this maps
+  /// the end brace to the end brace of the corresponding Dart function. For a
+  /// JavaScript function exited through a return statement this maps the end of
+  /// the return statement to the end brace of the Dart function:
+  ///
+  ///     JavaScript:                    Dart:
+  ///
+  ///     foo: function() {              foo() {
+  ///     @}                             }
+  ///                                    ^
+  ///     foo: function() {              foo() {
+  ///       return 0;@                     return 0;
+  ///     }                              }
+  ///                                    ^
   @override
   void onStep(js.Node node, Offset offset, StepKind kind) {
     int codeLocation = offset.value;
@@ -663,13 +721,69 @@
 
 /// The position of a [js.Call] node.
 class CallPosition {
+  /// The call node for which the positions have been computed.
   final js.Node node;
+
+  /// The position for [node] used as the offset in the JavaScript code.
+  ///
+  /// This is either `CodePositionKind.START` for code like
+  ///
+  ///     t1.foo$0()
+  ///     ^
+  /// where the left-most offset of the receiver should be used, or
+  /// `CodePositionKind.CLOSING` for code like
+  ///
+  ///     get$bar().foo$0()
+  ///               ^
+  ///
+  /// where the name of the called method should be used (here the method
+  /// 'foo$0').
   final CodePositionKind codePositionKind;
+
+  /// The position from the [SourceInformation] used in the mapped Dart code.
+  ///
+  /// This is either `SourcePositionKind.START` for code like
+  ///
+  ///     JavaScript:                    Dart:
+  ///
+  ///     t1.@foo$0()                    local.foo()
+  ///                                    ^
+  ///
+  /// where the JavaScript receiver is a "simple" expression, or
+  /// `SourcePositionKind.CLOSING` for code like
+  ///
+  ///     JavaScript:                    Dart:
+  ///
+  ///     get$bar().@foo()               bar.foo()
+  ///                                        ^
+  ///
+  /// where the JavaScript receiver is a "complex" expression.
+  ///
+  /// (@ marks the current JavaScript position and ^ point to the mapped Dart
+  /// code position.)
   final SourcePositionKind sourcePositionKind;
 
   CallPosition(this.node, this.codePositionKind, this.sourcePositionKind);
 
-  /// Computes the [CallPosition] for [node].
+  /// Computes the [CallPosition] for the call [node].
+  ///
+  /// For instance if the receiver of the JavaScript call is a "simple"
+  /// expression then the start position of the source information is used:
+  ///
+  ///     JavaScript:                    Dart:
+  ///
+  ///     t1.@foo$0()                    local.foo()
+  ///                                    ^
+  ///
+  /// If the receiver of the JavaScript call is "complex" then the inner
+  /// position of the source information is used:
+  ///
+  ///     JavaScript:                    Dart:
+  ///
+  ///     get$bar().@foo()               bar.foo()
+  ///                                        ^
+  /// (@ marks the current JavaScript position and ^ point to the mapped Dart
+  /// code position.)
   static CallPosition getSemanticPositionForCall(js.Call node) {
     if (node.target is js.PropertyAccess) {
       js.PropertyAccess access = node.target;
@@ -728,6 +842,13 @@
   }
 }
 
+/// An offset of a JavaScript node within the output code.
+///
+/// This object holds three different values for the offset corresponding to
+/// three different ways browsers can compute the offset of a JavaScript node.
+///
+/// Currently [subexpressionOffset] is used since it corresponds the most to the
+/// offset used by most browsers.
 class Offset {
   /// The offset of the enclosing statement relative to the beginning of the
   /// file.
@@ -1153,6 +1274,9 @@
     visit(node.value);
     notifyStep(
         node, getOffsetForNode(node, getSyntaxOffset(node)), StepKind.RETURN);
+    Offset exitOffset = getOffsetForNode(
+        node, getSyntaxOffset(node, kind: CodePositionKind.CLOSING));
+    notifyStep(node, exitOffset, StepKind.FUN_EXIT);
     statementOffset = null;
     leftToRightOffset = null;
   }
diff --git a/pkg/compiler/lib/src/io/source_information.dart b/pkg/compiler/lib/src/io/source_information.dart
index ac33b01..34a80d7 100644
--- a/pkg/compiler/lib/src/io/source_information.dart
+++ b/pkg/compiler/lib/src/io/source_information.dart
@@ -28,8 +28,10 @@
   /// The source location associated with the start of the JS node.
   SourceLocation get startPosition => null;
 
-  /// The source location associated with the closing of the JS node.
-  SourceLocation get closingPosition => null;
+  /// The source location associated with an inner of the JS node.
+  ///
+  /// The inner position is for instance `foo()` in `o.foo()`.
+  SourceLocation get innerPosition => null;
 
   /// The source location associated with the end of the JS node.
   SourceLocation get endPosition => null;
diff --git a/pkg/compiler/lib/src/js/js.dart b/pkg/compiler/lib/src/js/js.dart
index 97c6069..9a819e8 100644
--- a/pkg/compiler/lib/src/js/js.dart
+++ b/pkg/compiler/lib/src/js/js.dart
@@ -15,12 +15,13 @@
 export 'package:js_ast/js_ast.dart';
 export 'js_debug.dart';
 
-String prettyPrint(Node node, CompilerOptions compilerOptions,
-    {bool allowVariableMinification: true,
+String prettyPrint(Node node,
+    {bool enableMinification: false,
+    bool allowVariableMinification: true,
     Renamer renamerForNames: JavaScriptPrintingOptions.identityRenamer}) {
   // TODO(johnniwinther): Do we need all the options here?
   JavaScriptPrintingOptions options = new JavaScriptPrintingOptions(
-      shouldCompressOutput: compilerOptions.enableMinification,
+      shouldCompressOutput: enableMinification,
       minifyLocalVariables: allowVariableMinification,
       renamerForNames: renamerForNames);
   SimpleJavaScriptPrintingContext context =
@@ -130,7 +131,7 @@
 /// for example by the lazy emitter or when generating code generators.
 class UnparsedNode extends DeferredString implements AstContainer {
   final Node tree;
-  final CompilerOptions _compilerOptions;
+  final bool _enableMinification;
   final bool _protectForEval;
   LiteralString _cachedLiteral;
 
@@ -141,11 +142,11 @@
   /// When its string [value] is requested, the node pretty-prints the given
   /// [ast] and, if [protectForEval] is true, wraps the resulting string in
   /// parenthesis. The result is also escaped.
-  UnparsedNode(this.tree, this._compilerOptions, this._protectForEval);
+  UnparsedNode(this.tree, this._enableMinification, this._protectForEval);
 
   LiteralString get _literal {
     if (_cachedLiteral == null) {
-      String text = prettyPrint(tree, _compilerOptions);
+      String text = prettyPrint(tree, enableMinification: _enableMinification);
       if (_protectForEval) {
         if (tree is Fun) text = '($text)';
         if (tree is LiteralExpression) {
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 35913d3..b2b61c8 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -871,7 +871,8 @@
   String getGeneratedCode(MemberEntity element) {
     assert(!(element is MemberElement && !element.isDeclaration),
         failedAt(element));
-    return jsAst.prettyPrint(generatedCode[element], compiler.options);
+    return jsAst.prettyPrint(generatedCode[element],
+        enableMinification: compiler.options.enableMinification);
   }
 
   /// Generates the output and returns the total size of the generated code.
diff --git a/pkg/compiler/lib/src/js_backend/constant_emitter.dart b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
index 605b8f8..d52f2f0 100644
--- a/pkg/compiler/lib/src/js_backend/constant_emitter.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
@@ -370,4 +370,10 @@
   jsAst.Expression visitDeferred(DeferredConstantValue constant, [_]) {
     return constantReferenceGenerator(constant.referenced);
   }
+
+  @override
+  jsAst.Expression visitDeferredGlobal(DeferredGlobalConstantValue constant,
+      [_]) {
+    return constantReferenceGenerator(constant.referenced);
+  }
 }
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index 902fb2c..51e274e 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -1995,6 +1995,11 @@
   void visitDeferred(DeferredConstantValue constant, [_]) {
     addRoot('Deferred');
   }
+
+  @override
+  void visitDeferredGlobal(DeferredGlobalConstantValue constant, [_]) {
+    addRoot('Deferred');
+  }
 }
 
 /**
@@ -2116,6 +2121,12 @@
     return _combine(hash, _visit(constant.referenced));
   }
 
+  @override
+  int visitDeferredGlobal(DeferredGlobalConstantValue constant, [_]) {
+    int hash = constant.unit.hashCode;
+    return _combine(hash, _visit(constant.referenced));
+  }
+
   int _hashString(int hash, String s) {
     int length = s.length;
     hash = _combine(hash, length);
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index 89ee3d0..79057a1 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -137,9 +137,6 @@
   /// is a function type.
   jsAst.Template get templateForIsFunctionType;
 
-  /// Returns the JavaScript template that creates at runtime a new function
-  /// type object.
-  jsAst.Template get templateForCreateFunctionType;
   jsAst.Name get getFunctionThatReturnsNullName;
 
   /// Returns a [jsAst.Expression] representing the given [type]. Type variables
@@ -801,13 +798,6 @@
     return _representationGenerator.templateForIsFunctionType;
   }
 
-  /// Returns the JavaScript template that creates at runtime a new function
-  /// type object.
-  @override
-  jsAst.Template get templateForCreateFunctionType {
-    return _representationGenerator.templateForCreateFunctionType;
-  }
-
   @override
   jsAst.Expression getTypeRepresentation(
       Emitter emitter, DartType type, OnVariableCallback onVariable,
@@ -1055,15 +1045,6 @@
     return jsAst.js.expressionTemplateFor("'${namer.functionTypeTag}' in #");
   }
 
-  /// Returns the JavaScript template that creates at runtime a new function
-  /// type object.
-  jsAst.Template get templateForCreateFunctionType {
-    // The value of the functionTypeTag can be anything. We use "dynaFunc" for
-    // easier debugging.
-    return jsAst.js
-        .expressionTemplateFor('{ ${namer.functionTypeTag}: "dynafunc" }');
-  }
-
   jsAst.Expression visitFunctionType(FunctionType type, Emitter emitter) {
     List<jsAst.Property> properties = <jsAst.Property>[];
 
diff --git a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
index a3774ff..7f65831 100644
--- a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
@@ -261,8 +261,8 @@
 
   jsAst.Statement tearOffGetter;
   if (!options.useContentSecurityPolicy) {
-    jsAst.Expression tearOffAccessText =
-        new jsAst.UnparsedNode(tearOffAccessExpression, options, false);
+    jsAst.Expression tearOffAccessText = new jsAst.UnparsedNode(
+        tearOffAccessExpression, options.enableMinification, false);
     tearOffGetter = js.statement('''
 function tearOffGetter(funcs, reflectionInfo, name, isIntercepted) {
   return isIntercepted
diff --git a/pkg/compiler/lib/src/js_emitter/constant_ordering.dart b/pkg/compiler/lib/src/js_emitter/constant_ordering.dart
index 48721d5..0b8e6a7 100644
--- a/pkg/compiler/lib/src/js_emitter/constant_ordering.dart
+++ b/pkg/compiler/lib/src/js_emitter/constant_ordering.dart
@@ -233,6 +233,13 @@
     // TODO(sra): What kind of Entity is `prefix`?
     return compareElements(a.import, b.import);
   }
+
+  int visitDeferredGlobal(
+      DeferredGlobalConstantValue a, DeferredGlobalConstantValue b) {
+    int r = compareValues(a.referenced, b.referenced);
+    if (r != 0) return r;
+    return a.unit.compareTo(b.unit);
+  }
 }
 
 class _KindVisitor implements ConstantValueVisitor<int, Null> {
@@ -251,6 +258,7 @@
   static const int INTERCEPTOR = 11;
   static const int SYNTHETIC = 12;
   static const int DEFERRED = 13;
+  static const int DEFERRED_GLOBAL = 14;
   static const int NONCONSTANT = 13;
 
   static int kind(ConstantValue constant) =>
@@ -270,6 +278,7 @@
   int visitInterceptor(InterceptorConstantValue a, _) => INTERCEPTOR;
   int visitSynthetic(SyntheticConstantValue a, _) => SYNTHETIC;
   int visitDeferred(DeferredConstantValue a, _) => DEFERRED;
+  int visitDeferredGlobal(DeferredGlobalConstantValue a, _) => DEFERRED_GLOBAL;
 }
 
 /// Visitor for distinguishing types by kind.
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
index d5b051b..c96a17c 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
@@ -342,9 +342,6 @@
       case JsBuiltin.rawRuntimeType:
         return jsAst.js.expressionTemplateFor("#.constructor");
 
-      case JsBuiltin.createFunctionTypeRti:
-        return backend.rtiEncoder.templateForCreateFunctionType;
-
       case JsBuiltin.isSubtype:
         // TODO(floitsch): move this closer to where is-check properties are
         // built.
diff --git a/pkg/compiler/lib/src/js_emitter/metadata_collector.dart b/pkg/compiler/lib/src/js_emitter/metadata_collector.dart
index 3f76e8b..d21e5e7 100644
--- a/pkg/compiler/lib/src/js_emitter/metadata_collector.dart
+++ b/pkg/compiler/lib/src/js_emitter/metadata_collector.dart
@@ -372,8 +372,9 @@
 
   _MetadataEntry _addGlobalMetadata(jsAst.Node node, OutputUnit outputUnit) {
     String nameToKey(jsAst.Name name) => "${name.key}";
-    String printed =
-        jsAst.prettyPrint(node, _options, renamerForNames: nameToKey);
+    String printed = jsAst.prettyPrint(node,
+        enableMinification: _options.enableMinification,
+        renamerForNames: nameToKey);
     _metadataMap[outputUnit] ??= new Map<String, _BoundMetadataEntry>();
     return _metadataMap[outputUnit].putIfAbsent(printed, () {
       return new _BoundMetadataEntry(node);
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 6d0d91e..4a14cc2 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
@@ -698,9 +698,7 @@
         _rtiSubstitutions,
         _jsInteropAnalysis);
 
-    void visitMember(ClassEntity declarer, MemberEntity member) {
-      if (cls != declarer) return;
-
+    void visitMember(MemberEntity member) {
       if (member.isInstanceMember && !member.isAbstract && !member.isField) {
         // TODO(herhut): Remove once _buildMethod can no longer return null.
         Method method = _buildMethod(member);
@@ -747,11 +745,10 @@
     // MixinApplications run through the members of their mixin. Here, we are
     // only interested in direct members.
     if (!onlyForRti && !_elementEnvironment.isMixinApplication(cls)) {
-      _elementEnvironment.forEachClassMember(cls, visitMember);
-      _elementEnvironment.forEachConstructorBody(
-          cls,
-          (ConstructorBodyEntity constructorBody) =>
-              visitMember(cls, constructorBody));
+      List<MemberEntity> members = <MemberEntity>[];
+      _elementEnvironment.forEachLocalClassMember(cls, members.add);
+      _elementEnvironment.forEachConstructorBody(cls, members.add);
+      _sorter.sortMembers(members).forEach(visitMember);
     }
     bool isInterceptedClass = _interceptorData.isInterceptedClass(cls);
     List<Field> instanceFields = onlyForRti
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.dart
index f4ff829..f1b2ad4 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.dart
@@ -132,9 +132,6 @@
       case JsBuiltin.rawRuntimeType:
         return js.js.expressionTemplateFor("#.constructor");
 
-      case JsBuiltin.createFunctionTypeRti:
-        return _backend.rtiEncoder.templateForCreateFunctionType;
-
       case JsBuiltin.isSubtype:
         // TODO(floitsch): move this closer to where is-check properties are
         // built.
diff --git a/pkg/compiler/lib/src/js_model/closure.dart b/pkg/compiler/lib/src/js_model/closure.dart
index 5a95832..7f82042 100644
--- a/pkg/compiler/lib/src/js_model/closure.dart
+++ b/pkg/compiler/lib/src/js_model/closure.dart
@@ -168,7 +168,7 @@
         } else {
           failedAt(member, "Unexpected closure node ${node}");
         }
-        KernelClosureClass closureClass = _produceSyntheticElements(
+        KernelClosureClassInfo closureClassInfo = _produceSyntheticElements(
             closedWorldBuilder,
             member,
             functionNode,
@@ -177,8 +177,8 @@
             localFunctionsNeedingRti,
             classesNeedingRti);
         // Add also for the call method.
-        _scopeMap[closureClass.callMethod] = closureClass;
-        callMethods.add(closureClass.callMethod);
+        _scopeMap[closureClassInfo.callMethod] = closureClassInfo;
+        callMethods.add(closureClassInfo.callMethod);
       }
     });
     return callMethods;
@@ -190,7 +190,7 @@
   /// the closure accesses a variable that gets accessed at some point), then
   /// boxForCapturedVariables stores the local context for those variables.
   /// If no variables are captured, this parameter is null.
-  KernelClosureClass _produceSyntheticElements(
+  KernelClosureClassInfo _produceSyntheticElements(
       JsClosedWorldBuilder closedWorldBuilder,
       MemberEntity member,
       ir.FunctionNode node,
@@ -201,28 +201,24 @@
     _updateScopeBasedOnRtiNeed(
         info, node.parent, localFunctionsNeedingRti, classesNeedingRti, member);
     KernelToLocalsMap localsMap = _globalLocalsMap.getLocalsMap(member);
-    KernelClosureClass closureClass = closedWorldBuilder.buildClosureClass(
-        member,
-        node,
-        member.library,
-        boxedVariables,
-        info,
-        node.location,
-        localsMap);
+    KernelClosureClassInfo closureClassInfo =
+        closedWorldBuilder.buildClosureClass(member, node, member.library,
+            boxedVariables, info, node.location, localsMap);
 
     // We want the original declaration where that function is used to point
     // to the correct closure class.
-    _memberClosureRepresentationMap[closureClass.callMethod] = closureClass;
-    _globalLocalsMap.setLocalsMap(closureClass.callMethod, localsMap);
+    _memberClosureRepresentationMap[closureClassInfo.callMethod] =
+        closureClassInfo;
+    _globalLocalsMap.setLocalsMap(closureClassInfo.callMethod, localsMap);
     if (node.parent is ir.Member) {
       assert(_elementMap.getMember(node.parent) == member);
-      _memberClosureRepresentationMap[member] = closureClass;
+      _memberClosureRepresentationMap[member] = closureClassInfo;
     } else {
       assert(node.parent is ir.FunctionExpression ||
           node.parent is ir.FunctionDeclaration);
-      _localClosureRepresentationMap[node.parent] = closureClass;
+      _localClosureRepresentationMap[node.parent] = closureClassInfo;
     }
-    return closureClass;
+    return closureClassInfo;
   }
 
   @override
@@ -478,7 +474,7 @@
 }
 
 // TODO(johnniwinther): Add unittest for the computed [ClosureClass].
-class KernelClosureClass extends JsScopeInfo
+class KernelClosureClassInfo extends JsScopeInfo
     implements ClosureRepresentationInfo {
   JFunction callMethod;
   final Local closureEntity;
@@ -487,7 +483,7 @@
 
   final Map<Local, JField> localToFieldMap = new Map<Local, JField>();
 
-  KernelClosureClass.fromScopeInfo(
+  KernelClosureClassInfo.fromScopeInfo(
       this.closureClassEntity,
       ir.FunctionNode closureSourceNode,
       Map<Local, JRecordField> boxedVariables,
@@ -550,8 +546,8 @@
 
 class JClosureField extends JField implements PrivatelyNamedJSEntity {
   final Local _declaredEntity;
-  JClosureField(String name, KernelClosureClass containingClass, bool isConst,
-      bool isAssignable, this._declaredEntity)
+  JClosureField(String name, KernelClosureClassInfo containingClass,
+      bool isConst, bool isAssignable, this._declaredEntity)
       : super(
             containingClass.closureClassEntity.library,
             containingClass.closureClassEntity,
diff --git a/pkg/compiler/lib/src/js_model/elements.dart b/pkg/compiler/lib/src/js_model/elements.dart
index 4229b83..e9b84a1 100644
--- a/pkg/compiler/lib/src/js_model/elements.dart
+++ b/pkg/compiler/lib/src/js_model/elements.dart
@@ -9,7 +9,7 @@
 import '../elements/names.dart';
 import '../elements/types.dart';
 import '../kernel/indexed.dart';
-import 'closure.dart' show KernelClosureClass;
+import 'closure.dart' show KernelClosureClassInfo;
 
 /// Map from 'frontend' to 'backend' elements.
 ///
@@ -522,11 +522,11 @@
 }
 
 class JClosureCallMethod extends JMethod {
-  JClosureCallMethod(KernelClosureClass containingClass,
+  JClosureCallMethod(KernelClosureClassInfo closureClassInfo,
       ParameterStructure parameterStructure, AsyncMarker asyncMarker)
       : super(
-            containingClass.closureClassEntity.library,
-            containingClass.closureClassEntity,
+            closureClassInfo.closureClassEntity.library,
+            closureClassInfo.closureClassEntity,
             Names.call,
             parameterStructure,
             asyncMarker,
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index 4d56126..0ee5d63 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -159,6 +159,7 @@
       SelectorConstraintsStrategy selectorConstraintsStrategy) {
     return new KernelCodegenWorldBuilder(
         elementMap,
+        _globalLocalsMap,
         closedWorld.elementEnvironment,
         nativeBasicData,
         closedWorld,
@@ -474,7 +475,7 @@
 
   /// Construct a closure class and set up the necessary class inference
   /// hierarchy.
-  KernelClosureClass buildClosureClass(
+  KernelClosureClassInfo buildClosureClass(
       MemberEntity member,
       ir.FunctionNode originalClosureFunctionNode,
       JLibrary enclosingLibrary,
@@ -484,7 +485,7 @@
       KernelToLocalsMap localsMap) {
     ClassEntity superclass = _commonElements.closureClass;
 
-    KernelClosureClass cls = _elementMap.constructClosureClass(
+    KernelClosureClassInfo closureClassInfo = _elementMap.constructClosureClass(
         member,
         originalClosureFunctionNode,
         enclosingLibrary,
@@ -497,13 +498,13 @@
     // Tell the hierarchy that this is the super class. then we can use
     // .getSupertypes(class)
     ClassHierarchyNode parentNode = _classHierarchyNodes[superclass];
-    ClassHierarchyNode node = new ClassHierarchyNode(
-        parentNode, cls.closureClassEntity, parentNode.hierarchyDepth + 1);
-    _classHierarchyNodes[cls.closureClassEntity] = node;
-    _classSets[cls.closureClassEntity] = new ClassSet(node);
+    ClassHierarchyNode node = new ClassHierarchyNode(parentNode,
+        closureClassInfo.closureClassEntity, parentNode.hierarchyDepth + 1);
+    _classHierarchyNodes[closureClassInfo.closureClassEntity] = node;
+    _classSets[closureClassInfo.closureClassEntity] = new ClassSet(node);
     node.isDirectlyInstantiated = true;
 
-    return cls;
+    return closureClassInfo;
   }
 }
 
@@ -622,10 +623,13 @@
   }
 
   ConstantValue visitDeferred(DeferredConstantValue constant, _) {
+    throw new UnsupportedError("DeferredConstantValue with --use-kernel");
+  }
+
+  ConstantValue visitDeferredGlobal(DeferredGlobalConstantValue constant, _) {
     var referenced = constant.referenced.accept(this, null);
     if (referenced == constant.referenced) return constant;
-    // TODO(sigmund): do we need a JImport entity?
-    return new DeferredConstantValue(referenced, constant.import);
+    return new DeferredGlobalConstantValue(referenced, constant.unit);
   }
 
   DartType _handleType(DartType type) {
diff --git a/pkg/compiler/lib/src/kernel/deferred_load.dart b/pkg/compiler/lib/src/kernel/deferred_load.dart
index ea96d26..f9d46c3 100644
--- a/pkg/compiler/lib/src/kernel/deferred_load.dart
+++ b/pkg/compiler/lib/src/kernel/deferred_load.dart
@@ -22,15 +22,42 @@
 
   @override
   Iterable<ImportEntity> importsTo(Entity element, LibraryEntity library) {
-    if (element is! MemberEntity) return const <ImportEntity>[];
+    ir.NamedNode node;
+    String nodeName;
+    ir.Library enclosingLibrary;
+    if (element is ClassEntity) {
+      ClassDefinition definition = _elementMap.getClassDefinition(element);
+      if (definition.kind != ClassKind.regular) {
+        // You can't import closures.
+        return const <ImportEntity>[];
+      }
+      ir.Class _node = definition.node;
+      nodeName = _node.name;
+      enclosingLibrary = _node.enclosingLibrary;
+      node = _node;
+    } else if (element is MemberEntity) {
+      ir.Member _node = _elementMap.getMemberDefinition(element).node;
+      nodeName = _node.name.name;
+      enclosingLibrary = _node.enclosingLibrary;
+      node = _node;
+    } else if (element is Local ||
+        element is LibraryEntity ||
+        element is TypeVariableEntity) {
+      return const <ImportEntity>[];
+    } else if (element is TypedefEntity) {
+      throw new UnimplementedError("KernelDeferredLoadTask.importsTo typedef");
+    } else {
+      throw new UnsupportedError(
+          "KernelDeferredLoadTask.importsTo unexpected entity type: "
+          "${element.runtimeType}");
+    }
     List<ImportEntity> imports = [];
     ir.Library source = _elementMap.getLibraryNode(library);
-    ir.Member member = _elementMap.getMemberDefinition(element).node;
     for (ir.LibraryDependency dependency in source.dependencies) {
       if (dependency.isExport) continue;
-      if (!_isVisible(dependency.combinators, member.name.name)) continue;
-      if (member.enclosingLibrary == dependency.targetLibrary ||
-          additionalExports(dependency.targetLibrary).contains(member)) {
+      if (!_isVisible(dependency.combinators, nodeName)) continue;
+      if (enclosingLibrary == dependency.targetLibrary ||
+          additionalExports(dependency.targetLibrary).contains(node)) {
         imports.add(_elementMap.getImport(dependency));
       }
     }
diff --git a/pkg/compiler/lib/src/kernel/element_map.dart b/pkg/compiler/lib/src/kernel/element_map.dart
index 9360a77..2d256cc 100644
--- a/pkg/compiler/lib/src/kernel/element_map.dart
+++ b/pkg/compiler/lib/src/kernel/element_map.dart
@@ -180,6 +180,9 @@
   /// Returns the definition information for [member].
   MemberDefinition getMemberDefinition(covariant MemberEntity member);
 
+  /// Returns the definition information for [cls].
+  ClassDefinition getClassDefinition(covariant ClassEntity cls);
+
   /// Return the [ImportEntity] corresponding to [node].
   ImportEntity getImport(ir.LibraryDependency node);
 }
@@ -276,7 +279,7 @@
 enum ClassKind {
   regular,
   closure,
-  // TODO(efortuna, johnniwinther): Container is not a class, but is
+  // TODO(efortuna, johnniwinther): Record is not a class, but is
   // masquerading as one currently for consistency with the old element model.
   record,
 }
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 2d6dc79..92e71cd 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -71,6 +71,7 @@
 }
 
 abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin {
+  final CompilerOptions options;
   final DiagnosticReporter reporter;
   CommonElements _commonElements;
   ElementEnvironment _elementEnvironment;
@@ -92,7 +93,7 @@
   final EntityDataMap<IndexedTypedef, TypedefData> _typedefs =
       new EntityDataMap<IndexedTypedef, TypedefData>();
 
-  KernelToElementMapBase(this.reporter, Environment environment) {
+  KernelToElementMapBase(this.options, this.reporter, Environment environment) {
     _elementEnvironment = new KernelElementEnvironment(this);
     _commonElements = new CommonElements(_elementEnvironment);
     _constantEnvironment = new KernelConstantEnvironment(this, environment);
@@ -438,8 +439,7 @@
       namedParameterTypes.add(getDartType(variable.type));
     }
     List<FunctionTypeVariable> typeVariables;
-    if (node.typeParameters.isNotEmpty &&
-        DartTypeConverter.enableFunctionTypeVariables) {
+    if (node.typeParameters.isNotEmpty && options.strongMode) {
       List<DartType> typeParameters = <DartType>[];
       for (ir.TypeParameter typeParameter in node.typeParameters) {
         typeParameters
@@ -703,6 +703,9 @@
         'KernelToElementMapBase._forEachConstructorBody');
   }
 
+  void _forEachNestedClosure(
+      MemberEntity member, void f(FunctionEntity closure));
+
   void _forEachLocalClassMember(IndexedClass cls, void f(MemberEntity member)) {
     assert(checkFamily(cls));
     ClassEnv env = _classes.getEnv(cls);
@@ -790,7 +793,7 @@
 }
 
 /// Mixin that implements the abstract methods in [KernelToElementMapBase].
-abstract class ElementCreatorMixin {
+abstract class ElementCreatorMixin implements KernelToElementMapBase {
   ProgramEnv get _env;
   EntityDataEnvMap<IndexedLibrary, LibraryData, LibraryEnv> get _libraries;
   EntityDataEnvMap<IndexedClass, ClassData, ClassEnv> get _classes;
@@ -1012,11 +1015,8 @@
     int typeParameters = node.typeParameters.length;
     List<String> namedParameters =
         node.namedParameters.map((p) => p.name).toList()..sort();
-    return new ParameterStructure(
-        requiredParameters,
-        positionalParameters,
-        namedParameters,
-        DartTypeConverter.enableFunctionTypeVariables ? typeParameters : 0);
+    return new ParameterStructure(requiredParameters, positionalParameters,
+        namedParameters, options.strongMode ? typeParameters : 0);
   }
 
   IndexedLibrary createLibrary(String name, Uri canonicalUri);
@@ -1142,11 +1142,10 @@
         KElementCreatorMixin {
   native.BehaviorBuilder _nativeBehaviorBuilder;
   FrontendStrategy _frontendStrategy;
-  CompilerOptions _options;
 
   KernelToElementMapForImpactImpl(DiagnosticReporter reporter,
-      Environment environment, this._frontendStrategy, this._options)
-      : super(reporter, environment);
+      Environment environment, this._frontendStrategy, CompilerOptions options)
+      : super(options, reporter, environment);
 
   @override
   bool checkFamily(Entity entity) {
@@ -1158,6 +1157,13 @@
   }
 
   @override
+  void _forEachNestedClosure(
+      MemberEntity member, void f(FunctionEntity closure)) {
+    throw new UnsupportedError(
+        "KernelToElementMapForImpactImpl._forEachNestedClosure");
+  }
+
+  @override
   NativeBasicData get nativeBasicData => _frontendStrategy.nativeBasicData;
 
   /// Adds libraries in [program] to the set of libraries.
@@ -1171,7 +1177,7 @@
   @override
   native.BehaviorBuilder get nativeBehaviorBuilder =>
       _nativeBehaviorBuilder ??= new KernelBehaviorBuilder(elementEnvironment,
-          commonElements, nativeBasicData, reporter, _options);
+          commonElements, nativeBasicData, reporter, options);
 
   ResolutionImpact computeWorldImpact(KMember member) {
     return buildKernelImpact(
@@ -1180,7 +1186,7 @@
 
   ScopeModel computeScopeModel(KMember member) {
     ir.Member node = _members.getData(member).definition.node;
-    return KernelClosureAnalysis.computeScopeModel(member, node, _options);
+    return KernelClosureAnalysis.computeScopeModel(member, node, options);
   }
 
   /// Returns the kernel [ir.Procedure] node for the [method].
@@ -1255,6 +1261,11 @@
   MemberDefinition getMemberDefinition(MemberEntity member) {
     return _getMemberDefinition(member);
   }
+
+  @override
+  ClassDefinition getClassDefinition(ClassEntity cls) {
+    return _getClassDefinition(cls);
+  }
 }
 
 class KernelElementEnvironment extends ElementEnvironment {
@@ -1423,8 +1434,7 @@
   @override
   void forEachNestedClosure(
       MemberEntity member, void f(FunctionEntity closure)) {
-    throw new UnimplementedError(
-        'KernelElementEnvironment.forEachNestedClosure');
+    elementMap._forEachNestedClosure(member, f);
   }
 
   @override
@@ -1534,8 +1544,6 @@
 
 /// Visitor that converts kernel dart types into [DartType].
 class DartTypeConverter extends ir.DartTypeVisitor<DartType> {
-  static bool enableFunctionTypeVariables = false;
-
   final KernelToElementMapBase elementMap;
   final Map<ir.TypeParameter, DartType> currentFunctionTypeParameters =
       <ir.TypeParameter, DartType>{};
@@ -1588,7 +1596,7 @@
     int index = 0;
     List<FunctionTypeVariable> typeVariables;
     for (ir.TypeParameter typeParameter in node.typeParameters) {
-      if (enableFunctionTypeVariables) {
+      if (elementMap.options.strongMode) {
         // TODO(johnniwinther): Support recursive type variable bounds, like
         // `void Function<T extends Foo<T>>(T t)` when #31531 is fixed.
         DartType bound = typeParameter.bound.accept(this);
@@ -2046,11 +2054,15 @@
         ElementCreatorMixin
     implements
         KernelToWorldBuilder {
+  /// Map from members to the call methods created for their nested closures.
+  Map<MemberEntity, List<FunctionEntity>> _nestedClosureMap =
+      <MemberEntity, List<FunctionEntity>>{};
+
   NativeBasicData nativeBasicData;
 
   JsKernelToElementMap(DiagnosticReporter reporter, Environment environment,
       KernelToElementMapForImpactImpl _elementMap)
-      : super(reporter, environment) {
+      : super(_elementMap.options, reporter, environment) {
     _env = _elementMap._env;
     for (int libraryIndex = 0;
         libraryIndex < _elementMap._libraries.length;
@@ -2122,6 +2134,13 @@
     }
   }
 
+  @override
+  void _forEachNestedClosure(
+      MemberEntity member, void f(FunctionEntity closure)) {
+    assert(checkFamily(member));
+    _nestedClosureMap[member]?.forEach(f);
+  }
+
   InterfaceType getMemberThisType(MemberEntity member) {
     return _members.getData(member).getMemberThisType(this);
   }
@@ -2321,7 +2340,7 @@
           Local local, Map<Local, JRecordField> recordFieldsVisibleInScope) =>
       recordFieldsVisibleInScope.containsKey(local);
 
-  KernelClosureClass constructClosureClass(
+  KernelClosureClassInfo constructClosureClass(
       MemberEntity member,
       ir.FunctionNode node,
       JLibrary enclosingLibrary,
@@ -2369,20 +2388,24 @@
       closureEntity = new JLocal('', localsMap.currentMember);
     }
 
-    KernelClosureClass cls = new KernelClosureClass.fromScopeInfo(
-        classEntity,
-        node,
-        <Local, JRecordField>{},
-        info,
-        localsMap,
-        closureEntity,
-        info.hasThisLocal ? new ThisLocal(localsMap.currentMember) : null,
-        this);
-    _buildClosureClassFields(cls, member, memberThisType, info, localsMap,
-        recordFieldsVisibleInScope, memberMap);
+    KernelClosureClassInfo closureClassInfo =
+        new KernelClosureClassInfo.fromScopeInfo(
+            classEntity,
+            node,
+            <Local, JRecordField>{},
+            info,
+            localsMap,
+            closureEntity,
+            info.hasThisLocal ? new ThisLocal(localsMap.currentMember) : null,
+            this);
+    _buildClosureClassFields(closureClassInfo, member, memberThisType, info,
+        localsMap, recordFieldsVisibleInScope, memberMap);
 
     FunctionEntity callMethod = new JClosureCallMethod(
-        cls, _getParameterStructure(node), getAsyncMarker(node));
+        closureClassInfo, _getParameterStructure(node), getAsyncMarker(node));
+    _nestedClosureMap
+        .putIfAbsent(member, () => <FunctionEntity>[])
+        .add(callMethod);
     _members.register<IndexedFunction, FunctionData>(
         callMethod,
         new ClosureFunctionData(
@@ -2392,12 +2415,12 @@
             getFunctionType(node),
             node,
             typeVariableAccess));
-    memberMap[callMethod.name] = cls.callMethod = callMethod;
-    return cls;
+    memberMap[callMethod.name] = closureClassInfo.callMethod = callMethod;
+    return closureClassInfo;
   }
 
   void _buildClosureClassFields(
-      KernelClosureClass cls,
+      KernelClosureClassInfo closureClassInfo,
       MemberEntity member,
       InterfaceType memberThisType,
       KernelScopeInfo info,
@@ -2420,7 +2443,7 @@
         if (_isInRecord(capturedLocal, recordFieldsVisibleInScope)) {
           bool constructedField = _constructClosureFieldForRecord(
               capturedLocal,
-              cls,
+              closureClassInfo,
               memberThisType,
               memberMap,
               variable,
@@ -2434,8 +2457,8 @@
     // Add a field for the captured 'this'.
     if (info.thisUsedAsFreeVariable) {
       _constructClosureField(
-          cls.thisLocal,
-          cls,
+          closureClassInfo.thisLocal,
+          closureClassInfo,
           memberThisType,
           memberMap,
           getClassDefinition(member.enclosingClass).node,
@@ -2453,7 +2476,7 @@
         if (!_isInRecord(capturedLocal, recordFieldsVisibleInScope)) {
           _constructClosureField(
               capturedLocal,
-              cls,
+              closureClassInfo,
               memberThisType,
               memberMap,
               variable,
@@ -2465,7 +2488,7 @@
       } else if (variable is TypeParameterTypeWithContext) {
         _constructClosureField(
             localsMap.getLocalTypeVariable(variable.type, this),
-            cls,
+            closureClassInfo,
             memberThisType,
             memberMap,
             variable.type.parameter,
@@ -2488,7 +2511,7 @@
   /// in the closure class.
   bool _constructClosureFieldForRecord(
       Local capturedLocal,
-      KernelClosureClass cls,
+      KernelClosureClassInfo closureClassInfo,
       InterfaceType memberThisType,
       Map<String, MemberEntity> memberMap,
       ir.TreeNode sourceNode,
@@ -2498,32 +2521,32 @@
 
     // Don't construct a new field if the box that holds this local already has
     // a field in the closure class.
-    if (cls.localToFieldMap.containsKey(recordField.box)) {
-      cls.boxedVariables[capturedLocal] = recordField;
+    if (closureClassInfo.localToFieldMap.containsKey(recordField.box)) {
+      closureClassInfo.boxedVariables[capturedLocal] = recordField;
       return false;
     }
 
     FieldEntity closureField = new JClosureField(
-        '_box_$fieldNumber', cls, true, false, recordField.box);
+        '_box_$fieldNumber', closureClassInfo, true, false, recordField.box);
 
     _members.register<IndexedField, FieldData>(
         closureField,
         new ClosureFieldData(
             new ClosureMemberDefinition(
-                cls.localToFieldMap[capturedLocal],
+                closureClassInfo.localToFieldMap[capturedLocal],
                 computeSourceSpanFromTreeNode(sourceNode),
                 MemberKind.closureField,
                 sourceNode),
             memberThisType));
     memberMap[closureField.name] = closureField;
-    cls.localToFieldMap[recordField.box] = closureField;
-    cls.boxedVariables[capturedLocal] = recordField;
+    closureClassInfo.localToFieldMap[recordField.box] = closureField;
+    closureClassInfo.boxedVariables[capturedLocal] = recordField;
     return true;
   }
 
   _constructClosureField(
       Local capturedLocal,
-      KernelClosureClass cls,
+      KernelClosureClassInfo closureClassInfo,
       InterfaceType memberThisType,
       Map<String, MemberEntity> memberMap,
       ir.TreeNode sourceNode,
@@ -2532,7 +2555,7 @@
       int fieldNumber) {
     FieldEntity closureField = new JClosureField(
         _getClosureVariableName(capturedLocal.name, fieldNumber),
-        cls,
+        closureClassInfo,
         isConst,
         isAssignable,
         capturedLocal);
@@ -2541,13 +2564,13 @@
         closureField,
         new ClosureFieldData(
             new ClosureMemberDefinition(
-                cls.localToFieldMap[capturedLocal],
+                closureClassInfo.localToFieldMap[capturedLocal],
                 computeSourceSpanFromTreeNode(sourceNode),
                 MemberKind.closureField,
                 sourceNode),
             memberThisType));
     memberMap[closureField.name] = closureField;
-    cls.localToFieldMap[capturedLocal] = closureField;
+    closureClassInfo.localToFieldMap[capturedLocal] = closureField;
   }
 
   // Returns a non-unique name for the given closure element.
diff --git a/pkg/compiler/lib/src/kernel/element_map_mixins.dart b/pkg/compiler/lib/src/kernel/element_map_mixins.dart
index aa25d5e..9117831 100644
--- a/pkg/compiler/lib/src/kernel/element_map_mixins.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_mixins.dart
@@ -20,13 +20,14 @@
 import '../js_backend/namer.dart';
 import '../js_emitter/code_emitter_task.dart';
 import '../native/native.dart' as native;
+import '../options.dart';
 import '../universe/call_structure.dart';
 import '../universe/selector.dart';
 import 'element_map.dart';
-import 'element_map_impl.dart';
 import 'kernel_debug.dart';
 
 abstract class KernelToElementMapBaseMixin implements KernelToElementMap {
+  CompilerOptions get options;
   DiagnosticReporter get reporter;
   ElementEnvironment get elementEnvironment;
   LibraryEntity getLibrary(ir.Library node);
@@ -44,12 +45,8 @@
   CallStructure getCallStructure(ir.Arguments arguments) {
     int argumentCount = arguments.positional.length + arguments.named.length;
     List<String> namedArguments = arguments.named.map((e) => e.name).toList();
-    return new CallStructure(
-        argumentCount,
-        namedArguments,
-        DartTypeConverter.enableFunctionTypeVariables
-            ? arguments.types.length
-            : 0);
+    return new CallStructure(argumentCount, namedArguments,
+        options.strongMode ? arguments.types.length : 0);
   }
 
   @override
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index 3083498..a4a9011 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -173,7 +173,10 @@
         dependencies.forEach((ir.LibraryDependency node) {
           if (node.isExport) return;
           imports[node] = new KImport(
-              node.isDeferred, node.name, node.targetLibrary.importUri);
+              node.isDeferred,
+              node.name,
+              node.targetLibrary.importUri,
+              elementMap.getLibrary(node.enclosingLibrary));
         });
       }
     }
diff --git a/pkg/compiler/lib/src/kernel/kelements.dart b/pkg/compiler/lib/src/kernel/kelements.dart
index fd9ec25..6f14b6e 100644
--- a/pkg/compiler/lib/src/kernel/kelements.dart
+++ b/pkg/compiler/lib/src/kernel/kelements.dart
@@ -25,8 +25,9 @@
   final bool isDeferred;
   final String name;
   final Uri uri;
+  final LibraryEntity enclosingLibrary;
 
-  KImport(this.isDeferred, this.name, this.uri);
+  KImport(this.isDeferred, this.name, this.uri, this.enclosingLibrary);
 
   String toString() =>
       '${kElementPrefix}import($name:${isDeferred ? ' deferred' : ''})';
diff --git a/pkg/compiler/lib/src/kernel/types.dart b/pkg/compiler/lib/src/kernel/types.dart
index d6ea085..cd97a06 100644
--- a/pkg/compiler/lib/src/kernel/types.dart
+++ b/pkg/compiler/lib/src/kernel/types.dart
@@ -99,6 +99,10 @@
             reporter: elementMap.reporter,
             objectType: elementMap.commonElements.objectType);
 
+  // TODO(sigmund): delete once Issue #31118 is fixed.
+  @override
+  bool get reportMultiInheritanceIssue => false;
+
   InterfaceType getThisType(ClassEntity cls) {
     return elementMap._getThisType(cls);
   }
diff --git a/pkg/compiler/lib/src/library_loader.dart b/pkg/compiler/lib/src/library_loader.dart
index b4d108f..b0e0610 100644
--- a/pkg/compiler/lib/src/library_loader.dart
+++ b/pkg/compiler/lib/src/library_loader.dart
@@ -863,7 +863,8 @@
       } else {
         initializedCompilerState = fe.initializeCompiler(
             initializedCompilerState,
-            new Dart2jsTarget(new TargetFlags()),
+            new Dart2jsTarget(
+                new TargetFlags(strongMode: _elementMap.options.strongMode)),
             platformBinaries.resolve("dart2js_platform.dill"),
             _packageConfig);
         program = await fe.compile(
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 466e63a..73650f6 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -213,11 +213,16 @@
   /// sources to kernel, and then continue compilation from the kernel
   /// representation.
   ///
-  /// When this flag is on, the compiler also acccepts reading .dill files from
+  /// When this flag is on, the compiler also accepts reading .dill files from
   /// disk. The compiler reads the sources differently depending on the
   /// extension format.
   final bool useKernel;
 
+  /// Enables strong mode in dart2js.
+  ///
+  /// This is work-in-progress and will only be supported for [useKernel].
+  final bool strongMode;
+
   /// When obfuscating for minification, whether to use the frequency of a name
   /// as an heuristic to pick shorter names.
   final bool useFrequencyNamer;
@@ -325,6 +330,7 @@
         resolveOnly: _hasOption(options, Flags.resolveOnly),
         sourceMapUri: _extractUriOption(options, '--source-map='),
         strips: _extractCsvOption(options, '--force-strip='),
+        strongMode: _hasOption(options, Flags.strongMode),
         testMode: _hasOption(options, Flags.testMode),
         trustJSInteropTypeAnnotations:
             _hasOption(options, Flags.trustJSInteropTypeAnnotations),
@@ -390,6 +396,7 @@
       bool resolveOnly: false,
       Uri sourceMapUri: null,
       List<String> strips: const [],
+      bool strongMode: false,
       bool testMode: false,
       bool trustJSInteropTypeAnnotations: false,
       bool trustPrimitives: false,
@@ -470,6 +477,7 @@
         resolveOnly: resolveOnly,
         sourceMapUri: sourceMapUri,
         strips: strips,
+        strongMode: strongMode,
         testMode: testMode,
         trustJSInteropTypeAnnotations: trustJSInteropTypeAnnotations,
         trustPrimitives: trustPrimitives,
@@ -522,6 +530,7 @@
       this.compileOnly: false,
       this.sourceMapUri: null,
       this.strips: const [],
+      this.strongMode: false,
       this.testMode: false,
       this.trustJSInteropTypeAnnotations: false,
       this.trustPrimitives: false,
@@ -582,6 +591,7 @@
       compileOnly,
       sourceMapUri,
       strips,
+      strongMode,
       testMode,
       trustJSInteropTypeAnnotations,
       trustPrimitives,
@@ -649,6 +659,7 @@
         compileOnly: compileOnly ?? options.compileOnly,
         sourceMapUri: sourceMapUri ?? options.sourceMapUri,
         strips: strips ?? options.strips,
+        strongMode: strongMode ?? options.strongMode,
         testMode: testMode ?? options.testMode,
         trustJSInteropTypeAnnotations: trustJSInteropTypeAnnotations ??
             options.trustJSInteropTypeAnnotations,
diff --git a/pkg/compiler/lib/src/ordered_typeset.dart b/pkg/compiler/lib/src/ordered_typeset.dart
index b01dbf3..a134269 100644
--- a/pkg/compiler/lib/src/ordered_typeset.dart
+++ b/pkg/compiler/lib/src/ordered_typeset.dart
@@ -228,6 +228,9 @@
     }
   }
 
+  // TODO(sigmund): delete once Issue #31118 is fixed.
+  bool get reportMultiInheritanceIssue => true;
+
   void _addAtDepth(InterfaceType type, int depth) {
     LinkEntry<InterfaceType> prev = null;
     LinkEntry<InterfaceType> link = map[depth];
@@ -236,11 +239,13 @@
       if (existingType == type) return;
       if (existingType.element == type.element) {
         if (reporter != null) {
-          reporter.reportErrorMessage(cls, MessageKind.MULTI_INHERITANCE, {
-            'thisType': getThisType(cls),
-            'firstType': existingType,
-            'secondType': type
-          });
+          if (reportMultiInheritanceIssue) {
+            reporter.reportErrorMessage(cls, MessageKind.MULTI_INHERITANCE, {
+              'thisType': getThisType(cls),
+              'firstType': existingType,
+              'secondType': type
+            });
+          }
         } else {
           assert(false, failedAt(cls, 'Invalid ordered typeset for $cls'));
         }
diff --git a/pkg/compiler/lib/src/resolution/resolution_strategy.dart b/pkg/compiler/lib/src/resolution/resolution_strategy.dart
index b47e1c6..1c4b55c 100644
--- a/pkg/compiler/lib/src/resolution/resolution_strategy.dart
+++ b/pkg/compiler/lib/src/resolution/resolution_strategy.dart
@@ -533,13 +533,20 @@
   void forEachLocalClassMember(
       covariant ClassElement cls, void f(MemberElement member)) {
     cls.ensureResolved(_resolution);
-    cls.forEachLocalMember((_member) {
+
+    void handleMember(_member) {
       MemberElement member = _member;
       if (member.isSynthesized) return;
       if (member.isMalformed) return;
       if (member.isConstructor) return;
+      if (!member.isDeclaration) return;
       f(member);
-    });
+    }
+
+    cls.forEachLocalMember(handleMember);
+    if (cls.isPatched) {
+      cls.implementation.forEachLocalMember(handleMember);
+    }
   }
 
   @override
diff --git a/pkg/compiler/lib/src/serialization/equivalence.dart b/pkg/compiler/lib/src/serialization/equivalence.dart
index bb7a800..9fef23a 100644
--- a/pkg/compiler/lib/src/serialization/equivalence.dart
+++ b/pkg/compiler/lib/src/serialization/equivalence.dart
@@ -1032,6 +1032,20 @@
   }
 
   @override
+  bool visitDeferredGlobal(DeferredGlobalConstantValue value1,
+      covariant DeferredGlobalConstantValue value2) {
+    return strategy.testSets(
+            value1,
+            value2,
+            'imports',
+            value1.unit.importsForTesting,
+            value2.unit.importsForTesting,
+            strategy.elementEquivalence) &&
+        strategy.testConstantValues(
+            value1, value2, 'referenced', value1.referenced, value2.referenced);
+  }
+
+  @override
   bool visitNonConstant(
       NonConstantValue value1, covariant NonConstantValue value2) {
     return true;
diff --git a/pkg/compiler/lib/src/serialization/modelz.dart b/pkg/compiler/lib/src/serialization/modelz.dart
index 773980d..34549ec 100644
--- a/pkg/compiler/lib/src/serialization/modelz.dart
+++ b/pkg/compiler/lib/src/serialization/modelz.dart
@@ -2330,6 +2330,8 @@
     }
   }
 
+  LibraryElement get enclosingLibrary => library;
+
   @override
   bool get isDeferred {
     _ensurePrefixResolved();
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index 559e4fb..0c2ea28 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -15,6 +15,7 @@
 import '../constants/constant_system.dart';
 import '../constants/expressions.dart';
 import '../constants/values.dart';
+import '../deferred_load.dart' show OutputUnit;
 import '../diagnostics/messages.dart' show Message, MessageTemplate;
 import '../dump_info.dart' show InfoReporter;
 import '../elements/elements.dart';
@@ -2184,8 +2185,10 @@
     ImportElement deferredImport =
         deferredLoadTask.deferredImportElement(node, elements);
     if (deferredImport != null) {
+      OutputUnit unit =
+          compiler.backend.outputUnitData.outputUnitForMember(field);
       instruction = graph.addDeferredConstant(
-          value, deferredImport, sourceInformation, compiler, closedWorld);
+          value, unit, sourceInformation, compiler, closedWorld);
     } else {
       instruction = graph.addConstant(value, closedWorld,
           sourceInformation: sourceInformation);
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 803a408..0f0724b 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -2530,8 +2530,18 @@
       ConstantValue value = _elementMap.getFieldConstantValue(field);
       if (value != null) {
         if (!field.isAssignable) {
-          stack.add(graph.addConstant(value, closedWorld,
-              sourceInformation: sourceInformation));
+          var unit = compiler.backend.outputUnitData.outputUnitForEntity(field);
+          // TODO(sigmund): this is not equivalent to what the old FE does: if
+          // there is no prefix the old FE wouldn't treat this in any special
+          // way. Also, if the prefix points to a constant in the main output
+          // unit, the old FE would still generate a deferred wrapper here.
+          if (!unit.isMainOutput) {
+            stack.add(graph.addDeferredConstant(
+                value, unit, sourceInformation, compiler, closedWorld));
+          } else {
+            stack.add(graph.addConstant(value, closedWorld,
+                sourceInformation: sourceInformation));
+          }
         } else {
           push(new HStatic(field, _typeInferenceMap.getInferredTypeOf(field),
               sourceInformation));
@@ -4790,7 +4800,7 @@
   // Invariant: *INSIDE_LOOP* > *OUTSIDE_LOOP*
   static const INLINING_NODES_OUTSIDE_LOOP = 15;
   static const INLINING_NODES_OUTSIDE_LOOP_ARG_FACTOR = 3;
-  static const INLINING_NODES_INSIDE_LOOP = 42;
+  static const INLINING_NODES_INSIDE_LOOP = 34;
   static const INLINING_NODES_INSIDE_LOOP_ARG_FACTOR = 4;
 
   static bool canBeInlined(KernelToElementMapForBuilding elementMap,
@@ -4838,6 +4848,7 @@
     return true;
   }
 
+  @override
   defaultNode(ir.Node node) {
     if (tooDifficult) return;
     if (!registerNode()) return;
@@ -4848,6 +4859,7 @@
     node.visitChildren(this);
   }
 
+  @override
   visitReturnStatement(ir.ReturnStatement node) {
     if (!registerNode()) return;
     if (seenReturn) {
@@ -4858,6 +4870,7 @@
     seenReturn = true;
   }
 
+  @override
   visitThrow(ir.Throw node) {
     if (!registerNode()) return;
     if (seenReturn) {
@@ -4876,42 +4889,51 @@
     // isn't in the AST based inline weeder.
   }
 
+  @override
   visitForStatement(ir.ForStatement node) {
     _handleLoop();
   }
 
+  @override
   visitForInStatement(ir.ForInStatement node) {
     _handleLoop();
   }
 
+  @override
   visitWhileStatement(ir.WhileStatement node) {
     _handleLoop();
   }
 
+  @override
   visitDoStatement(ir.DoStatement node) {
     _handleLoop();
   }
 
+  @override
   visitTryCatch(ir.TryCatch node) {
     if (tooDifficult) return;
     tooDifficultReason = 'try';
   }
 
+  @override
   visitTryFinally(ir.TryFinally node) {
     if (tooDifficult) return;
     tooDifficultReason = 'try';
   }
 
+  @override
   visitFunctionExpression(ir.FunctionExpression node) {
     if (!registerNode()) return;
     tooDifficultReason = 'closure';
   }
 
+  @override
   visitFunctionDeclaration(ir.FunctionDeclaration node) {
     if (!registerNode()) return;
     tooDifficultReason = 'closure';
   }
 
+  @override
   visitFunctionNode(ir.FunctionNode node) {
     if (node.asyncMarker != ir.AsyncMarker.Sync) {
       tooDifficultReason = 'async/await';
@@ -4919,6 +4941,36 @@
     }
     node.visitChildren(this);
   }
+
+  @override
+  visitConditionalExpression(ir.ConditionalExpression node) {
+    // Heuristic: In "parameter ? A : B" there is a high probability that
+    // parameter is a constant. Assuming the parameter is constant, we can
+    // compute a count that is bounded by the largest arm rather than the sum of
+    // both arms.
+    ir.Expression condition = node.condition;
+    condition.accept(this);
+    if (tooDifficult) return;
+    int commonPrefixCount = nodeCount;
+
+    node.then.accept(this);
+    if (tooDifficult) return;
+    int thenCount = nodeCount - commonPrefixCount;
+
+    nodeCount = commonPrefixCount;
+    node.otherwise.accept(this);
+    if (tooDifficult) return;
+    int elseCount = nodeCount - commonPrefixCount;
+
+    nodeCount = commonPrefixCount + thenCount + elseCount;
+    if (condition is ir.VariableGet &&
+        condition.variable.parent is ir.FunctionNode) {
+      nodeCount =
+          commonPrefixCount + (thenCount > elseCount ? thenCount : elseCount);
+    }
+    // This is last so that [tooDifficult] is always updated.
+    if (!registerNode()) return;
+  }
 }
 
 /// Class in charge of building try, catch and/or finally blocks. This handles
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index a373b52..2b98deb 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -8,6 +8,7 @@
 import '../compiler.dart' show Compiler;
 import '../constants/constant_system.dart';
 import '../constants/values.dart';
+import '../deferred_load.dart' show OutputUnit;
 import '../elements/entities.dart';
 import '../elements/jumps.dart';
 import '../elements/types.dart';
@@ -273,15 +274,12 @@
 
   HConstant addDeferredConstant(
       ConstantValue constant,
-      ImportEntity import,
+      OutputUnit unit,
       SourceInformation sourceInformation,
       Compiler compiler,
       ClosedWorld closedWorld) {
-    // TODO(sigurdm,johnniwinther): These deferred constants should be created
-    // by the constant evaluator.
-    ConstantValue wrapper = new DeferredConstantValue(constant, import);
-    compiler.backend.outputUnitData
-        .registerConstantDeferredUse(wrapper, import);
+    ConstantValue wrapper = new DeferredGlobalConstantValue(constant, unit);
+    compiler.backend.outputUnitData.registerConstantDeferredUse(wrapper, unit);
     return addConstant(wrapper, closedWorld,
         sourceInformation: sourceInformation);
   }
diff --git a/pkg/compiler/lib/src/ssa/value_range_analyzer.dart b/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
index e13b834..d796db4 100644
--- a/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
+++ b/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
@@ -684,6 +684,8 @@
     NumConstantValue constantNum;
     if (constant is DeferredConstantValue) {
       constantNum = constant.referenced;
+    } else if (constant is DeferredGlobalConstantValue) {
+      constantNum = constant.referenced;
     } else {
       constantNum = constant;
     }
diff --git a/pkg/compiler/lib/src/types/constants.dart b/pkg/compiler/lib/src/types/constants.dart
index 382a3e6..0bd4b32 100644
--- a/pkg/compiler/lib/src/types/constants.dart
+++ b/pkg/compiler/lib/src/types/constants.dart
@@ -35,6 +35,12 @@
   }
 
   @override
+  TypeMask visitDeferredGlobal(
+      DeferredGlobalConstantValue constant, ClosedWorld closedWorld) {
+    return constant.referenced.accept(this, closedWorld);
+  }
+
+  @override
   TypeMask visitDouble(DoubleConstantValue constant, ClosedWorld closedWorld) {
     // We have to recognize double constants that are 'is int'.
     if (closedWorld.constantSystem.isInt(constant)) {
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder.dart b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
index 2649f62..7335b12 100644
--- a/pkg/compiler/lib/src/universe/codegen_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
@@ -667,10 +667,12 @@
 }
 
 class KernelCodegenWorldBuilder extends CodegenWorldBuilderImpl {
-  KernelToWorldBuilder _elementMap;
+  final KernelToWorldBuilder _elementMap;
+  final GlobalLocalsMap _globalLocalsMap;
 
   KernelCodegenWorldBuilder(
       this._elementMap,
+      this._globalLocalsMap,
       ElementEnvironment elementEnvironment,
       NativeBasicData nativeBasicData,
       ClosedWorld world,
@@ -697,8 +699,7 @@
   @override
   void forEachParameterAsLocal(
       FunctionEntity function, void f(Local parameter)) {
-    throw new UnimplementedError(
-        'KernelCodegenWorldBuilder.forEachParameterAsLocal');
+    forEachOrderedParameter(_globalLocalsMap, _elementMap, function, f);
   }
 
   @override
diff --git a/pkg/compiler/lib/src/universe/resolution_world_builder.dart b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
index a8501fb..c08d246 100644
--- a/pkg/compiler/lib/src/universe/resolution_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
@@ -296,17 +296,28 @@
   Map<ClassEntity, _ClassUsage> get classUsageForTesting => _processedClasses;
 
   /// Map of registered usage of static members of live classes.
-  final Map<Entity, _MemberUsage> _staticMemberUsage = <Entity, _MemberUsage>{};
-
-  Map<Entity, _MemberUsage> get staticMemberUsageForTesting =>
-      _staticMemberUsage;
-
-  /// Map of registered usage of instance members of live classes.
-  final Map<MemberEntity, _MemberUsage> _instanceMemberUsage =
+  final Map<MemberEntity, _MemberUsage> _memberUsage =
       <MemberEntity, _MemberUsage>{};
 
-  Map<MemberEntity, _MemberUsage> get instanceMemberUsageForTesting =>
-      _instanceMemberUsage;
+  Map<MemberEntity, _MemberUsage> get staticMemberUsageForTesting {
+    Map<MemberEntity, _MemberUsage> map = <MemberEntity, _MemberUsage>{};
+    _memberUsage.forEach((MemberEntity member, _MemberUsage usage) {
+      if (!member.isInstanceMember) {
+        map[member] = usage;
+      }
+    });
+    return map;
+  }
+
+  Map<MemberEntity, _MemberUsage> get instanceMemberUsageForTesting {
+    Map<MemberEntity, _MemberUsage> map = <MemberEntity, _MemberUsage>{};
+    _memberUsage.forEach((MemberEntity member, _MemberUsage usage) {
+      if (member.isInstanceMember) {
+        map[member] = usage;
+      }
+    });
+    return map;
+  }
 
   /// Map containing instance members of live classes that are not yet live
   /// themselves.
@@ -616,7 +627,7 @@
 
     MemberEntity element = staticUse.element;
     EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
-    _MemberUsage usage = _staticMemberUsage.putIfAbsent(element, () {
+    _MemberUsage usage = _memberUsage.putIfAbsent(element, () {
       _MemberUsage usage = new _MemberUsage(element);
       useSet.addAll(usage.appliedUse);
       return usage;
@@ -749,7 +760,7 @@
     // 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.
-    _instanceMemberUsage.putIfAbsent(member, () {
+    _memberUsage.putIfAbsent(member, () {
       bool isNative = _nativeBasicData.isNativeClass(cls);
       _MemberUsage usage = new _MemberUsage(member, isNative: isNative);
       EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
@@ -816,12 +827,7 @@
 
   @override
   bool isMemberUsed(MemberEntity member) {
-    if (member.isInstanceMember) {
-      _MemberUsage usage = _instanceMemberUsage[member];
-      if (usage != null && usage.hasUse) return true;
-    }
-    _MemberUsage usage = _staticMemberUsage[member];
-    return usage != null && usage.hasUse;
+    return _memberUsage[member]?.hasUse ?? false;
   }
 
   Map<ClassEntity, Set<ClassEntity>> populateHierarchyNodes() {
diff --git a/pkg/compiler/lib/src/universe/world_builder.dart b/pkg/compiler/lib/src/universe/world_builder.dart
index 8c3965d..a5b2922 100644
--- a/pkg/compiler/lib/src/universe/world_builder.dart
+++ b/pkg/compiler/lib/src/universe/world_builder.dart
@@ -24,6 +24,7 @@
 import '../js_backend/native_data.dart' show NativeBasicData, NativeDataBuilder;
 import '../js_backend/no_such_method_registry.dart';
 import '../js_backend/runtime_types.dart';
+import '../js_model/locals.dart';
 import '../kernel/element_map_impl.dart';
 import '../native/enqueue.dart' show NativeResolutionEnqueuer;
 import '../options.dart';
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index ef74950..a91d346 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -867,6 +867,7 @@
     }
 
     ClassSet classSet = getClassSet(base);
+    assert(classSet != null, failedAt(base, "No class set for $base."));
     ClassHierarchyNode node = classSet.node;
     if (query == ClassQuery.EXACT) {
       return node.isExplicitlyInstantiated && !hasConcreteMatch(base, selector);
diff --git a/pkg/compiler/testing_dart.json b/pkg/compiler/testing_dart.json
index 82bbdb7..736a55f 100644
--- a/pkg/compiler/testing_dart.json
+++ b/pkg/compiler/testing_dart.json
@@ -14,83 +14,45 @@
     ],
 
     "exclude": [
-      "^tests/compiler/dart2js/analyze_api_test\\.dart",
-      "^tests/compiler/dart2js/analyze_test_test\\.dart",
-      "^tests/compiler/dart2js/bad_output_io_test\\.dart",
-      "^tests/compiler/dart2js/boolified_operator_test\\.dart",
       "^tests/compiler/dart2js/codegen_helper\\.dart",
       "^tests/compiler/dart2js/constant_expression_evaluate_test\\.dart",
       "^tests/compiler/dart2js/constant_expression_test\\.dart",
-      "^tests/compiler/dart2js/dart2js_batch2_test\\.dart",
-      "^tests/compiler/dart2js/dart2js_batch_test\\.dart",
-      "^tests/compiler/dart2js/dart2js_resolver_test\\.dart",
-      "^tests/compiler/dart2js/data/dart2js_batch2_run\\.dart",
       "^tests/compiler/dart2js/data/mirrors_helper\\.dart",
       "^tests/compiler/dart2js/data/one_line_dart_program\\.dart",
-      "^tests/compiler/dart2js/deferred_custom_element_test\\.dart",
-      "^tests/compiler/dart2js/deferred_dont_inline_deferred_constants_test\\.dart",
-      "^tests/compiler/dart2js/deferred_dont_inline_deferred_globals_test\\.dart",
-      "^tests/compiler/dart2js/deferred_follow_constant_dependencies_test\\.dart",
-      "^tests/compiler/dart2js/deferred_follow_implicit_super_regression_test\\.dart",
-      "^tests/compiler/dart2js/deferred_inline_restrictions_test\\.dart",
-      "^tests/compiler/dart2js/deferred_load_graph_segmentation2_test\\.dart",
-      "^tests/compiler/dart2js/deferred_load_graph_segmentation_test\\.dart",
-      "^tests/compiler/dart2js/deferred_mirrors_test\\.dart",
-      "^tests/compiler/dart2js/deferred_not_in_main_test\\.dart",
-      "^tests/compiler/dart2js/embedded_category_api_boundary_test\\.dart",
-      "^tests/compiler/dart2js/exit_code_test\\.dart",
-      "^tests/compiler/dart2js/expect_annotations2_test\\.dart",
-      "^tests/compiler/dart2js/flatten_test\\.dart",
-      "^tests/compiler/dart2js/gvn_dynamic_field_get_test\\.dart",
-      "^tests/compiler/dart2js/import_mirrors_test\\.dart",
-      "^tests/compiler/dart2js/import_test\\.dart",
+      "^tests/compiler/dart2js/deferred/inline_restrictions_test\\.dart",
+      "^tests/compiler/dart2js/deferred/load_graph_segmentation2_test\\.dart",
+      "^tests/compiler/dart2js/deferred/load_graph_segmentation_test\\.dart",
+      "^tests/compiler/dart2js/mirrors/deferred_mirrors_test\\.dart",
+      "^tests/compiler/dart2js/deferred/not_in_main_test\\.dart",
       "^tests/compiler/dart2js/in_user_code_test\\.dart",
-      "^tests/compiler/dart2js/interop_anonymous_unreachable_test\\.dart",
-      "^tests/compiler/dart2js/js_constant_test\\.dart",
-      "^tests/compiler/dart2js/js_parser_statements_test\\.dart",
-      "^tests/compiler/dart2js/js_spec_optimization_test\\.dart",
       "^tests/compiler/dart2js/jsinterop/world_test\\.dart",
       "^tests/compiler/dart2js/kernel/class_hierarchy_test\\.dart",
       "^tests/compiler/dart2js/kernel/closed_world_test\\.dart",
       "^tests/compiler/dart2js/kernel/visitor_test\\.dart",
-      "^tests/compiler/dart2js/least_upper_bound_test\\.dart",
-      "^tests/compiler/dart2js/library_resolution_test\\.dart",
-      "^tests/compiler/dart2js/list_tracer2_test\\.dart",
-      "^tests/compiler/dart2js/list_tracer3_test\\.dart",
-      "^tests/compiler/dart2js/members_test\\.dart",
       "^tests/compiler/dart2js/memory_compiler\\.dart",
-      "^tests/compiler/dart2js/message_kind_helper\\.dart",
-      "^tests/compiler/dart2js/metadata_test\\.dart",
-      "^tests/compiler/dart2js/minimal_resolution_test\\.dart",
-      "^tests/compiler/dart2js/mirrors_used_test\\.dart",
+      "^tests/compiler/dart2js/old_frontend/message_kind_helper\\.dart",
+      "^tests/compiler/dart2js/old_frontend/metadata_test\\.dart",
+      "^tests/compiler/dart2js/mirrors/mirrors_used_test\\.dart",
       "^tests/compiler/dart2js/mixin_typevariable_test\\.dart",
-      "^tests/compiler/dart2js/mock_compiler\\.dart",
-      "^tests/compiler/dart2js/modulo_remainder_test\\.dart",
       "^tests/compiler/dart2js/needs_no_such_method_test\\.dart",
       "^tests/compiler/dart2js/no_such_method_enabled_test\\.dart",
       "^tests/compiler/dart2js/output_collector\\.dart",
-      "^tests/compiler/dart2js/override_inheritance_test\\.dart",
-      "^tests/compiler/dart2js/package_root_test\\.dart",
-      "^tests/compiler/dart2js/partial_parser_test\\.dart",
-      "^tests/compiler/dart2js/patch_test\\.dart",
+      "^tests/compiler/dart2js/old_frontend/patch_test\\.dart",
       "^tests/compiler/dart2js/quarantined/http_launch_data/http_launch_main_package\\.dart",
       "^tests/compiler/dart2js/quarantined/http_test\\.dart",
-      "^tests/compiler/dart2js/reexport_handled_test\\.dart",
-      "^tests/compiler/dart2js/resolution_test\\.dart",
-      "^tests/compiler/dart2js/resolver_test\\.dart",
+      "^tests/compiler/dart2js/old_frontend/reexport_handled_test\\.dart",
+      "^tests/compiler/dart2js/old_frontend/resolution_test\\.dart",
       "^tests/compiler/dart2js/serialization/analysis_test_helper\\.dart",
       "^tests/compiler/dart2js/serialization/compilation_test_helper\\.dart",
       "^tests/compiler/dart2js/serialization/duplicate_library_test\\.dart",
       "^tests/compiler/dart2js/serialization/equivalence_test\\.dart",
       "^tests/compiler/dart2js/serialization/model_test_helper\\.dart",
       "^tests/compiler/dart2js/serialization/test_helper\\.dart",
-      "^tests/compiler/dart2js/simple_inferrer_closure_test\\.dart",
-      "^tests/compiler/dart2js/simple_inferrer_const_closure2_test\\.dart",
-      "^tests/compiler/dart2js/simple_inferrer_const_closure_default_test\\.dart",
-      "^tests/compiler/dart2js/simple_inferrer_const_closure_test\\.dart",
-      "^tests/compiler/dart2js/simple_inferrer_global_field_closure_test\\.dart",
-      "^tests/compiler/dart2js/simple_inferrer_test\\.dart",
-      "^tests/compiler/dart2js/size_test\\.dart",
+      "^tests/compiler/dart2js/inference/simple_inferrer_closure_test\\.dart",
+      "^tests/compiler/dart2js/inference/simple_inferrer_const_closure2_test\\.dart",
+      "^tests/compiler/dart2js/inference/simple_inferrer_const_closure_test\\.dart",
+      "^tests/compiler/dart2js/inference/simple_inferrer_global_field_closure_test\\.dart",
+      "^tests/compiler/dart2js/inference/simple_inferrer_test\\.dart",
       "^tests/compiler/dart2js/sourcemaps/helpers/source_map_validator_helper\\.dart",
       "^tests/compiler/dart2js/sourcemaps/diff_view\\.dart",
       "^tests/compiler/dart2js/sourcemaps/html_parts\\.dart",
@@ -105,15 +67,9 @@
       "^tests/compiler/dart2js/sourcemaps/stacktrace_test\\.dart",
       "^tests/compiler/dart2js/subtype_test\\.dart",
       "^tests/compiler/dart2js/subtypeset_test\\.dart",
-      "^tests/compiler/dart2js/tdiv_test\\.dart",
       "^tests/compiler/dart2js/token_naming_test\\.dart",
-      "^tests/compiler/dart2js/trust_type_annotations_test\\.dart",
-      "^tests/compiler/dart2js/type_checker_test\\.dart",
-      "^tests/compiler/dart2js/type_equals_test\\.dart",
-      "^tests/compiler/dart2js/type_inference8_test\\.dart",
-      "^tests/compiler/dart2js/type_mask2_test\\.dart",
-      "^tests/compiler/dart2js/type_mask_test\\.dart",
-      "^tests/compiler/dart2js/type_order_test\\.dart",
+      "^tests/compiler/dart2js/inference/type_inference8_test\\.dart",
+      "^tests/compiler/dart2js/inference/type_mask2_test\\.dart",
       "^tests/compiler/dart2js/type_representation_test\\.dart",
       "^tests/compiler/dart2js/type_substitution_test\\.dart",
       "^tests/compiler/dart2js/type_variable_occurrence_test\\.dart",
diff --git a/pkg/dart_internal/lib/extract_type_arguments.dart b/pkg/dart_internal/lib/extract_type_arguments.dart
index 7c93e5f..218d075 100644
--- a/pkg/dart_internal/lib/extract_type_arguments.dart
+++ b/pkg/dart_internal/lib/extract_type_arguments.dart
@@ -9,6 +9,7 @@
 //
 // Only this exact special file is allowed to import "dart:_internal" without
 // causing a compile error.
+// ignore: import_internal_library
 import 'dart:_internal' as internal;
 
 /// Given an [Iterable], invokes [extract], passing the [iterable]'s type
diff --git a/pkg/dev_compiler/bin/dartdevk.dart b/pkg/dev_compiler/bin/dartdevk.dart
index 7a212de..b0d6aec 100755
--- a/pkg/dev_compiler/bin/dartdevk.dart
+++ b/pkg/dev_compiler/bin/dartdevk.dart
@@ -9,14 +9,18 @@
 import 'dart:convert';
 import 'dart:io';
 
+import 'package:bazel_worker/bazel_worker.dart';
 import 'package:dev_compiler/src/kernel/command.dart';
 import 'package:front_end/src/api_unstable/ddc.dart' as fe;
 
 Future main(List<String> args) async {
-  if (args.isNotEmpty && args.last == "--batch") {
-    await runBatch(args.sublist(0, args.length - 1));
+  var parsedArgs = _preprocessArgs(args);
+  if (parsedArgs.isBatch) {
+    await runBatch(parsedArgs.args);
+  } else if (parsedArgs.isWorker) {
+    await new _CompilerWorker(parsedArgs.args).run();
   } else {
-    var result = await compile(args);
+    var result = await compile(parsedArgs.args);
     var succeeded = result.result;
     exitCode = succeeded ? 0 : 1;
   }
@@ -60,3 +64,80 @@
   var time = watch.elapsedMilliseconds;
   print('>>> BATCH END (${tests - failed})/$tests ${time}ms');
 }
+
+/// Runs the compiler worker loop.
+class _CompilerWorker extends AsyncWorkerLoop {
+  /// The original args supplied to the executable.
+  final List<String> _startupArgs;
+
+  _CompilerWorker(this._startupArgs) : super();
+
+  /// Performs each individual work request.
+  Future<WorkResponse> performRequest(WorkRequest request) async {
+    var args = _startupArgs.toList()..addAll(request.arguments);
+
+    var output = new StringBuffer();
+    var result = await runZoned(() => compile(args), zoneSpecification:
+        new ZoneSpecification(print: (self, parent, zone, message) {
+      output.writeln(message.toString());
+    }));
+    return new WorkResponse()
+      ..exitCode = result.result ? 0 : 1
+      ..output = output.toString();
+  }
+}
+
+/// Preprocess arguments to determine whether DDK is used in batch mode or as a
+/// persistent worker.
+///
+/// When used in batch mode, we expect a `--batch` parameter last.
+///
+/// When used as a persistent bazel worker, the `--persistent_worker` might be
+/// present, and an argument of the form `@path/to/file` might be provided. The
+/// latter needs to be replaced by reading all the contents of the
+/// file and expanding them into the resulting argument list.
+_ParsedArgs _preprocessArgs(List<String> args) {
+  if (args.isEmpty) return new _ParsedArgs(false, false, args);
+
+  String lastArg = args.last;
+  if (lastArg == '--batch') {
+    return new _ParsedArgs(true, false, args.sublist(0, args.length - 1));
+  }
+
+  var newArgs = [];
+  bool isWorker = false;
+  var len = args.length;
+  for (int i = 0; i < len; i++) {
+    var arg = args[i];
+    if (i == len - 1 && arg.startsWith('@')) {
+      newArgs.addAll(_readLines(arg.substring(1)));
+    } else if (arg == '--persistent_worker') {
+      isWorker = true;
+    } else {
+      newArgs.add(arg);
+    }
+  }
+  return new _ParsedArgs(false, isWorker, newArgs);
+}
+
+/// Return all lines in a file found at [path].
+Iterable<String> _readLines(String path) {
+  try {
+    return new File(path)
+        .readAsStringSync()
+        .replaceAll('\r\n', '\n')
+        .replaceAll('\r', '\n')
+        .split('\n')
+        .where((String line) => line.isNotEmpty);
+  } on FileSystemException catch (e) {
+    throw new Exception('Failed to read $path: $e');
+  }
+}
+
+class _ParsedArgs {
+  final bool isBatch;
+  final bool isWorker;
+  final List<String> args;
+
+  _ParsedArgs(this.isBatch, this.isWorker, this.args);
+}
diff --git a/pkg/dev_compiler/web/web_command.dart b/pkg/dev_compiler/web/web_command.dart
index b50616f..857af1f 100644
--- a/pkg/dev_compiler/web/web_command.dart
+++ b/pkg/dev_compiler/web/web_command.dart
@@ -100,7 +100,9 @@
 
     try {
       sdkRequest = await HttpRequest.request(sdkUrl,
-          responseType: "arraybuffer", mimeType: "application/octet-stream");
+          responseType: "arraybuffer",
+          mimeType: "application/octet-stream",
+          withCredentials: true);
     } catch (error) {
       onError('Dart sdk summaries failed to load: $error. url: $sdkUrl');
       return null;
diff --git a/pkg/front_end/lib/src/api_prototype/summary_generator.dart b/pkg/front_end/lib/src/api_prototype/summary_generator.dart
index 6557156..8bd633a 100644
--- a/pkg/front_end/lib/src/api_prototype/summary_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/summary_generator.dart
@@ -35,9 +35,14 @@
 /// are also listed in the build unit sources, otherwise an error results.  (It
 /// is not permitted to refer to a part file declared in another build unit).
 ///
+/// If [truncate] is true, the resulting summary doesn't include any references
+/// to libraries loaded from the input summaries, and only contains code that
+/// was compiled from sources.
+///
 /// The return value is a list of bytes to write to the summary file.
-Future<List<int>> summaryFor(List<Uri> sources, CompilerOptions options) async {
+Future<List<int>> summaryFor(List<Uri> sources, CompilerOptions options,
+    {bool truncate: false}) async {
   return (await generateKernel(new ProcessedOptions(options, true, sources),
-          buildSummary: true, buildProgram: false))
+          buildSummary: true, buildProgram: false, truncateSummary: truncate))
       ?.summary;
 }
diff --git a/pkg/front_end/lib/src/api_unstable/dart2js.dart b/pkg/front_end/lib/src/api_unstable/dart2js.dart
index fc92b87..a7adc1f 100644
--- a/pkg/front_end/lib/src/api_unstable/dart2js.dart
+++ b/pkg/front_end/lib/src/api_unstable/dart2js.dart
@@ -30,7 +30,7 @@
 
   CompilerOptions options = new CompilerOptions()
     ..target = target
-    ..strongMode = false
+    ..strongMode = target.strongMode
     ..linkedDependencies = [sdkUri]
     ..packagesFileUri = packagesFileUri;
 
diff --git a/pkg/front_end/lib/src/api_unstable/summary_worker.dart b/pkg/front_end/lib/src/api_unstable/summary_worker.dart
new file mode 100644
index 0000000..33c09af
--- /dev/null
+++ b/pkg/front_end/lib/src/api_unstable/summary_worker.dart
@@ -0,0 +1,61 @@
+// 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.
+
+/// API needed by `utils/front_end/summary_worker.dart`, a tool used to compute
+/// summaries in build systems like bazel, pub-build, and package-build.
+
+import 'dart:async' show Future;
+
+import 'package:front_end/src/api_prototype/file_system.dart';
+import 'package:front_end/src/base/processed_options.dart';
+import 'package:front_end/src/kernel_generator_impl.dart';
+import 'package:kernel/target/targets.dart' show Target;
+
+import '../api_prototype/compiler_options.dart';
+import 'compiler_state.dart';
+
+export 'compiler_state.dart';
+
+export '../api_prototype/physical_file_system.dart' show PhysicalFileSystem;
+export '../fasta/fasta_codes.dart' show LocatedMessage;
+export '../fasta/severity.dart' show Severity;
+
+Future<InitializedCompilerState> initializeCompiler(
+    InitializedCompilerState oldState,
+    Uri sdkSummary,
+    Uri packagesFile,
+    List<Uri> inputSummaries,
+    Target target,
+    FileSystem fileSystem) async {
+  // TODO(sigmund): use incremental compiler when it supports our use case.
+  // Note: it is common for the summary worker to invoke the compiler with the
+  // same input summary URIs, but with different contents, so we'd need to be
+  // able to track shas or modification time-stamps to be able to invalidate the
+  // old state appropriately.
+  CompilerOptions options = new CompilerOptions()
+    ..sdkSummary = sdkSummary
+    ..packagesFileUri = packagesFile
+    ..inputSummaries = inputSummaries
+    ..target = target
+    ..fileSystem = fileSystem
+    ..chaseDependencies = true;
+
+  ProcessedOptions processedOpts = new ProcessedOptions(options, true, []);
+
+  return new InitializedCompilerState(options, processedOpts);
+}
+
+Future<List<int>> compile(InitializedCompilerState compilerState,
+    List<Uri> inputs, ProblemHandler problemHandler) async {
+  CompilerOptions options = compilerState.options;
+  options..onProblem = problemHandler;
+
+  ProcessedOptions processedOpts = compilerState.processedOpts;
+  processedOpts.inputs.clear();
+  processedOpts.inputs.addAll(inputs);
+
+  var result = await generateKernel(processedOpts,
+      buildSummary: true, buildProgram: false);
+  return result?.summary;
+}
diff --git a/pkg/front_end/lib/src/fasta/builder/library_builder.dart b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
index dea20dc..7a77519 100644
--- a/pkg/front_end/lib/src/fasta/builder/library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
@@ -175,8 +175,10 @@
   int finishTypeVariables(ClassBuilder object) => 0;
 
   void becomeCoreLibrary(dynamicType) {
-    addBuilder("dynamic",
-        new DynamicTypeBuilder<T, dynamic>(dynamicType, this, -1), -1);
+    if (scope.local["dynamic"] == null) {
+      addBuilder("dynamic",
+          new DynamicTypeBuilder<T, dynamic>(dynamicType, this, -1), -1);
+    }
   }
 
   void forEach(void f(String name, Builder builder)) {
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 0268c43..dad91b9 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -2066,7 +2066,7 @@
     messageTemplate:
         r"""The integer literal #lexeme can't be represented in 64 bits.""",
     tipTemplate:
-        r"""Try using BigInt (from 'dart:typed_data' library) if you need an integer larger than 9,223,372,036,854,775,807 or less than -9,223,372,036,854,775,808.""",
+        r"""Try using the BigInt class if you need an integer larger than 9,223,372,036,854,775,807 or less than -9,223,372,036,854,775,808.""",
     withArguments: _withArgumentsIntegerLiteralIsOutOfRange);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2083,7 +2083,7 @@
       message:
           """The integer literal $lexeme can't be represented in 64 bits.""",
       tip:
-          """Try using BigInt (from 'dart:typed_data' library) if you need an integer larger than 9,223,372,036,854,775,807 or less than -9,223,372,036,854,775,808.""",
+          """Try using the BigInt class if you need an integer larger than 9,223,372,036,854,775,807 or less than -9,223,372,036,854,775,808.""",
       arguments: {'token': token});
 }
 
@@ -4174,7 +4174,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageSuperAsExpression = const MessageCode(
     "SuperAsExpression",
-    message: r"""Super calls can't be used as expressions.""",
+    message: r"""Can't use 'super' as an expression.""",
     tip:
         r"""To delegate a constructor to a super constructor, put the super call as an initializer.""");
 
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index e210ad2..0a3c742 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -6,7 +6,8 @@
 
 import 'dart:async' show Future;
 
-import 'package:kernel/kernel.dart' show Program, loadProgramFromBytes;
+import 'package:kernel/kernel.dart'
+    show Library, Program, Source, loadProgramFromBytes;
 
 import '../api_prototype/incremental_kernel_generator.dart'
     show DeltaProgram, IncrementalKernelGenerator;
@@ -76,6 +77,7 @@
   @override
   Future<FastaDelta> computeDelta({Uri entryPoint}) async {
     ticker.reset();
+    entryPoint ??= context.options.inputs.single;
     return context.runInContext<Future<FastaDelta>>((CompilerContext c) async {
       if (platform == null) {
         UriTranslator uriTranslator = await c.options.getUriTranslator();
@@ -98,21 +100,37 @@
 
       List<LibraryBuilder> reusedLibraries =
           computeReusedLibraries(invalidatedUris);
-      ticker.logMs("Decided to reuse ${reusedLibraries.length} libraries");
+      if (userCode != null) {
+        ticker.logMs("Decided to reuse ${reusedLibraries.length}"
+            " of ${userCode.loader.builders.length} libraries");
+      }
 
       userCode = new KernelTarget(
           c.fileSystem, false, platform, platform.uriTranslator,
           uriToSource: c.uriToSource);
       for (LibraryBuilder library in reusedLibraries) {
         userCode.loader.builders[library.uri] = library;
+        if (library.uri.scheme == "dart" && library.uri.path == "core") {
+          userCode.loader.coreLibrary = library;
+        }
       }
 
       userCode.read(entryPoint);
 
       await userCode.buildOutlines();
 
-      return new FastaDelta(
-          await userCode.buildProgram(verify: c.options.verify));
+      // This is not the full program. It is the program including all
+      // libraries loaded from .dill files.
+      Program programWithDill =
+          await userCode.buildProgram(verify: c.options.verify);
+
+      // This is the incremental program.
+      Program program = new Program(
+          nameRoot: programWithDill.root,
+          libraries: new List<Library>.from(userCode.loader.libraries),
+          uriToSource: new Map<Uri, Source>.from(userCode.uriToSource));
+
+      return new FastaDelta(program);
     });
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart b/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
index 7f5ddbf..40d70e2 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
@@ -13,6 +13,7 @@
     show
         messageInvalidInitializer,
         messageLoadLibraryTakesNoArguments,
+        messageSuperAsExpression,
         templateIntegerLiteralIsOutOfRange;
 
 import '../messages.dart' show Message;
@@ -352,8 +353,8 @@
     if (!isSuper) {
       return new ShadowThisExpression();
     } else {
-      return helper.deprecated_buildCompileTimeError(
-          "Can't use `super` as an expression.", offsetForToken(token));
+      return helper.buildCompileTimeError(
+          messageSuperAsExpression, offsetForToken(token));
     }
   }
 
@@ -406,6 +407,8 @@
   doInvocation(int offset, Arguments arguments) {
     if (isInitializer) {
       return buildConstructorInitializer(offset, new Name(""), arguments);
+    } else if (isSuper) {
+      return helper.buildCompileTimeError(messageSuperAsExpression, offset);
     } else {
       return helper.buildMethodInvocation(
           new ShadowThisExpression(), callName, arguments, offset,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_alias_builder.dart
index eeb4bad..263fef7 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_alias_builder.dart
@@ -66,7 +66,8 @@
       builtType.typedefReference = target.reference;
       if (typeVariables != null) {
         for (KernelTypeVariableBuilder tv in typeVariables) {
-          tv.parameter.bound = tv?.bound?.build(library);
+          // Follow bound in order to find all cycles
+          tv.bound?.build(library);
           target.typeParameters.add(tv.parameter..parent = target);
         }
       }
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 24a0534..431bd48 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -231,17 +231,18 @@
       loader.resolveTypes();
       List<SourceClassBuilder> myClasses = collectMyClasses();
       loader.checkSemantics(myClasses);
+      loader.finishTypeVariables(objectClassBuilder);
       loader.buildProgram();
       installDefaultSupertypes();
       installDefaultConstructors(myClasses);
       loader.resolveConstructors();
-      loader.finishTypeVariables(objectClassBuilder);
       program =
           link(new List<Library>.from(loader.libraries), nameRoot: nameRoot);
       if (metadataCollector != null) {
         program.addMetadataRepository(metadataCollector.repository);
       }
       loader.computeHierarchy(program);
+      computeCoreTypes();
       loader.checkOverrides(myClasses);
       if (!loader.target.disableTypeInference) {
         loader.prepareTopLevelInference(myClasses);
@@ -513,6 +514,41 @@
         isSyntheticDefault: true);
   }
 
+  void computeCoreTypes() {
+    List<Library> libraries = <Library>[];
+    for (String platformLibrary in const [
+      "dart:_internal",
+      "dart:async",
+      "dart:core",
+      "dart:mirrors"
+    ]) {
+      Uri uri = Uri.parse(platformLibrary);
+      LibraryBuilder library = loader.builders[uri];
+      if (library == null) {
+        // TODO(ahe): This is working around a bug in kernel_driver_test or
+        // kernel_driver.
+        bool found = false;
+        for (Library target in dillTarget.loader.libraries) {
+          if (target.importUri == uri) {
+            libraries.add(target);
+            found = true;
+            break;
+          }
+        }
+        if (!found && uri.path != "mirrors") {
+          // dart:mirrors is optional.
+          throw "Can't find $uri";
+        }
+      } else {
+        libraries.add(library.target);
+      }
+    }
+    Program plaformLibraries = new Program();
+    // Add libraries directly to prevent that their parents are changed.
+    plaformLibraries.libraries.addAll(libraries);
+    loader.computeCoreTypes(plaformLibraries);
+  }
+
   void finishAllConstructors(List<SourceClassBuilder> builders) {
     Class objectClass = this.objectClass;
     for (SourceClassBuilder builder in builders) {
diff --git a/pkg/front_end/lib/src/fasta/parser/class_member_parser.dart b/pkg/front_end/lib/src/fasta/parser/class_member_parser.dart
index 28904d0..381c598 100644
--- a/pkg/front_end/lib/src/fasta/parser/class_member_parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/class_member_parser.dart
@@ -6,8 +6,6 @@
 
 import '../../scanner/token.dart' show Token;
 
-import '../fasta_codes.dart' show Message;
-
 import 'assert.dart' show Assert;
 
 import 'listener.dart' show Listener;
@@ -38,16 +36,6 @@
     }
   }
 
-  @override
-  Token parseRecoverExpression(Token token, Message message) {
-    Token begin = token;
-    // TODO(brianwilkerson): Remove the invocation of `syntheticPreviousToken`
-    // when `parseRecoverExpression` accepts the last consumed token.
-    token = skipExpression(syntheticPreviousToken(token));
-    listener.handleRecoverExpression(begin, message);
-    return token;
-  }
-
   // This method is overridden for two reasons:
   // 1. Avoid generating events for arguments.
   // 2. Avoid calling skip expression for each argument (which doesn't work).
diff --git a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
index ff2104f..27989e2 100644
--- a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
@@ -1200,11 +1200,6 @@
   }
 
   @override
-  void handleRecoverExpression(Token token, Message message) {
-    listener?.handleRecoverExpression(token, message);
-  }
-
-  @override
   void handleRecoverableError(
       Message message, Token startToken, Token endToken) {
     listener?.handleRecoverableError(message, startToken, endToken);
@@ -1291,16 +1286,6 @@
   }
 
   @override
-  Token injectGenericCommentTypeAssign(Token token) {
-    return listener?.injectGenericCommentTypeAssign(token);
-  }
-
-  @override
-  Token injectGenericCommentTypeList(Token token) {
-    return listener?.injectGenericCommentTypeList(token);
-  }
-
-  @override
   void logEvent(String name) {
     listener?.logEvent(name);
   }
@@ -1314,13 +1299,6 @@
   List<ParserError> get recoverableErrors => listener?.recoverableErrors;
 
   @override
-  Token replaceTokenWithGenericCommentTypeAssign(
-      Token tokenToStartReplacing, Token tokenWithComment) {
-    return listener?.replaceTokenWithGenericCommentTypeAssign(
-        tokenToStartReplacing, tokenWithComment);
-  }
-
-  @override
   set suppressParseErrors(bool value) {
     listener?.suppressParseErrors = value;
   }
diff --git a/pkg/front_end/lib/src/fasta/parser/listener.dart b/pkg/front_end/lib/src/fasta/parser/listener.dart
index 8a9cf34..60f90dd 100644
--- a/pkg/front_end/lib/src/fasta/parser/listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/listener.dart
@@ -208,13 +208,6 @@
 
   void beginExpressionStatement(Token token) {}
 
-  /// Called by [ClassMemberParser] after skipping an expression as error
-  /// recovery. For a stack-based listener, the suggested action is to push
-  /// `null` or a synthetic erroneous expression.
-  void handleRecoverExpression(Token token, Message message) {
-    logEvent("RecoverExpression");
-  }
-
   /// Called by [Parser] after parsing an extraneous expression as error
   /// recovery. For a stack-based listener, the suggested action is to discard
   /// an expression from the stack.
@@ -1215,28 +1208,6 @@
     logEvent("Script");
   }
 
-  /// Matches a generic comment type substitution and injects it into the token
-  /// stream before the given [token].
-  Token injectGenericCommentTypeAssign(Token token) {
-    return token;
-  }
-
-  /// Matches a generic comment type variables or type arguments and injects
-  /// them into the token stream before the given [token].
-  Token injectGenericCommentTypeList(Token token) {
-    return token;
-  }
-
-  /// If the [tokenWithComment] has a type substitution comment /*=T*/, then
-  /// the comment should be scanned into new tokens, and these tokens inserted
-  /// instead of tokens from the [tokenToStartReplacing] to the
-  /// [tokenWithComment]. Returns the first newly inserted token, or the
-  /// original [tokenWithComment].
-  Token replaceTokenWithGenericCommentTypeAssign(
-      Token tokenToStartReplacing, Token tokenWithComment) {
-    return tokenToStartReplacing;
-  }
-
   /// A type has been just parsed, and the parser noticed that the next token
   /// has a type substitution comment /*=T*. So, the type that has been just
   /// parsed should be discarded, and a new type should be parsed instead.
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 c8920ee..b371988 100644
--- a/pkg/front_end/lib/src/fasta/parser/modifier_context.dart
+++ b/pkg/front_end/lib/src/fasta/parser/modifier_context.dart
@@ -478,11 +478,7 @@
       } else if (identical(value, 'static')) {
         token = parseStaticRecovery(token);
       } else if (identical(value, 'typedef')) {
-        // TODO(brianwilkerson): Move this into a `parseTypedefRecovery` method
-        // that can be more sophisticated about skipping the rest of the typedef
-        // declaration.
-        parser.reportRecoverableError(token.next, fasta.messageTypedefInClass);
-        token = token.next;
+        token = parseTypedefRecovery(token);
       } else if (identical(value, 'var')) {
         token = parseVarRecovery(token);
       } else if (token.next.isModifier) {
@@ -637,6 +633,16 @@
     return next;
   }
 
+  Token parseTypedefRecovery(Token token) {
+    token = token.next;
+    assert(optional('typedef', token));
+    parser.reportRecoverableError(token, fasta.messageTypedefInClass);
+    // TODO(brianwilkerson): If the declaration appears to be a valid typedef
+    // then skip the entire declaration so that we generate a single error
+    // (above) rather than many unhelpful errors.
+    return token;
+  }
+
   Token parseVarRecovery(Token token) {
     token = token.next;
     if (token.next.isIdentifier && optional('(', token.next.next)) {
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 3548042..08cfbc2 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -604,14 +604,13 @@
     } else {
       // Recovery
       listener.endImport(importKeyword, null);
-      return parseImportRecovery(uri, token);
+      return parseImportRecovery(uri);
     }
   }
 
   /// Recover given out-of-order clauses in an import directive where [token] is
-  /// the import keyword and [recoveryStart] is the token on which main parsing
-  /// stopped.
-  Token parseImportRecovery(Token token, Token recoveryStart) {
+  /// the import keyword.
+  Token parseImportRecovery(Token token) {
     final primaryListener = listener;
     final recoveryListener = new ImportRecoveryListener(primaryListener);
 
@@ -739,10 +738,10 @@
     Token equalitySign;
     if (optional('==', token)) {
       equalitySign = token;
-      token = parseLiteralStringOrRecoverExpression(token).next;
+      token = ensureLiteralString(token).next;
     }
     expect(')', token);
-    token = parseLiteralStringOrRecoverExpression(token);
+    token = ensureLiteralString(token);
     listener.endConditionalUri(ifKeyword, leftParen, equalitySign);
     return token;
   }
@@ -889,7 +888,7 @@
     Token partKeyword = token.next;
     assert(optional('part', partKeyword));
     listener.beginPart(partKeyword);
-    token = parseLiteralStringOrRecoverExpression(partKeyword);
+    token = ensureLiteralString(partKeyword);
     token = ensureSemicolon(token);
     listener.endPart(partKeyword, token);
     return token;
@@ -911,7 +910,7 @@
       token = parseQualified(ofKeyword, IdentifierContext.partName,
           IdentifierContext.partNameContinuation);
     } else {
-      token = parseLiteralStringOrRecoverExpression(ofKeyword);
+      token = ensureLiteralString(ofKeyword);
     }
     token = ensureSemicolon(token);
     listener.endPartOf(partKeyword, ofKeyword, token, hasName);
@@ -924,12 +923,6 @@
   /// ;
   /// ```
   Token parseMetadataStar(Token token) {
-    // TODO(brianwilkerson): Either remove the invocation of `previous` by
-    // making `injectGenericCommentTypeAssign` accept and return the last
-    // consumed token, or remove the invocation of
-    // `injectGenericCommentTypeAssign` by invoking it outside this method where
-    // invoking it is necessary.
-    token = listener.injectGenericCommentTypeAssign(token.next).previous;
     listener.beginMetadataStar(token.next);
     int count = 0;
     while (optional('@', token.next)) {
@@ -1042,10 +1035,19 @@
   }
 
   Token skipFormalParameters(Token token, MemberKind kind) {
+    Token lastConsumed = token;
     token = token.next;
-    assert(optional('(', token));
     // TODO(ahe): Shouldn't this be `beginFormalParameters`?
     listener.beginOptionalFormalParameters(token);
+    if (!optional('(', token)) {
+      if (optional(';', token)) {
+        reportRecoverableError(token, fasta.messageExpectedOpenParens);
+        listener.endFormalParameters(0, token, token, kind);
+        return lastConsumed;
+      }
+      listener.endFormalParameters(0, token, token, kind);
+      return reportUnexpectedToken(token);
+    }
     Token closeBrace = closeBraceTokenFor(token);
     listener.endFormalParameters(0, token, closeBrace, kind);
     return closeBrace;
@@ -1450,7 +1452,7 @@
       // Recovery
       token = parseClassHeaderRecovery(start, begin, classKeyword);
     }
-    token = parseClassBody(token, start.next);
+    token = parseClassBody(token);
     listener.endClassDeclaration(begin, token);
     return token;
   }
@@ -2030,20 +2032,11 @@
         // analyze the tokens following the const keyword.
         assert(optional("const", token.next));
         beforeBegin = token;
-        token = listener.injectGenericCommentTypeAssign(token.next.next);
-        // TODO(brianwilkerson): Remove the invocation of `previous` when
-        // `injectGenericCommentTypeAssign` returns the last consumed token.
-        begin = beforeToken = token.previous;
-        // TODO(brianwilkerson): Figure out how to remove the invocation of
-        // `previous`.
-        beforeBegin = begin.previous;
-        assert(begin.next == token);
+        begin = beforeToken = token.next;
+        token = beforeToken.next;
       } else {
-        // Modify [begin] in case generic type are injected from a comment.
-        begin = token = listener.injectGenericCommentTypeAssign(token.next);
-        // TODO(brianwilkerson): Remove the invocation of `previous` when
-        // `injectGenericCommentTypeAssign` returns the last consumed token.
-        beforeToken = beforeBegin = begin.previous;
+        beforeToken = beforeBegin = token;
+        token = begin = token.next;
       }
 
       if (optional("void", token)) {
@@ -2140,18 +2133,6 @@
         listener.handleType(begin, token.next);
       }
 
-      {
-        Token newBegin = listener.replaceTokenWithGenericCommentTypeAssign(
-            begin, token.next);
-        if (!identical(newBegin, begin)) {
-          listener.discardTypeReplacedWithCommentTypeAssign();
-          // TODO(brianwilkerson): Remove the invocation of `previous` when
-          // `replaceTokenWithGenericCommentTypeAssign` returns the last
-          // consumed token.
-          return parseType(newBegin.previous);
-        }
-      }
-
       for (int i = 0; i < functionTypes; i++) {
         Token next = token.next;
         assert(optional('Function', next));
@@ -2408,9 +2389,7 @@
         return parseNamedFunctionRest(beforeName, begin, formals, true);
 
       case TypeContinuation.VariablesDeclarationOrExpression:
-        if (looksLikeType &&
-            token.isIdentifier &&
-            isOneOf4(token.next, '=', ';', ',', 'in')) {
+        if (looksLikeType && token.isIdentifier) {
           // TODO(ahe): Generate type events and call
           // parseVariablesDeclarationNoSemicolonRest instead.
           return parseVariablesDeclarationNoSemicolon(beforeBegin);
@@ -2512,11 +2491,6 @@
           reportRecoverableError(nameToken, fasta.messagePrivateNamedParameter);
         }
 
-        // TODO(brianwilkerson): Remove the invocation of `previous` when
-        // `injectGenericCommentTypeList` returns the last consumed token.
-        beforeToken = listener.injectGenericCommentTypeList(token).previous;
-        token = beforeToken.next;
-
         Token inlineFunctionTypeStart;
         if (optional("<", token)) {
           Token closer = closeBraceTokenFor(token);
@@ -2640,9 +2614,6 @@
   /// TODO(ahe): Clean this up.
   Token parseStuffOpt(Token token, Function beginStuff, Function stuffParser,
       Function endStuff, Function handleNoStuff) {
-    // TODO(brianwilkerson): Remove the invocation of `previous` when
-    // `injectGenericCommentTypeList` returns the last consumed token.
-    token = listener.injectGenericCommentTypeList(token.next).previous;
     Token next = token.next;
     if (optional('<', next)) {
       BeginToken begin = next;
@@ -2961,16 +2932,11 @@
       } else if (isGetter) {
         hasName = true;
       }
-      token = listener.injectGenericCommentTypeAssign(token);
-      // TODO(brianwilkerson): Remove the invocation of `previous` when
-      // `injectGenericCommentTypeAssign` returns the last consumed token.
-      previous = token.previous;
       identifiers = identifiers.prepend(previous);
 
       if (!isGeneralizedFunctionType(token)) {
         // Read a potential return type.
         if (isValidTypeReference(token)) {
-          Token type = token;
           // type ...
           if (optional('.', token.next)) {
             // type '.' ...
@@ -2994,22 +2960,6 @@
               }
             }
           }
-          // If the next token after a type has a type substitution comment
-          // /*=T*/, then the previous type tokens and the reference to them
-          // from the link should be replaced.
-          {
-            Token newType = listener.replaceTokenWithGenericCommentTypeAssign(
-                type, token.next);
-            if (!identical(newType, type)) {
-              identifiers = identifiers.tail;
-              token = newType;
-              // TODO(brianwilkerson): Remove the invocation of `previous` when
-              // `replaceTokenWithGenericCommentTypeAssign` returns the last
-              // consumed token.
-              previous = token.previous;
-              continue;
-            }
-          }
         } else if (token.type.isBuiltIn) {
           // Handle the edge case where a built-in keyword is being used
           // as the identifier, as in "abstract<T>() => 0;"
@@ -3314,23 +3264,6 @@
     return token;
   }
 
-  Token parseLiteralStringOrRecoverExpression(Token token) {
-    // TODO(brianwilkerson) Replace invocations of this method with invocations
-    // of `ensureParseLiteralString`.
-    Token next = token.next;
-    if (identical(next.kind, STRING_TOKEN)) {
-      return parseLiteralString(token);
-    } else if (next is ErrorToken) {
-      // TODO(brianwilkerson): Remove the invocation of `previous` when
-      // `reportErrorToken` returns the last consumed token.
-      return reportErrorToken(next, false).previous;
-    } else {
-      reportRecoverableErrorWithToken(next, fasta.templateExpectedString);
-      return parseRecoverExpression(
-          token, fasta.templateExpectedString.withArguments(next));
-    }
-  }
-
   Token expectSemicolon(Token token) {
     return expect(';', token);
   }
@@ -3438,12 +3371,7 @@
   ///   '{' classMember* '}'
   /// ;
   /// ```
-  ///
-  /// The [beforeBody] token is required to be a token that appears somewhere
-  /// before the [token] in the token stream.
-  Token parseClassBody(Token token, Token beforeBody) {
-    // TODO(brianwilkerson): Remove the parameter `beforeBody` because it is not
-    // being used.
+  Token parseClassBody(Token token) {
     Token previousToken = token;
     Token begin = token = token.next;
     listener.beginClassBody(token);
@@ -4376,10 +4304,6 @@
     return token;
   }
 
-  Token parseRecoverExpression(Token token, Message message) {
-    return parseExpression(token);
-  }
-
   int expressionDepth = 0;
   Token parseExpression(Token token) {
     if (expressionDepth++ > 500) {
@@ -4618,11 +4542,7 @@
         next = token.next;
       } else if (optional('(', next)) {
         if (typeArguments == null) {
-          next = listener.injectGenericCommentTypeList(next);
           if (isValidMethodTypeArguments(next)) {
-            // TODO(brianwilkerson): Remove the invocation of `previous` when
-            // `injectGenericCommentTypeList` (invoked above) returns the last
-            // consumed token.
             token = parseTypeArgumentsOpt(token);
             next = token.next;
           } else {
@@ -4641,9 +4561,6 @@
   }
 
   Token parsePrimary(Token token, IdentifierContext context) {
-    // TODO(brianwilkerson): Remove the invocation of `previous` when
-    // `injectGenericCommentTypeList` returns the last consumed token.
-    token = listener.injectGenericCommentTypeList(token.next).previous;
     final kind = token.next.kind;
     if (kind == IDENTIFIER_TOKEN) {
       return parseSendOrFunctionLiteral(token, context);
@@ -5026,11 +4943,8 @@
   /// ;
   /// ```
   Token parseConstExpression(Token token) {
-    Token constKeyword = token.next;
+    Token constKeyword = token = token.next;
     assert(optional('const', constKeyword));
-    // TODO(brianwilkerson) Remove the invocation of `previous` when
-    // `injectGenericCommentTypeList` returns the last consumed token.
-    token = listener.injectGenericCommentTypeList(constKeyword.next).previous;
     Token next = token.next;
     final String value = next.stringValue;
     if ((identical(value, '[')) || (identical(value, '[]'))) {
@@ -5209,10 +5123,7 @@
   }
 
   Token parseSend(Token token, IdentifierContext context) {
-    Token beginToken = ensureIdentifier(token, context);
-    // TODO(brianwilkerson): Remove the invocation of `previous` when
-    // `injectGenericCommentTypeList` returns the last consumed token.
-    token = listener.injectGenericCommentTypeList(beginToken.next).previous;
+    Token beginToken = token = ensureIdentifier(token, context);
     if (isValidMethodTypeArguments(token.next)) {
       token = parseTypeArgumentsOpt(token);
     } else {
@@ -5380,20 +5291,6 @@
   Token parseVariablesDeclarationMaybeSemicolon(
       Token token, bool endWithSemicolon) {
     token = parseMetadataStar(token);
-
-    // If the next token has a type substitution comment /*=T*/, then
-    // the current 'var' token should be repealed and replaced.
-    // TODO(brianwilkerson): Shouldn't this also work when the current token is
-    // something other than `var`, such as in `Object /*=T*/ v;`?
-    if (optional('var', token.next)) {
-      // TODO(brianwilkerson): Remove the invocation of `previous` when
-      // `replaceTokenWithGenericCommentTypeAssign` returns the last consumed
-      // token.
-      token = listener
-          .replaceTokenWithGenericCommentTypeAssign(token.next, token.next.next)
-          .previous;
-    }
-
     token = parseModifiers(token, MemberKind.Local, isVarAllowed: true);
     return parseVariablesDeclarationMaybeSemicolonRest(token, endWithSemicolon);
   }
@@ -5462,6 +5359,7 @@
   /// ;
   /// ```
   Token parseForStatement(Token awaitToken, Token token) {
+    // TODO(brianwilkerson): Consider moving `token` to be the first parameter.
     Token forKeyword = token.next;
     assert(awaitToken == null || optional('await', awaitToken));
     listener.beginForStatement(forKeyword);
@@ -5518,6 +5416,7 @@
   /// ;
   /// ```
   Token parseForRest(Token forToken, Token leftParenthesis, Token token) {
+    // TODO(brianwilkerson): Consider moving `token` to be the first parameter.
     Token leftSeparator = ensureSemicolon(token);
     if (optional(';', leftSeparator.next)) {
       token = parseEmptyStatement(leftSeparator);
@@ -5559,6 +5458,7 @@
   /// ```
   Token parseForInRest(
       Token awaitToken, Token forKeyword, Token leftParenthesis, Token token) {
+    // TODO(brianwilkerson): Consider moving `token` to be the first parameter.
     Token inKeyword = token.next;
     assert(optional('in', inKeyword) || optional(':', inKeyword));
     listener.beginForInExpression(inKeyword.next);
@@ -6047,7 +5947,7 @@
     Token next = token.next;
     if (optional(';', next)) {
       // Report and skip extra semicolons that appear between members.
-      // TODO(brianwilkerson) Provide a more specific error message.
+      // TODO(brianwilkerson): Provide a more specific error message.
       reportRecoverableError(
           next, fasta.templateExpectedClassMember.withArguments(next));
       listener.handleInvalidMember(next);
diff --git a/pkg/front_end/lib/src/fasta/parser/recovery_listeners.dart b/pkg/front_end/lib/src/fasta/parser/recovery_listeners.dart
index e6a502d..6166889 100644
--- a/pkg/front_end/lib/src/fasta/parser/recovery_listeners.dart
+++ b/pkg/front_end/lib/src/fasta/parser/recovery_listeners.dart
@@ -26,26 +26,12 @@
   RecoveryListener(this._primaryListener);
 
   @override
-  Token injectGenericCommentTypeAssign(Token token) =>
-      _primaryListener.injectGenericCommentTypeAssign(token);
-
-  @override
-  Token injectGenericCommentTypeList(Token token) =>
-      _primaryListener.injectGenericCommentTypeList(token);
-
-  @override
   Token handleUnrecoverableError(Token token, Message message) =>
       _primaryListener.handleUnrecoverableError(token, message);
 
   @override
   Token newSyntheticToken(Token next) =>
       _primaryListener.newSyntheticToken(next);
-
-  @override
-  Token replaceTokenWithGenericCommentTypeAssign(
-          Token tokenToStartReplacing, Token tokenWithComment) =>
-      _primaryListener.replaceTokenWithGenericCommentTypeAssign(
-          tokenToStartReplacing, tokenWithComment);
 }
 
 class ClassHeaderRecoveryListener extends RecoveryListener {
diff --git a/pkg/front_end/lib/src/fasta/parser/top_level_parser.dart b/pkg/front_end/lib/src/fasta/parser/top_level_parser.dart
index 33969af..98dc6fb 100644
--- a/pkg/front_end/lib/src/fasta/parser/top_level_parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/top_level_parser.dart
@@ -15,5 +15,5 @@
 class TopLevelParser extends ClassMemberParser {
   TopLevelParser(Listener listener) : super(listener);
 
-  Token parseClassBody(Token token, Token beforeBody) => skipClassBody(token);
+  Token parseClassBody(Token token) => skipClassBody(token);
 }
diff --git a/pkg/front_end/lib/src/fasta/source/diet_parser.dart b/pkg/front_end/lib/src/fasta/source/diet_parser.dart
index d3002d8..9f1bc91 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_parser.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_parser.dart
@@ -6,37 +6,13 @@
 
 import '../../scanner/token.dart' show Token;
 
-import '../fasta_codes.dart' show messageExpectedOpenParens;
-
-import '../parser.dart'
-    show ClassMemberParser, Listener, MemberKind, closeBraceTokenFor, optional;
+import '../parser.dart' show ClassMemberParser, Listener, MemberKind;
 
 // TODO(ahe): Move this to parser package.
 class DietParser extends ClassMemberParser {
   DietParser(Listener listener) : super(listener);
 
   Token parseFormalParameters(Token token, MemberKind kind) {
-    return skipFormals(token, kind);
-  }
-
-  // TODO(brianwilkerson): Move this method to Parser, and, if possible, merge
-  // it with skipFormalParameters.
-  Token skipFormals(Token token, MemberKind kind) {
-    token = token.next;
-    listener.beginOptionalFormalParameters(token);
-    if (!optional('(', token)) {
-      if (optional(';', token)) {
-        reportRecoverableError(token, messageExpectedOpenParens);
-        listener.endFormalParameters(0, token, token, kind);
-        // TODO(brianwilkerson): Until this method accepts the last consumed
-        // token, this returns the wrong token (it should be the token before
-        // `token`).
-        return token;
-      }
-      return reportUnexpectedToken(token);
-    }
-    Token closeBrace = closeBraceTokenFor(token);
-    listener.endFormalParameters(0, token, closeBrace, kind);
-    return closeBrace;
+    return skipFormalParameters(token, kind);
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index b59d33a..1bfbc7c 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -191,13 +191,6 @@
   }
 
   @override
-  void handleRecoverExpression(Token token, Message message) {
-    debugEvent("RecoverExpression");
-    push(NullValue.Expression);
-    push(token.charOffset);
-  }
-
-  @override
   void endPart(Token partKeyword, Token semicolon) {
     debugEvent("Part");
     int charOffset = popCharOffset();
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 5c71111..ac4e347 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -536,6 +536,9 @@
   void computeHierarchy(Program program) {
     hierarchy = new IncrementalClassHierarchy();
     ticker.logMs("Computed class hierarchy");
+  }
+
+  void computeCoreTypes(Program program) {
     coreTypes = new CoreTypes(program);
     ticker.logMs("Computed core types");
   }
diff --git a/pkg/front_end/lib/src/fasta/source/stack_listener.dart b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
index 6bb8712..7586246 100644
--- a/pkg/front_end/lib/src/fasta/source/stack_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
@@ -305,11 +305,6 @@
   }
 
   @override
-  void handleRecoverExpression(Token token, Message message) {
-    debugEvent("RecoverExpression");
-  }
-
-  @override
   void handleDirectivesOnly() {
     pop(); // Discard the metadata.
   }
diff --git a/pkg/front_end/lib/src/fasta/util/link.dart b/pkg/front_end/lib/src/fasta/util/link.dart
index 87d6b2a..80e21ff 100644
--- a/pkg/front_end/lib/src/fasta/util/link.dart
+++ b/pkg/front_end/lib/src/fasta/util/link.dart
@@ -127,6 +127,7 @@
   // Unsupported Iterable<T> methods.
   //
   bool any(bool f(T e)) => _unsupported('any');
+  Iterable<T> cast<T>() => _unsupported('cast');
   T elementAt(int i) => _unsupported('elementAt');
   Iterable<K> expand<K>(Iterable<K> f(T e)) => _unsupported('expand');
   T firstWhere(bool f(T e), {T orElse()}) => _unsupported('firstWhere');
@@ -134,15 +135,18 @@
     return _unsupported('fold');
   }
 
+  Iterable<T> followedBy(Iterable<T> other) => _unsupported('followedBy');
   T get last => _unsupported('get:last');
   T lastWhere(bool f(T e), {T orElse()}) => _unsupported('lastWhere');
   String join([separator = '']) => _unsupported('join');
   T reduce(T combine(T a, T b)) => _unsupported('reduce');
-  T singleWhere(bool f(T e)) => _unsupported('singleWhere');
+  Iterable<T> retype<T>() => _unsupported('retype');
+  T singleWhere(bool f(T e), {T orElse()}) => _unsupported('singleWhere');
   Iterable<T> skipWhile(bool f(T e)) => _unsupported('skipWhile');
   Iterable<T> take(int n) => _unsupported('take');
   Iterable<T> takeWhile(bool f(T e)) => _unsupported('takeWhile');
   Set<T> toSet() => _unsupported('toSet');
+  Iterable<T> whereType<T>() => _unsupported('whereType');
   Iterable<T> where(bool f(T e)) => _unsupported('where');
 
   _unsupported(String method) => throw new UnsupportedError(method);
diff --git a/pkg/front_end/lib/src/kernel_generator_impl.dart b/pkg/front_end/lib/src/kernel_generator_impl.dart
index 97effa6..ed9816d 100644
--- a/pkg/front_end/lib/src/kernel_generator_impl.dart
+++ b/pkg/front_end/lib/src/kernel_generator_impl.dart
@@ -15,7 +15,6 @@
 import 'fasta/compiler_context.dart' show CompilerContext;
 import 'fasta/deprecated_problems.dart' show deprecated_InputError, reportCrash;
 import 'fasta/dill/dill_target.dart' show DillTarget;
-import 'fasta/kernel/kernel_outline_shaker.dart';
 import 'fasta/kernel/kernel_target.dart' show KernelTarget;
 import 'fasta/kernel/utils.dart';
 import 'fasta/kernel/verifier.dart';
@@ -27,19 +26,19 @@
 Future<CompilerResult> generateKernel(ProcessedOptions options,
     {bool buildSummary: false,
     bool buildProgram: true,
-    bool trimDependencies: false}) async {
+    bool truncateSummary: false}) async {
   return await CompilerContext.runWithOptions(options, (_) async {
     return await generateKernelInternal(
         buildSummary: buildSummary,
         buildProgram: buildProgram,
-        trimDependencies: trimDependencies);
+        truncateSummary: truncateSummary);
   });
 }
 
 Future<CompilerResult> generateKernelInternal(
     {bool buildSummary: false,
     bool buildProgram: true,
-    bool trimDependencies: false}) async {
+    bool truncateSummary: false}) async {
   var options = CompilerContext.current.options;
   var fs = options.fileSystem;
   if (!await options.validateOptions()) return null;
@@ -100,17 +99,6 @@
         await kernelTarget.buildOutlines(nameRoot: nameRoot);
     List<int> summary = null;
     if (buildSummary) {
-      if (trimDependencies) {
-        // TODO(sigmund): see if it is worth supporting this. Note: trimming the
-        // program is destructive, so if we are emitting summaries and the
-        // program in a single API call, we would need to clone the program here
-        // to avoid deleting pieces that are needed by kernelTarget.buildProgram
-        // below.
-        assert(!buildProgram);
-        var excluded =
-            dillTarget.loader.libraries.map((lib) => lib.importUri).toSet();
-        trimProgram(summaryProgram, (uri) => !excluded.contains(uri));
-      }
       if (options.verify) {
         for (var error in verifyProgram(summaryProgram)) {
           options.report(error, Severity.error);
@@ -120,20 +108,23 @@
         printProgramText(summaryProgram,
             libraryFilter: kernelTarget.isSourceLibrary);
       }
-      if (kernelTarget.errors.isEmpty) {
-        summary = serializeProgram(summaryProgram, excludeUriToSource: true);
-      }
+
+      // Copy the program to exclude the uriToSource map from the summary.
+      //
+      // Note: we don't pass the library argument to the constructor to
+      // preserve the the libraries parent pointer (it should continue to point
+      // to the program within KernelTarget).
+      var trimmedSummaryProgram = new Program(nameRoot: summaryProgram.root)
+        ..libraries.addAll(truncateSummary
+            ? kernelTarget.loader.libraries
+            : summaryProgram.libraries);
+      summary = serializeProgram(trimmedSummaryProgram);
       options.ticker.logMs("Generated outline");
     }
 
     Program program;
     if (buildProgram && kernelTarget.errors.isEmpty) {
       program = await kernelTarget.buildProgram(verify: options.verify);
-      if (trimDependencies) {
-        var excluded =
-            dillTarget.loader.libraries.map((lib) => lib.importUri).toSet();
-        trimProgram(program, (uri) => !excluded.contains(uri));
-      }
       if (options.debugDump) {
         printProgramText(program, libraryFilter: kernelTarget.isSourceLibrary);
       }
diff --git a/pkg/front_end/lib/src/scanner/scanner.dart b/pkg/front_end/lib/src/scanner/scanner.dart
index bd01cfe..6091c28 100644
--- a/pkg/front_end/lib/src/scanner/scanner.dart
+++ b/pkg/front_end/lib/src/scanner/scanner.dart
@@ -557,7 +557,7 @@
     _tail = _tail.setNext(eofToken);
     if (_stackEnd >= 0) {
       _hasUnmatchedGroups = true;
-      // TODO(brianwilkerson) Fix the ungrouped tokens?
+      // TODO(brianwilkerson): Fix the ungrouped tokens?
     }
   }
 
diff --git a/pkg/front_end/lib/src/testing/compiler_common.dart b/pkg/front_end/lib/src/testing/compiler_common.dart
index 67eae73..81ac570 100644
--- a/pkg/front_end/lib/src/testing/compiler_common.dart
+++ b/pkg/front_end/lib/src/testing/compiler_common.dart
@@ -56,10 +56,13 @@
 ///
 /// Wraps [summaryFor] with some default testing options (see [setup]).
 Future<List<int>> summarize(List<String> inputs, Map<String, dynamic> sources,
-    {List<String> inputSummaries: const [], CompilerOptions options}) async {
+    {List<String> inputSummaries: const [],
+    CompilerOptions options,
+    bool truncate: false}) async {
   options ??= new CompilerOptions();
   await setup(options, sources, inputSummaries: inputSummaries);
-  return await summaryFor(inputs.map(toTestUri).toList(), options);
+  return await summaryFor(inputs.map(toTestUri).toList(), options,
+      truncate: truncate);
 }
 
 /// Defines a default set of options for testing:
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 494ec4e..b6047e9 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -1446,7 +1446,7 @@
   template: "Expected identifier, but got 'super'."
 
 SuperAsExpression:
-  template: "Super calls can't be used as expressions."
+  template: "Can't use 'super' as an expression."
   tip: "To delegate a constructor to a super constructor, put the super call as an initializer."
 
 SwitchHasCaseAfterDefault:
@@ -1550,7 +1550,7 @@
 
 IntegerLiteralIsOutOfRange:
   template: "The integer literal #lexeme can't be represented in 64 bits."
-  tip: "Try using BigInt (from 'dart:typed_data' library) if you need an integer larger than 9,223,372,036,854,775,807 or less than -9,223,372,036,854,775,808."
+  tip: "Try using the BigInt class if you need an integer larger than 9,223,372,036,854,775,807 or less than -9,223,372,036,854,775,808."
 
 ColonInPlaceOfIn:
   template: "For-in loops use 'in' rather than a colon."
diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml
index caf5c1c..7b6e9cc 100644
--- a/pkg/front_end/pubspec.yaml
+++ b/pkg/front_end/pubspec.yaml
@@ -18,7 +18,6 @@
 dev_dependencies:
   analyzer: '>=0.30.0 <0.32.0'
   args: '>=0.13.0 <2.0.0'
-  bazel_worker: ^0.1.4
   dart_style: '^1.0.7'
   json_rpc_2: ^2.0.4
   mockito: ^2.0.2
diff --git a/pkg/front_end/test/fasta/incremental_hello_test.dart b/pkg/front_end/test/fasta/incremental_hello_test.dart
new file mode 100644
index 0000000..97f02fc
--- /dev/null
+++ b/pkg/front_end/test/fasta/incremental_hello_test.dart
@@ -0,0 +1,82 @@
+// 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.md file.
+
+library fasta.test.incremental_dynamic_test;
+
+import 'package:async_helper/async_helper.dart' show asyncTest;
+
+import 'package:expect/expect.dart' show Expect;
+
+import "package:front_end/src/api_prototype/compiler_options.dart"
+    show CompilerOptions;
+
+import 'package:front_end/src/base/processed_options.dart'
+    show ProcessedOptions;
+
+import 'package:front_end/src/compute_platform_binaries_location.dart'
+    show computePlatformBinariesLocation;
+
+import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
+
+import 'package:front_end/src/fasta/fasta_codes.dart' show LocatedMessage;
+
+import 'package:front_end/src/fasta/incremental_compiler.dart'
+    show FastaDelta, IncrementalCompiler;
+
+import 'package:front_end/src/fasta/severity.dart' show Severity;
+
+void problemHandler(LocatedMessage message, Severity severity, String formatted,
+    int line, int column) {
+  throw "Unexpected message: $formatted";
+}
+
+test({bool sdkFromSource}) async {
+  final CompilerOptions optionBuilder = new CompilerOptions()
+    ..packagesFileUri = Uri.base.resolve(".packages")
+    ..strongMode = false
+    ..onProblem = problemHandler;
+
+  if (sdkFromSource) {
+    optionBuilder.librariesSpecificationUri =
+        Uri.base.resolve("sdk/lib/libraries.json");
+  } else {
+    optionBuilder.sdkSummary =
+        computePlatformBinariesLocation().resolve("vm_platform.dill");
+  }
+
+  final Uri helloDart = Uri.base.resolve("pkg/front_end/testcases/hello.dart");
+
+  final ProcessedOptions options =
+      new ProcessedOptions(optionBuilder, false, [helloDart]);
+
+  IncrementalCompiler compiler =
+      new IncrementalCompiler(new CompilerContext(options));
+
+  FastaDelta delta = await compiler.computeDelta();
+
+  if (sdkFromSource) {
+    // Expect that the new program contains at least the following libraries:
+    // dart:core, dart:async, and hello.dart.
+    Expect.isTrue(delta.newProgram.libraries.length > 2,
+        "${delta.newProgram.libraries.length} <= 2");
+  } else {
+    // Expect that the new program contains exactly hello.dart.
+    Expect.isTrue(delta.newProgram.libraries.length == 1,
+        "${delta.newProgram.libraries.length} != 1");
+  }
+
+  compiler.invalidate(helloDart);
+
+  delta = await compiler.computeDelta(entryPoint: helloDart);
+  // Expect that the new program contains exactly hello.dart
+  Expect.isTrue(delta.newProgram.libraries.length == 1,
+      "${delta.newProgram.libraries.length} != 1");
+}
+
+void main() {
+  asyncTest(() async {
+    await test(sdkFromSource: true);
+    await test(sdkFromSource: false);
+  });
+}
diff --git a/pkg/front_end/test/summary_generator_test.dart b/pkg/front_end/test/summary_generator_test.dart
index 052e616..36306a2 100644
--- a/pkg/front_end/test/summary_generator_test.dart
+++ b/pkg/front_end/test/summary_generator_test.dart
@@ -100,6 +100,22 @@
     checkDSummary(summaryD);
   });
 
+  test('dependencies not included in truncated summaries', () async {
+    // Note: by default this test is loading the SDK from summaries.
+    var summaryA = await summarize(['a.dart'], allSources, truncate: true);
+    var program = loadProgramFromBytes(summaryA);
+    expect(program.libraries.length, 1);
+    expect(program.libraries.single.importUri.path.endsWith('a.dart'), isTrue);
+
+    var sourcesWithA = new Map.from(allSources);
+    sourcesWithA['a.dill'] = summaryA;
+    var summaryB = await summarize(['b.dart'], sourcesWithA,
+        inputSummaries: ['a.dill'], truncate: true);
+    program = loadProgramFromBytes(summaryB);
+    expect(program.libraries.length, 1);
+    expect(program.libraries.single.importUri.path.endsWith('b.dart'), isTrue);
+  });
+
   test('summarization by default is hermetic', () async {
     var errors = [];
     var options = new CompilerOptions()..onError = (e) => errors.add(e);
diff --git a/pkg/front_end/testcases/ast_builder.status b/pkg/front_end/testcases/ast_builder.status
index 98b16fc..da87982 100644
--- a/pkg/front_end/testcases/ast_builder.status
+++ b/pkg/front_end/testcases/ast_builder.status
@@ -132,6 +132,7 @@
 regress/issue_29983: Crash
 regress/issue_29984: Crash
 regress/issue_29985: Crash
+regress/issue_30838: Crash
 regress/issue_31155: Crash # Issue 31155.
 regress/issue_31157: Crash
 regress/issue_31180: Crash
@@ -139,11 +140,13 @@
 regress/issue_31186: Crash
 regress/issue_31187: Crash
 regress/issue_31198: Crash
+regress/issue_31213: Crash
 reorder_super: Crash
 runtime_checks/implicit_downcast_assert_initializer: Crash
 runtime_checks/implicit_downcast_constructor_initializer: Crash
 runtime_checks_new/for_in_call_kinds: Crash
 statements: Crash
+super_call: Crash
 super_rasta_copy: Crash
 type_variable_as_super: Crash
 uninitialized_fields: Crash
diff --git a/pkg/front_end/testcases/incremental.status b/pkg/front_end/testcases/incremental.status
index d5feffe..c572cda 100644
--- a/pkg/front_end/testcases/incremental.status
+++ b/pkg/front_end/testcases/incremental.status
@@ -3,3 +3,5 @@
 # BSD-style license that can be found in the LICENSE.md file.
 
 # Status file for the test suite ../test/fasta/incremental_test.dart.
+
+dartino/change_in_part.incremental: Crash # Parts aren't handled correctly
diff --git a/pkg/front_end/testcases/rasta/super.dart.strong.expect b/pkg/front_end/testcases/rasta/super.dart.strong.expect
index e4997f7..4de50f1 100644
--- a/pkg/front_end/testcases/rasta/super.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.strong.expect
@@ -51,8 +51,8 @@
     self::use(super.{self::A::~}());
     super.{self::A::unary-}();
     self::use(super.{self::A::unary-}());
-    (let final dynamic #t1 = this in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:43:5: Error: The getter '' isn't defined for the class '#lib1::C'.\nTry correcting the name to the name of an existing getter, or defining a getter or field named ''.\n    +super;\n    ^"))).+(const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use `super` as an expression.\n    +super;\n     ^")));
-    self::use((let final dynamic #t2 = this in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:44:9: Error: The getter '' isn't defined for the class '#lib1::C'.\nTry correcting the name to the name of an existing getter, or defining a getter or field named ''.\n    use(+super);\n        ^"))).+(const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use `super` as an expression.\n    use(+super);\n         ^"))));
+    (let final dynamic #t1 = this in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:43:5: Error: The getter '' isn't defined for the class '#lib1::C'.\nTry correcting the name to the name of an existing getter, or defining a getter or field named ''.\n    +super;\n    ^"))).+(const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use 'super' as an expression.\nTo delegate a constructor to a super constructor, put the super call as an initializer.\n    +super;\n     ^")));
+    self::use((let final dynamic #t2 = this in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:44:9: Error: The getter '' isn't defined for the class '#lib1::C'.\nTry correcting the name to the name of an existing getter, or defining a getter or field named ''.\n    use(+super);\n        ^"))).+(const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use 'super' as an expression.\nTo delegate a constructor to a super constructor, put the super call as an initializer.\n    use(+super);\n         ^"))));
     super.{self::A::==}(87);
     self::use(super.{self::A::==}(87));
     !super.{self::A::==}(87);
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart b/pkg/front_end/testcases/regress/issue_30838.dart
new file mode 100644
index 0000000..3125604
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_30838.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+typedef Foo<S> = S Function<T>(T x);
+int foo<T>(T x) => 3;
+Foo<int> bar() => foo;
+void test1() {
+  bar()<String>("hello");
+}
+
+class A {
+  Foo<int> f;
+  void test() {
+    f<String>("hello");
+  }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.direct.expect b/pkg/front_end/testcases/regress/issue_30838.dart.direct.expect
new file mode 100644
index 0000000..bf351e8
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.direct.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Foo<S extends core::Object> = <T extends core::Object>(T) → S;
+class A extends core::Object {
+  field <T extends core::Object>(T) → core::int f = null;
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method test() → void {
+    this.f<core::String>("hello");
+  }
+}
+static method foo<T extends core::Object>(self::foo::T x) → core::int
+  return 3;
+static method bar() → <T extends core::Object>(T) → core::int
+  return self::foo;
+static method test1() → void {
+  self::bar().call<core::String>("hello");
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.outline.expect b/pkg/front_end/testcases/regress/issue_30838.dart.outline.expect
new file mode 100644
index 0000000..ea2077a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.outline.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Foo<S extends core::Object> = <T extends core::Object>(T) → S;
+class A extends core::Object {
+  field <T extends core::Object>(T) → core::int f;
+  default constructor •() → void
+    ;
+  method test() → void
+    ;
+}
+static method foo<T extends core::Object>(self::foo::T x) → core::int
+  ;
+static method bar() → <T extends core::Object>(T) → core::int
+  ;
+static method test1() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.strong.expect b/pkg/front_end/testcases/regress/issue_30838.dart.strong.expect
new file mode 100644
index 0000000..a9dea91
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.strong.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Foo<S extends core::Object> = <T extends core::Object>(T) → S;
+class A extends core::Object {
+  field <T extends core::Object>(T) → core::int f = null;
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method test() → void {
+    this.{self::A::f}<core::String>("hello");
+  }
+}
+static method foo<T extends core::Object>(self::foo::T x) → core::int
+  return 3;
+static method bar() → <T extends core::Object>(T) → core::int
+  return self::foo;
+static method test1() → void {
+  self::bar().call<core::String>("hello");
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31198.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31198.dart.direct.expect
index 2761375..072b91b 100644
--- a/pkg/front_end/testcases/regress/issue_31198.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31198.dart.direct.expect
@@ -9,7 +9,7 @@
 }
 class B extends self::A {
   constructor •() → void
-    : final dynamic #t1 = const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_31198.dart:8:8: Error: Super calls can't be used as expressions.\nTo delegate a constructor to a super constructor, put the super call as an initializer.\n  B(): super().foo() {}\n       ^")).foo() {}
+    : final dynamic #t1 = const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_31198.dart:8:8: Error: Can't use 'super' as an expression.\nTo delegate a constructor to a super constructor, put the super call as an initializer.\n  B(): super().foo() {}\n       ^")).foo() {}
 }
 static method bad() → dynamic {
   new self::B::•();
diff --git a/pkg/front_end/testcases/regress/issue_31198.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31198.dart.strong.expect
index 6dde538..ad0da2f 100644
--- a/pkg/front_end/testcases/regress/issue_31198.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31198.dart.strong.expect
@@ -9,7 +9,7 @@
 }
 class B extends self::A {
   constructor •() → void
-    : final dynamic #t1 = const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_31198.dart:8:8: Error: Super calls can't be used as expressions.\nTo delegate a constructor to a super constructor, put the super call as an initializer.\n  B(): super().foo() {}\n       ^")).foo() {}
+    : final dynamic #t1 = const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/regress/issue_31198.dart:8:8: Error: Can't use 'super' as an expression.\nTo delegate a constructor to a super constructor, put the super call as an initializer.\n  B(): super().foo() {}\n       ^")).foo() {}
 }
 static method bad() → dynamic {
   new self::B::•();
diff --git a/pkg/front_end/testcases/regress/issue_31213.dart b/pkg/front_end/testcases/regress/issue_31213.dart
new file mode 100644
index 0000000..f4b522a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31213.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+typedef C<A, K> = int Function<B>(A x, K y, B v);
+typedef D<K> = C<A, K> Function<A>(int z);
+
+dynamic producer<K>() {
+  return <A>(int v1) {
+    return <B>(A v2, K v3, B v4) => 0;
+  };
+}
+
+main() {
+  assert(producer<String>() is D<String>);
+}
diff --git a/pkg/front_end/testcases/regress/issue_31213.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31213.dart.direct.expect
new file mode 100644
index 0000000..860b081
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31213.dart.direct.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef C<A extends core::Object, K extends core::Object> = <B extends core::Object>(A, K, B) → core::int;
+typedef D<K extends core::Object> = <A extends core::Object>(core::int) → <B extends core::Object>(A, K, B) → core::int;
+static method producer<K extends core::Object>() → dynamic {
+  return <A extends core::Object>(core::int v1) → dynamic {
+    return <B extends core::Object>(A v2, self::producer::K v3, B v4) → dynamic => 0;
+  };
+}
+static method main() → dynamic {
+  assert(self::producer<core::String>() is <A extends core::Object>(core::int) → <B extends core::Object>(A, core::String, B) → core::int);
+}
diff --git a/pkg/front_end/testcases/regress/issue_31213.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31213.dart.outline.expect
new file mode 100644
index 0000000..ab22b45
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31213.dart.outline.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef C<A extends core::Object, K extends core::Object> = <B extends core::Object>(A, K, B) → core::int;
+typedef D<K extends core::Object> = <A extends core::Object>(core::int) → <B extends core::Object>(A, K, B) → core::int;
+static method producer<K extends core::Object>() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/regress/issue_31213.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31213.dart.strong.expect
new file mode 100644
index 0000000..c6e0d5f
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31213.dart.strong.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef C<A extends core::Object, K extends core::Object> = <B extends core::Object>(A, K, B) → core::int;
+typedef D<K extends core::Object> = <A extends core::Object>(core::int) → <B extends core::Object>(A, K, B) → core::int;
+static method producer<K extends core::Object>() → dynamic {
+  return <A extends core::Object>(core::int v1) → <B extends core::Object>(A, self::producer::K, B) → core::int {
+    return <B extends core::Object>(A v2, self::producer::K v3, B v4) → core::int => 0;
+  };
+}
+static method main() → dynamic {
+  assert(self::producer<core::String>() is <A extends core::Object>(core::int) → <B extends core::Object>(A, core::String, B) → core::int);
+}
diff --git a/pkg/front_end/testcases/super_call.dart b/pkg/front_end/testcases/super_call.dart
new file mode 100644
index 0000000..6d9d0a1
--- /dev/null
+++ b/pkg/front_end/testcases/super_call.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+class A {
+  int call(int x) => x * 2;
+}
+
+class B extends A {
+  int call(int x) => x * 3;
+
+  int call_super() {
+    // Assumes that super() means super.call().
+    // In reality, it is illegal to use it this way.
+    return super(5);
+  }
+}
+
+main() {
+  assert(new B().call_super() == 10);
+}
diff --git a/pkg/front_end/testcases/super_call.dart.direct.expect b/pkg/front_end/testcases/super_call.dart.direct.expect
new file mode 100644
index 0000000..b526f3a0
--- /dev/null
+++ b/pkg/front_end/testcases/super_call.dart.direct.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method call(core::int x) → core::int
+    return x.*(2);
+}
+class B extends self::A {
+  default constructor •() → void
+    : super self::A::•()
+    ;
+  method call(core::int x) → core::int
+    return x.*(3);
+  method call_super() → core::int {
+    return const core::_ConstantExpressionError::•()._throw(new core::_CompileTimeError::•("pkg/front_end/testcases/super_call.dart:14:12: Error: Can't use 'super' as an expression.\nTo delegate a constructor to a super constructor, put the super call as an initializer.\n    return super(5);\n           ^"));
+  }
+}
+static method main() → dynamic {
+  assert(new self::B::•().call_super().==(10));
+}
diff --git a/pkg/front_end/testcases/super_call.dart.outline.expect b/pkg/front_end/testcases/super_call.dart.outline.expect
new file mode 100644
index 0000000..a12055e
--- /dev/null
+++ b/pkg/front_end/testcases/super_call.dart.outline.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    ;
+  method call(core::int x) → core::int
+    ;
+}
+class B extends self::A {
+  default constructor •() → void
+    ;
+  method call(core::int x) → core::int
+    ;
+  method call_super() → core::int
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/super_call.dart.strong.expect b/pkg/front_end/testcases/super_call.dart.strong.expect
new file mode 100644
index 0000000..3c4e3e0
--- /dev/null
+++ b/pkg/front_end/testcases/super_call.dart.strong.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  default constructor •() → void
+    : super core::Object::•()
+    ;
+  method call(core::int x) → core::int
+    return x.{core::num::*}(2);
+}
+class B extends self::A {
+  default constructor •() → void
+    : super self::A::•()
+    ;
+  method call(core::int x) → core::int
+    return x.{core::num::*}(3);
+  method call_super() → core::int {
+    return const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/super_call.dart:14:12: Error: Can't use 'super' as an expression.\nTo delegate a constructor to a super constructor, put the super call as an initializer.\n    return super(5);\n           ^")) as{TypeError} core::int;
+  }
+}
+static method main() → dynamic {
+  assert(new self::B::•().{self::B::call_super}().{core::num::==}(10));
+}
diff --git a/pkg/front_end/tool/_fasta/entry_points.dart b/pkg/front_end/tool/_fasta/entry_points.dart
index db9b11f..d2304b1 100644
--- a/pkg/front_end/tool/_fasta/entry_points.dart
+++ b/pkg/front_end/tool/_fasta/entry_points.dart
@@ -10,6 +10,10 @@
 
 import 'dart:io' show File, exitCode;
 
+import 'package:compiler/src/kernel/dart2js_target.dart' show Dart2jsTarget;
+
+import 'package:kernel/target/targets.dart' show TargetFlags, targets;
+
 import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
 
 import 'package:front_end/src/fasta/deprecated_problems.dart'
@@ -38,6 +42,8 @@
 const int iterations = const int.fromEnvironment("iterations", defaultValue: 1);
 
 compileEntryPoint(List<String> arguments) async {
+  targets["dart2js"] = (TargetFlags flags) => new Dart2jsTarget(flags);
+
   // Timing results for each iteration
   List<double> elapsedTimes = <double>[];
 
diff --git a/pkg/js_ast/lib/src/printer.dart b/pkg/js_ast/lib/src/printer.dart
index f93fabc..82edc93 100644
--- a/pkg/js_ast/lib/src/printer.dart
+++ b/pkg/js_ast/lib/src/printer.dart
@@ -487,6 +487,8 @@
       visitNestedExpression(node.value, EXPRESSION,
           newInForInit: false, newAtStatementBegin: false);
     }
+    // Set the closing position to be before the optional semicolon.
+    currentNode.closingPosition = _charCount;
     outSemicolonLn();
   }
 
diff --git a/pkg/js_ast/test/printer_callback_test.dart b/pkg/js_ast/test/printer_callback_test.dart
index d142e83..6483d28 100644
--- a/pkg/js_ast/test/printer_callback_test.dart
+++ b/pkg/js_ast/test/printer_callback_test.dart
@@ -40,7 +40,7 @@
 }""",
     TestMode.DELIMITER: """
 function(a, b) {
-  return null;
+  return null@4;
 @0}""",
     TestMode.EXIT: """
 function(a@1, b@2) {
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 4e5135b..9300ef0 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -1507,6 +1507,7 @@
     this.isExternal = isExternal;
     this.isConst = isConst;
     this.isForwardingStub = isForwardingStub;
+    this.isForwardingSemiStub = isForwardingSemiStub;
     this.transformerFlags = transformerFlags;
   }
 
diff --git a/pkg/kernel/lib/type_algebra.dart b/pkg/kernel/lib/type_algebra.dart
index 5b2ab4e..60b6e3c 100644
--- a/pkg/kernel/lib/type_algebra.dart
+++ b/pkg/kernel/lib/type_algebra.dart
@@ -340,7 +340,7 @@
   TypeParameter freshTypeParameter(TypeParameter node) {
     var fresh = new TypeParameter(node.name);
     substitution[node] = new TypeParameterType(fresh);
-    fresh.bound = node.bound != null ? visit(node.bound) : null;
+    fresh.bound = visit(node.bound);
     return fresh;
   }
 }
diff --git a/pkg/kernel/lib/verifier.dart b/pkg/kernel/lib/verifier.dart
index cea0972..fbbfb81 100644
--- a/pkg/kernel/lib/verifier.dart
+++ b/pkg/kernel/lib/verifier.dart
@@ -145,6 +145,10 @@
   void declareTypeParameters(List<TypeParameter> parameters) {
     for (int i = 0; i < parameters.length; ++i) {
       var parameter = parameters[i];
+      if (parameter.bound == null) {
+        problem(
+            currentParent, "Missing bound for type parameter '$parameter'.");
+      }
       if (!typeParametersInScope.add(parameter)) {
         problem(parameter, "Type parameter '$parameter' redeclared.");
       }
@@ -577,7 +581,7 @@
       problem(
           currentParent,
           "Type parameter '$parameter' referenced from"
-          " static context, parent is '${parameter.parent}'.");
+          " static context, parent is: '${parameter.parent}'.");
     }
   }
 
diff --git a/pkg/kernel/test/verify_test.dart b/pkg/kernel/test/verify_test.dart
index 7c7c243..32b80f9 100644
--- a/pkg/kernel/test/verify_test.dart
+++ b/pkg/kernel/test/verify_test.dart
@@ -104,7 +104,7 @@
   negativeTest(
       'Class type parameter in static method',
       "Type parameter 'test_lib::TestClass::T' referenced from static context,"
-      " parent is 'test_lib::TestClass'.", (TestHarness test) {
+      " parent is: 'test_lib::TestClass'.", (TestHarness test) {
     return new Procedure(
         new Name('bar'),
         ProcedureKind.Method,
@@ -115,7 +115,7 @@
   negativeTest(
       'Class type parameter in static field',
       "Type parameter 'test_lib::TestClass::T' referenced from static context,"
-      " parent is 'test_lib::TestClass'.", (TestHarness test) {
+      " parent is: 'test_lib::TestClass'.", (TestHarness test) {
     return new Field(new Name('field'),
         initializer:
             new TypeLiteral(new TypeParameterType(test.classTypeParameter)),
diff --git a/pkg/sourcemap_testing/lib/src/stepping_helper.dart b/pkg/sourcemap_testing/lib/src/stepping_helper.dart
index a906bd2..fad7ad9 100644
--- a/pkg/sourcemap_testing/lib/src/stepping_helper.dart
+++ b/pkg/sourcemap_testing/lib/src/stepping_helper.dart
@@ -344,6 +344,7 @@
   List<_PointMapping> mappingsOnLines = [];
   for (var line in sourceMap.lines) {
     for (var entry in line.entries) {
+      if (entry.sourceLine == null) continue;
       if (entry.sourceLine >= breakOnLine &&
           entry.sourceLine < breakOnLine + 4) {
         mappingsOnLines.add(new _PointMapping(
diff --git a/pkg/vm/bin/gen_kernel.dart b/pkg/vm/bin/gen_kernel.dart
index 6f1ff40..2fc8bf6 100644
--- a/pkg/vm/bin/gen_kernel.dart
+++ b/pkg/vm/bin/gen_kernel.dart
@@ -12,7 +12,7 @@
 import 'package:kernel/src/tool/batch_util.dart' as batch_util;
 import 'package:kernel/target/targets.dart' show TargetFlags;
 import 'package:kernel/target/vm.dart' show VmTarget;
-import 'package:vm/kernel_front_end.dart' show compileToKernel;
+import 'package:vm/kernel_front_end.dart' show compileToKernel, ErrorDetector;
 
 final ArgParser _argParser = new ArgParser(allowTrailingOptions: true)
   ..addOption('platform',
@@ -60,7 +60,7 @@
   final bool strongMode = options['strong-mode'];
   final bool aot = options['aot'];
 
-  int errors = 0;
+  ErrorDetector errorDetector = new ErrorDetector();
 
   final CompilerOptions compilerOptions = new CompilerOptions()
     ..strongMode = strongMode
@@ -68,18 +68,13 @@
     ..linkedDependencies = <Uri>[Uri.base.resolve(platformKernel)]
     ..packagesFileUri = packages != null ? Uri.base.resolve(packages) : null
     ..reportMessages = true
-    ..onError = (CompilationMessage message) {
-      if ((message.severity != Severity.nit) &&
-          (message.severity != Severity.warning)) {
-        ++errors;
-      }
-    };
+    ..onError = errorDetector;
 
   Program program = await compileToKernel(
       Uri.base.resolve(filename), compilerOptions,
       aot: aot);
 
-  if ((errors > 0) || (program == null)) {
+  if (errorDetector.hasCompilationErrors || (program == null)) {
     return _compileTimeErrorExitCode;
   }
 
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index 5ec3890..8df5e10 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -185,6 +185,8 @@
   final bool strong = request[5];
   final int isolateId = request[6];
   final List sourceFiles = request[7];
+  // TODO(bkonyi): this still needs to be hooked in.
+  // final bool suppressWarnings = request[8];
 
   Compiler compiler;
   // TODO(aam): There should be no need to have an option to choose
@@ -284,7 +286,8 @@
     false /* incremental */,
     false /* strong */,
     1 /* isolateId chosen randomly */,
-    null /* source files */
+    null /* source files */,
+    false /* suppress warnings */,
   ];
   _processLoadRequest(request);
 }
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index 11506fc..7f7158b 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -7,13 +7,17 @@
 
 import 'dart:async';
 
-import 'package:front_end/src/api_prototype/compiler_options.dart';
+import 'package:front_end/src/api_prototype/compiler_options.dart'
+    show CompilerOptions, ErrorHandler;
 import 'package:front_end/src/api_prototype/kernel_generator.dart'
     show kernelForProgram;
+import 'package:front_end/src/api_prototype/compilation_message.dart'
+    show CompilationMessage, Severity;
+import 'package:front_end/src/fasta/severity.dart' show Severity;
 import 'package:kernel/ast.dart' show Program;
 import 'package:kernel/core_types.dart' show CoreTypes;
 
-import 'transformations/cha_devirtualization.dart' as chaDevirtualization
+import 'transformations/devirtualization.dart' as devirtualization
     show transformProgram;
 
 /// Generates a kernel representation of the program whose main library is in
@@ -23,9 +27,18 @@
 ///
 Future<Program> compileToKernel(Uri source, CompilerOptions options,
     {bool aot: false}) async {
+  // Replace error handler to detect if there are compilation errors.
+  final errorDetector =
+      new ErrorDetector(previousErrorHandler: options.onError);
+  options.onError = errorDetector;
+
   final program = await kernelForProgram(source, options);
 
-  if (aot && (program != null)) {
+  // Restore error handler (in case 'options' are reused).
+  options.onError = errorDetector.previousErrorHandler;
+
+  // Run global transformations only if program is correct.
+  if (aot && (program != null) && !errorDetector.hasCompilationErrors) {
     _runGlobalTransformations(program, options.strongMode);
   }
 
@@ -33,11 +46,25 @@
 }
 
 _runGlobalTransformations(Program program, bool strongMode) {
-  final coreTypes = new CoreTypes(program);
-
-  // TODO(alexmarkov): AOT-specific whole-program transformations.
-
   if (strongMode) {
-    chaDevirtualization.transformProgram(coreTypes, program);
+    final coreTypes = new CoreTypes(program);
+
+    devirtualization.transformProgram(coreTypes, program);
+  }
+}
+
+class ErrorDetector {
+  final ErrorHandler previousErrorHandler;
+  bool hasCompilationErrors = false;
+
+  ErrorDetector({this.previousErrorHandler});
+
+  void call(CompilationMessage message) {
+    if ((message.severity != Severity.nit) &&
+        (message.severity != Severity.warning)) {
+      hasCompilationErrors = true;
+    }
+
+    previousErrorHandler?.call(message);
   }
 }
diff --git a/pkg/vm/lib/transformations/cha_devirtualization.dart b/pkg/vm/lib/transformations/cha_devirtualization.dart
deleted file mode 100644
index cdc2ce4..0000000
--- a/pkg/vm/lib/transformations/cha_devirtualization.dart
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library vm.transformations.cha_devirtualization;
-
-import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart' show CoreTypes;
-import 'package:kernel/class_hierarchy.dart' show ClosedWorldClassHierarchy;
-
-import '../metadata/direct_call.dart';
-
-/// Devirtualization of method invocations based on the class hierarchy
-/// analysis. Assumes strong mode and closed world.
-Program transformProgram(CoreTypes coreTypes, Program program) {
-  new _Devirtualization(coreTypes, program).visitProgram(program);
-  return program;
-}
-
-/// Resolves targets of instance method invocations, property getter
-/// invocations and property setters invocations using strong mode
-/// types / interface targets and closed-world class hierarchy analysis.
-/// If direct target is determined, the invocation node is annotated
-/// with direct call metadata.
-class _Devirtualization extends RecursiveVisitor<Null> {
-  /// Toggles tracing (useful for debugging).
-  static const _trace = const bool.fromEnvironment('trace.devirtualization');
-
-  final ClosedWorldClassHierarchy _hierarchy;
-  final DirectCallMetadataRepository _metadata;
-  Set<Name> _objectMemberNames;
-
-  _Devirtualization(CoreTypes coreTypes, Program program)
-      : _hierarchy = new ClosedWorldClassHierarchy(program),
-        _metadata = new DirectCallMetadataRepository() {
-    _objectMemberNames = new Set<Name>.from(_hierarchy
-        .getInterfaceMembers(coreTypes.objectClass)
-        .map((Member m) => m.name));
-    program.addMetadataRepository(_metadata);
-  }
-
-  bool _isMethod(Member member) => (member is Procedure) && !member.isGetter;
-
-  bool _isFieldOrGetter(Member member) =>
-      (member is Field) || ((member is Procedure) && member.isGetter);
-
-  bool _isLegalTargetForMethodInvocation(Member target, Arguments arguments) {
-    final FunctionNode func = target.function;
-
-    final positionalArgs = arguments.positional.length;
-    if ((positionalArgs < func.requiredParameterCount) ||
-        (positionalArgs > func.positionalParameters.length)) {
-      return false;
-    }
-
-    if (arguments.named.isNotEmpty) {
-      final names = arguments.named.map((v) => v.name).toSet();
-      names.removeAll(func.namedParameters.map((v) => v.name));
-      if (names.isNotEmpty) {
-        return false;
-      }
-    }
-
-    return true;
-  }
-
-  _makeDirectCall(TreeNode node, Member target, Member singleTarget) {
-    if (_trace) {
-      print("[devirt] Resolving ${target} to ${singleTarget}");
-    }
-    _metadata.mapping[node] = new DirectCallMetadata(singleTarget, true);
-  }
-
-  @override
-  visitLibrary(Library node) {
-    if (_trace) {
-      String external = node.isExternal ? " (external)" : "";
-      print("[devirt] Processing library ${node.name}${external}");
-    }
-    super.visitLibrary(node);
-  }
-
-  @override
-  visitMethodInvocation(MethodInvocation node) {
-    super.visitMethodInvocation(node);
-
-    Member target = node.interfaceTarget;
-    if ((target != null) &&
-        _isMethod(target) &&
-        !_objectMemberNames.contains(target.name)) {
-      Member singleTarget =
-          _hierarchy.getSingleTargetForInterfaceInvocation(target);
-      // TODO(dartbug.com/30480): Convert _isLegalTargetForMethodInvocation()
-      // check into an assertion once front-end implements override checks.
-      if ((singleTarget != null) &&
-          _isMethod(singleTarget) &&
-          _isLegalTargetForMethodInvocation(singleTarget, node.arguments)) {
-        _makeDirectCall(node, target, singleTarget);
-      }
-    }
-  }
-
-  @override
-  visitPropertyGet(PropertyGet node) {
-    super.visitPropertyGet(node);
-
-    Member target = node.interfaceTarget;
-    if ((target != null) &&
-        _isFieldOrGetter(target) &&
-        !_objectMemberNames.contains(target.name)) {
-      Member singleTarget =
-          _hierarchy.getSingleTargetForInterfaceInvocation(target);
-      if ((singleTarget != null) && _isFieldOrGetter(singleTarget)) {
-        _makeDirectCall(node, target, singleTarget);
-      }
-    }
-  }
-
-  @override
-  visitPropertySet(PropertySet node) {
-    super.visitPropertySet(node);
-
-    Member target = node.interfaceTarget;
-    if (target != null) {
-      Member singleTarget = _hierarchy
-          .getSingleTargetForInterfaceInvocation(target, setter: true);
-      if (singleTarget != null) {
-        _makeDirectCall(node, target, singleTarget);
-      }
-    }
-  }
-}
diff --git a/pkg/vm/lib/transformations/devirtualization.dart b/pkg/vm/lib/transformations/devirtualization.dart
new file mode 100644
index 0000000..9d8685b
--- /dev/null
+++ b/pkg/vm/lib/transformations/devirtualization.dart
@@ -0,0 +1,153 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library vm.transformations.cha_devirtualization;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/core_types.dart' show CoreTypes;
+import 'package:kernel/class_hierarchy.dart'
+    show ClassHierarchy, ClosedWorldClassHierarchy;
+
+import '../metadata/direct_call.dart';
+
+/// Devirtualization of method invocations based on the class hierarchy
+/// analysis. Assumes strong mode and closed world.
+Program transformProgram(CoreTypes coreTypes, Program program) {
+  new CHADevirtualization(
+          coreTypes, program, new ClosedWorldClassHierarchy(program))
+      .visitProgram(program);
+  return program;
+}
+
+/// Base class for implementing devirtualization of method invocations.
+/// Subclasses should implement particular devirtualization strategy in
+/// [getDirectCall] method. Once direct target is determined, the invocation
+/// node is annotated with direct call metadata.
+abstract class Devirtualization extends RecursiveVisitor<Null> {
+  /// Toggles tracing (useful for debugging).
+  static const _trace = const bool.fromEnvironment('trace.devirtualization');
+
+  final DirectCallMetadataRepository _metadata;
+  Set<Name> _objectMemberNames;
+
+  Devirtualization(
+      CoreTypes coreTypes, Program program, ClassHierarchy hierarchy)
+      : _metadata = new DirectCallMetadataRepository() {
+    _objectMemberNames = new Set<Name>.from(hierarchy
+        .getInterfaceMembers(coreTypes.objectClass)
+        .map((Member m) => m.name));
+    program.addMetadataRepository(_metadata);
+  }
+
+  bool isMethod(Member member) => (member is Procedure) && !member.isGetter;
+
+  bool isFieldOrGetter(Member member) =>
+      (member is Field) || ((member is Procedure) && member.isGetter);
+
+  bool isLegalTargetForMethodInvocation(Member target, Arguments arguments) {
+    final FunctionNode func = target.function;
+
+    final positionalArgs = arguments.positional.length;
+    if ((positionalArgs < func.requiredParameterCount) ||
+        (positionalArgs > func.positionalParameters.length)) {
+      return false;
+    }
+
+    if (arguments.named.isNotEmpty) {
+      final names = arguments.named.map((v) => v.name).toSet();
+      names.removeAll(func.namedParameters.map((v) => v.name));
+      if (names.isNotEmpty) {
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+  DirectCallMetadata getDirectCall(TreeNode node, Member target,
+      {bool setter = false});
+
+  makeDirectCall(TreeNode node, Member target, DirectCallMetadata directCall) {
+    if (_trace) {
+      print("[devirt] Resolving ${target} to ${directCall.target}"
+          " at ${node.location}");
+    }
+    _metadata.mapping[node] = directCall;
+  }
+
+  @override
+  visitLibrary(Library node) {
+    if (_trace) {
+      String external = node.isExternal ? " (external)" : "";
+      print("[devirt] Processing library ${node.name}${external}");
+    }
+    super.visitLibrary(node);
+  }
+
+  @override
+  visitMethodInvocation(MethodInvocation node) {
+    super.visitMethodInvocation(node);
+
+    Member target = node.interfaceTarget;
+    if ((target != null) &&
+        isMethod(target) &&
+        !_objectMemberNames.contains(target.name)) {
+      DirectCallMetadata directCall = getDirectCall(node, target);
+      // TODO(dartbug.com/30480): Convert _isLegalTargetForMethodInvocation()
+      // check into an assertion once front-end implements override checks.
+      if ((directCall != null) &&
+          isMethod(directCall.target) &&
+          isLegalTargetForMethodInvocation(directCall.target, node.arguments)) {
+        makeDirectCall(node, target, directCall);
+      }
+    }
+  }
+
+  @override
+  visitPropertyGet(PropertyGet node) {
+    super.visitPropertyGet(node);
+
+    Member target = node.interfaceTarget;
+    if ((target != null) &&
+        isFieldOrGetter(target) &&
+        !_objectMemberNames.contains(target.name)) {
+      DirectCallMetadata directCall = getDirectCall(node, target);
+      if ((directCall != null) && isFieldOrGetter(directCall.target)) {
+        makeDirectCall(node, target, directCall);
+      }
+    }
+  }
+
+  @override
+  visitPropertySet(PropertySet node) {
+    super.visitPropertySet(node);
+
+    Member target = node.interfaceTarget;
+    if (target != null) {
+      DirectCallMetadata directCall = getDirectCall(node, target, setter: true);
+      if (directCall != null) {
+        makeDirectCall(node, target, directCall);
+      }
+    }
+  }
+}
+
+/// Devirtualization based on the closed-world class hierarchy analysis.
+class CHADevirtualization extends Devirtualization {
+  final ClosedWorldClassHierarchy _hierarchy;
+
+  CHADevirtualization(CoreTypes coreTypes, Program program, this._hierarchy)
+      : super(coreTypes, program, _hierarchy);
+
+  @override
+  DirectCallMetadata getDirectCall(TreeNode node, Member target,
+      {bool setter = false}) {
+    Member singleTarget = _hierarchy
+        .getSingleTargetForInterfaceInvocation(target, setter: setter);
+    if (singleTarget == null) {
+      return null;
+    }
+    return new DirectCallMetadata(singleTarget, true);
+  }
+}
diff --git a/pkg/vm/tool/dart_precompiled_runtime2 b/pkg/vm/tool/dart_precompiled_runtime2
index d8c490a..eeb33e3 100755
--- a/pkg/vm/tool/dart_precompiled_runtime2
+++ b/pkg/vm/tool/dart_precompiled_runtime2
@@ -36,4 +36,5 @@
 exec "$BIN_DIR"/dart_precompiled_runtime               \
      --strong                                          \
      --reify-generic-functions                         \
+     --limit-ints-to-64-bits                           \
      "$@"
diff --git a/pkg/vm/tool/gen_kernel b/pkg/vm/tool/gen_kernel
index 5b96047..e5687b8 100755
--- a/pkg/vm/tool/gen_kernel
+++ b/pkg/vm/tool/gen_kernel
@@ -8,6 +8,13 @@
 
 set -e
 
+# Enable Dart 2.0 fixed-size integers for gen_kernel if running in strong mode.
+for arg in "$@"; do
+  if [ "$arg" == "--strong-mode" ]; then
+    DART_VM_FLAGS="--limit-ints-to-64-bits $DART_VM_FLAGS"
+  fi
+done
+
 function follow_links() {
   file="$1"
   while [ -h "$file" ]; do
@@ -35,4 +42,4 @@
   OUT_DIR="$SDK_DIR/out"
 fi
 
-exec "$DART" "${SDK_DIR}/pkg/vm/bin/gen_kernel.dart" $@
+exec "$DART" $DART_VM_FLAGS "${SDK_DIR}/pkg/vm/bin/gen_kernel.dart" $@
diff --git a/pkg/vm/tool/precompiler2 b/pkg/vm/tool/precompiler2
index a3aee3a..faf92c0 100755
--- a/pkg/vm/tool/precompiler2
+++ b/pkg/vm/tool/precompiler2
@@ -67,7 +67,9 @@
 BIN_DIR="$OUT_DIR/$DART_CONFIGURATION"
 
 # Step 1: Generate Kernel binary from the input Dart source.
-"$BIN_DIR"/dart "${SDK_DIR}/pkg/vm/bin/gen_kernel.dart"                        \
+"$BIN_DIR"/dart                                                                \
+     --limit-ints-to-64-bits                                                   \
+     "${SDK_DIR}/pkg/vm/bin/gen_kernel.dart"                                   \
      --platform "${BIN_DIR}/vm_platform_strong.dill"                           \
      --aot                                                                     \
      $PACKAGES                                                                 \
@@ -78,6 +80,7 @@
 exec "$BIN_DIR"/dart_bootstrap                                                 \
      --strong                                                                  \
      --reify-generic-functions                                                 \
+     --limit-ints-to-64-bits                                                   \
      --snapshot-kind=app-aot                                                   \
      --use-blobs                                                               \
      --snapshot="$SNAPSHOT_FILE"                                               \
diff --git a/runtime/bin/dfe.cc b/runtime/bin/dfe.cc
index 192a332..b1141b2 100644
--- a/runtime/bin/dfe.cc
+++ b/runtime/bin/dfe.cc
@@ -84,13 +84,56 @@
   return Dart_NewExternalTypedData(Dart_TypedData_kUint64, kernel_program, 1);
 }
 
+class WindowsPathSanitizer {
+ public:
+  explicit WindowsPathSanitizer(const char* path) {
+    // For Windows we need to massage the paths a bit according to
+    // http://blogs.msdn.com/b/ie/archive/2006/12/06/file-uris-in-windows.aspx
+    //
+    // Convert
+    // C:\one\two\three
+    // to
+    // /C:/one/two/three
+    //
+    // (see builtin.dart#_sanitizeWindowsPath)
+    intptr_t len = strlen(path);
+    sanitized_uri_ = reinterpret_cast<char*>(malloc(len + 1 + 1));
+    if (sanitized_uri_ == NULL) {
+      OUT_OF_MEMORY();
+    }
+    char* s = sanitized_uri_;
+    if (len > 2 && path[1] == ':') {
+      *s++ = '/';
+    }
+    for (const char *p = path; *p; ++p, ++s) {
+      *s = *p == '\\' ? '/' : *p;
+    }
+    *s = '\0';
+  }
+  ~WindowsPathSanitizer() { free(sanitized_uri_); }
+
+  const char* sanitized_uri() { return sanitized_uri_; }
+
+ private:
+  char* sanitized_uri_;
+
+  DISALLOW_COPY_AND_ASSIGN(WindowsPathSanitizer);
+};
+
 void* DFE::CompileAndReadScript(const char* script_uri,
                                 char** error,
                                 int* exit_code) {
   // TODO(aam): When Frontend is ready, VM should be passing vm_outline.dill
   // instead of vm_platform.dill to Frontend for compilation.
+#if defined(HOST_OS_WINDOWS)
+  WindowsPathSanitizer path_sanitizer(script_uri);
+  const char* sanitized_uri = path_sanitizer.sanitized_uri();
+#else
+  const char* sanitized_uri = script_uri;
+#endif
+
   Dart_KernelCompilationResult result =
-      Dart_CompileToKernel(script_uri, GetPlatformBinaryFilename());
+      Dart_CompileToKernel(sanitized_uri, GetPlatformBinaryFilename());
   switch (result.status) {
     case Dart_KernelCompilationStatus_Ok:
       return Dart_ReadKernelBinary(result.kernel, result.kernel_size,
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 57d33f8..56139f95 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -1425,10 +1425,6 @@
       return kErrorExitCode;
     }
 
-    if (commandline_packages_file != NULL) {
-      AddDependency(commandline_packages_file);
-    }
-
     Dart_QualifiedFunctionName* entry_points =
         ParseEntryPointsManifestIfPresent();
     SetupStubNativeResolversForPrecompilation(entry_points);
diff --git a/runtime/observatory/tests/service/break_on_default_constructor_test.dart b/runtime/observatory/tests/service/break_on_default_constructor_test.dart
new file mode 100644
index 0000000..93901a8
--- /dev/null
+++ b/runtime/observatory/tests/service/break_on_default_constructor_test.dart
@@ -0,0 +1,76 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:observatory/debugger.dart';
+import 'package:observatory/service_io.dart';
+import 'package:unittest/unittest.dart';
+import 'package:observatory/service.dart' as S;
+
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+class Foo {}
+
+code() {
+  new Foo();
+}
+
+class TestDebugger extends Debugger {
+  TestDebugger(this.isolate, this.stack);
+
+  VM get vm => isolate.vm;
+  Isolate isolate;
+  ServiceMap stack;
+  int currentFrame = 0;
+}
+
+Future<Debugger> initDebugger(Isolate isolate) {
+  return isolate.getStack().then((stack) {
+    return new TestDebugger(isolate, stack);
+  });
+}
+
+List<String> stops = [];
+
+var tests = [
+  hasPausedAtStart,
+  // Load the isolate's libraries
+  (Isolate isolate) async {
+    for (var lib in isolate.libraries) {
+      await lib.load();
+    }
+  },
+
+  (Isolate isolate) async {
+    var debugger = await initDebugger(isolate);
+    var loc = await DebuggerLocation.parse(debugger, 'Foo');
+
+    if (loc.valid) {
+      if (loc.function != null) {
+        try {
+          await debugger.isolate.addBreakpointAtEntry(loc.function);
+        } on S.ServerRpcException catch (e) {
+          if (e.code == S.ServerRpcException.kCannotAddBreakpoint) {
+            // Expected
+          } else {
+            fail("Got unexpected error $e");
+          }
+        }
+      } else {
+        fail("Expected to find function");
+      }
+    } else {
+      fail("Expected to find function");
+    }
+
+    isolate.resume();
+  },
+];
+
+main(args) {
+  runIsolateTestsSynchronous(args, tests,
+      testeeConcurrent: code, pause_on_start: true, pause_on_exit: true);
+}
diff --git a/runtime/observatory/tests/service/step_through_constructor_test.dart b/runtime/observatory/tests/service/step_through_constructor_test.dart
new file mode 100644
index 0000000..42fc5d6
--- /dev/null
+++ b/runtime/observatory/tests/service/step_through_constructor_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'test_helper.dart';
+import 'service_test_common.dart';
+
+const int LINE = 17;
+const String file = "step_through_constructor_test.dart";
+
+code() {
+  new Foo();
+}
+
+class Foo {
+  Foo() {
+    print("Hello from Foo!");
+  }
+}
+
+List<String> stops = [];
+List<String> expected = [
+  "$file:${LINE+0}:5", // on 'print'
+  "$file:${LINE+1}:3", // on ending '}'
+];
+
+var tests = [
+  hasPausedAtStart,
+  setBreakpointAtLine(LINE),
+  runStepIntoThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected,
+      debugPrint: true, debugPrintFile: file, debugPrintLine: LINE)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(args, tests,
+      testeeConcurrent: code, pause_on_start: true, pause_on_exit: true);
+}
diff --git a/runtime/tests/vm/dart/single_target_and_method_extractors_test.dart b/runtime/tests/vm/dart/single_target_and_method_extractors_test.dart
new file mode 100644
index 0000000..eb82966
--- /dev/null
+++ b/runtime/tests/vm/dart/single_target_and_method_extractors_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+// Note: below we are using tear-offs instead of calling methods directly
+// to guarantee very specific compilation order:
+//
+//    - compile main, add get:methodM and get:callMethodM to selector set.
+//    - compile A.callMethodM and add get:createB to selector set.
+//    - compile A.createB and mark B as allocated.
+//
+// Class B is not marked as allocated until A.createB is compiled, which means
+// that when A.callMethodM is compiled only class A has get:methodM method
+// extractor injected.
+//
+// This test is verifying that optimizing compiler does not treat this method
+// extractor as a single target for this.get:methodM call.
+main() {
+  // This adds selector 'get:methodM' into the sent selector set and
+  // marks class A as allocated.
+  new A().methodM;
+
+  // This adds get:callMethodM to the sent selector set.
+  final callMethodMOnA = new A().callMethodM;
+  final b = callMethodMOnA("A");
+  final callMethodMOnB = b.callMethodM;
+  callMethodMOnB("B");
+}
+
+class A {
+  B callMethodM(String expected) {
+    final f = methodM;
+    Expect.equals(expected, f());
+
+    final newB = createB;
+    return newB();
+  }
+
+  B createB() => new B();
+
+  String methodM() => 'A';
+}
+
+class B extends A {
+  @override
+  String methodM() => 'B';
+}
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 407b338..63981da 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -67,9 +67,6 @@
 cc/Mixin_PrivateSuperResolution: Skip
 cc/Mixin_PrivateSuperResolutionCrossLibraryShouldFail: Skip
 
-[ $compiler == dartkp ]
-dart/truncating_ints_test: CompileTimeError # Issue 31339
-
 [ $compiler == precompiler ]
 dart/byte_array_test: Skip # Incompatible flag --disable_alloc_stubs_after_gc
 
@@ -353,6 +350,9 @@
 dart/spawn_infinite_loop_test: Crash # Please triage.
 dart/truncating_ints_test: CompileTimeError # Please triage.
 
+[ $compiler == dartkp && !$strong ]
+dart/truncating_ints_test: Skip # This test cannot be run in dartkp/legacy mode (gen_kernel does not pass --limit-ints-to-64-bits in legacy mode).
+
 [ $compiler == dartkp && ($runtime == dart_precompiled || $runtime == vm) ]
 dart/data_uri_import_test/base64: CompileTimeError
 dart/data_uri_import_test/nocharset: CompileTimeError
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index bc75dd7..1f74a04 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -75,6 +75,10 @@
         # TODO(zra): When the platform-specific timeline code is moved out to
         # the embedder, this can go away.
         "//zircon/system/ulib/fbl",
+        # TODO(US-399): Remove time_service specific code when it is no longer
+        # necessary.
+        "//garnet/public/lib/time_service/fidl",
+        "//garnet/public/lib/app/cpp",
       ]
     }
     public_configs = [ ":libdart_vm_config" ]
diff --git a/runtime/vm/compiler/aot/aot_call_specializer.cc b/runtime/vm/compiler/aot/aot_call_specializer.cc
index 2db84f6..13190f9 100644
--- a/runtime/vm/compiler/aot/aot_call_specializer.cc
+++ b/runtime/vm/compiler/aot/aot_call_specializer.cc
@@ -719,10 +719,18 @@
       for (intptr_t i = 0; i < class_ids.length(); i++) {
         const intptr_t cid = class_ids[i];
         cls = isolate()->class_table()->At(cid);
+        // Even if we are resolving get:M on a class that has method M
+        // ResolveForReceiverClass would not inject a method extractor into
+        // a class becuase FLAG_lazy_dispatchers is set to false during AOT
+        // compilation. Precompiler however does inject method extractors
+        // (see Precompiler::CheckForNewDynamicFunctions). This means that that
+        // lookup for get:m might overlook a method M in subclass and return
+        // get:m (method extractor for M) from a superclass.
+        // For this reason we abort optimization if lookup returns any
+        // artificial functions that can be inserted lazily.
         target = instr->ResolveForReceiverClass(cls);
-        if (target.IsNull()) {
-          // Can't resolve the target. It might be a noSuchMethod,
-          // call through getter or closurization.
+        if (target.IsNull() || target.IsMethodExtractor() ||
+            target.IsInvokeFieldDispatcher()) {
           single_target = Function::null();
           ic_data = ICData::null();
           break;
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index 675351a..a85c3bc 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -878,8 +878,7 @@
   // To check that, we compute value & ~object and skip the write barrier
   // if the bit is not set. We can't destroy the object.
   bic(TMP, value, Operand(object));
-  tsti(TMP, Immediate(kNewObjectAlignmentOffset));
-  b(no_update, EQ);
+  tbz(no_update, TMP, kNewObjectBitPosition);
 }
 
 // Preserves object and value registers.
@@ -888,11 +887,10 @@
                                       Label* no_update) {
   // For the value we are only interested in the new/old bit and the tag bit.
   // And the new bit with the tag bit. The resulting bit will be 0 for a Smi.
-  and_(TMP, value, Operand(value, LSL, kObjectAlignmentLog2 - 1));
+  and_(TMP, value, Operand(value, LSL, kNewObjectBitPosition));
   // And the result with the negated space bit of the object.
   bic(TMP, TMP, Operand(object));
-  tsti(TMP, Immediate(kNewObjectAlignmentOffset));
-  b(no_update, EQ);
+  tbz(no_update, TMP, kNewObjectBitPosition);
 }
 
 void Assembler::StoreIntoObjectOffset(Register object,
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.cc b/runtime/vm/compiler/assembler/assembler_ia32.cc
index af1079b..363261f 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.cc
+++ b/runtime/vm/compiler/assembler/assembler_ia32.cc
@@ -1856,18 +1856,12 @@
 void Assembler::StoreIntoObjectFilter(Register object,
                                       Register value,
                                       Label* no_update) {
-  // For the value we are only interested in the new/old bit and the tag bit.
-  andl(value, Immediate(kNewObjectAlignmentOffset | kHeapObjectTag));
-  // Shift the tag bit into the carry.
-  shrl(value, Immediate(1));
-  // Add the tag bits together, if the value is not a Smi the addition will
-  // overflow into the next bit, leaving us with a zero low bit.
-  adcl(value, object);
-  // Mask out higher, uninteresting bits which were polluted by dest.
-  andl(value, Immediate(kObjectAlignment - 1));
-  // Compare with the expected bit pattern.
-  cmpl(value, Immediate((kNewObjectAlignmentOffset >> 1) + kHeapObjectTag +
-                        kOldObjectAlignmentOffset + kHeapObjectTag));
+  ASSERT(kNewObjectAlignmentOffset == 4);
+  ASSERT(kHeapObjectTag == 1);
+  // Detect value being ...101 and object being ...001.
+  andl(value, Immediate(7));
+  leal(value, Address(value, object, TIMES_2, 9));
+  testl(value, Immediate(0xf));
   j(NOT_ZERO, no_update, Assembler::kNearJump);
 }
 
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index 74dae8e..123ce31 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -1199,18 +1199,12 @@
 void Assembler::StoreIntoObjectFilter(Register object,
                                       Register value,
                                       Label* no_update) {
-  // For the value we are only interested in the new/old bit and the tag bit.
-  andl(value, Immediate(kNewObjectAlignmentOffset | kHeapObjectTag));
-  // Shift the tag bit into the carry.
-  shrl(value, Immediate(1));
-  // Add the tag bits together, if the value is not a Smi the addition will
-  // overflow into the next bit, leaving us with a zero low bit.
-  adcl(value, object);
-  // Mask out higher, uninteresting bits which were polluted by dest.
-  andl(value, Immediate(kObjectAlignment - 1));
-  // Compare with the expected bit pattern.
-  cmpl(value, Immediate((kNewObjectAlignmentOffset >> 1) + kHeapObjectTag +
-                        kOldObjectAlignmentOffset + kHeapObjectTag));
+  ASSERT(kNewObjectAlignmentOffset == 8);
+  ASSERT(kHeapObjectTag == 1);
+  // Detect value being ...1001 and object being ...0001.
+  andl(value, Immediate(0xf));
+  leal(value, Address(value, object, TIMES_2, 0x15));
+  testl(value, Immediate(0x1f));
   j(NOT_ZERO, no_update, Assembler::kNearJump);
 }
 
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index 5a9e9b0..32d0160 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -406,6 +406,7 @@
   RA(Q, movq, 0x8B)
   RR(L, movl, 0x8B)
   RA(Q, leaq, 0x8D)
+  RA(L, leal, 0x8D)
   AR(L, cmpxchgl, 0xB1, 0x0F)
   AR(Q, cmpxchgq, 0xB1, 0x0F)
   RA(L, cmpxchgl, 0xB1, 0x0F)
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index d30b351..35bc55b 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -9207,6 +9207,9 @@
   } else if (tag == kField) {
     FieldHelper field_helper(this);
     field_helper.ReadUntilExcluding(FieldHelper::kEnd);
+  } else if (tag == kClass) {
+    ClassHelper class_helper(this);
+    class_helper.ReadUntilExcluding(ClassHelper::kEnd);
   } else {
     H.ReportError("Unsupported tag at this point: %d.", tag);
     UNREACHABLE();
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 3035c75..9196276 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -322,6 +322,7 @@
   enum Flag {
     kConst = 1 << 0,
     kExternal = 1 << 1,
+    kSyntheticDefault = 1 << 2,
   };
 
   explicit ConstructorHelper(StreamingFlowGraphBuilder* builder) {
@@ -340,6 +341,7 @@
 
   bool IsExternal() { return (flags_ & kExternal) != 0; }
   bool IsConst() { return (flags_ & kConst) != 0; }
+  bool IsSyntheticDefault() { return (flags_ & kSyntheticDefault) != 0; }
 
   NameIndex canonical_name_;
   TokenPosition position_;
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index def0b90..9e776f9 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -2676,35 +2676,53 @@
       if (entry.IsClass()) {
         const Class& klass = Class::Cast(entry);
         entry_script = klass.script();
-        if (!entry_script.IsNull() && script.kernel_script_index() ==
-                                          entry_script.kernel_script_index()) {
+        if (!entry_script.IsNull() &&
+            (script.kernel_script_index() ==
+             entry_script.kernel_script_index()) &&
+            (script.kernel_string_offsets() ==
+             entry_script.kernel_string_offsets())) {
           token_positions.Add(klass.token_pos().value());
         }
-        Array& array = Array::Handle(zone_, klass.fields());
-        Field& field = Field::Handle(Z);
-        for (intptr_t i = 0; i < array.Length(); ++i) {
-          field ^= array.At(i);
-          if (field.kernel_offset() <= 0) {
-            // Skip artificially injected fields.
-            continue;
+        if (klass.is_finalized()) {
+          Array& array = Array::Handle(Z, klass.fields());
+          Field& field = Field::Handle(Z);
+          for (intptr_t i = 0; i < array.Length(); ++i) {
+            field ^= array.At(i);
+            if (field.kernel_offset() <= 0) {
+              // Skip artificially injected fields.
+              continue;
+            }
+            data = field.KernelData();
+            entry_script = field.Script();
+            ProcessTokenPositionsEntry(
+                data, script, entry_script, field.kernel_offset(),
+                field.KernelDataProgramOffset(), Z, &helper, &token_positions,
+                &yield_positions);
           }
-          data = field.KernelData();
-          entry_script = field.Script();
-          ProcessTokenPositionsEntry(
-              data, script, entry_script, field.kernel_offset(),
-              field.KernelDataProgramOffset(), zone_, &helper, &token_positions,
-              &yield_positions);
-        }
-        array = klass.functions();
-        Function& function = Function::Handle(Z);
-        for (intptr_t i = 0; i < array.Length(); ++i) {
-          function ^= array.At(i);
-          data = function.KernelData();
-          entry_script = function.script();
-          ProcessTokenPositionsEntry(
-              data, script, entry_script, function.kernel_offset(),
-              function.KernelDataProgramOffset(), zone_, &helper,
-              &token_positions, &yield_positions);
+          array = klass.functions();
+          Function& function = Function::Handle(Z);
+          for (intptr_t i = 0; i < array.Length(); ++i) {
+            function ^= array.At(i);
+            data = function.KernelData();
+            entry_script = function.script();
+            ProcessTokenPositionsEntry(
+                data, script, entry_script, function.kernel_offset(),
+                function.KernelDataProgramOffset(), Z, &helper,
+                &token_positions, &yield_positions);
+          }
+        } else {
+          // Class isn't finalized yet: read the data attached to it.
+          ASSERT(klass.kernel_offset() > 0);
+          data = lib.kernel_data();
+          ASSERT(!data.IsNull());
+          const intptr_t library_kernel_offset = lib.kernel_offset();
+          ASSERT(library_kernel_offset > 0);
+          const intptr_t class_offset = klass.kernel_offset();
+
+          entry_script = klass.script();
+          ProcessTokenPositionsEntry(data, script, entry_script, class_offset,
+                                     library_kernel_offset, Z, &helper,
+                                     &token_positions, &yield_positions);
         }
       } else if (entry.IsFunction()) {
         const Function& function = Function::Cast(entry);
@@ -2712,7 +2730,7 @@
         entry_script = function.script();
         ProcessTokenPositionsEntry(data, script, entry_script,
                                    function.kernel_offset(),
-                                   function.KernelDataProgramOffset(), zone_,
+                                   function.KernelDataProgramOffset(), Z,
                                    &helper, &token_positions, &yield_positions);
       } else if (entry.IsField()) {
         const Field& field = Field::Cast(entry);
@@ -2724,8 +2742,8 @@
         entry_script = field.Script();
         ProcessTokenPositionsEntry(data, script, entry_script,
                                    field.kernel_offset(),
-                                   field.KernelDataProgramOffset(), zone_,
-                                   &helper, &token_positions, &yield_positions);
+                                   field.KernelDataProgramOffset(), Z, &helper,
+                                   &token_positions, &yield_positions);
       }
     }
   }
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 16e5074..7043b36 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -978,7 +978,7 @@
   EXPECT_VALID(result);
   EXPECT(fits);
 
-  Dart_Handle above_max = Dart_NewIntegerFromHexCString("0x8000000000000000");
+  Dart_Handle above_max = Dart_NewIntegerFromHexCString("0x10000000000000000");
   if (FLAG_limit_ints_to_64_bits) {
     EXPECT(Dart_IsApiError(above_max));
   } else {
@@ -996,7 +996,7 @@
   EXPECT_VALID(result);
   EXPECT(fits);
 
-  Dart_Handle below_min = Dart_NewIntegerFromHexCString("-0x8000000000000001");
+  Dart_Handle below_min = Dart_NewIntegerFromHexCString("-0x10000000000000001");
   if (FLAG_limit_ints_to_64_bits) {
     EXPECT(Dart_IsApiError(below_min));
   } else {
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 6a868de..5c508f0 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -2827,6 +2827,10 @@
   BreakpointLocation* bpt_location = SetBreakpoint(
       script, target_function.token_pos(), target_function.end_token_pos(), -1,
       -1 /* no requested line/col */);
+  if (bpt_location == NULL) {
+    return NULL;
+  }
+
   if (single_shot) {
     return bpt_location->AddSingleShot(this);
   } else {
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index f74e67a..9b804c7 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -34,6 +34,10 @@
             show_kernel_isolate,
             false,
             "Show Kernel service isolate as normal isolate.");
+DEFINE_FLAG(bool,
+            suppress_fe_warnings,
+            false,
+            "Suppress warnings from the FE.");
 
 const char* KernelIsolate::kName = DART_KERNEL_ISOLATE_NAME;
 Dart_IsolateCreateCallback KernelIsolate::create_callback_ = NULL;
@@ -361,6 +365,11 @@
     } else {
       files.type = Dart_CObject_kNull;
     }
+
+    Dart_CObject suppress_warnings;
+    suppress_warnings.type = Dart_CObject_kBool;
+    suppress_warnings.value.as_bool = FLAG_suppress_fe_warnings;
+
     Dart_CObject* message_arr[] = {&tag,
                                    &send_port,
                                    &uri,
@@ -368,7 +377,8 @@
                                    &dart_incremental,
                                    &dart_strong,
                                    &isolate_id,
-                                   &files};
+                                   &files,
+                                   &suppress_warnings};
     message.value.as_array.values = message_arr;
     message.value.as_array.length = ARRAY_SIZE(message_arr);
     // Send the message.
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 50fa689..5d8388c 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -986,6 +986,10 @@
                                      true,   // is_method
                                      false,  // is_closure
                                      &function_node_helper);
+    if (constructor_helper.IsSyntheticDefault()) {
+      function.set_is_debuggable(false);
+    }
+
     function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd);
     constructor_helper.SetJustRead(ConstructorHelper::kFunction);
     constructor_helper.ReadUntilExcluding(ConstructorHelper::kEnd);
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 1e98057..090091d 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -3565,16 +3565,37 @@
 }
 
 TokenPosition Class::ComputeEndTokenPos() const {
+#if defined(DART_PRECOMPILED_RUNTIME)
+  return TokenPosition::kNoSource;
+#else
   // Return the begin token for synthetic classes.
   if (is_synthesized_class() || IsMixinApplication() || IsTopLevel()) {
     return token_pos();
   }
 
-  Zone* zone = Thread::Current()->zone();
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
   const Script& scr = Script::Handle(zone, script());
   ASSERT(!scr.IsNull());
 
   if (scr.kind() == RawScript::kKernelTag) {
+    ASSERT(kernel_offset() > 0);
+    const Library& lib = Library::Handle(zone, library());
+    const TypedData& kernel_data = TypedData::Handle(zone, lib.kernel_data());
+    ASSERT(!kernel_data.IsNull());
+    const intptr_t library_kernel_offset = lib.kernel_offset();
+    ASSERT(library_kernel_offset > 0);
+    const intptr_t class_offset = kernel_offset();
+
+    kernel::TranslationHelper helper(thread);
+    helper.InitFromScript(scr);
+    kernel::StreamingFlowGraphBuilder builder_(&helper, scr, zone, kernel_data,
+                                               0);
+    builder_.SetOffset(class_offset);
+    kernel::ClassHelper class_helper(&builder_);
+    class_helper.ReadUntilIncluding(kernel::ClassHelper::kEndPosition);
+    if (class_helper.end_position_.IsReal()) return class_helper.end_position_;
+
     TokenPosition largest_seen = token_pos();
 
     // Walk through all functions and get their end_tokens to find the classes
@@ -3613,6 +3634,7 @@
   }
   UNREACHABLE();
   return TokenPosition::kNoSource;
+#endif
 }
 
 int32_t Class::SourceFingerprint() const {
@@ -3799,13 +3821,19 @@
 }
 
 bool Class::IsFutureClass() const {
-  return (library() == Library::AsyncLibrary()) &&
-         (Name() == Symbols::Future().raw());
+  // Looking up future_class in the object store would not work, because
+  // this function is called during class finalization, before the object store
+  // field would be initialized by InitKnownObjects().
+  return (Name() == Symbols::Future().raw()) &&
+         (library() == Library::AsyncLibrary());
 }
 
 bool Class::IsFutureOrClass() const {
-  return (library() == Library::AsyncLibrary()) &&
-         (Name() == Symbols::FutureOr().raw());
+  // Looking up future_or_class in the object store would not work, because
+  // this function is called during class finalization, before the object store
+  // field would be initialized by InitKnownObjects().
+  return (Name() == Symbols::FutureOr().raw()) &&
+         (library() == Library::AsyncLibrary());
 }
 
 // If test_kind == kIsSubtypeOf, checks if type S is a subtype of type T.
@@ -3829,10 +3857,10 @@
   Isolate* isolate = thread->isolate();
   Class& this_class = Class::Handle(zone, cls.raw());
   while (true) {
-    // Check for DynamicType.
     // Each occurrence of DynamicType in type T is interpreted as the dynamic
-    // type, a supertype of all types.
-    if (other.IsDynamicClass()) {
+    // type, a supertype of all types. So are Object and void types.
+    if (other.IsDynamicClass() || other.IsObjectClass() ||
+        other.IsVoidClass()) {
       return true;
     }
     // Check for NullType, which, as of Dart 1.5, is a subtype of (and is more
@@ -3858,11 +3886,6 @@
     if (this_class.IsDynamicClass()) {
       return !isolate->strong() && (test_kind == Class::kIsSubtypeOf);
     }
-    // Check for ObjectType. Any type that is not NullType or DynamicType
-    // (already checked above), is more specific than ObjectType/VoidType.
-    if (other.IsObjectClass() || other.IsVoidClass()) {
-      return true;
-    }
     // If other is neither Object, dynamic or void, then ObjectType/VoidType
     // can't be a subtype of other.
     if (this_class.IsObjectClass() || this_class.IsVoidClass()) {
@@ -3880,7 +3903,7 @@
       // below), we only check a subvector of the proper length.
       // Check for covariance.
       if (other_type_arguments.IsNull() ||
-          other_type_arguments.IsRaw(from_index, num_type_params)) {
+          other_type_arguments.IsTopTypes(from_index, num_type_params)) {
         return true;
       }
       if (type_arguments.IsNull() ||
@@ -4003,8 +4026,7 @@
     }
     const AbstractType& other_type_arg =
         AbstractType::Handle(zone, other_type_arguments.TypeAt(0));
-    if (other_type_arg.IsObjectType() || other_type_arg.IsDynamicType() ||
-        other_type_arg.IsVoidType()) {
+    if (other_type_arg.IsTopType()) {
       return true;
     }
     if (!type_arguments.IsNull() && IsFutureClass()) {
@@ -4776,6 +4798,18 @@
   return true;
 }
 
+bool TypeArguments::IsTopTypes(intptr_t from_index, intptr_t len) const {
+  ASSERT(Length() >= (from_index + len));
+  AbstractType& type = AbstractType::Handle();
+  for (intptr_t i = 0; i < len; i++) {
+    type = TypeAt(from_index + i);
+    if (type.IsNull() || !type.IsTopType()) {
+      return false;
+    }
+  }
+  return true;
+}
+
 bool TypeArguments::TypeTest(TypeTestKind test_kind,
                              const TypeArguments& other,
                              intptr_t from_index,
@@ -6587,7 +6621,7 @@
   if (Isolate::Current()->strong()) {
     const AbstractType& param_type =
         AbstractType::Handle(ParameterTypeAt(parameter_position));
-    if (param_type.IsDynamicType()) {
+    if (param_type.IsTopType()) {
       return true;
     }
     const AbstractType& other_param_type =
@@ -6687,14 +6721,20 @@
   // Check the result type.
   const AbstractType& other_res_type =
       AbstractType::Handle(zone, other.result_type());
-  if (!other_res_type.IsDynamicType() && !other_res_type.IsVoidType()) {
-    const AbstractType& res_type = AbstractType::Handle(zone, result_type());
-    if (isolate->strong()) {
+  if (isolate->strong()) {
+    // In strong mode, 'void Function()' is a subtype of 'Object Function()'.
+    if (!other_res_type.IsTopType()) {
+      const AbstractType& res_type = AbstractType::Handle(zone, result_type());
       if (!res_type.IsSubtypeOf(other_res_type, bound_error, bound_trail,
                                 space)) {
         return false;
       }
-    } else {
+    }
+  } else {
+    // In Dart 1.0, 'void Function()' is not a subtype of 'Object Function()',
+    // but it is a subtype of 'dynamic Function()' and of 'void Function()'.
+    if (!other_res_type.IsDynamicType() && !other_res_type.IsVoidType()) {
+      const AbstractType& res_type = AbstractType::Handle(zone, result_type());
       if (res_type.IsVoidType()) {
         return false;
       }
@@ -11521,7 +11561,7 @@
     lib_url = lib.url();
     map.InsertNewOrGetValue(lib_url, lib);
   }
-  // Now rememeber these in the isolate's object store.
+  // Now remember these in the isolate's object store.
   isolate->object_store()->set_libraries(libs);
   isolate->object_store()->set_libraries_map(map.Release());
 }
@@ -15737,7 +15777,7 @@
   Isolate* isolate = thread->isolate();
   const Class& cls = Class::Handle(zone, clazz());
   if (cls.IsClosureClass()) {
-    if (other.IsObjectType() || other.IsDartFunctionType() ||
+    if (other.IsTopType() || other.IsDartFunctionType() ||
         other.IsDartClosureType()) {
       return true;
     }
@@ -15754,9 +15794,7 @@
       if (instantiated_other.IsTypeRef()) {
         instantiated_other = TypeRef::Cast(instantiated_other).type();
       }
-      if (instantiated_other.IsDynamicType() ||
-          instantiated_other.IsObjectType() ||
-          instantiated_other.IsVoidType() ||
+      if (instantiated_other.IsTopType() ||
           instantiated_other.IsDartFunctionType()) {
         return true;
       }
@@ -15812,8 +15850,7 @@
     if (instantiated_other.IsTypeRef()) {
       instantiated_other = TypeRef::Cast(instantiated_other).type();
     }
-    if (instantiated_other.IsDynamicType() ||
-        instantiated_other.IsObjectType() || instantiated_other.IsVoidType()) {
+    if (instantiated_other.IsTopType()) {
       return true;
     }
   }
@@ -15877,8 +15914,7 @@
         TypeArguments::Handle(zone, other.arguments());
     const AbstractType& other_type_arg =
         AbstractType::Handle(zone, other_type_arguments.TypeAt(0));
-    if (other_type_arg.IsObjectType() || other_type_arg.IsDynamicType() ||
-        other_type_arg.IsVoidType()) {
+    if (other_type_arg.IsTopType()) {
       return true;
     }
     if (Class::Handle(zone, clazz()).IsFutureClass()) {
@@ -16448,76 +16484,93 @@
   if (IsCanonical()) {
     return raw() == Object::dynamic_type().raw();
   }
-  return HasResolvedTypeClass() && (type_class() == Object::dynamic_class());
+  return HasResolvedTypeClass() && (type_class_id() == kDynamicCid);
 }
 
 bool AbstractType::IsVoidType() const {
+  // The void type is always canonical, because void is a keyword.
   return raw() == Object::void_type().raw();
 }
 
+bool AbstractType::IsObjectType() const {
+  return HasResolvedTypeClass() && (type_class_id() == kInstanceCid);
+}
+
+bool AbstractType::IsTopType() const {
+  if (IsVoidType()) {
+    return true;
+  }
+  if (!HasResolvedTypeClass()) {
+    return false;
+  }
+  classid_t cid = type_class_id();
+  return (cid == kDynamicCid) || (cid == kInstanceCid);
+}
+
 bool AbstractType::IsNullType() const {
-  return !IsFunctionType() && HasResolvedTypeClass() &&
-         (type_class() == Isolate::Current()->object_store()->null_class());
+  return HasResolvedTypeClass() && (type_class_id() == kNullCid);
 }
 
 bool AbstractType::IsBoolType() const {
-  return !IsFunctionType() && HasResolvedTypeClass() &&
-         (type_class() == Isolate::Current()->object_store()->bool_class());
+  return HasResolvedTypeClass() && (type_class_id() == kBoolCid);
 }
 
 bool AbstractType::IsIntType() const {
-  return !IsFunctionType() && HasResolvedTypeClass() &&
+  return HasResolvedTypeClass() &&
          (type_class() == Type::Handle(Type::IntType()).type_class());
 }
 
 bool AbstractType::IsInt64Type() const {
-  return !IsFunctionType() && HasResolvedTypeClass() &&
+  return HasResolvedTypeClass() &&
          (type_class() == Type::Handle(Type::Int64Type()).type_class());
 }
 
 bool AbstractType::IsDoubleType() const {
-  return !IsFunctionType() && HasResolvedTypeClass() &&
+  return HasResolvedTypeClass() &&
          (type_class() == Type::Handle(Type::Double()).type_class());
 }
 
 bool AbstractType::IsFloat32x4Type() const {
-  return !IsFunctionType() && HasResolvedTypeClass() &&
+  // kFloat32x4Cid refers to the private class and cannot be used here.
+  return HasResolvedTypeClass() &&
          (type_class() == Type::Handle(Type::Float32x4()).type_class());
 }
 
 bool AbstractType::IsFloat64x2Type() const {
-  return !IsFunctionType() && HasResolvedTypeClass() &&
+  // kFloat64x2Cid refers to the private class and cannot be used here.
+  return HasResolvedTypeClass() &&
          (type_class() == Type::Handle(Type::Float64x2()).type_class());
 }
 
 bool AbstractType::IsInt32x4Type() const {
-  return !IsFunctionType() && HasResolvedTypeClass() &&
+  // kInt32x4Cid refers to the private class and cannot be used here.
+  return HasResolvedTypeClass() &&
          (type_class() == Type::Handle(Type::Int32x4()).type_class());
 }
 
 bool AbstractType::IsNumberType() const {
-  return !IsFunctionType() && HasResolvedTypeClass() &&
-         (type_class() == Type::Handle(Type::Number()).type_class());
+  return HasResolvedTypeClass() && (type_class_id() == kNumberCid);
 }
 
 bool AbstractType::IsSmiType() const {
-  return !IsFunctionType() && HasResolvedTypeClass() &&
-         (type_class() == Type::Handle(Type::SmiType()).type_class());
+  return HasResolvedTypeClass() && (type_class_id() == kSmiCid);
 }
 
 bool AbstractType::IsStringType() const {
-  return !IsFunctionType() && HasResolvedTypeClass() &&
+  return HasResolvedTypeClass() &&
          (type_class() == Type::Handle(Type::StringType()).type_class());
 }
 
 bool AbstractType::IsDartFunctionType() const {
-  return !IsFunctionType() && HasResolvedTypeClass() &&
+  return HasResolvedTypeClass() &&
          (type_class() == Type::Handle(Type::DartFunctionType()).type_class());
 }
 
 bool AbstractType::IsDartClosureType() const {
+  // Non-typedef function types have '_Closure' class as type class, but are not
+  // the Dart '_Closure' type.
   return !IsFunctionType() && HasResolvedTypeClass() &&
-         (type_class() == Isolate::Current()->object_store()->closure_class());
+         (type_class_id() == kClosureCid);
 }
 
 bool AbstractType::TypeTest(TypeTestKind test_kind,
@@ -16558,8 +16611,7 @@
   // comparing function-types).
   // As of Dart 1.5, the Null type is a subtype of (and is more specific than)
   // any type.
-  if (other.IsObjectType() || other.IsDynamicType() || other.IsVoidType() ||
-      IsNullType()) {
+  if (other.IsTopType() || IsNullType()) {
     return true;
   }
   Thread* thread = Thread::Current();
@@ -16724,8 +16776,7 @@
         TypeArguments::Handle(zone, other.arguments());
     const AbstractType& other_type_arg =
         AbstractType::Handle(zone, other_type_arguments.TypeAt(0));
-    if (other_type_arg.IsObjectType() || other_type_arg.IsDynamicType() ||
-        other_type_arg.IsVoidType()) {
+    if (other_type_arg.IsTopType()) {
       return true;
     }
     // Retry the TypeTest function after unwrapping type arg of FutureOr.
@@ -17105,7 +17156,7 @@
   if (IsMalbounded() != other_type.IsMalbounded()) {
     return false;  // Do not drop bound error.
   }
-  if (type_class() != other_type.type_class()) {
+  if (type_class_id() != other_type.type_class_id()) {
     return false;
   }
   if (!IsFinalized() || !other_type.IsFinalized()) {
@@ -17413,13 +17464,11 @@
 
   // Since void is a keyword, we never have to canonicalize the void type after
   // it is canonicalized once by the vm isolate. The parser does the mapping.
-  ASSERT((type_class() != Object::void_class()) ||
-         (isolate == Dart::vm_isolate()));
+  ASSERT((type_class_id() != kVoidCid) || (isolate == Dart::vm_isolate()));
 
   // Since dynamic is not a keyword, the parser builds a type that requires
   // canonicalization.
-  if ((type_class() == Object::dynamic_class()) &&
-      (isolate != Dart::vm_isolate())) {
+  if ((type_class_id() == kDynamicCid) && (isolate != Dart::vm_isolate())) {
     ASSERT(Object::dynamic_type().IsCanonical());
     return Object::dynamic_type().raw();
   }
@@ -17527,7 +17576,7 @@
   if (IsMalformed() || IsRecursive()) {
     return true;
   }
-  if (type_class() == Object::dynamic_class()) {
+  if (type_class_id() == kDynamicCid) {
     return (raw() == Object::dynamic_type().raw());
   }
   Zone* zone = thread->zone();
@@ -17593,7 +17642,7 @@
   ASSERT(IsFinalized());
   uint32_t result = 1;
   if (IsMalformed()) return result;
-  result = CombineHashes(result, Class::Handle(type_class()).id());
+  result = CombineHashes(result, type_class_id());
   result = CombineHashes(result, TypeArguments::Handle(arguments()).Hash());
   if (IsFunctionType()) {
     const Function& sig_fun = Function::Handle(signature());
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 9da8f8c..5b9fdea 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -5665,6 +5665,11 @@
     return IsDynamicTypes(true, 0, len);
   }
 
+  // Check if the subvector of length 'len' starting at 'from_index' of this
+  // type argument vector consists solely of DynamicType, ObjectType, or
+  // VoidType.
+  bool IsTopTypes(intptr_t from_index, intptr_t len) const;
+
   // Check the subtype relationship, considering only a subvector of length
   // 'len' starting at 'from_index'.
   bool IsSubtypeOf(const TypeArguments& other,
@@ -5985,10 +5990,12 @@
   // Check if this type represents the 'Null' type.
   bool IsNullType() const;
 
-  bool IsObjectType() const {
-    return !IsFunctionType() && HasResolvedTypeClass() &&
-           Class::Handle(type_class()).IsObjectClass();
-  }
+  // Check if this type represents the 'Object' type.
+  bool IsObjectType() const;
+
+  // Check if this type represents a top type, i.e. 'dynamic', 'Object', or
+  // 'void' type.
+  bool IsTopType() const;
 
   // Check if this type represents the 'bool' type.
   bool IsBoolType() const;
@@ -6265,6 +6272,9 @@
   }
   RawAbstractType* type() const { return raw_ptr()->type_; }
   void set_type(const AbstractType& value) const;
+  virtual classid_t type_class_id() const {
+    return AbstractType::Handle(type()).type_class_id();
+  }
   virtual RawClass* type_class() const {
     return AbstractType::Handle(type()).type_class();
   }
@@ -6440,6 +6450,9 @@
   virtual bool HasResolvedTypeClass() const {
     return AbstractType::Handle(type()).HasResolvedTypeClass();
   }
+  virtual classid_t type_class_id() const {
+    return AbstractType::Handle(type()).type_class_id();
+  }
   virtual RawClass* type_class() const {
     return AbstractType::Handle(type()).type_class();
   }
diff --git a/runtime/vm/os_fuchsia.cc b/runtime/vm/os_fuchsia.cc
index becd0b8..4c030df 100644
--- a/runtime/vm/os_fuchsia.cc
+++ b/runtime/vm/os_fuchsia.cc
@@ -8,14 +8,20 @@
 #include "vm/os.h"
 
 #include <errno.h>
+#include <fdio/util.h>
 #include <zircon/process.h>
 #include <zircon/syscalls.h>
 #include <zircon/syscalls/object.h>
 #include <zircon/types.h>
 
+#include "lib/app/cpp/environment_services.h"
+#include "lib/time_service/fidl/time_service.fidl.h"
+
 #include "platform/assert.h"
 #include "vm/zone.h"
 
+static constexpr char kTimeServiceName[] = "time_service::TimeService";
+
 namespace dart {
 
 #ifndef PRODUCT
@@ -35,36 +41,53 @@
   return static_cast<intptr_t>(getpid());
 }
 
-static bool LocalTime(int64_t seconds_since_epoch, tm* tm_result) {
-  time_t seconds = static_cast<time_t>(seconds_since_epoch);
-  if (seconds != seconds_since_epoch) {
-    return false;
+static zx_status_t GetTimeServicePtr(
+    time_service::TimeServiceSyncPtr* time_svc) {
+  zx::channel service_root = app::subtle::CreateStaticServiceRootHandle();
+  zx::channel time_svc_channel = GetSynchronousProxy(time_svc).PassChannel();
+  return fdio_service_connect_at(service_root.get(), kTimeServiceName,
+                                 time_svc_channel.release());
+}
+
+static zx_status_t GetLocalAndDstOffsetInSeconds(int64_t seconds_since_epoch,
+                                                 int32_t* local_offset,
+                                                 int32_t* dst_offset) {
+  time_service::TimeServiceSyncPtr time_svc;
+  zx_status_t status = GetTimeServicePtr(&time_svc);
+  if (status == ZX_OK) {
+    time_svc->GetTimezoneOffsetMinutes(seconds_since_epoch * 1000, local_offset,
+                                       dst_offset);
+    *local_offset *= 60;
+    *dst_offset *= 60;
   }
-  struct tm* error_code = localtime_r(&seconds, tm_result);
-  return error_code != NULL;
+  return status;
 }
 
 const char* OS::GetTimeZoneName(int64_t seconds_since_epoch) {
-  tm decomposed;
-  bool succeeded = LocalTime(seconds_since_epoch, &decomposed);
-  // If unsuccessful, return an empty string like V8 does.
-  return (succeeded && (decomposed.tm_zone != NULL)) ? decomposed.tm_zone : "";
+  time_service::TimeServiceSyncPtr time_svc;
+  if (GetTimeServicePtr(&time_svc) == ZX_OK) {
+    fidl::String res;
+    time_svc->GetTimezoneId(&res);
+    char* tz_name = Thread::Current()->zone()->Alloc<char>(res.size() + 1);
+    memmove(tz_name, res.get().c_str(), res.size());
+    tz_name[res.size()] = '\0';
+    return tz_name;
+  }
+  return "";
 }
 
 int OS::GetTimeZoneOffsetInSeconds(int64_t seconds_since_epoch) {
-  tm decomposed;
-  bool succeeded = LocalTime(seconds_since_epoch, &decomposed);
-  // Even if the offset was 24 hours it would still easily fit into 32 bits.
-  // If unsuccessful, return zero like V8 does.
-  return succeeded ? static_cast<int>(decomposed.tm_gmtoff) : 0;
+  int32_t local_offset, dst_offset;
+  zx_status_t status = GetLocalAndDstOffsetInSeconds(
+      seconds_since_epoch, &local_offset, &dst_offset);
+  return status == ZX_OK ? local_offset + dst_offset : 0;
 }
 
 int OS::GetLocalTimeZoneAdjustmentInSeconds() {
-  // TODO(floitsch): avoid excessive calls to tzset?
-  tzset();
-  // Even if the offset was 24 hours it would still easily fit into 32 bits.
-  // Note that Unix and Dart disagree on the sign.
-  return static_cast<int>(-timezone);
+  int32_t local_offset, dst_offset;
+  zx_status_t status = GetLocalAndDstOffsetInSeconds(
+      zx_time_get(ZX_CLOCK_UTC) / ZX_SEC(1), &local_offset, &dst_offset);
+  return status == ZX_OK ? local_offset : 0;
 }
 
 int64_t OS::GetCurrentTimeMillis() {
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index e2bcab8..da39187 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -223,6 +223,7 @@
   // Alignment offsets are used to determine object age.
   kNewObjectAlignmentOffset = kWordSize,
   kOldObjectAlignmentOffset = 0,
+  kNewObjectBitPosition = kWordSizeLog2,
   // Object sizes are aligned to kObjectAlignment.
   kObjectAlignment = 2 * kWordSize,
   kObjectAlignmentLog2 = kWordSizeLog2 + 1,
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index 7d21d3d..0a0dd08 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -44,7 +44,7 @@
 # ........dartfmt.dart.snapshot
 # ........dartdevc.dart.snapshot
 # ........dartdevk.dart.snapshot
-# ........front_end_worker.dart.snapshot
+# ........kernel_summary_worker.dart.snapshot
 # ........pub.dart.snapshot
 # ........utils_wrapper.dart.snapshot
 #.........resources/
@@ -163,8 +163,8 @@
     "../utils/dartfmt",
   ],
   [
-    "front_end_worker",
-    "../utils/front_end:front_end_worker",
+    "kernel_summary_worker",
+    "../utils/bazel:kernel_summary_worker",
   ],
   [
     "pub",
@@ -315,50 +315,58 @@
 }
 
 # Copies the Dart VM binary into bin/
-copy("copy_dart") {
-  visibility = [ ":create_common_sdk" ]
-  deps = [
-    "../runtime/bin:dart",
-  ]
-  dart_out = get_label_info("../runtime/bin:dart", "root_out_dir")
-  if (is_win) {
-    sources = [
-      "$dart_out/dart.exe",
+if (is_fuchsia_host) {
+  # In the Fuchsia build, this has to use a symlink for two reasons.
+  # First, it makes the lookup of shared libraries relative to $ORIGIN
+  # (Linux) or @loader_path (macOS) find the libraries where they are,
+  # since those lookups use the directory of the symlink target rather
+  # than of the link itself (as they would for a copy or hard link).
+  # Second, when the dart binary is built as a "variant" (e.g. with a
+  # sanitizer), then $root_out_dir/dart is itself a symlink to the real
+  # binary in the selected variant toolchain's $root_out_dir and since
+  # the "copy" tool is actually a hard link rather than a copy, it will
+  # make a link to the symlink rather than the symlink's target, and the
+  # relative symlink interpreted from a different containing directory
+  # will not find the actual binary.
+  action("copy_dart") {
+    visibility = [ ":create_common_sdk" ]
+    dart_label = "../runtime/bin:dart"
+    deps = [
+      dart_label,
     ]
-  } else {
+    dart_out = get_label_info(dart_label, "root_out_dir")
     sources = [
       "$dart_out/$dart_stripped_binary",
     ]
+    outputs = [
+      "$root_out_dir/dart-sdk/bin/$dart_stripped_binary",
+    ]
+    script = "/bin/ln"
+    args = [
+      "-snf",
+      rebase_path(sources[0], get_path_info(outputs[0], "dir")),
+      rebase_path(outputs[0]),
+    ]
   }
-  if (is_win) {
-    sources += [ "$dart_out/dart.lib" ]
-  }
-  outputs = [
-    "$root_out_dir/dart-sdk/bin/{{source_file_part}}",
-  ]
-}
-
-# Copies dynamically linked libraries into bin/. This is currently only needed
-# for Fuchsia when building for Linux hosts.
-if (is_fuchsia_host && is_linux) {
-  copy("copy_dylibs") {
+} else {
+  copy("copy_dart") {
     visibility = [ ":create_common_sdk" ]
     deps = [
-      "//third_party/boringssl:crypto",
-      "//third_party/boringssl:ssl",
-      "//third_party/zlib",
+      "../runtime/bin:dart",
     ]
-    crypto_out =
-        get_label_info("//third_party/boringssl:crypto", "root_out_dir")
-    crypto_name = get_label_info("//third_party/boringssl:crypto", "name")
-    ssl_out = get_label_info("//third_party/boringssl:ssl", "root_out_dir")
-    ssl_name = get_label_info("//third_party/boringssl:ssl", "name")
-    zlib_out = get_label_info("//third_party/zlib", "root_out_dir")
-    sources = [
-      "$crypto_out/lib${crypto_name}.so",
-      "$ssl_out/lib${ssl_name}.so",
-      "$zlib_out/libz.so",
-    ]
+    dart_out = get_label_info("../runtime/bin:dart", "root_out_dir")
+    if (is_win) {
+      sources = [
+        "$dart_out/dart.exe",
+      ]
+    } else {
+      sources = [
+        "$dart_out/$dart_stripped_binary",
+      ]
+    }
+    if (is_win) {
+      sources += [ "$dart_out/dart.lib" ]
+    }
     outputs = [
       "$root_out_dir/dart-sdk/bin/{{source_file_part}}",
     ]
@@ -557,8 +565,8 @@
   ]
   gen_dir = get_label_info("../utils/dartdevc:dartdevc_sdk", "target_gen_dir")
   sources = [
-    "$gen_dir/ddc_sdk.sum",
     "$gen_dir/ddc_sdk.dill",
+    "$gen_dir/ddc_sdk.sum",
   ]
   outputs = [
     "$root_out_dir/dart-sdk/lib/_internal/{{source_file_part}}",
@@ -830,22 +838,19 @@
     ":copy_api_readme",
     ":copy_dart",
     ":copy_dartdoc_files",
-    ":copy_vm_dill_files",
     ":copy_headers",
     ":copy_libraries_dart",
     ":copy_license",
     ":copy_platform_files",
     ":copy_pub_assets",
     ":copy_readme",
+    ":copy_vm_dill_files",
     ":write_revision_file",
     ":write_version_file",
   ]
   if (is_win) {
     deps += [ ":copy_7zip" ]
   }
-  if (is_fuchsia_host && is_linux) {
-    deps += [ ":copy_dylibs" ]
-  }
 }
 
 # Parts specific to the platform SDK.
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index a0d0bc8..b2603af 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -95,14 +95,6 @@
       'returns:bool;effects:none;depends:none', JsBuiltin.isFunctionType, type);
 }
 
-/// Creates a function type object.
-// TODO(floitsch): move this to foreign_helper.dart or similar.
-@ForceInline()
-createDartFunctionTypeRti() {
-  return JS_BUILTIN('returns:=Object;effects:none;depends:none',
-      JsBuiltin.createFunctionTypeRti);
-}
-
 /// Retrieves the class name from type information stored on the constructor of
 /// [type].
 // TODO(floitsch): move this to foreign_helper.dart or similar.
diff --git a/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart b/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
index 2fff7ec..5b40739 100644
--- a/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
+++ b/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
@@ -387,11 +387,6 @@
   ///     JS_BUILTIN('bool', JsBuiltin.isFunctionType, o)
   isFunctionType,
 
-  /// Returns a new function type object.
-  ///
-  ///     JS_BUILTIN('=Object', JsBuiltin.createFunctionType)
-  createFunctionTypeRti,
-
   /// Returns the JavaScript-constructor name given an rti encoding.
   ///
   ///     JS_BUILTIN('String', JsBuiltin.rawRtiToJsConstructorName, rti)
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 09a775c..0eb0458 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -30324,8 +30324,8 @@
     var completer = new Completer();
     _setLocalDescription(description, () {
       completer.complete();
-    }, (error) {
-      completer.completeError(error);
+    }, (exception) {
+      completer.completeError(exception);
     });
     return completer.future;
   }
@@ -30344,8 +30344,8 @@
     var completer = new Completer();
     _setRemoteDescription(description, () {
       completer.complete();
-    }, (error) {
-      completer.completeError(error);
+    }, (exception) {
+      completer.completeError(exception);
     });
     return completer.future;
   }
@@ -37965,6 +37965,8 @@
   @DocsEditable()
   void _moveTo(int x, int y) native;
 
+  @JSName('openDatabase')
+
   /// *Deprecated.*
   @DomName('Window.openDatabase')
   @DocsEditable()
@@ -37974,7 +37976,7 @@
   // http://www.w3.org/TR/webdatabase/
   @Experimental() // deprecated
   @Creates('SqlDatabase')
-  SqlDatabase openDatabase(
+  SqlDatabase _openDatabase(
       String name, String version, String displayName, int estimatedSize,
       [DatabaseCallback creationCallback]) native;
 
@@ -38921,6 +38923,28 @@
     _moveTo(p.x, p.y);
   }
 
+  @JSName('openDatabase')
+  @DomName('Window.openDatabase')
+  @DocsEditable()
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental()
+  @Creates('SqlDatabase')
+  SqlDatabase openDatabase(
+      String name, String version, String displayName, int estimatedSize,
+      [DatabaseCallback creationCallback]) {
+    var db;
+    if (creationCallback == null)
+      db = _openDatabase(name, version, displayName, estimatedSize);
+    else
+      db = _openDatabase(
+          name, version, displayName, estimatedSize, creationCallback);
+
+    applyExtension('Database', db);
+
+    return db;
+  }
+
   @DomName('Window.pageXOffset')
   @DocsEditable()
   int get pageXOffset => JS('num', '#.pageXOffset', this).round();
diff --git a/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart b/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
index 69af259..9a84406 100644
--- a/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
+++ b/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
@@ -23,6 +23,7 @@
 
 import 'dart:_js_helper'
     show
+        applyExtension,
         convertDartClosureToJS,
         Creates,
         JSName,
@@ -128,6 +129,20 @@
   void transaction(SqlTransactionCallback callback,
       [SqlTransactionErrorCallback errorCallback,
       VoidCallback successCallback]) native;
+
+  @JSName('transaction')
+  @DomName('Database.transaction')
+  @DocsEditable()
+  Future<SqlTransaction> transaction_future() {
+    var completer = new Completer<SqlTransaction>();
+    transaction((value) {
+      applyExtension('SQLTransaction', value);
+      completer.complete(value);
+    }, (error) {
+      completer.completeError(error);
+    });
+    return completer.future;
+  }
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -304,10 +319,26 @@
     throw new UnsupportedError("Not supported");
   }
 
+  @JSName('executeSql')
   @DomName('SQLTransaction.executeSql')
   @DocsEditable()
-  void executeSql(String sqlStatement,
+  void _executeSql(String sqlStatement,
       [List arguments,
       SqlStatementCallback callback,
       SqlStatementErrorCallback errorCallback]) native;
+
+  @JSName('executeSql')
+  @DomName('SQLTransaction.executeSql')
+  @DocsEditable()
+  Future<SqlResultSet> executeSql(String sqlStatement, [List arguments]) {
+    var completer = new Completer<SqlResultSet>();
+    _executeSql(sqlStatement, arguments, (transaction, resultSet) {
+      applyExtension('SQLResultSet', resultSet);
+      applyExtension('SQLResultSetRowList', resultSet.rows);
+      completer.complete(resultSet);
+    }, (transaction, error) {
+      completer.completeError(error);
+    });
+    return completer.future;
+  }
 }
diff --git a/tests/compiler/dart2js/async_await_js_transform_test.dart b/tests/compiler/dart2js/async_await/async_await_js_transform_test.dart
similarity index 100%
rename from tests/compiler/dart2js/async_await_js_transform_test.dart
rename to tests/compiler/dart2js/async_await/async_await_js_transform_test.dart
diff --git a/tests/compiler/dart2js/class_codegen_test.dart b/tests/compiler/dart2js/class_codegen_test.dart
deleted file mode 100644
index d744468..0000000
--- a/tests/compiler/dart2js/class_codegen_test.dart
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-// Test that parameters keep their names in the output.
-
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-class A { }
-class B { }
-
-main() {
-  new A();
-  new B();
-}
-""";
-
-const String TEST_TWO = r"""
-class A { }
-class B extends A { }
-
-main() {
-  new A();
-  new B();
-}
-""";
-
-const String TEST_THREE = r"""
-class B extends A { }
-class A { }
-
-main() {
-  new B();
-  new A();
-}
-""";
-
-const String TEST_FOUR = r"""
-class A {
-  var x;
-}
-
-class B extends A {
-  var y;
-  var z;
-}
-
-main() {
-  new B();
-}
-""";
-
-const String TEST_FIVE = r"""
-class A {
-  var a;
-  A(a) : this.a = a {}
-}
-
-main() {
-  new A(3);
-}
-""";
-
-twoClasses() {
-  asyncTest(() => compileAll(TEST_ONE).then((generated) {
-        Expect.isTrue(
-            generated.contains(new RegExp('A: {[ \n]*"\\^": "Object;"')));
-        Expect.isTrue(
-            generated.contains(new RegExp('B: {[ \n]*"\\^": "Object;"')));
-      }));
-}
-
-subClass() {
-  checkOutput(String generated) {
-    Expect.isTrue(generated.contains(new RegExp('A: {[ \n]*"\\^": "Object;"')));
-    Expect.isTrue(generated.contains(new RegExp('B: {[ \n]*"\\^": "A;"')));
-  }
-
-  asyncTest(() => compileAll(TEST_TWO).then(checkOutput));
-  asyncTest(() => compileAll(TEST_THREE).then(checkOutput));
-}
-
-fieldTest() {
-  asyncTest(() => compileAll(TEST_FOUR).then((generated) {
-        Expect.isTrue(generated
-            .contains(new RegExp('B: {[ \n]*"\\^": "A;y,z,x",[ \n]*static:')));
-      }));
-}
-
-constructor1() {
-  asyncTest(() => compileAll(TEST_FIVE).then((generated) {
-        Expect.isTrue(generated.contains(new RegExp(r"new [$A-Z]+\.A\(a\);")));
-      }));
-}
-
-main() {
-  twoClasses();
-  subClass();
-  fieldTest();
-  constructor1();
-}
diff --git a/tests/compiler/dart2js/class_set_test.dart b/tests/compiler/dart2js/class_set_test.dart
index 8a9fe87..6f446e6 100644
--- a/tests/compiler/dart2js/class_set_test.dart
+++ b/tests/compiler/dart2js/class_set_test.dart
@@ -17,7 +17,9 @@
 
 void main() {
   asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
     await testAll(CompileMode.memory);
+    print('--test from kernel------------------------------------------------');
     await testAll(CompileMode.kernel);
   });
 }
diff --git a/tests/compiler/dart2js/closure_codegen_test.dart b/tests/compiler/dart2js/closure_codegen_test.dart
deleted file mode 100644
index 6f947e6..0000000
--- a/tests/compiler/dart2js/closure_codegen_test.dart
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-// Test that parameters keep their names in the output.
-
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_INVOCATION0 = r"""
-main() {
-  var o = null;
-  o();
-}
-""";
-
-const String TEST_INVOCATION1 = r"""
-main() {
-  var o = null;
-  o(1);
-}
-""";
-
-const String TEST_INVOCATION2 = r"""
-main() {
-  var o = null;
-  o(1, 2);
-}
-""";
-
-const String TEST_BAILOUT = r"""
-class A {
-  var x;
-  foo(_) { // make sure only g has no arguments
-    var f = () { return 499;  };
-    return 499 + x + f();
-  }
-}
-
-main() { new A().foo(1); }
-""";
-
-Future closureInvocation(bool minify, String prefix) {
-  return Future.wait([
-    compile(TEST_INVOCATION0, minify: minify, check: (String generated) {
-      Expect.isTrue(generated.contains(".$prefix\$0()"));
-    }),
-    compile(TEST_INVOCATION1, minify: minify, check: (String generated) {
-      Expect.isTrue(generated.contains(".$prefix\$1(1)"));
-    }),
-    compile(TEST_INVOCATION2, minify: minify, check: (String generated) {
-      Expect.isTrue(generated.contains(".$prefix\$2(1,${minify ? "" : " "}2)"));
-    })
-  ]);
-}
-
-// Make sure that the bailout version does not introduce a second version of
-// the closure.
-Future closureBailout(bool minify, String prefix) {
-  return compileAll(TEST_BAILOUT, minify: minify).then((generated) {
-    RegExp regexp = new RegExp("$prefix\\\$0:${minify ? "" : " "}function");
-    Iterator<Match> matches = regexp.allMatches(generated).iterator;
-    checkNumberOfMatches(matches, 1);
-  });
-}
-
-main() {
-  asyncTest(() => Future.wait([
-        closureInvocation(false, "call"),
-        closureInvocation(true, ""),
-        closureBailout(false, "call"),
-        closureBailout(true, ""),
-      ]));
-}
diff --git a/tests/compiler/dart2js/closure_tracer_28919_test.dart b/tests/compiler/dart2js/closure_tracer_28919_test.dart
deleted file mode 100644
index 122ba8b..0000000
--- a/tests/compiler/dart2js/closure_tracer_28919_test.dart
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-
-import 'compiler_helper.dart';
-import 'type_mask_test_helper.dart';
-import 'package:compiler/src/types/types.dart';
-
-bool isContainer(TypeMask mask) {
-  return mask is ContainerTypeMask;
-}
-
-const String TEST = '''
-
-foo1() {
-  final methods = [];
-  var res, sum;
-  for (int i = 0; i != 3; i++) {
-    methods.add((int x) { res = x; sum = x + i; });
-  }
-  methods[0](499);
-  probe1res(res);
-  probe1sum(sum);
-  probe1methods(methods);
-}
-probe1res(x) => x;
-probe1sum(x) => x;
-probe1methods(x) => x;
-
-nonContainer(choice) {
-  var m = choice == 0 ? [] : "<String>";
-  if (m is !List) throw 123;
-  // The union then filter leaves us with a non-container type.
-  return m;
-}
-
-foo2(int choice) {
-  final methods = nonContainer(choice);
-  var res, sum;
-  for (int i = 0; i != 3; i++) {
-    methods.add((int x) { res = x; sum = x + i; });
-  }
-  methods[0](499);
-  probe2res(res);
-  probe2methods(methods);
-}
-probe2res(x) => x;
-probe2methods(x) => x;
-
-main() {
-  foo1();
-  foo2(0);
-  foo2(1);
-}
-''';
-
-void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
-        var commonMasks = closedWorld.commonMasks;
-
-        typeOf(String name) {
-          MemberElement member = findElement(compiler, name);
-          return typesInferrer.getReturnTypeOfMember(member);
-        }
-
-        checkType(String name, type) {
-          var mask = typeOf(name);
-          Expect.equals(type.nullable(), simplify(mask, closedWorld), name);
-        }
-
-        checkContainer(String name, bool value) {
-          var mask = typeOf(name);
-          Expect.equals(
-              value, isContainer(mask), '$name is container (mask: $mask)');
-        }
-
-        checkContainer('probe1methods', true);
-        checkType('probe1res', commonMasks.uint31Type);
-        checkType('probe1sum', commonMasks.positiveIntType);
-
-        checkContainer('probe2methods', false);
-        checkType('probe2res', commonMasks.dynamicType);
-      }));
-}
diff --git a/tests/compiler/dart2js/code_motion_test.dart b/tests/compiler/dart2js/code_motion_test.dart
deleted file mode 100644
index 69f1800..0000000
--- a/tests/compiler/dart2js/code_motion_test.dart
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-foo(int a, int b, bool param2) {
-  // Make sure a and b become numbers.
-  var c = a - b;
-  for (int i = 0; i < 1; i++) {
-    if (param2) {
-      print(a + b);
-    } else {
-      print(a + b);
-    }
-  }
-  return c;
-}
-""";
-
-main() {
-  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
-        RegExp regexp = new RegExp('a \\+ b');
-        Iterator matches = regexp.allMatches(generated).iterator;
-        Expect.isTrue(matches.moveNext());
-        Expect.isFalse(matches.moveNext());
-      }));
-}
diff --git a/tests/compiler/dart2js/arithmetic_simplification_test.dart b/tests/compiler/dart2js/codegen/arithmetic_simplification_test.dart
similarity index 83%
rename from tests/compiler/dart2js/arithmetic_simplification_test.dart
rename to tests/compiler/dart2js/codegen/arithmetic_simplification_test.dart
index 6c2d57d..f213526 100644
--- a/tests/compiler/dart2js/arithmetic_simplification_test.dart
+++ b/tests/compiler/dart2js/codegen/arithmetic_simplification_test.dart
@@ -4,7 +4,7 @@
 // Test constant folding on numbers.
 
 import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String INT_PLUS_ZERO = """
 int foo(x) => x;
@@ -78,29 +78,29 @@
   var timesOne = new RegExp(r"\* 1");
   var oneTimes = new RegExp(r"1 \*");
 
-  test(CompileMode compileMode) async {
+  test({bool useKernel}) async {
     await compileAndDoNotMatch(INT_PLUS_ZERO, 'main', plusZero,
-        compileMode: compileMode);
+        useKernel: useKernel);
     await compileAndDoNotMatch(ZERO_PLUS_INT, 'main', zeroPlus,
-        compileMode: compileMode);
+        useKernel: useKernel);
     await compileAndMatch(NUM_PLUS_ZERO, 'main', plusZero,
-        compileMode: compileMode);
+        useKernel: useKernel);
     await compileAndMatch(ZERO_PLUS_NUM, 'main', zeroPlus,
-        compileMode: compileMode);
+        useKernel: useKernel);
     await compileAndDoNotMatch(INT_TIMES_ONE, 'main', timesOne,
-        compileMode: compileMode);
+        useKernel: useKernel);
     await compileAndDoNotMatch(ONE_TIMES_INT, 'main', oneTimes,
-        compileMode: compileMode);
+        useKernel: useKernel);
     await compileAndDoNotMatch(NUM_TIMES_ONE, 'main', timesOne,
-        compileMode: compileMode);
+        useKernel: useKernel);
     await compileAndDoNotMatch(ONE_TIMES_NUM, 'main', oneTimes,
-        compileMode: compileMode);
+        useKernel: useKernel);
   }
 
   asyncTest(() async {
     print('--test from ast---------------------------------------------------');
-    await test(CompileMode.memory);
+    await test(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await test(CompileMode.kernel);
+    await test(useKernel: true);
   });
 }
diff --git a/tests/compiler/dart2js/array_static_intercept_test.dart b/tests/compiler/dart2js/codegen/array_static_intercept_test.dart
similarity index 80%
rename from tests/compiler/dart2js/array_static_intercept_test.dart
rename to tests/compiler/dart2js/codegen/array_static_intercept_test.dart
index 0ad768d..95bddad 100644
--- a/tests/compiler/dart2js/array_static_intercept_test.dart
+++ b/tests/compiler/dart2js/codegen/array_static_intercept_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST_ONE = r"""
 foo(a) {
@@ -15,8 +15,8 @@
 """;
 
 main() {
-  test(CompileMode compileMode) async {
-    await compile(TEST_ONE, entry: 'foo', compileMode: compileMode,
+  test({bool useKernel}) async {
+    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
         check: (String generated) {
       Expect.isTrue(generated.contains(r'.add$1('));
       Expect.isTrue(generated.contains(r'.removeLast$0('));
@@ -27,8 +27,8 @@
 
   asyncTest(() async {
     print('--test from ast---------------------------------------------------');
-    await test(CompileMode.memory);
+    await test(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await test(CompileMode.kernel);
+    await test(useKernel: true);
   });
 }
diff --git a/tests/compiler/dart2js/boolify_test.dart b/tests/compiler/dart2js/codegen/boolify_test.dart
similarity index 77%
rename from tests/compiler/dart2js/boolify_test.dart
rename to tests/compiler/dart2js/codegen/boolify_test.dart
index fb382cb..afaefc5 100644
--- a/tests/compiler/dart2js/boolify_test.dart
+++ b/tests/compiler/dart2js/codegen/boolify_test.dart
@@ -6,7 +6,7 @@
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = r"""
 foo() {
@@ -17,8 +17,8 @@
 """;
 
 main() {
-  test(CompileMode compileMode) async {
-    await compile(TEST, entry: 'foo', compileMode: compileMode,
+  test({bool useKernel}) async {
+    await compile(TEST, entry: 'foo', useKernel: useKernel,
         check: (String generated) {
       Expect.isTrue(generated.contains('foo() !== true)'));
     });
@@ -26,8 +26,8 @@
 
   asyncTest(() async {
     print('--test from ast---------------------------------------------------');
-    await test(CompileMode.memory);
+    await test(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await test(CompileMode.kernel);
+    await test(useKernel: true);
   });
 }
diff --git a/tests/compiler/dart2js/builtin_equals_test.dart b/tests/compiler/dart2js/codegen/builtin_equals_test.dart
similarity index 82%
rename from tests/compiler/dart2js/builtin_equals_test.dart
rename to tests/compiler/dart2js/codegen/builtin_equals_test.dart
index 6571c34..9adc8fa 100644
--- a/tests/compiler/dart2js/builtin_equals_test.dart
+++ b/tests/compiler/dart2js/codegen/builtin_equals_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = r"""
 foo() {
@@ -18,11 +18,11 @@
 """;
 
 main() {
-  test(CompileMode compileMode) async {
+  test({bool useKernel}) async {
     await compile(TEST,
         entry: 'foo',
         enableTypeAssertions: true,
-        compileMode: compileMode, check: (String generated) {
+        useKernel: useKernel, check: (String generated) {
       Expect.isTrue(!generated.contains('eqB'));
 
       RegExp regexp = new RegExp('==');
@@ -33,8 +33,8 @@
 
   asyncTest(() async {
     print('--test from ast---------------------------------------------------');
-    await test(CompileMode.memory);
+    await test(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await test(CompileMode.kernel);
+    await test(useKernel: true);
   });
 }
diff --git a/tests/compiler/dart2js/builtin_interceptor_test.dart b/tests/compiler/dart2js/codegen/builtin_interceptor_test.dart
similarity index 74%
rename from tests/compiler/dart2js/builtin_interceptor_test.dart
rename to tests/compiler/dart2js/codegen/builtin_interceptor_test.dart
index 19533c0..1384a0f 100644
--- a/tests/compiler/dart2js/builtin_interceptor_test.dart
+++ b/tests/compiler/dart2js/codegen/builtin_interceptor_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST_ONE = r"""
 foo() {
@@ -25,16 +25,16 @@
 """;
 
 main() {
-  test(CompileMode compileMode) async {
-    await compile(TEST_ONE, entry: 'foo', compileMode: compileMode,
+  test({bool useKernel}) async {
+    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
         check: (String generated) {
       Expect.isTrue(generated.contains("return 3;"));
     });
-    await compile(TEST_TWO, entry: 'foo', compileMode: compileMode,
+    await compile(TEST_TWO, entry: 'foo', useKernel: useKernel,
         check: (String generated) {
       Expect.isTrue(generated.contains("return 3;"));
     });
-    await compile(TEST_THREE, entry: 'foo', compileMode: compileMode,
+    await compile(TEST_THREE, entry: 'foo', useKernel: useKernel,
         check: (String generated) {
       Expect.isTrue(generated.contains("push(2);"));
     });
@@ -42,8 +42,8 @@
 
   asyncTest(() async {
     print('--test from ast---------------------------------------------------');
-    await test(CompileMode.memory);
+    await test(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await test(CompileMode.kernel);
+    await test(useKernel: true);
   });
 }
diff --git a/tests/compiler/dart2js/class_codegen2_test.dart b/tests/compiler/dart2js/codegen/class_codegen2_test.dart
similarity index 71%
rename from tests/compiler/dart2js/class_codegen2_test.dart
rename to tests/compiler/dart2js/codegen/class_codegen2_test.dart
index f85d0f3..8577b77 100644
--- a/tests/compiler/dart2js/class_codegen2_test.dart
+++ b/tests/compiler/dart2js/codegen/class_codegen2_test.dart
@@ -6,7 +6,7 @@
 import 'dart:async';
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST_ONE = r"""
 class A { foo() => 499; }
@@ -89,10 +89,17 @@
   // { a: true, }. Make sure this doesn't happen again.
   RegExp danglingComma = new RegExp(r',[ \n]*}');
 
-  asyncTest(
-      () => Future.forEach([TEST_ONE, TEST_TWO, TEST_THREE, TEST_FOUR], (test) {
-            return compileAll(test).then((generated) {
-              Expect.isFalse(danglingComma.hasMatch(generated));
-            });
-          }));
+  Future runTests(CompileMode compileMode) async {
+    for (String test in [TEST_ONE, TEST_TWO, TEST_THREE, TEST_FOUR]) {
+      String generated = await compileAll(test, compileMode: compileMode);
+      Expect.isFalse(danglingComma.hasMatch(generated));
+    }
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(CompileMode.memory);
+    print('--test from kernel------------------------------------------------');
+    await runTests(CompileMode.kernel);
+  });
 }
diff --git a/tests/compiler/dart2js/codegen/class_codegen_test.dart b/tests/compiler/dart2js/codegen/class_codegen_test.dart
new file mode 100644
index 0000000..693e934
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/class_codegen_test.dart
@@ -0,0 +1,107 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Test that parameters keep their names in the output.
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+import '../compiler_helper.dart';
+
+const String TEST_ONE = r"""
+class A { }
+class B { }
+
+main() {
+  new A();
+  new B();
+}
+""";
+
+const String TEST_TWO = r"""
+class A { }
+class B extends A { }
+
+main() {
+  new A();
+  new B();
+}
+""";
+
+const String TEST_THREE = r"""
+class B extends A { }
+class A { }
+
+main() {
+  new B();
+  new A();
+}
+""";
+
+const String TEST_FOUR = r"""
+class A {
+  var x;
+}
+
+class B extends A {
+  var y;
+  var z;
+}
+
+main() {
+  new B();
+}
+""";
+
+const String TEST_FIVE = r"""
+class A {
+  var a;
+  A(a) : this.a = a {}
+}
+
+main() {
+  new A(3);
+}
+""";
+
+twoClasses(CompileMode compileMode) async {
+  String generated = await compileAll(TEST_ONE, compileMode: compileMode);
+  Expect.isTrue(generated.contains(new RegExp('A: {[ \n]*"\\^": "Object;"')));
+  Expect.isTrue(generated.contains(new RegExp('B: {[ \n]*"\\^": "Object;"')));
+}
+
+subClass(CompileMode compileMode) async {
+  checkOutput(String generated) {
+    Expect.isTrue(generated.contains(new RegExp('A: {[ \n]*"\\^": "Object;"')));
+    Expect.isTrue(generated.contains(new RegExp('B: {[ \n]*"\\^": "A;"')));
+  }
+
+  checkOutput(await compileAll(TEST_TWO, compileMode: compileMode));
+  checkOutput(await compileAll(TEST_THREE, compileMode: compileMode));
+}
+
+fieldTest(CompileMode compileMode) async {
+  String generated = await compileAll(TEST_FOUR, compileMode: compileMode);
+  Expect.isTrue(generated
+      .contains(new RegExp('B: {[ \n]*"\\^": "A;y,z,x",[ \n]*static:')));
+}
+
+constructor1(CompileMode compileMode) async {
+  String generated = await compileAll(TEST_FIVE, compileMode: compileMode);
+  Expect.isTrue(generated.contains(new RegExp(r"new [$A-Z]+\.A\(a\);")));
+}
+
+main() {
+  runTests(CompileMode compileMode) async {
+    await twoClasses(compileMode);
+    await subClass(compileMode);
+    await fieldTest(compileMode);
+    await constructor1(compileMode);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(CompileMode.memory);
+    print('--test from kernel------------------------------------------------');
+    await runTests(CompileMode.kernel);
+  });
+}
diff --git a/tests/compiler/dart2js/class_order_test.dart b/tests/compiler/dart2js/codegen/class_order_test.dart
similarity index 61%
rename from tests/compiler/dart2js/class_order_test.dart
rename to tests/compiler/dart2js/codegen/class_order_test.dart
index e3629c1..1946305 100644
--- a/tests/compiler/dart2js/class_order_test.dart
+++ b/tests/compiler/dart2js/codegen/class_order_test.dart
@@ -5,7 +5,7 @@
 
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST_ONE = r"""
 class A { foo() => 499; }
@@ -36,11 +36,18 @@
   // we just verify that their members are in the correct order.
   RegExp regexp = new RegExp(r"foo\$0?:(.|\n)*bar\$0:(.|\n)*gee\$0:");
 
-  asyncTest(() => compileAll(TEST_ONE).then((generated) {
-        Expect.isTrue(regexp.hasMatch(generated));
-      }));
+  runTests(CompileMode compileMode) async {
+    String generated1 = await compileAll(TEST_ONE, compileMode: compileMode);
+    Expect.isTrue(regexp.hasMatch(generated1));
 
-  asyncTest(() => compileAll(TEST_TWO).then((generated) {
-        Expect.isTrue(regexp.hasMatch(generated));
-      }));
+    String generated2 = await compileAll(TEST_TWO, compileMode: compileMode);
+    Expect.isTrue(regexp.hasMatch(generated2));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(CompileMode.memory);
+    print('--test from kernel------------------------------------------------');
+    await runTests(CompileMode.kernel);
+  });
 }
diff --git a/tests/compiler/dart2js/codegen/closure_codegen_test.dart b/tests/compiler/dart2js/codegen/closure_codegen_test.dart
new file mode 100644
index 0000000..07650a2
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/closure_codegen_test.dart
@@ -0,0 +1,87 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Test that parameters keep their names in the output.
+
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String TEST_INVOCATION0 = r"""
+main() {
+  var o = null;
+  o();
+}
+""";
+
+const String TEST_INVOCATION1 = r"""
+main() {
+  var o = null;
+  o(1);
+}
+""";
+
+const String TEST_INVOCATION2 = r"""
+main() {
+  var o = null;
+  o(1, 2);
+}
+""";
+
+const String TEST_BAILOUT = r"""
+class A {
+  var x;
+  foo(_) { // make sure only g has no arguments
+    var f = () { return 499;  };
+    return 499 + x + f();
+  }
+}
+
+main() { new A().foo(1); }
+""";
+
+Future closureInvocation({bool useKernel, bool minify, String prefix}) async {
+  await compile(TEST_INVOCATION0, useKernel: useKernel, minify: minify,
+      check: (String generated) {
+    Expect.isTrue(generated.contains(".$prefix\$0()"));
+  });
+  await compile(TEST_INVOCATION1, useKernel: useKernel, minify: minify,
+      check: (String generated) {
+    Expect.isTrue(generated.contains(".$prefix\$1(1)"));
+  });
+  await compile(TEST_INVOCATION2, useKernel: useKernel, minify: minify,
+      check: (String generated) {
+    Expect.isTrue(generated.contains(".$prefix\$2(1,${minify ? "" : " "}2)"));
+  });
+}
+
+// Make sure that the bailout version does not introduce a second version of
+// the closure.
+Future closureBailout(CompileMode compileMode,
+    {bool minify, String prefix}) async {
+  String generated =
+      await compileAll(TEST_BAILOUT, compileMode: compileMode, minify: minify);
+  RegExp regexp = new RegExp("$prefix\\\$0:${minify ? "" : " "}function");
+  Iterator<Match> matches = regexp.allMatches(generated).iterator;
+  checkNumberOfMatches(matches, 1);
+}
+
+main() {
+  runTests({bool useKernel}) async {
+    await closureInvocation(
+        useKernel: useKernel, minify: false, prefix: "call");
+    await closureInvocation(useKernel: useKernel, minify: true, prefix: "");
+    CompileMode compileMode =
+        useKernel ? CompileMode.kernel : CompileMode.memory;
+    await closureBailout(compileMode, minify: false, prefix: "call");
+    await closureBailout(compileMode, minify: true, prefix: "");
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/code_motion_test.dart b/tests/compiler/dart2js/codegen/code_motion_test.dart
new file mode 100644
index 0000000..f800e33
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/code_motion_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String TEST_ONE = r"""
+foo(int a, int b, bool param2) {
+  // Make sure a and b become numbers.
+  var c = a - b;
+  for (int i = 0; i < 1; i++) {
+    if (param2) {
+      print(a + b);
+    } else {
+      print(a + b);
+    }
+  }
+  return c;
+}
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    await compile(TEST_ONE, useKernel: useKernel, entry: 'foo',
+        check: (String generated) {
+      RegExp regexp = new RegExp('a \\+ b');
+      Iterator matches = regexp.allMatches(generated).iterator;
+      Expect.isTrue(matches.moveNext());
+      Expect.isFalse(matches.moveNext());
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/constant_folding_codeUnitAt_test.dart b/tests/compiler/dart2js/codegen/constant_folding_codeUnitAt_test.dart
new file mode 100644
index 0000000..d576b64
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/constant_folding_codeUnitAt_test.dart
@@ -0,0 +1,53 @@
+// 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.
+// Test constant folding on numbers.
+
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String TEST_1 = """
+foo() {
+  var a = 'Hello';
+  var b = 0;
+  return a.codeUnitAt(b);
+}
+""";
+
+// No folding of index type error.
+const String TEST_2 = """
+foo() {
+  var a = 'Hello';
+  var b = 1.5;
+  return a.codeUnitAt(b);
+}
+""";
+
+// No folding of index range error.
+const String TEST_3 = """
+foo() {
+  var a = 'Hello';
+  var b = 55;
+  return a.codeUnitAt(b);
+}
+""";
+
+main() {
+  runTests({bool useKernel}) async {
+    await compileAndMatch(TEST_1, 'foo', new RegExp(r'return 72'),
+        useKernel: useKernel);
+    await compileAndDoNotMatch(TEST_1, 'foo', new RegExp(r'Hello'),
+        useKernel: useKernel);
+    await compileAndMatch(TEST_2, 'foo', new RegExp(r'Hello'),
+        useKernel: useKernel);
+    await compileAndMatch(TEST_3, 'foo', new RegExp(r'Hello'),
+        useKernel: useKernel);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/constant_folding_test.dart b/tests/compiler/dart2js/codegen/constant_folding_test.dart
new file mode 100644
index 0000000..80bcac7
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/constant_folding_test.dart
@@ -0,0 +1,99 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Test constant folding on numbers.
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String NUMBER_FOLDING = """
+void main() {
+  var a = 4;
+  var b = 3;
+  print(a + b);
+}
+""";
+
+const String NEGATIVE_NUMBER_FOLDING = """
+void main() {
+  var a = 4;
+  var b = -3;
+  print(a + b);
+}
+""";
+
+const String NULL_EQUALS_FOLDING = """
+foo(a, b, c, d) {
+  if (a == null) return 1;
+  if (null == b) return 2;
+  if (4 == c) return 3;
+  if ("foo" == d) return 3;
+}
+""";
+
+const String LIST_LENGTH_FOLDING = """
+foo() {
+  return const [1, 2, 3].length;
+}
+""";
+
+const String STRING_LENGTH_FOLDING = """
+foo() {
+  return '123'.length;
+}
+""";
+
+const String LIST_INDEX_FOLDING = """
+foo() {
+  return const [1, 2, 3][0];
+}
+""";
+
+const String RANGE_ERROR_INDEX_FOLDING = """
+foo() {
+  return [1][1];
+}
+""";
+
+main() {
+  runTests({bool useKernel}) async {
+    await compileAndMatch(NUMBER_FOLDING, 'main', new RegExp(r"print\(7\)"),
+        useKernel: useKernel);
+    await compileAndMatch(
+        NEGATIVE_NUMBER_FOLDING, 'main', new RegExp(r"print\(1\)"),
+        useKernel: useKernel);
+    await compile(NULL_EQUALS_FOLDING, useKernel: useKernel, entry: 'foo',
+        check: (String generated) {
+      RegExp regexp = new RegExp(r'a == null');
+      Expect.isTrue(regexp.hasMatch(generated));
+
+      regexp = new RegExp(r'null == b');
+      Expect.isTrue(regexp.hasMatch(generated));
+
+      regexp = new RegExp(r'4 === c');
+      Expect.isTrue(regexp.hasMatch(generated));
+
+      regexp = new RegExp('"foo" === d');
+      Expect.isTrue(regexp.hasMatch(generated));
+    });
+    await compileAndMatch(LIST_LENGTH_FOLDING, 'foo', new RegExp(r"return 3"),
+        useKernel: useKernel);
+    await compileAndMatch(LIST_INDEX_FOLDING, 'foo', new RegExp(r"return 1"),
+        useKernel: useKernel);
+    await compileAndDoNotMatch(LIST_INDEX_FOLDING, 'foo', new RegExp(r"ioore"),
+        useKernel: useKernel);
+    await compileAndMatch(STRING_LENGTH_FOLDING, 'foo', new RegExp(r"return 3"),
+        useKernel: useKernel);
+    await compileAndMatch(
+        RANGE_ERROR_INDEX_FOLDING, 'foo', new RegExp(r"ioore"),
+        useKernel: useKernel);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/constant_namer_test.dart b/tests/compiler/dart2js/codegen/constant_namer_test.dart
new file mode 100644
index 0000000..14d93ce
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/constant_namer_test.dart
@@ -0,0 +1,46 @@
+// 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:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+import '../compiler_helper.dart';
+
+const String TEST_ONE = r"""
+  class Token {
+    final name;
+    final value;
+    const Token(this.name, [this.value]);
+    use() { print(this); }
+  }
+  test() {
+    const [12,53].use();
+    const Token('start').use();
+    const Token('end').use();
+    const Token('yes', 12).use();
+    const Token(true, false).use();
+  }
+""";
+
+main() {
+  check(String generated, String text) {
+    Expect.isTrue(generated.contains(text), text);
+  }
+
+  runTests({bool useKernel}) async {
+    String generated =
+        await compile(TEST_ONE, useKernel: useKernel, entry: 'test');
+    check(generated, '.List_12_53.');
+    check(generated, '.Token_start_null.');
+    check(generated, '.Token_end_null.');
+    check(generated, '.Token_yes_12.');
+    check(generated, '.Token_true_false.');
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/dead_code_test.dart b/tests/compiler/dart2js/codegen/dead_code_test.dart
new file mode 100644
index 0000000..56f42d1
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/dead_code_test.dart
@@ -0,0 +1,32 @@
+// 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 '../compiler_helper.dart';
+
+String TEST = r'''
+main() {
+  foo(null);
+}
+foo(a) {
+  if (a != null) return 42;
+  return 54;
+}
+''';
+
+main() {
+  runTest({bool useKernel}) async {
+    String generated = await compileAll(TEST,
+        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+    Expect.isFalse(generated.contains('return 42'), 'dead code not eliminated');
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/dead_phi_eliminator_test.dart b/tests/compiler/dart2js/codegen/dead_phi_eliminator_test.dart
new file mode 100644
index 0000000..aa5597e
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/dead_phi_eliminator_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String TEST_ONE = r"""
+void foo(bar) {
+  var toBeRemoved = 1;
+  if (bar) {
+    toBeRemoved = 2;
+  } else {
+    toBeRemoved = 3;
+  }
+}
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    await compile(TEST_ONE, useKernel: useKernel, entry: 'foo',
+        check: (String generated) {
+      RegExp regexp = new RegExp("toBeRemoved");
+      Expect.isTrue(!regexp.hasMatch(generated));
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/declare_once_test.dart b/tests/compiler/dart2js/codegen/declare_once_test.dart
new file mode 100644
index 0000000..68e0036
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/declare_once_test.dart
@@ -0,0 +1,37 @@
+// 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.
+// Test that parameters keep their names in the output.
+
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+import '../compiler_helper.dart';
+
+main() {
+  // For a function with only one variable we declare it inline for more
+  // compactness.  Test that we don't also declare it at the start of the
+  // method.
+  runTest({bool useKernel}) async {
+    String generated = await compile(
+        'final List a = const ["bar", "baz"];'
+        'int foo() {'
+        '  for (int i = 0; i < a.length; i++) {'
+        '    print(a[i]);'
+        '  }'
+        '}',
+        useKernel: useKernel,
+        entry: 'foo',
+        minify: false);
+    RegExp re = new RegExp(r"var ");
+    Expect.isTrue(re.hasMatch(generated));
+    print(generated);
+    Expect.equals(1, re.allMatches(generated).length);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/elide_callthrough_stub_test.dart b/tests/compiler/dart2js/codegen/elide_callthrough_stub_test.dart
new file mode 100644
index 0000000..f7a3db9
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/elide_callthrough_stub_test.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Check that calls through fields elide the call-through stub.  This
+// optimization is done by the simplifier, so inlining does not need to be
+// enabled.
+
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+import '../compiler_helper.dart';
+
+const String TEST1 = r'''
+class W {
+  final Function _fun;
+  W(this._fun);
+  foo(zzz) => _fun(zzz); //   this._fun$1(zzz) -->  this._fun.call$1(zzz)
+}
+add1(x) => x + 1;
+main() {
+  var w = new W(add1);
+  var x = w.foo(42);
+}
+''';
+
+const String TEST2 = r'''
+class W {
+  final Function __fun;
+  Function get _fun => __fun;
+  W(this.__fun);
+  foo(zzz) => _fun(zzz); //   this._fun$1(zzz) stays same.
+}
+add1(x) => x + 1;
+main() {
+  var w = new W(add1);
+  var x = w.foo(42);
+}
+''';
+
+main() {
+  runTests({bool useKernel}) async {
+    CompileMode compileMode =
+        useKernel ? CompileMode.kernel : CompileMode.memory;
+    String generated1 = await compileAll(TEST1, compileMode: compileMode);
+    // Direct call through field.
+    Expect.isTrue(generated1.contains(r'this._fun.call$1(zzz)'));
+    // No stub.
+    Expect.isFalse(generated1.contains(r'_fun$1:'));
+    // No call to stub.
+    Expect.isFalse(generated1.contains(r'_fun$1('));
+
+    String generated2 = await compileAll(TEST2, compileMode: compileMode);
+    // No call through field.
+    Expect.isFalse(generated2.contains(r'this._fun.call$1(zzz)'));
+    // Call through stub.
+    Expect.isTrue(generated2.contains(r'this._fun$1(zzz)'));
+    // Stub is generated.
+    Expect.isTrue(generated2.contains(r'_fun$1:'));
+    // Call through getter (inside stub).
+    Expect.isTrue(generated2.contains(r'get$_fun().call$1'));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/emit_const_fields_test.dart b/tests/compiler/dart2js/codegen/emit_const_fields_test.dart
new file mode 100644
index 0000000..8a7eea4
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/emit_const_fields_test.dart
@@ -0,0 +1,35 @@
+// 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.
+// Test that unused static consts are not emitted.
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+import '../compiler_helper.dart';
+
+const String TEST_GUIDE = r"""
+class Guide {
+  static const LTUAE = 42;
+  static const TITLE = 'Life, the Universe and Everything';
+}
+
+main() {
+  return "${Guide.LTUAE}, ${Guide.TITLE}";
+}
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    String generated = await compileAll(TEST_GUIDE,
+        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+    Expect.isTrue(generated.contains("42"));
+    Expect.isFalse(generated.contains("TITLE"));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/expect_annotations2_test.dart b/tests/compiler/dart2js/codegen/expect_annotations2_test.dart
similarity index 75%
rename from tests/compiler/dart2js/expect_annotations2_test.dart
rename to tests/compiler/dart2js/codegen/expect_annotations2_test.dart
index 981ba57..3dea0f3 100644
--- a/tests/compiler/dart2js/expect_annotations2_test.dart
+++ b/tests/compiler/dart2js/codegen/expect_annotations2_test.dart
@@ -5,7 +5,8 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import 'package:compiler/compiler_new.dart';
-import 'memory_compiler.dart';
+import 'package:compiler/src/commandline_options.dart';
+import '../memory_compiler.dart';
 
 const MEMORY_SOURCE_FILES = const {
   'main.dart': '''
@@ -36,10 +37,12 @@
 };
 
 void main() {
-  asyncTest(() async {
+  runTest({bool useKernel}) async {
     OutputCollector collector = new OutputCollector();
     await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES, outputProvider: collector);
+        memorySourceFiles: MEMORY_SOURCE_FILES,
+        outputProvider: collector,
+        options: useKernel ? [Flags.useKernel] : []);
     // Simply check that the constants of the small functions are still in the
     // output, and that we don't see the result of constant folding.
     String jsOutput = collector.getOutput('', OutputType.js);
@@ -51,5 +54,12 @@
     Expect.isFalse(jsOutput.contains('211109'));
     Expect.isFalse(jsOutput.contains('82155031'));
     Expect.isFalse(jsOutput.contains('4712'));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
   });
 }
diff --git a/tests/compiler/dart2js/codegen/expect_annotations_test.dart b/tests/compiler/dart2js/codegen/expect_annotations_test.dart
new file mode 100644
index 0000000..d4cacfa
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/expect_annotations_test.dart
@@ -0,0 +1,143 @@
+// 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: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/elements/entities.dart';
+import 'package:compiler/src/js_backend/annotations.dart' as optimizerHints;
+import 'package:compiler/src/types/types.dart';
+import 'package:compiler/src/world.dart' show ClosedWorld;
+import '../inference/type_mask_test_helper.dart';
+import '../memory_compiler.dart';
+
+const Map MEMORY_SOURCE_FILES = const {
+  'main.dart': r"""
+import 'package:expect/expect.dart';
+
+int method(String arg) => arg.length;
+
+@AssumeDynamic()
+int methodAssumeDynamic(String arg) => arg.length;
+
+@TrustTypeAnnotations()
+int methodTrustTypeAnnotations(String arg) => arg.length;
+
+@NoInline()
+int methodNoInline(String arg) => arg.length;
+
+@NoInline() @TrustTypeAnnotations()
+int methodNoInlineTrustTypeAnnotations(String arg) => arg.length;
+
+@AssumeDynamic() @TrustTypeAnnotations()
+int methodAssumeDynamicTrustTypeAnnotations(String arg) => arg.length;
+
+
+void main(List<String> args) {
+  print(method(args[0]));
+  print(methodAssumeDynamic('foo'));
+  print(methodTrustTypeAnnotations(42));
+  print(methodTrustTypeAnnotations("fourtyTwo"));
+  print(methodNoInline('bar'));
+  print(methodNoInlineTrustTypeAnnotations(42));
+  print(methodNoInlineTrustTypeAnnotations("fourtyTwo"));
+  print(methodAssumeDynamicTrustTypeAnnotations(null));
+}
+"""
+};
+
+main() {
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
+
+runTest({bool useKernel}) async {
+  CompilationResult result = await runCompiler(
+      memorySourceFiles: MEMORY_SOURCE_FILES,
+      options: useKernel ? [Flags.useKernel] : []);
+  Compiler compiler = result.compiler;
+  ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+  Expect.isFalse(compiler.compilationFailed, 'Unsuccessful compilation');
+  Expect.isNotNull(closedWorld.commonElements.expectNoInlineClass,
+      'NoInlineClass is unresolved.');
+  Expect.isNotNull(closedWorld.commonElements.expectTrustTypeAnnotationsClass,
+      'TrustTypeAnnotations is unresolved.');
+  Expect.isNotNull(closedWorld.commonElements.expectAssumeDynamicClass,
+      'AssumeDynamicClass is unresolved.');
+
+  void testTypeMatch(FunctionEntity function, TypeMask expectedParameterType,
+      TypeMask expectedReturnType, TypesInferrer inferrer) {
+    compiler.codegenWorldBuilder.forEachParameterAsLocal(function,
+        (Local parameter) {
+      TypeMask type = inferrer.getTypeOfParameter(parameter);
+      Expect.equals(
+          expectedParameterType, simplify(type, closedWorld), "$parameter");
+    });
+    if (expectedReturnType != null) {
+      TypeMask type = inferrer.getReturnTypeOfMember(function);
+      Expect.equals(
+          expectedReturnType, simplify(type, closedWorld), "$function");
+    }
+  }
+
+  void test(String name,
+      {bool expectNoInline: false,
+      bool expectTrustTypeAnnotations: false,
+      TypeMask expectedParameterType: null,
+      TypeMask expectedReturnType: null,
+      bool expectAssumeDynamic: false}) {
+    LibraryEntity mainApp = closedWorld.elementEnvironment.mainLibrary;
+    FunctionEntity method =
+        closedWorld.elementEnvironment.lookupLibraryMember(mainApp, name);
+    Expect.isNotNull(method);
+    Expect.equals(
+        expectNoInline,
+        optimizerHints.noInline(
+            closedWorld.elementEnvironment, closedWorld.commonElements, method),
+        "Unexpected annotation of @NoInline on '$method'.");
+    Expect.equals(
+        expectTrustTypeAnnotations,
+        optimizerHints.trustTypeAnnotations(
+            closedWorld.elementEnvironment, closedWorld.commonElements, method),
+        "Unexpected annotation of @TrustTypeAnnotations on '$method'.");
+    Expect.equals(
+        expectAssumeDynamic,
+        optimizerHints.assumeDynamic(
+            closedWorld.elementEnvironment, closedWorld.commonElements, method),
+        "Unexpected annotation of @AssumeDynamic on '$method'.");
+    TypesInferrer inferrer = compiler.globalInference.typesInferrerInternal;
+    if (expectTrustTypeAnnotations && expectedParameterType != null) {
+      testTypeMatch(
+          method, expectedParameterType, expectedReturnType, inferrer);
+    } else if (expectAssumeDynamic) {
+      testTypeMatch(
+          method, closedWorld.commonMasks.dynamicType, null, inferrer);
+    }
+  }
+
+  TypeMask jsStringType = closedWorld.commonMasks.stringType;
+  TypeMask jsIntType = closedWorld.commonMasks.intType;
+  TypeMask coreStringType =
+      new TypeMask.subtype(closedWorld.commonElements.stringClass, closedWorld);
+
+  test('method');
+  test('methodAssumeDynamic', expectAssumeDynamic: true);
+  test('methodTrustTypeAnnotations',
+      expectTrustTypeAnnotations: true, expectedParameterType: jsStringType);
+  test('methodNoInline', expectNoInline: true);
+  test('methodNoInlineTrustTypeAnnotations',
+      expectNoInline: true,
+      expectTrustTypeAnnotations: true,
+      expectedParameterType: jsStringType,
+      expectedReturnType: jsIntType);
+  test('methodAssumeDynamicTrustTypeAnnotations',
+      expectAssumeDynamic: true,
+      expectTrustTypeAnnotations: true,
+      expectedParameterType: coreStringType);
+}
diff --git a/tests/compiler/dart2js/codegen/field_codegen_test.dart b/tests/compiler/dart2js/codegen/field_codegen_test.dart
new file mode 100644
index 0000000..e77a1c2
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/field_codegen_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Test that parameters keep their names in the output.
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+import '../compiler_helper.dart';
+
+const String TEST_NULL0 = r"""
+class A { static var x; }
+
+main() { return A.x; }
+""";
+
+const String TEST_NULL1 = r"""
+var x;
+
+main() { return x; }
+""";
+
+main() {
+  runTests({bool useKernel}) async {
+    CompileMode compileMode =
+        useKernel ? CompileMode.kernel : CompileMode.memory;
+
+    String generated1 = await compileAll(TEST_NULL0, compileMode: compileMode);
+    Expect.isTrue(generated1.contains("null"));
+
+    String generated2 = await compileAll(TEST_NULL1, compileMode: compileMode);
+    Expect.isTrue(generated2.contains("null"));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/field_update_test.dart b/tests/compiler/dart2js/codegen/field_update_test.dart
new file mode 100644
index 0000000..8f809b5
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/field_update_test.dart
@@ -0,0 +1,106 @@
+// 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:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+import '../compiler_helper.dart';
+
+// Test for emitting JavaScript pre- and post-increment and assignment ops.
+
+const String TEST_1 = """
+class A {
+  var a = 42;
+  int foo() { var r = a; a = a + 1; return r; }  // this.a++
+}
+
+void main() {
+  var a = new A();
+  print(a.foo());
+}
+""";
+
+const String TEST_2 = """
+class A {
+  var a = 42;
+  int foo() { var r = a; a = a + 1; return a; }  // ++this.a
+}
+
+void main() {
+  var a = new A();
+  print(a.foo());
+}
+""";
+
+const String TEST_3 = """
+class A {
+  var a = 42;
+  int foo() { var r = a; a = a - 1; return r; }  // this.a--
+}
+
+void main() {
+  var a = new A();
+  print(a.foo());
+}
+""";
+
+const String TEST_4 = """
+class A {
+  var a = 42;
+  int foo() { var r = a; a = a - 1; return a; }  // --this.a
+}
+
+void main() {
+  var a = new A();
+  print(a.foo());
+}
+""";
+
+const String TEST_5 = """
+class A {
+  var a = 42;
+  int foo() { var r = a; a = a - 2; return a; }  // this.a -= 2
+}
+
+void main() {
+  var a = new A();
+  print(a.foo());
+}
+""";
+
+const String TEST_6 = """
+class A {
+  var a = 42;
+  int foo() { var r = a; a = a * 2; return a; }  // this.a *= 2
+}
+
+void main() {
+  var a = new A();
+  print(a.foo());
+}
+""";
+
+main() {
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
+
+runTests({bool useKernel}) async {
+  test(String code, Function f) async {
+    String generated = await compileAll(code,
+        disableInlining: true,
+        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+    Expect.isTrue(f(generated));
+  }
+
+  await test(TEST_1, (generated) => generated.contains(r'return this.a++;'));
+  await test(TEST_2, (generated) => generated.contains(r'return ++this.a;'));
+  await test(TEST_3, (generated) => generated.contains(r'return this.a--;'));
+  await test(TEST_4, (generated) => generated.contains(r'return --this.a;'));
+  await test(TEST_5, (generated) => generated.contains(r' this.a -= 2;'));
+  await test(TEST_6, (generated) => generated.contains(r' this.a *= 2;'));
+}
diff --git a/tests/compiler/dart2js/codegen/for_in_test.dart b/tests/compiler/dart2js/codegen/for_in_test.dart
new file mode 100644
index 0000000..2ae009d
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/for_in_test.dart
@@ -0,0 +1,46 @@
+// 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 '../compiler_helper.dart';
+
+const String TEST_ONE = r"""
+foo(a) {
+  int x = 0;
+  for (int i in a) {
+    x += i;
+  }
+  return x;
+}
+""";
+
+const String TEST_TWO = r"""
+foo(a) {
+  int x = 0;
+  for (int i in a) {
+    if (i == 5) continue;
+    x += i;
+  }
+  return x;
+}
+""";
+
+main() {
+  runTests({bool useKernel}) async {
+    await compile(TEST_ONE, entry: 'foo', check: (String generated) {
+      Expect.isTrue(!generated.contains(r'break'));
+    }, useKernel: useKernel);
+    await compile(TEST_TWO, entry: 'foo', check: (String generated) {
+      Expect.isTrue(generated.contains(r'continue'));
+    }, useKernel: useKernel);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/forloop_box_test.dart b/tests/compiler/dart2js/codegen/forloop_box_test.dart
new file mode 100644
index 0000000..915cbf4
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/forloop_box_test.dart
@@ -0,0 +1,70 @@
+// 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:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+import '../compiler_helper.dart';
+
+String SHOULD_NOT_BE_BOXED_TEST = r'''
+main() {
+  var a;
+  for (var i=0; i<10; i++) {
+    a = () => i;
+  }
+  print(a());
+}
+''';
+
+String SHOULD_BE_BOXED_TEST = r'''
+run(f) => f();
+main() {
+  var a;
+  for (var i=0; i<10; run(() => i++)) {
+    a = () => i;
+  }
+  print(a());
+}
+''';
+
+String ONLY_UPDATE_LOOP_VAR_TEST = r'''
+run(f) => f();
+main() {
+  var a;
+  for (var i=0; i<10; run(() => i++)) {
+    var b = 3;
+    a = () => b = i;
+  }
+  print(a());
+}
+''';
+
+main() {
+  runTests({bool useKernel}) async {
+    CompileMode compileMode =
+        useKernel ? CompileMode.kernel : CompileMode.memory;
+
+    String generated1 =
+        await compileAll(SHOULD_NOT_BE_BOXED_TEST, compileMode: compileMode);
+    Expect.isTrue(generated1.contains('main_closure(i)'),
+        'for-loop variable should not have been boxed');
+
+    String generated2 =
+        await compileAll(SHOULD_BE_BOXED_TEST, compileMode: compileMode);
+    Expect.isFalse(generated2.contains('main_closure(i)'),
+        'for-loop variable should have been boxed');
+
+    String generated3 = await compileAll(ONLY_UPDATE_LOOP_VAR_TEST);
+    Expect.isFalse(generated3.contains('main_closure(i)'),
+        'for-loop variable should have been boxed');
+    Expect.isFalse(generated3.contains(', _box_0.b = 3,'),
+        'non for-loop captured variable should not be updated in loop');
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/generate_at_use_site_test.dart b/tests/compiler/dart2js/codegen/generate_at_use_site_test.dart
similarity index 62%
rename from tests/compiler/dart2js/generate_at_use_site_test.dart
rename to tests/compiler/dart2js/codegen/generate_at_use_site_test.dart
index c951836..a7e3bf48 100644
--- a/tests/compiler/dart2js/generate_at_use_site_test.dart
+++ b/tests/compiler/dart2js/codegen/generate_at_use_site_test.dart
@@ -2,10 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String FIB = r"""
 fib(n) {
@@ -51,17 +50,27 @@
 """;
 
 main() {
-  asyncTest(() => Future.wait([
-        // Make sure we don't introduce a new variable.
-        compileAndDoNotMatch(FIB, 'fib', new RegExp("var $anyIdentifier =")),
+  runTests({bool useKernel}) async {
+    // Make sure we don't introduce a new variable.
+    await compileAndDoNotMatch(FIB, 'fib', new RegExp("var $anyIdentifier ="),
+        useKernel: useKernel);
 
-        compileAndDoNotMatch(BAR, 'bar', new RegExp("isLeaf")),
+    await compileAndDoNotMatch(BAR, 'bar', new RegExp("isLeaf"),
+        useKernel: useKernel);
 
-        compile(TEST, entry: 'foo', check: (String generated) {
-          Expect.isFalse(generated.contains('else'));
-          // Regression check to ensure that there is no floating variable
-          // expression.
-          Expect.isFalse(new RegExp('^[ ]*a;').hasMatch(generated));
-        }),
-      ]));
+    await compile(TEST, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      Expect.isFalse(generated.contains('else'));
+      // Regression check to ensure that there is no floating variable
+      // expression.
+      Expect.isFalse(new RegExp('^[ ]*a;').hasMatch(generated));
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
 }
diff --git a/tests/compiler/dart2js/codegen/gvn_dynamic_field_get_test.dart b/tests/compiler/dart2js/codegen/gvn_dynamic_field_get_test.dart
new file mode 100644
index 0000000..7d03a19
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/gvn_dynamic_field_get_test.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Test that dart2js gvns dynamic getters that don't have side
+// effects.
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+import 'package:compiler/compiler_new.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/elements/names.dart';
+import 'package:compiler/src/universe/selector.dart' show Selector;
+import 'package:compiler/src/world.dart';
+import '../memory_compiler.dart';
+
+const String TEST = r"""
+class A {
+  var foo;
+  bar(a) {
+    return a.foo + a.foo;
+  }
+}
+
+main() {
+  new A().bar(new Object());
+}
+""";
+
+main() {
+  runTests({bool useKernel}) async {
+    OutputCollector outputCollector = new OutputCollector();
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: {'main.dart': TEST},
+        outputProvider: outputCollector,
+        options: useKernel ? [Flags.useKernel] : []);
+    Compiler compiler = result.compiler;
+    ClosedWorldBase closedWorld =
+        compiler.resolutionWorldBuilder.closedWorldForTesting;
+    var elementEnvironment = closedWorld.elementEnvironment;
+
+    String generated = outputCollector.getOutput('', OutputType.js);
+    RegExp regexp = new RegExp(r"get\$foo");
+    Iterator matches = regexp.allMatches(generated).iterator;
+    checkNumberOfMatches(matches, 1);
+    dynamic cls =
+        elementEnvironment.lookupClass(elementEnvironment.mainLibrary, 'A');
+    Expect.isNotNull(cls);
+    String name = 'foo';
+    var element = elementEnvironment.lookupClassMember(cls, name);
+    Expect.isNotNull(element);
+    Selector selector = new Selector.getter(new PublicName(name));
+    Expect.isFalse(closedWorld.hasAnyUserDefinedGetter(selector, null));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/gvn_test.dart b/tests/compiler/dart2js/codegen/gvn_test.dart
new file mode 100644
index 0000000..b9962bc
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/gvn_test.dart
@@ -0,0 +1,154 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String TEST_ONE = r"""
+void foo(bar) {
+  for (int i = 0; i < 1; i++) {
+    print(1 + bar);
+    print(1 + bar);
+  }
+}
+""";
+
+// Check that modulo does not have any side effect and we are
+// GVN'ing the length of [:list:].
+const String TEST_TWO = r"""
+void foo(a) {
+  var list = new List<int>();
+  list[0] = list[0 % a];
+  list[1] = list[1 % a];
+}
+""";
+
+// Check that is checks get GVN'ed.
+const String TEST_THREE = r"""
+void foo(a) {
+  print(42);  // Make sure numbers are used.
+  print(a is num);
+  print(a is num);
+}
+""";
+
+// Check that instructions that don't have a builtin equivalent can
+// still be GVN'ed.
+const String TEST_FOUR = r"""
+void foo(a) {
+  print(1 >> a);
+  print(1 >> a);
+}
+""";
+
+// Check that [HCheck] instructions do not prevent GVN.
+const String TEST_FIVE = r"""
+class A {
+  var foo = 21;
+}
+
+class B {}
+
+main() {
+  var a = [new B(), new A()][0];
+  var b = a.foo;
+  var c = a.foo;
+  if (a is B) {
+    c = a.foo;
+  }
+  return b + c;
+}
+""";
+
+// Check that a gvn'able instruction in the loop header gets hoisted.
+const String TEST_SIX = r"""
+class A {
+  final field = 54;
+}
+
+main() {
+  var a = new A();
+  while (a.field == 54) { a.field = 42; }
+}
+""";
+
+// Check that a gvn'able instruction that may throw in the loop header
+// gets hoisted.
+const String TEST_SEVEN = r"""
+class A {
+  final field;
+  A() : field = null;
+  A.bar() : field = 42;
+}
+
+main() {
+  var a = new A();
+  var b = new A.bar();
+  while (a.field == 54) { a.field = 42; b.field = 42; }
+}
+""";
+
+// Check that a check in a loop header gets hoisted.
+const String TEST_EIGHT = r"""
+class A {
+  final field;
+  A() : field = null;
+  A.bar() : field = 42;
+}
+
+main() {
+  var a = new A();
+  var b = new A.bar();
+  for (int i = 0; i < a.field; i++) { a.field = 42; b.field = 42; }
+}
+""";
+
+main() {
+  runTests({bool useKernel}) async {
+    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      RegExp regexp = new RegExp(r"1 \+ [a-z]+");
+      checkNumberOfMatches(regexp.allMatches(generated).iterator, 1);
+    });
+    await compile(TEST_TWO, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      checkNumberOfMatches(
+          new RegExp("length").allMatches(generated).iterator, 1);
+    });
+    await compile(TEST_THREE, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      checkNumberOfMatches(
+          new RegExp("number").allMatches(generated).iterator, 1);
+    });
+    await compile(TEST_FOUR, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      checkNumberOfMatches(new RegExp("shr").allMatches(generated).iterator, 1);
+    });
+
+    CompileMode compileMode =
+        useKernel ? CompileMode.kernel : CompileMode.memory;
+
+    await compileAll(TEST_FIVE, compileMode: compileMode).then((generated) {
+      checkNumberOfMatches(
+          new RegExp("get\\\$foo").allMatches(generated).iterator, 1);
+    });
+    await compileAll(TEST_SIX, compileMode: compileMode).then((generated) {
+      Expect.isTrue(generated.contains('for (t1 = a.field === 54; t1;)'));
+    });
+    await compileAll(TEST_SEVEN, compileMode: compileMode).then((generated) {
+      Expect.isTrue(generated.contains('for (t1 = a.field === 54; t1;)'));
+    });
+    await compileAll(TEST_EIGHT, compileMode: compileMode).then((generated) {
+      Expect.isTrue(generated.contains('for (; i < t1; ++i)'));
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/identity_test.dart b/tests/compiler/dart2js/codegen/identity_test.dart
new file mode 100644
index 0000000..78f65cd
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/identity_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String TEST_ONE = r"""
+class A {}
+bool foo(bar) {
+  var x = new A();
+  var y = new A();
+  return identical(x, y);
+}
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      // Check that no boolify code is generated.
+      RegExp regexp = new RegExp("=== true");
+      Iterator matches = regexp.allMatches(generated).iterator;
+      Expect.isFalse(matches.moveNext());
+
+      regexp = new RegExp("===");
+      matches = regexp.allMatches(generated).iterator;
+      Expect.isTrue(matches.moveNext());
+      Expect.isFalse(matches.moveNext());
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/if_do_while_test.dart b/tests/compiler/dart2js/codegen/if_do_while_test.dart
new file mode 100644
index 0000000..ff6b8d0
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/if_do_while_test.dart
@@ -0,0 +1,38 @@
+// 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:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String TEST = r"""
+foo(param0, param1, param2) {
+  if (param0)
+    do {
+      param1();
+    } while(param2());
+  else {
+    param2();
+  }
+}
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    await compile(TEST, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      // Check that the do-while in the 'then' is enclosed in braces.
+      // Otherwise Android 4.0 stock browser has a syntax error. See issue 10923.
+      Expect.isTrue(
+          new RegExp(r'if[ ]*\([^)]+\)[ ]*\{[\n ]*do').hasMatch(generated));
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/inferrer_factory_test.dart b/tests/compiler/dart2js/codegen/inferrer_factory_test.dart
new file mode 100644
index 0000000..59f39ab
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/inferrer_factory_test.dart
@@ -0,0 +1,40 @@
+// 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 '../compiler_helper.dart';
+
+const String TEST1 = r"""
+class A implements List {
+  factory A() {
+    // Avoid inlining by using try/catch.
+    try {
+      return new List();
+    } catch (e) {
+    }
+  }
+}
+
+main() {
+  new A()[0] = 42;
+}
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    String generated = await compileAll(TEST1,
+        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+    // Check that we're using the index operator on the object returned
+    // by the A factory.
+    Expect.isTrue(generated.contains('[0] = 42'));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/interceptor_almost_constant_test.dart b/tests/compiler/dart2js/codegen/interceptor_almost_constant_test.dart
new file mode 100644
index 0000000..b9b1783
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/interceptor_almost_constant_test.dart
@@ -0,0 +1,32 @@
+// 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:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String TEST_ONE = r"""
+  foo(b) {
+    var a = b ? [1,2,3] : null;
+    print(a.first);
+  }
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    // Check that almost-constant interceptor is used.
+    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      String re = r'a && [\w\.]*_methods';
+      Expect.isTrue(generated.contains(new RegExp(re)), 'contains /$re/');
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/interceptor_test.dart b/tests/compiler/dart2js/codegen/interceptor_test.dart
new file mode 100644
index 0000000..3955b33
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/interceptor_test.dart
@@ -0,0 +1,56 @@
+// 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 '../compiler_helper.dart';
+
+const String TEST_ONE = r"""
+  foo(a) {
+    var myVariableName = a.toString();
+    print(myVariableName);
+    print(myVariableName);
+  }
+""";
+
+const String TEST_TWO = r"""
+  class A {
+    var length;
+  }
+  foo(a) {
+    print([]); // Make sure the array class is instantiated.
+    return new A().length + a.length;
+  }
+""";
+
+main() {
+  runTests({bool useKernel}) async {
+    // Check that one-shot interceptors preserve variable names, see
+    // https://code.google.com/p/dart/issues/detail?id=8106.
+    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      Expect.isTrue(
+          generated.contains(new RegExp(r'[$A-Z]+\.toString\$0\$\(a\)')));
+      Expect.isTrue(generated.contains('myVariableName'));
+    });
+    // Check that an intercepted getter that does not need to be
+    // intercepted, is turned into a regular getter call or field
+    // access.
+    await compile(TEST_TWO, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      Expect.isFalse(generated.contains(r'a.get$length()'));
+      Expect
+          .isTrue(generated.contains(new RegExp(r'[$A-Z]+\.A\$\(\)\.length')));
+      Expect.isTrue(
+          generated.contains(new RegExp(r'[$A-Z]+\.get\$length\$as\(a\)')));
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/interpolation_folding_test.dart b/tests/compiler/dart2js/codegen/interpolation_folding_test.dart
new file mode 100644
index 0000000..68f13e6
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/interpolation_folding_test.dart
@@ -0,0 +1,69 @@
+// 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:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+import '../compiler_helper.dart';
+
+// Tests for
+const String TEST_1 = r"""
+  foo() {
+    int a = 120;
+    String b = 'hello';
+    return 'u${a}v${b}w';
+  }
+""";
+
+const String TEST_2 = r"""
+  foo(a, b) {
+    return 'aaaaa${a}xxxxx'
+           "yyyyy${b}zzzzz";
+  }
+""";
+
+const String TEST_3 = r"""
+  foo(a) {
+    var b = '$a#';
+    return '${b}x${b}';
+  }
+""";
+
+const String TEST_4 = r"""
+  foo(a) {
+    var b = [];
+    if (a) b.add(123);
+    return '${b.length}';
+  }
+""";
+
+main() {
+  runTests({bool useKernel}) async {
+    check(String test, String contained) async {
+      String generated =
+          await compile(test, entry: 'foo', useKernel: useKernel);
+      Expect.isTrue(generated.contains(contained), contained);
+    }
+
+    // Full substitution.
+    await check(TEST_1, r'"u120vhellow"');
+
+    // Adjacent string fragments get merged.
+    await check(TEST_2, r'"xxxxxyyyyy"');
+
+    // 1. No merging of fragments that are multi-use.  Prevents exponential code
+    //    and keeps author's manual CSE.
+    // 2. Know string values require no stringification.
+    await check(TEST_3, r'return b + "x" + b');
+
+    // Known int value can be formatted directly.
+    await check(TEST_4, r'return "" + b.length');
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/inverse_operator_test.dart b/tests/compiler/dart2js/codegen/inverse_operator_test.dart
new file mode 100644
index 0000000..eb1cee1
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/inverse_operator_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String MAIN = r"""
+int inscrutable(int x) => x == 0 ? 0 : x | inscrutable(x & (x - 1));
+main() {
+  var x = 1;
+  if (inscrutable(x) == 0) {
+    main();
+    x = 2;
+  }
+  print(!(1 < x));
+}""";
+
+main() {
+  runTest({bool useKernel}) async {
+    // Make sure we don't introduce a new variable.
+    await compileAndMatchFuzzy(MAIN, 'main', "1 >= x", useKernel: useKernel);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/is_function_test.dart b/tests/compiler/dart2js/codegen/is_function_test.dart
similarity index 64%
rename from tests/compiler/dart2js/is_function_test.dart
rename to tests/compiler/dart2js/codegen/is_function_test.dart
index 59d7d45..d594a90 100644
--- a/tests/compiler/dart2js/is_function_test.dart
+++ b/tests/compiler/dart2js/codegen/is_function_test.dart
@@ -10,7 +10,7 @@
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/js_emitter/model.dart';
 import 'package:expect/expect.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 const String SOURCE = '''
 import 'dart:isolate';
@@ -18,15 +18,18 @@
 ''';
 
 main() {
-  asyncTest(() async {
-    var result = await runCompiler(
-        memorySourceFiles: {'main.dart': SOURCE},
-        options: [Flags.enableCheckedMode]);
+  runTest({bool useKernel}) async {
+    List<String> options = [Flags.enableCheckedMode];
+    if (useKernel) {
+      options.add(Flags.useKernel);
+    }
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: {'main.dart': SOURCE}, options: options);
     Expect.isTrue(result.isSuccess);
     Compiler compiler = result.compiler;
     Program program = compiler.backend.emitter.emitter.programForTesting;
-    var name = compiler.backend.namer
-        .operatorIs(compiler.frontendStrategy.commonElements.functionClass);
+    var name = compiler.backend.namer.operatorIs(
+        compiler.backendClosedWorldForTesting.commonElements.functionClass);
     for (Fragment fragment in program.fragments) {
       for (Library library in fragment.libraries) {
         for (Class cls in library.classes) {
@@ -38,5 +41,12 @@
         }
       }
     }
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
   });
 }
diff --git a/tests/compiler/dart2js/codegen/is_inference2_test.dart b/tests/compiler/dart2js/codegen/is_inference2_test.dart
new file mode 100644
index 0000000..e2bff2a
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/is_inference2_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String TEST_IF_BOOL_FIRST_INSTRUCTION = r"""
+negate(x) {
+  if (x is bool) return !x;
+  return x;
+}
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    await compile(TEST_IF_BOOL_FIRST_INSTRUCTION,
+        entry: 'negate', useKernel: useKernel, check: (String generated) {
+      Expect.isTrue(generated.contains("!")); // We want to see !x.
+      Expect.isFalse(generated.contains("!=")); // And not !== true.
+      Expect.isFalse(generated.contains("true"));
+      Expect.isFalse(generated.contains("false"));
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/is_inference_test.dart b/tests/compiler/dart2js/codegen/is_inference_test.dart
similarity index 67%
rename from tests/compiler/dart2js/is_inference_test.dart
rename to tests/compiler/dart2js/codegen/is_inference_test.dart
index a5d7f8b..9915918 100644
--- a/tests/compiler/dart2js/is_inference_test.dart
+++ b/tests/compiler/dart2js/codegen/is_inference_test.dart
@@ -5,7 +5,7 @@
 import 'dart:async';
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST_IF = r"""
 test(param) {
@@ -71,8 +71,9 @@
 }
 """;
 
-Future compileAndTest(String code) {
-  return compile(code, entry: 'test', check: (String generated) {
+Future compileAndTest(String code, {bool useKernel}) {
+  return compile(code, entry: 'test', useKernel: useKernel,
+      check: (String generated) {
     RegExp validAdd =
         new RegExp("($anyIdentifier \\+ 42)|($anyIdentifier \\+= 42)");
     RegExp invalidAdd = new RegExp("$anyIdentifier \\+ 53");
@@ -82,12 +83,19 @@
 }
 
 main() {
-  asyncTest(() => Future.wait([
-        compileAndTest(TEST_IF),
-        compileAndTest(TEST_IF_ELSE),
-        compileAndTest(TEST_IF_RETURN),
-        compileAndTest(TEST_IF_NOT_ELSE),
-        compileAndTest(TEST_IF_NOT_RETURN),
-        compileAndTest(TEST_IF_NOT_ELSE_RETURN),
-      ]));
+  runTests({bool useKernel}) async {
+    await compileAndTest(TEST_IF, useKernel: useKernel);
+    await compileAndTest(TEST_IF_ELSE, useKernel: useKernel);
+    await compileAndTest(TEST_IF_RETURN, useKernel: useKernel);
+    await compileAndTest(TEST_IF_NOT_ELSE, useKernel: useKernel);
+    await compileAndTest(TEST_IF_NOT_RETURN, useKernel: useKernel);
+    await compileAndTest(TEST_IF_NOT_ELSE_RETURN, useKernel: useKernel);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
 }
diff --git a/tests/compiler/dart2js/codegen/licm_test.dart b/tests/compiler/dart2js/codegen/licm_test.dart
new file mode 100644
index 0000000..f6fee65
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/licm_test.dart
@@ -0,0 +1,39 @@
+// 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.
+
+// Check that we hoist instructions in a loop condition, even if that
+// condition involves control flow.
+
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String TEST = '''
+var a = [1];
+
+main() {
+  int count = int.parse('42') == 42 ? 42 : null;
+  for (int i = 0; i < count && i < a[0]; i++) {
+    print(i);
+  }
+  a.removeLast();
+  // Ensure we don't try to generate a bailout method based on a check
+  // of [count].
+  count.removeLast();
+}
+''';
+
+main() {
+  runTest({bool useKernel}) async {
+    await compileAndMatch(TEST, 'main',
+        new RegExp('if \\(typeof count !== "number"\\)(.|\\n)*while'),
+        useKernel: useKernel);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/literal_list_test.dart b/tests/compiler/dart2js/codegen/literal_list_test.dart
new file mode 100644
index 0000000..fa05bec
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/literal_list_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String TEST_ONE = r"""
+foo() {
+  print([1, 2]);
+  print([3]);
+  var c = [4, 5];
+  print(c);
+}
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      Expect.isTrue(generated.contains('print([1, 2]);'));
+      Expect.isTrue(generated.contains('print([3]);'));
+      Expect.isTrue(generated.contains('print([4, 5]);'));
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/literal_map_test.dart b/tests/compiler/dart2js/codegen/literal_map_test.dart
new file mode 100644
index 0000000..363a8e2
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/literal_map_test.dart
@@ -0,0 +1,36 @@
+// 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 '../compiler_helper.dart';
+
+const String TEST = """
+foo() {
+  var a = {};
+  var index = foo(); // Make sure we want to optimize this method.
+  while (true) a[index] = 1;
+}
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    await compile(TEST, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      // Make sure we have all the type information we need.
+      Expect.isFalse(generated.contains('bailout'));
+      Expect.isFalse(generated.contains('interceptor'));
+      // Make sure we don't go through an interceptor.
+      Expect.isTrue(generated.contains(r'a.$indexSet(a') ||
+          generated.contains(r'.$indexSet(0'));
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/load_elimination_test.dart b/tests/compiler/dart2js/codegen/load_elimination_test.dart
similarity index 66%
rename from tests/compiler/dart2js/load_elimination_test.dart
rename to tests/compiler/dart2js/codegen/load_elimination_test.dart
index efbc841..2a8935e 100644
--- a/tests/compiler/dart2js/load_elimination_test.dart
+++ b/tests/compiler/dart2js/codegen/load_elimination_test.dart
@@ -2,10 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST_1 = """
 class A {
@@ -235,33 +234,41 @@
 """;
 
 main() {
-  test(String code, String expected) {
-    return () => compileAll(code, disableInlining: false).then((generated) {
-          Expect.isTrue(
-              generated.contains(expected),
-              "Generated code didn't contain '$expected'.\n"
-              "Test:\n$code, Generated:\n$generated");
-        });
+  runTests({bool useKernel}) async {
+    test(String code, String expected) async {
+      String generated = await compileAll(code,
+          disableInlining: false,
+          compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+      Expect.isTrue(
+          generated.contains(expected),
+          "Generated code didn't contain '$expected'.\n"
+          "Test:\n$code, Generated:\n$generated");
+    }
+
+    await test(TEST_1, 'return 42');
+    await test(TEST_2, 'return 42');
+    await test(TEST_3, 'return 84');
+    await test(TEST_4, 'return t1 + t1');
+    await test(TEST_5, 'return 84');
+    await test(TEST_6, 'return 84');
+    await test(TEST_7, 'return 32');
+    await test(TEST_8, 'return a.a');
+    await test(TEST_9, 'return a.a');
+    await test(TEST_10, 'return 2');
+    await test(TEST_11, 'return a.a');
+    await test(TEST_12, 'return 6');
+    await test(TEST_13, 'return 6');
+    await test(TEST_14, 'return t1[0]');
+    await test(TEST_15, 'return 42');
+    await test(TEST_16, 'return \$.a');
+    await test(TEST_17, 'return t1');
+    await test(TEST_18, 'return t1');
   }
 
-  asyncTest(() => Future.forEach([
-        test(TEST_1, 'return 42'),
-        test(TEST_2, 'return 42'),
-        test(TEST_3, 'return 84'),
-        test(TEST_4, 'return t1 + t1'),
-        test(TEST_5, 'return 84'),
-        test(TEST_6, 'return 84'),
-        test(TEST_7, 'return 32'),
-        test(TEST_8, 'return a.a'),
-        test(TEST_9, 'return a.a'),
-        test(TEST_10, 'return 2'),
-        test(TEST_11, 'return a.a'),
-        test(TEST_12, 'return 6'),
-        test(TEST_13, 'return 6'),
-        test(TEST_14, 'return t1[0]'),
-        test(TEST_15, 'return 42'),
-        test(TEST_16, 'return \$.a'),
-        test(TEST_17, 'return t1'),
-        test(TEST_18, 'return t1'),
-      ], (f) => f()));
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
 }
diff --git a/tests/compiler/dart2js/codegen/logical_expression_test.dart b/tests/compiler/dart2js/codegen/logical_expression_test.dart
new file mode 100644
index 0000000..8ed8e00
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/logical_expression_test.dart
@@ -0,0 +1,61 @@
+// 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.
+
+// Test that logical or-expressions don't introduce unnecessary nots.
+
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String TEST_ONE = r"""
+foo(bar, gee) {
+  bool cond1 = bar();
+  if (cond1 || gee()) gee();
+  if (cond1 || gee()) gee();
+}
+""";
+
+const String TEST_TWO = r"""
+void foo(list, bar) {
+  if (list == null) bar();
+  if (list == null || bar()) bar();
+  if (list == null || bar()) bar();
+}
+""";
+
+main() {
+  runTests({bool useKernel}) async {
+    // We want something like:
+    //     var t1 = bar.call$0() === true;
+    //     if (t1 || gee.call$0() === true) gee.call$0();
+    //     if (t1 || gee.call$0() === true) gee.call$0();
+    await compileAndDoNotMatchFuzzy(
+        TEST_ONE,
+        'foo',
+        r"""var x = [a-zA-Z0-9$.]+\(\) == true;
+            if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;
+            if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;""",
+        useKernel: useKernel);
+
+    // We want something like:
+    //     var t1 = list == null;
+    //     if (t1) bar.call$0();
+    //     if (t1 || bar.call$0() === true) bar.call$0();
+    //     if (t1 || bar.call$0() === true) bar.call$0();
+    await compileAndMatchFuzzy(
+        TEST_TWO,
+        'foo',
+        r"""var x = x == null;
+            if \(x\) [^;]+;
+            if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;
+            if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;""",
+        useKernel: useKernel);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/loop_test.dart b/tests/compiler/dart2js/codegen/loop_test.dart
new file mode 100644
index 0000000..3594325
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/loop_test.dart
@@ -0,0 +1,81 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String TEST_ONE = r"""
+foo(a) {
+  int x = 0;
+  for (int i = 0; i < 10; i++) {
+    x += i;
+  }
+  return x;
+}
+""";
+
+const String TEST_TWO = r"""
+foo(a) {
+  int x = 0;
+  int i = 0;
+  while (i < 10) {
+    x += i;
+    i++;
+  }
+  return x;
+}
+""";
+
+const String TEST_THREE = r"""
+foo(a) {
+  int x = 0;
+  for (int i = 0; i < 10; i++) {
+    if (i == 5) continue;
+    x += i;
+  }
+  return x;
+}
+""";
+
+const String TEST_FOUR = r"""
+foo(a) {
+  int x = 0;
+  int i = 0;
+  while (i < 10) {
+    i++;
+    if (i == 5) continue;
+    x += i;
+  }
+  return x;
+}
+""";
+
+main() {
+  runTests({bool useKernel}) async {
+    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      Expect.isTrue(generated.contains(r'for ('));
+    });
+    await compile(TEST_TWO, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      Expect.isTrue(!generated.contains(r'break'));
+    });
+    await compile(TEST_THREE, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      Expect.isTrue(generated.contains(r'continue'));
+    });
+    await compile(TEST_FOUR, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      Expect.isTrue(generated.contains(r'continue'));
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/minify_many_locals_test.dart b/tests/compiler/dart2js/codegen/minify_many_locals_test.dart
new file mode 100644
index 0000000..ed902ed
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/minify_many_locals_test.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Test that parameters keep their names in the output.
+
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+import '../compiler_helper.dart';
+
+main() {
+  runTests({bool useKernel, int numberOfParameters}) async {
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("foo(");
+    for (int i = 0; i < numberOfParameters; i++) {
+      buffer.write("x$i, ");
+    }
+    buffer.write("x) { int i = ");
+    for (int i = 0; i < numberOfParameters; i++) {
+      buffer.write("x$i+");
+    }
+    buffer.write("$numberOfParameters; return i; }");
+    String code = buffer.toString();
+
+    String generated =
+        await compile(code, entry: 'foo', minify: true, useKernel: useKernel);
+    RegExp re = new RegExp(r"\(a,b,c");
+    Expect.isTrue(re.hasMatch(generated));
+
+    re = new RegExp(r"x,y,z,a0,a1,a2");
+    Expect.isTrue(re.hasMatch(generated));
+
+    re = new RegExp(r"y,z,a0,a1,a2,a3,a4,a5,a6");
+    Expect.isTrue(re.hasMatch(generated));
+
+    re = new RegExp(r"g8,g9,h0,h1");
+    Expect.isTrue(re.hasMatch(generated));
+
+    re = new RegExp(r"z8,z9,aa0,aa1,aa2");
+    Expect.isTrue(re.hasMatch(generated));
+
+    re = new RegExp(r"aa9,ab0,ab1");
+    Expect.isTrue(re.hasMatch(generated));
+
+    re = new RegExp(r"az9,ba0,ba1");
+    Expect.isTrue(re.hasMatch(generated));
+  }
+
+  asyncTest(() async {
+    // The [numberOfParameters] values are somewhat arbitrary.
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false, numberOfParameters: 1800);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true, numberOfParameters: 2000);
+  });
+}
diff --git a/tests/compiler/dart2js/modulo_remainder_test.dart b/tests/compiler/dart2js/codegen/modulo_remainder_test.dart
similarity index 67%
rename from tests/compiler/dart2js/modulo_remainder_test.dart
rename to tests/compiler/dart2js/codegen/modulo_remainder_test.dart
index aef3238..29d8b1b 100644
--- a/tests/compiler/dart2js/modulo_remainder_test.dart
+++ b/tests/compiler/dart2js/codegen/modulo_remainder_test.dart
@@ -2,9 +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 'dart:async';
 import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String MOD1 = r"""
 foo(param) {
@@ -66,16 +65,26 @@
 """;
 
 main() {
-  Future check(String test) {
-    return compile(test, entry: 'foo', check: checkerForAbsentPresent(test));
+  runTests({bool useKernel}) async {
+    check(String test) async {
+      await compile(test,
+          entry: 'foo',
+          useKernel: useKernel,
+          check: checkerForAbsentPresent(test));
+    }
+
+    await check(MOD1);
+    await check(MOD2);
+    await check(MOD3);
+    await check(REM1);
+    await check(REM2);
+    await check(REM3);
   }
 
-  asyncTest(() => Future.wait([
-        check(MOD1),
-        check(MOD2),
-        check(MOD3),
-        check(REM1),
-        check(REM2),
-        check(REM3),
-      ]));
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
 }
diff --git a/tests/compiler/dart2js/codegen/no_constructor_body_test.dart b/tests/compiler/dart2js/codegen/no_constructor_body_test.dart
new file mode 100644
index 0000000..3d3e8ec
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/no_constructor_body_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+import '../compiler_helper.dart';
+
+const String TEST = r"""
+class A {
+  A.foo() {}
+  A();
+}
+main() {
+  new A();
+  new A.foo();
+}
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    String generated = await compileAll(TEST,
+        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+
+    Expect.isTrue(generated
+        .contains(new RegExp('A: {[ \n]*"\\^": "Object;",[ \n]*static:')));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/no_duplicate_constructor_body2_test.dart b/tests/compiler/dart2js/codegen/no_duplicate_constructor_body2_test.dart
new file mode 100644
index 0000000..b90eba5
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/no_duplicate_constructor_body2_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../compiler_helper.dart';
+import "package:async_helper/async_helper.dart";
+
+const String CODE = """
+var x = 0;
+class A {
+  A() { x++; }
+}
+
+class B extends A {
+  B();
+}
+
+main() {
+  new B();
+  new A();
+}
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    String generated = await compileAll(CODE,
+        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+    RegExp regexp = new RegExp(r'A\$0: function');
+    Iterator<Match> matches = regexp.allMatches(generated).iterator;
+    checkNumberOfMatches(matches, 1);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/no_duplicate_constructor_body_test.dart b/tests/compiler/dart2js/codegen/no_duplicate_constructor_body_test.dart
new file mode 100644
index 0000000..6bba7dd
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/no_duplicate_constructor_body_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:async_helper/async_helper.dart";
+import '../compiler_helper.dart';
+
+const String CODE = """
+class A {
+  A(String b) { b.length; }
+}
+
+main() {
+  new A("foo");
+}
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    String generated = await compileAll(CODE,
+        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+    RegExp regexp = new RegExp(r'\A: {[ \n]*"\^": "[A-Za-z]+;"');
+    Iterator<Match> matches = regexp.allMatches(generated).iterator;
+    checkNumberOfMatches(matches, 1);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/no_duplicate_stub_test.dart b/tests/compiler/dart2js/codegen/no_duplicate_stub_test.dart
new file mode 100644
index 0000000..2c9e0bb6
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/no_duplicate_stub_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:async_helper/async_helper.dart";
+import '../compiler_helper.dart';
+
+const String TEST = r"""
+class A {
+  foo({a, b}) {}
+}
+
+class B extends A {
+}
+
+main() {
+  var a = [bar, baz];
+  a[0](new A());
+  a[1](new A());
+}
+
+bar(a) {
+  if (a is A) a.foo(a: 42);
+}
+
+baz(a) {
+  if (a is B) a.foo(a: 42);
+}
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    String generated = await compileAll(TEST,
+        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+    RegExp regexp = new RegExp('foo\\\$1\\\$a: function');
+    Iterator<Match> matches = regexp.allMatches(generated).iterator;
+    checkNumberOfMatches(matches, 1);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/null_check_test.dart b/tests/compiler/dart2js/codegen/null_check_test.dart
new file mode 100644
index 0000000..34bf897
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/null_check_test.dart
@@ -0,0 +1,32 @@
+// 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 '../compiler_helper.dart';
+import "package:async_helper/async_helper.dart";
+
+const String TEST1 = r"""
+main() {
+  var foo;
+  if (main() == 5) {
+    foo = [0];
+  }
+  return foo[0];
+}
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    String generated = await compileAll(TEST1,
+        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+    Expect.isFalse(generated.contains('foo.length'));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/boolify_test.dart b/tests/compiler/dart2js/codegen/null_type_test.dart
similarity index 60%
copy from tests/compiler/dart2js/boolify_test.dart
copy to tests/compiler/dart2js/codegen/null_type_test.dart
index fb382cb..353e424 100644
--- a/tests/compiler/dart2js/boolify_test.dart
+++ b/tests/compiler/dart2js/codegen/null_type_test.dart
@@ -2,32 +2,29 @@
 // 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 boolify_test;
-
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
-const String TEST = r"""
+const String TEST_ONE = r"""
 foo() {
-  var a = foo();
-  if (!a) return 1;
-  return 2;
+  var c = null;
+  while (true) c = 1 + c;
 }
 """;
 
 main() {
-  test(CompileMode compileMode) async {
-    await compile(TEST, entry: 'foo', compileMode: compileMode,
+  runTest({bool useKernel}) async {
+    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
         check: (String generated) {
-      Expect.isTrue(generated.contains('foo() !== true)'));
+      Expect.isFalse(generated.contains('typeof (void 0)'));
     });
   }
 
   asyncTest(() async {
     print('--test from ast---------------------------------------------------');
-    await test(CompileMode.memory);
+    await runTest(useKernel: false);
     print('--test from kernel------------------------------------------------');
-    await test(CompileMode.kernel);
+    await runTest(useKernel: true);
   });
 }
diff --git a/tests/compiler/dart2js/number_output_test.dart b/tests/compiler/dart2js/codegen/number_output_test.dart
similarity index 70%
rename from tests/compiler/dart2js/number_output_test.dart
rename to tests/compiler/dart2js/codegen/number_output_test.dart
index 42bd65b..81bc5bc 100644
--- a/tests/compiler/dart2js/number_output_test.dart
+++ b/tests/compiler/dart2js/codegen/number_output_test.dart
@@ -5,8 +5,9 @@
 import 'dart:async';
 import 'package:expect/expect.dart';
 import 'package:compiler/compiler_new.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:async_helper/async_helper.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 const MEMORY_SOURCE_FILES = const {
   'main.dart': '''
@@ -18,12 +19,19 @@
         }'''
 };
 
-Future test({bool minify}) async {
+Future test({bool useKernel, bool minify}) async {
   OutputCollector collector = new OutputCollector();
+  List<String> options = <String>[];
+  if (useKernel) {
+    options.add(Flags.useKernel);
+  }
+  if (minify) {
+    options.add(Flags.minify);
+  }
   await runCompiler(
       memorySourceFiles: MEMORY_SOURCE_FILES,
       outputProvider: collector,
-      options: minify ? ['--minify'] : []);
+      options: options);
 
   // Check that we use the shorter exponential representations.
   String jsOutput = collector.getOutput('', OutputType.js);
@@ -47,8 +55,15 @@
 }
 
 main() {
+  runTest({bool useKernel}) async {
+    await test(useKernel: useKernel, minify: true);
+    await test(useKernel: useKernel, minify: false);
+  }
+
   asyncTest(() async {
-    await test(minify: true);
-    await test(minify: false);
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
   });
 }
diff --git a/tests/compiler/dart2js/codegen/parameter_phi_elimination_test.dart b/tests/compiler/dart2js/codegen/parameter_phi_elimination_test.dart
new file mode 100644
index 0000000..29f6992
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/parameter_phi_elimination_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test. Failed due to trying to detach an HLocal twice.
+
+// VMOptions=--enable_asserts
+
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String SOURCE = r"""
+bool baz(int a, int b) {
+  while (a == b || a < b) {
+    a = a + b;
+  }
+  return a == b;
+}
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    await compile(SOURCE, entry: "baz", useKernel: useKernel);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/pretty_parameter_test.dart b/tests/compiler/dart2js/codegen/pretty_parameter_test.dart
new file mode 100644
index 0000000..d2ca04e
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/pretty_parameter_test.dart
@@ -0,0 +1,113 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Test that parameters keep their names in the output.
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String FOO = r"""
+void foo(var a, var b) {
+}
+""";
+
+const String BAR = r"""
+void bar(var eval, var $eval) {
+}
+""";
+
+const String PARAMETER_AND_TEMP = r"""
+void bar(var t0, var b) {
+  {
+    var t0 = 2;
+    if (b) {
+      bar(1, 2);
+      t0 = 4;
+    } else {
+      t0 = 3;
+    }
+    print(t0);
+  }
+  print(t0);
+}
+""";
+
+const String NO_LOCAL = r"""
+foo(bar, baz) {
+  if (bar) {
+    baz = 2;
+  } else {
+    baz = 3;
+  }
+  return baz;
+}
+""";
+
+const String MULTIPLE_PHIS_ONE_LOCAL = r"""
+foo(param1, param2, param3) {
+  var a = 2;
+  if (param1) {
+    if (param2) {
+      if (param3) {
+        a = 42;
+      }
+      print(a);
+    }
+    print(a);
+  }
+  print(a);
+}
+""";
+
+const String PARAMETER_INIT = r"""
+int foo(var start, bool test) {
+  var result = start;
+  if (test) {
+    foo(1, 2);
+    result = 42;
+  }
+  print(result);
+}
+""";
+
+main() {
+  runTests({bool useKernel}) async {
+    await compile(FOO, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      Expect.isTrue(generated.contains(r"function(a, b) {"));
+    });
+    await compile(BAR, entry: 'bar', useKernel: useKernel,
+        check: (String generated) {
+      Expect.isTrue(generated.contains(r"function($eval, $$eval) {"));
+    });
+    await compile(PARAMETER_AND_TEMP, entry: 'bar', useKernel: useKernel,
+        check: (String generated) {
+      Expect.isTrue(generated.contains(r"print(t00)"));
+      // Check that the second 't0' got another name.
+      Expect.isTrue(generated.contains(r"print(t01)"));
+    });
+    await compile(MULTIPLE_PHIS_ONE_LOCAL, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      Expect.isTrue(generated.contains("var a;"));
+      // Check that there is only one var declaration.
+      checkNumberOfMatches(new RegExp("var").allMatches(generated).iterator, 1);
+    });
+    await compile(NO_LOCAL, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      Expect.isFalse(generated.contains('var'));
+    });
+    await compile(PARAMETER_INIT, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      // Check that there is only one var declaration.
+      checkNumberOfMatches(new RegExp("var").allMatches(generated).iterator, 1);
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/redundant_phi_eliminator_test.dart b/tests/compiler/dart2js/codegen/redundant_phi_eliminator_test.dart
new file mode 100644
index 0000000..e18c6e3
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/redundant_phi_eliminator_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String TEST_ONE = r"""
+void foo(bar) {
+  var toBeRemoved = 1;
+  if (bar) {
+  } else {
+  }
+  print(toBeRemoved);
+}
+""";
+
+const String TEST_TWO = r"""
+void foo() {
+  var temp = 0;
+  var toBeRemoved = temp;
+  for (var i = 0; i == 0; i = i + 1) {
+    toBeRemoved = temp;
+  }
+  print(toBeRemoved);
+}
+""";
+
+main() {
+  runTests({bool useKernel}) async {
+    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      RegExp regexp = new RegExp("toBeRemoved");
+      Expect.isTrue(!regexp.hasMatch(generated));
+    });
+    await compile(TEST_TWO, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      RegExp regexp = new RegExp("toBeRemoved");
+      Expect.isTrue(!regexp.hasMatch(generated));
+      regexp = new RegExp("temp");
+      Expect.isTrue(!regexp.hasMatch(generated));
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/regress_10231_test.dart b/tests/compiler/dart2js/codegen/regress_10231_test.dart
new file mode 100644
index 0000000..2c2c242
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/regress_10231_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for http://dartbug.com/10231.
+
+import 'package:expect/expect.dart';
+import "package:async_helper/async_helper.dart";
+import '../compiler_helper.dart';
+
+const String SOURCE = """
+test(a, b, c, d) {
+  if (a is !num) throw 'a not num';
+  if (b is !num) throw 'b not num';
+  if (c is !num) throw 'c not num';
+  if (d is !num) throw 'd not num';
+  return a + b + c + d;
+}
+
+main() {
+  test(1, 2, 3, 4);
+  test('x', 'y', 'z', 'w');
+  test([], {}, [], {});
+}
+""";
+
+void main() {
+  runTests({bool useKernel}) async {
+    String code =
+        await compile(SOURCE, useKernel: useKernel, methodName: 'test');
+    Expect.isNotNull(code);
+    Expect.equals(0, new RegExp('add').allMatches(code).length);
+    Expect.equals(3, new RegExp('\\+').allMatches(code).length);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/side_effect_tdiv_regression_test.dart b/tests/compiler/dart2js/codegen/side_effect_tdiv_regression_test.dart
new file mode 100644
index 0000000..4d87085
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/side_effect_tdiv_regression_test.dart
@@ -0,0 +1,39 @@
+// 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 '../compiler_helper.dart';
+
+const String TEST = r'''
+class A {
+  var field = 42;
+}
+main() {
+  var a = new A();
+  var b = [42, -1];
+  // Force a setter on [field].
+  if (false) a.field = 12;
+  var c = a.field;
+  print(b[0] ~/ b[1]);
+  return c + a.field;
+}
+''';
+
+void main() {
+  runTest({bool useKernel}) async {
+    String generated = await compileAll(TEST,
+        compileMode: useKernel ? CompileMode.kernel : CompileMode.mock);
+    Expect.isTrue(generated.contains('return c + c;'));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    // TODO(johnniwinther): This test only works with the mock compiler.
+    //print('--test from kernel----------------------------------------------');
+    //await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/simple_function_subtype_test.dart b/tests/compiler/dart2js/codegen/simple_function_subtype_test.dart
similarity index 67%
rename from tests/compiler/dart2js/simple_function_subtype_test.dart
rename to tests/compiler/dart2js/codegen/simple_function_subtype_test.dart
index a1b3a73..7821d4a 100644
--- a/tests/compiler/dart2js/simple_function_subtype_test.dart
+++ b/tests/compiler/dart2js/codegen/simple_function_subtype_test.dart
@@ -8,7 +8,7 @@
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = r"""
 typedef Args0();
@@ -51,13 +51,23 @@
 """;
 
 main() {
-  asyncTest(() => compile(TEST, entry: 'foo', check: (String generated) {
-        for (int i = 0; i <= 15; i++) {
-          String predicateCheck = '.\$is_args$i';
-          Expect.isTrue(generated.contains(predicateCheck),
-              'Expected predicate check $predicateCheck');
-        }
-        Expect.isFalse(generated.contains('checkFunctionSubtype'),
-            'Unexpected use of checkFunctionSubtype');
-      }));
+  runTest({bool useKernel}) async {
+    await compile(TEST, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      for (int i = 0; i <= 15; i++) {
+        String predicateCheck = '.\$is_args$i';
+        Expect.isTrue(generated.contains(predicateCheck),
+            'Expected predicate check $predicateCheck');
+      }
+      Expect.isFalse(generated.contains('checkFunctionSubtype'),
+          'Unexpected use of checkFunctionSubtype');
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
 }
diff --git a/tests/compiler/dart2js/codegen/ssa_phi_codegen_test.dart b/tests/compiler/dart2js/codegen/ssa_phi_codegen_test.dart
new file mode 100644
index 0000000..8aa46ad
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/ssa_phi_codegen_test.dart
@@ -0,0 +1,107 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Test that parameters keep their names in the output.
+
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String TEST_ONE = r"""
+void foo(bar) {
+  var a = 1;
+  if (bar) {
+    a = 2;
+  } else {
+    a = 3;
+  }
+  print(a);
+  print(a);
+}
+""";
+
+const String TEST_TWO = r"""
+void main() {
+  var t = 0;
+  for (var i = 0; i == 0; i = i + 1) {
+    t = t + 10;
+  }
+  print(t);
+}
+""";
+
+const String TEST_THREE = r"""
+foo(b, c, d) {
+  var val = 42;
+  if (b) {
+    c = c && d;
+    if (c) {
+      val = 43;
+    }
+  }
+  return val;
+}
+""";
+
+const String TEST_FOUR = r"""
+foo() {
+  var a = true;
+  var b = false;
+  for (var i = 0; a; i = i + 1) {
+    if (i == 9) a = false;
+    for (var j = 0; b; j = j + 1) {
+      if (j == 9) b = false;
+    }
+  }
+  print(a);
+  print(b);
+}
+""";
+
+const String TEST_FIVE = r"""
+void main() {
+  var hash = 0;
+  for (var i = 0; i == 0; i = i + 1) {
+    hash = hash + 10;
+    hash = hash + 42;
+  }
+  print(t);
+}
+""";
+
+main() {
+  runTests({bool useKernel}) async {
+    await compileAndMatchFuzzy(TEST_ONE, 'foo', "var x = x === true \\? 2 : 3;",
+        useKernel: useKernel);
+    await compileAndMatchFuzzy(TEST_ONE, 'foo', "print\\(x\\);",
+        useKernel: useKernel);
+
+    await compileAndMatchFuzzy(TEST_TWO, 'main', "x \\+= 10",
+        useKernel: useKernel);
+    await compileAndMatchFuzzy(TEST_TWO, 'main', "\\+\\+x",
+        useKernel: useKernel);
+
+    // Check that we don't have 'd = d' (using regexp back references).
+    await compileAndDoNotMatchFuzzy(TEST_THREE, 'foo', '(x) = \1',
+        useKernel: useKernel);
+    await compileAndMatchFuzzy(TEST_THREE, 'foo', 'return x',
+        useKernel: useKernel);
+
+    // Check that a store just after the declaration of the local
+    // only generates one instruction.
+    await compileAndMatchFuzzy(TEST_THREE, 'foo', 'x = 42',
+        useKernel: useKernel);
+
+    await compileAndDoNotMatchFuzzy(TEST_FOUR, 'foo', '(x) = \1;',
+        useKernel: useKernel);
+
+    await compileAndDoNotMatch(TEST_FIVE, 'main', new RegExp('hash0'),
+        useKernel: useKernel);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/static_closure_test.dart b/tests/compiler/dart2js/codegen/static_closure_test.dart
new file mode 100644
index 0000000..67fe7d1
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/static_closure_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that static functions are closurized as expected.
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+import '../compiler_helper.dart';
+
+main() {
+  runTest({bool useKernel}) async {
+    String code = await compileAll(r'''main() { print(main); }''',
+        compileMode: useKernel ? CompileMode.kernel : CompileMode.mock);
+    // At some point, we will have to closurize global functions
+    // differently, at which point this test will break. Then it is time
+    // to implement a way to call a Dart closure from JS foreign
+    // functions.
+
+    // If this test fail, please take a look at the use of
+    // toStringWrapper in captureStackTrace in js_helper.dart.
+    Expect.isTrue(
+        code.contains(
+            new RegExp(r'print\([$A-Z]+\.lib___main\$closure\(\)\);')),
+        code);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    // TODO(johnniwinther): This test only works with the mock compiler.
+    //print('--test from kernel----------------------------------------------');
+    //await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/strength_eq_test.dart b/tests/compiler/dart2js/codegen/strength_eq_test.dart
new file mode 100644
index 0000000..c8d9f29
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/strength_eq_test.dart
@@ -0,0 +1,40 @@
+// 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.
+// Test constant folding on numbers.
+
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String CODE = """
+class A {
+  var link;
+}
+int foo(x) {
+  if (new DateTime.now().millisecondsSinceEpoch == 42) return null;
+  var a = new A();
+  if (new DateTime.now().millisecondsSinceEpoch == 42) return a;
+  a.link = a;
+  return a;
+}
+void main() {
+  var x = foo(0);
+  return x == x.link;
+}
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    // The `==` is strengthened to a HIdentity instruction.  The HIdentity follows
+    // `x.link`, so x cannot be `null`.
+    var compare = new RegExp(r'x === x\.get\$link\(\)');
+    await compileAndMatch(CODE, 'main', compare, useKernel: useKernel);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/string_add_test.dart b/tests/compiler/dart2js/codegen/string_add_test.dart
new file mode 100644
index 0000000..1be733a
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/string_add_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+import '../compiler_helper.dart';
+
+main() {
+  runTest({bool useKernel}) async {
+    String code = await compileAll(r'''main() { return "foo" + "bar"; }''',
+        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+    Expect.isTrue(!code.contains(r'$add'));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/string_escapes_test.dart b/tests/compiler/dart2js/codegen/string_escapes_test.dart
new file mode 100644
index 0000000..14b69d8
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/string_escapes_test.dart
@@ -0,0 +1,84 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+import '../compiler_helper.dart';
+
+// Test that the compiler handles string literals containing line terminators.
+
+main() {
+  runTests({bool useKernel}) async {
+    Future<String> compileExpression(String expression) {
+      var source = "foo() { return $expression; }";
+      return compile(source, entry: "foo", useKernel: useKernel);
+    }
+
+    await compileExpression("''' \n\r\u2028\u2029'''").then((String generated) {
+      Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
+          generated.contains(r"'\r\u2028\u2029'"));
+    });
+    await compileExpression("r''' \n\r\u2028\u2029'''")
+        .then((String generated) {
+      Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
+          generated.contains(r"'\r\u2028\u2029'"));
+    });
+    await compileExpression("r''' \r\n\u2028\u2029'''")
+        .then((String generated) {
+      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
+          generated.contains(r"'\u2028\u2029'"));
+    });
+    await compileExpression("r''' \r\u2028\u2029'''").then((String generated) {
+      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
+          generated.contains(r"'\u2028\u2029'"));
+    });
+    await compileExpression("r''' \n\u2028\u2029'''").then((String generated) {
+      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
+          generated.contains(r"'\u2028\u2029'"));
+    });
+    await compileExpression(
+            "r'''\t\t      \t\t  \t\t  \t \t \n\r\u2028\u2029'''")
+        .then((String generated) {
+      Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
+          generated.contains(r"'\r\u2028\u2029'"));
+    });
+    await compileExpression(
+            "r'''\\\t\\\t \\   \\  \t\\\t  \t \\\n\r\u2028\u2029'''")
+        .then((String generated) {
+      Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
+          generated.contains(r"'\r\u2028\u2029'"));
+    });
+    await compileExpression(
+            "r'''\t\t      \t\t  \t\t  \t \t \\\n\r\u2028\u2029'''")
+        .then((String generated) {
+      Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
+          generated.contains(r"'\r\u2028\u2029'"));
+    });
+    await compileExpression(
+            "r'''\\\t\\\t \\   \\  \t\\\t   \\\r\n\u2028\u2029'''")
+        .then((String generated) {
+      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
+          generated.contains(r"'\u2028\u2029'"));
+    });
+    await compileExpression(
+            "r'''\\\t\\\t \\   \\  \t\\\t   \\\r\u2028\u2029'''")
+        .then((String generated) {
+      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
+          generated.contains(r"'\u2028\u2029'"));
+    });
+    await compileExpression("'\u2028\u2029'").then((String generated) {
+      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
+          generated.contains(r"'\u2028\u2029'"));
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    // TODO(johnniwinther): This test doesn't work with kernel.
+    //print('--test from kernel----------------------------------------------');
+    //await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/string_interpolation_test.dart b/tests/compiler/dart2js/codegen/string_interpolation_test.dart
new file mode 100644
index 0000000..13cbbfa
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/string_interpolation_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+import '../compiler_helper.dart';
+
+main() {
+  runTests({bool useKernel}) async {
+    CompileMode compileMode =
+        useKernel ? CompileMode.kernel : CompileMode.memory;
+
+    String code1 = await compileAll(
+        r'''main() { return "${2}${true}${'a'}${3.14}"; }''',
+        compileMode: compileMode);
+    Expect.isTrue(code1.contains(r'2truea3.14'));
+
+    String code2 = await compileAll(
+        r'''main() { return "foo ${new Object()}"; }''',
+        compileMode: compileMode);
+    Expect.isFalse(code2.contains(r'$add'));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/switch_empty_default_test.dart b/tests/compiler/dart2js/codegen/switch_empty_default_test.dart
similarity index 70%
rename from tests/compiler/dart2js/switch_empty_default_test.dart
rename to tests/compiler/dart2js/codegen/switch_empty_default_test.dart
index cbddf01..1250ef7 100644
--- a/tests/compiler/dart2js/switch_empty_default_test.dart
+++ b/tests/compiler/dart2js/codegen/switch_empty_default_test.dart
@@ -3,9 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test constant folding on numbers.
 
-import 'dart:async';
 import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String SIMPLY_EMPTY = """
 int foo(x) => x;
@@ -120,12 +119,19 @@
   var defOrCase3 = new RegExp(r"(default:|case 3):");
   var case3 = new RegExp(r"case 3:");
 
-  asyncTest(() => Future.wait([
-        compileAndDoNotMatch(SIMPLY_EMPTY, 'main', def),
-        compileAndDoNotMatch(TOTAL, 'main', defOrCase3),
-        compileAndDoNotMatch(OPTIMIZED, 'main', def),
-        compileAndMatch(LABEL, 'main', case3),
-        compileAndMatch(DEFLABEL, 'main', def),
-        compileAndMatch(EMPTYDEFLABEL, 'main', def),
-      ]));
+  runTests({bool useKernel}) async {
+    await compileAndDoNotMatch(SIMPLY_EMPTY, 'main', def, useKernel: useKernel);
+    await compileAndDoNotMatch(TOTAL, 'main', defOrCase3, useKernel: useKernel);
+    await compileAndDoNotMatch(OPTIMIZED, 'main', def, useKernel: useKernel);
+    await compileAndMatch(LABEL, 'main', case3, useKernel: useKernel);
+    await compileAndMatch(DEFLABEL, 'main', def, useKernel: useKernel);
+    await compileAndMatch(EMPTYDEFLABEL, 'main', def, useKernel: useKernel);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
 }
diff --git a/tests/compiler/dart2js/tdiv_test.dart b/tests/compiler/dart2js/codegen/tdiv_test.dart
similarity index 69%
rename from tests/compiler/dart2js/tdiv_test.dart
rename to tests/compiler/dart2js/codegen/tdiv_test.dart
index 73b6ecf..f894754 100644
--- a/tests/compiler/dart2js/tdiv_test.dart
+++ b/tests/compiler/dart2js/codegen/tdiv_test.dart
@@ -6,7 +6,7 @@
 
 import 'dart:async';
 import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST1 = r"""
 foo(param) {
@@ -61,15 +61,25 @@
 """;
 
 main() {
-  Future check(String test) {
-    return compile(test, entry: 'foo', check: checkerForAbsentPresent(test));
+  runTests({bool useKernel}) async {
+    Future check(String test) {
+      return compile(test,
+          entry: 'foo',
+          useKernel: useKernel,
+          check: checkerForAbsentPresent(test));
+    }
+
+    await check(TEST1);
+    await check(TEST2);
+    await check(TEST3);
+    await check(TEST4);
+    await check(TEST5);
   }
 
-  asyncTest(() => Future.wait([
-        check(TEST1),
-        check(TEST2),
-        check(TEST3),
-        check(TEST4),
-        check(TEST5),
-      ]));
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
 }
diff --git a/tests/compiler/dart2js/codegen/top_level_closure_tree_shake_test.dart b/tests/compiler/dart2js/codegen/top_level_closure_tree_shake_test.dart
new file mode 100644
index 0000000..277c631
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/top_level_closure_tree_shake_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String TEST_ONE = r"""
+main() {
+  var f = use;
+  if (false) {
+    // This statement and the use of 'foo' should be optimized away, causing
+    // 'foo' to be absent from the final code.
+    f(foo);
+  }
+  f(bar);
+}
+
+foo() => 'Tarantula!';
+bar() => 'Coelacanth!';
+
+use(x) {
+  print(x());
+}
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    String generated = await compileAll(TEST_ONE,
+        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+    Expect.isFalse(generated.contains('Tarantula!'), "failed to remove 'foo'");
+    Expect.isTrue(generated.contains('Coelacanth!'));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/tree_shaking_test.dart b/tests/compiler/dart2js/codegen/tree_shaking_test.dart
new file mode 100644
index 0000000..4d47a5f
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/tree_shaking_test.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+import '../compiler_helper.dart';
+
+const String TEST = r"""
+class A {
+  foo() => bar();
+  bar() => 42;
+}
+class B extends A {
+  bar() => 54;
+}
+class C implements A {
+  bar() => 68;
+}
+main() {
+  new A();
+  new B();
+  new C();
+  new A().foo();
+}
+""";
+
+void main() {
+  runTest({bool useKernel}) async {
+    String generated = await compileAll(TEST,
+        compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+    Expect.isTrue(generated.contains('return 42'));
+    Expect.isTrue(generated.contains('return 54'));
+    Expect.isFalse(generated.contains('return 68'));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/trust_type_annotations2_test.dart b/tests/compiler/dart2js/codegen/trust_type_annotations2_test.dart
new file mode 100644
index 0000000..40e7651
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/trust_type_annotations2_test.dart
@@ -0,0 +1,48 @@
+// 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:expect/expect.dart';
+import "package:async_helper/async_helper.dart";
+import 'package:compiler/src/commandline_options.dart';
+import '../memory_compiler.dart';
+
+const MEMORY_SOURCE_FILES = const {
+  'main.dart': '''
+
+foo(int x, int y) {
+  return x + y;
+}
+
+main (x, y) {
+  if (x != null) {
+    if (y != null) {
+      return foo(x, y);
+    }
+  }
+}
+''',
+};
+
+main() {
+  runTest({bool useKernel}) async {
+    var options = [Flags.trustTypeAnnotations];
+    if (useKernel) {
+      options.add(Flags.useKernel);
+    }
+    var result = await runCompiler(
+        memorySourceFiles: MEMORY_SOURCE_FILES, options: options);
+    var compiler = result.compiler;
+    var element =
+        compiler.backendClosedWorldForTesting.elementEnvironment.mainFunction;
+    var code = compiler.backend.getGeneratedCode(element);
+    Expect.isTrue(code.contains('+'), code);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart b/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart
new file mode 100644
index 0000000..1f09909
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart
@@ -0,0 +1,97 @@
+// 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:expect/expect.dart';
+import "package:async_helper/async_helper.dart";
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/elements/entities.dart';
+import '../compiler_helper.dart';
+import '../memory_compiler.dart';
+
+const String TEST = """
+class A {
+  int aField;
+
+  A(this.aField);
+
+  // Test return type annotation.
+  int foo(a) => a;
+  // Test parameter type annotation.
+  faa (int a) => a;
+  // Test annotations on locals.
+  baz(x) {
+    int y = x;
+    return y;
+  }
+  // Test tear-off closure type annotations.
+  int bar(x) => x;
+  int tear(x) {
+    var torn = bar;
+    // Have torn escape through closure to disable tracing.
+    var fail = (() => torn)();
+    return fail(x);
+  }
+}
+
+main () {
+  var a = new A("42");
+  print(a.aField);
+  print(a.foo("42"));
+  print(a.foo(42));
+  print(a.faa("42"));
+  print(a.faa(42));
+  print(a.baz("42"));
+  print(a.baz(42));
+  // Test trusting types of tear off closures.
+  print(a.tear("42"));
+  print(a.tear(42));
+}
+""";
+
+void main() {
+  runTest({bool useKernel}) async {
+    var options = [Flags.trustTypeAnnotations];
+    if (useKernel) {
+      options.add(Flags.useKernel);
+    }
+    var result = await runCompiler(
+        memorySourceFiles: {'main.dart': TEST}, options: options);
+    var compiler = result.compiler;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
+    var closedWorld = typesInferrer.closedWorld;
+    var elementEnvironment = closedWorld.elementEnvironment;
+
+    ClassEntity classA =
+        elementEnvironment.lookupClass(elementEnvironment.mainLibrary, "A");
+
+    checkReturn(String name, TypeMask type) {
+      MemberEntity element = elementEnvironment.lookupClassMember(classA, name);
+      var mask = typesInferrer.getReturnTypeOfMember(element);
+      Expect.isTrue(type.containsMask(mask, closedWorld));
+    }
+
+    checkType(String name, type) {
+      MemberEntity element = elementEnvironment.lookupClassMember(classA, name);
+      Expect.isTrue(type.containsMask(
+          typesInferrer.getTypeOfMember(element), closedWorld));
+    }
+
+    var intMask =
+        new TypeMask.subtype(closedWorld.commonElements.intClass, closedWorld);
+
+    checkReturn('foo', intMask);
+    checkReturn('faa', intMask);
+    checkType('aField', intMask);
+    checkReturn('bar', intMask);
+    checkReturn('baz', intMask);
+    checkReturn('tear', intMask);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/type_guard_unuser_test.dart b/tests/compiler/dart2js/codegen/type_guard_unuser_test.dart
new file mode 100644
index 0000000..43bd9e8
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/type_guard_unuser_test.dart
@@ -0,0 +1,78 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String TEST_ONE = r"""
+foo(a) {
+  int b = foo(true);
+  if (a) b = foo(2);
+  return b;
+}
+""";
+
+const String TEST_TWO = r"""
+bar(a) {}
+foo(d) {
+  int a = 1;
+  int c = foo(1);
+  if (true) {}
+  return a + c;
+}
+""";
+
+const String TEST_THREE = r"""
+foo(int a, int b) {
+  return 0 + a + b;
+}
+""";
+
+const String TEST_THREE_WITH_BAILOUT = r"""
+foo(int a, int b) {
+  var t;
+  for (int i = 0; i < 1; i++) {
+    t = 0 + a + b;
+  }
+  return t;
+}
+""";
+
+main() {
+  runTests({bool useKernel}) async {
+    await compile(TEST_ONE, entry: 'foo', check: (String generated) {
+      RegExp regexp = new RegExp(getIntTypeCheck(anyIdentifier));
+      Iterator<Match> matches = regexp.allMatches(generated).iterator;
+      checkNumberOfMatches(matches, 0);
+      Expect.isTrue(generated.contains(
+          new RegExp(r'return a === true \? [$A-Z]+\.foo\(2\) : b;')));
+    });
+    await compile(TEST_TWO, entry: 'foo', check: (String generated) {
+      RegExp regexp = new RegExp("foo\\(1\\)");
+      Iterator<Match> matches = regexp.allMatches(generated).iterator;
+      checkNumberOfMatches(matches, 1);
+    });
+    await compile(TEST_THREE, entry: 'foo', check: (String generated) {
+      RegExp regexp = new RegExp(getNumberTypeCheck('a'));
+      Expect.isTrue(regexp.hasMatch(generated));
+      regexp = new RegExp(getNumberTypeCheck('b'));
+      Expect.isTrue(regexp.hasMatch(generated));
+    });
+    await compile(TEST_THREE_WITH_BAILOUT, entry: 'foo',
+        check: (String generated) {
+      RegExp regexp = new RegExp(getNumberTypeCheck('a'));
+      Expect.isTrue(regexp.hasMatch(generated));
+      regexp = new RegExp(getNumberTypeCheck('b'));
+      Expect.isTrue(regexp.hasMatch(generated));
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/type_inference2_test.dart b/tests/compiler/dart2js/codegen/type_inference2_test.dart
new file mode 100644
index 0000000..60b8899
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/type_inference2_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String TEST_ONE = r"""
+sum(param0, param1) {
+  var sum = 0;
+  for (var i = param0; i < param1; i += 1) sum = sum + i;
+  return sum;
+}
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    await compileAndMatchFuzzy(TEST_ONE, 'sum', r"\+\+x", useKernel: useKernel);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/type_inference3_test.dart b/tests/compiler/dart2js/codegen/type_inference3_test.dart
new file mode 100644
index 0000000..1173171
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/type_inference3_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String TEST_ONE = r"""
+sum(param0, param1) {
+  var sum = 0;
+  for (var i = param0; i < param1; i += 1) sum = sum + i;
+  return sum;
+}
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    await compile(TEST_ONE, entry: 'sum', useKernel: useKernel,
+        check: (String generated) {
+      RegExp regexp = new RegExp(getNumberTypeCheck('(param1|b)'));
+      Expect.isTrue(regexp.hasMatch(generated));
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/type_inference4_test.dart b/tests/compiler/dart2js/codegen/type_inference4_test.dart
new file mode 100644
index 0000000..300826d
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/type_inference4_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String TEST_ONE = r"""
+foo(j) {
+  var array = [1, 2, 3];
+  if (j < 0) j = 0;
+  for (var i = j; i < 3; i++) {
+    array[i];
+  }
+}
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      // Test for absence of an illegal argument exception. This means that the
+      // arguments are known to be integers.
+      Expect.isFalse(generated.contains('iae'));
+      // Also make sure that we are not just in bailout mode without speculative
+      // types by grepping for the integer-bailout check on argument j.
+      RegExp regexp = new RegExp(getIntTypeCheck('[aji]'));
+      Expect.isTrue(regexp.hasMatch(generated));
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/type_inference5_test.dart b/tests/compiler/dart2js/codegen/type_inference5_test.dart
new file mode 100644
index 0000000..3e43f2b
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/type_inference5_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import '../compiler_helper.dart';
+
+const String TEST_ONE = r"""
+foo(j) {
+  var a = [1, 2, 3];
+  for (var i = j; i < 3; i++) {
+    a[i];
+  }
+}
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    await compile(TEST_ONE, entry: 'foo', useKernel: useKernel,
+        check: (String generated) {
+      // Test for absence of an illegal argument exception. This means that the
+      // arguments are known to be integers.
+      Expect.isFalse(generated.contains('iae'));
+      // Also make sure that we are not just in bailout mode without speculative
+      // types by grepping for the integer-bailout check on argument j.
+      var argname = new RegExp(r'function(?: [a-z]+)?\(([a-zA-Z0-9_]+)\)')
+          .firstMatch(generated)[1];
+      print(argname);
+      RegExp regexp = new RegExp(getIntTypeCheck("(i|$argname)"));
+      Expect.isTrue(regexp.hasMatch(generated));
+    });
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/types_of_captured_variables_test.dart b/tests/compiler/dart2js/codegen/types_of_captured_variables_test.dart
new file mode 100644
index 0000000..02d60de
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/types_of_captured_variables_test.dart
@@ -0,0 +1,62 @@
+// 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 '../compiler_helper.dart';
+
+const String TEST1 = r"""
+main() {
+  var a = 52;
+  var f = () => a + 87;
+  f();
+}
+""";
+
+const String TEST2 = r"""
+main() {
+  var a = 52;
+  var g = () { a = 48; };
+  var f = () => a + 87;
+  f();
+  g();
+}
+""";
+
+const String TEST3 = r"""
+main() {
+  var a = 52;
+  var g = () { a = 'foo'; };
+  var f = () => a + 87;
+  f();
+  g();
+}
+""";
+
+main() {
+  runTests({bool useKernel}) async {
+    CompileMode compileMode =
+        useKernel ? CompileMode.kernel : CompileMode.memory;
+
+    // Test that we know the type of captured, non-mutated variables.
+    String generated1 = await compileAll(TEST1, compileMode: compileMode);
+    Expect.isTrue(generated1.contains('+ 87'));
+
+    // Test that we know the type of captured, mutated variables.
+    String generated2 = await compileAll(TEST2, compileMode: compileMode);
+    Expect.isTrue(generated2.contains('+ 87'));
+
+    // Test that we know when types of a captured, mutated variable
+    // conflict.
+    String generated3 = await compileAll(TEST3, compileMode: compileMode);
+    Expect.isFalse(generated3.contains('+ 87'));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/unused_empty_map_test.dart b/tests/compiler/dart2js/codegen/unused_empty_map_test.dart
similarity index 62%
rename from tests/compiler/dart2js/unused_empty_map_test.dart
rename to tests/compiler/dart2js/codegen/unused_empty_map_test.dart
index 62e6e06..0b52c0c 100644
--- a/tests/compiler/dart2js/unused_empty_map_test.dart
+++ b/tests/compiler/dart2js/codegen/unused_empty_map_test.dart
@@ -4,10 +4,11 @@
 
 // Ensure that unused empty HashMap nodes are dropped from the output.
 
-import 'package:expect/expect.dart';
-import 'package:compiler/compiler_new.dart';
 import 'package:async_helper/async_helper.dart';
-import 'memory_compiler.dart';
+import 'package:compiler/compiler_new.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:expect/expect.dart';
+import '../memory_compiler.dart';
 
 const TEST_SOURCE = const {
   "main.dart": r"""
@@ -21,11 +22,20 @@
 const HASHMAP_EMPTY_CONSTRUCTOR = r"LinkedHashMap_LinkedHashMap$_empty";
 
 main() {
-  asyncTest(() async {
+  runTest({bool useKernel}) async {
     var collector = new OutputCollector();
     await runCompiler(
-        memorySourceFiles: TEST_SOURCE, outputProvider: collector);
+        memorySourceFiles: TEST_SOURCE,
+        outputProvider: collector,
+        options: useKernel ? [Flags.useKernel] : []);
     String generated = collector.getOutput('', OutputType.js);
     Expect.isFalse(generated.contains(HASHMAP_EMPTY_CONSTRUCTOR));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
   });
 }
diff --git a/tests/compiler/dart2js/codegen/use_checks_test.dart b/tests/compiler/dart2js/codegen/use_checks_test.dart
new file mode 100644
index 0000000..7647e8f
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/use_checks_test.dart
@@ -0,0 +1,45 @@
+// 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:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:expect/expect.dart';
+import '../memory_compiler.dart';
+
+const MEMORY_SOURCE_FILES = const {
+  'main.dart': '''
+main (x, y) {
+  if (x != null) {
+    if (y != null) {
+      // Forces x and y to be int-checked.
+      int a = x;
+      int b = y;
+      // Now we must be able to do a direct "+" operation in JS.
+      return x + y;
+    }
+  }
+}
+''',
+};
+
+main() {
+  runTest({bool useKernel}) async {
+    var options = [Flags.enableCheckedMode];
+    if (useKernel) options.add(Flags.useKernel);
+    var result = await runCompiler(
+        memorySourceFiles: MEMORY_SOURCE_FILES, options: options);
+    var compiler = result.compiler;
+    var element =
+        compiler.backendClosedWorldForTesting.elementEnvironment.mainFunction;
+    var code = compiler.backend.getGeneratedCode(element);
+    Expect.isTrue(code.contains('+'), code);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/use_strict_test.dart b/tests/compiler/dart2js/codegen/use_strict_test.dart
similarity index 76%
rename from tests/compiler/dart2js/use_strict_test.dart
rename to tests/compiler/dart2js/codegen/use_strict_test.dart
index 4e86dbb..b11d254 100644
--- a/tests/compiler/dart2js/use_strict_test.dart
+++ b/tests/compiler/dart2js/codegen/use_strict_test.dart
@@ -4,8 +4,9 @@
 
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/compiler_new.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:expect/expect.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 // Use strict does not allow parameters or locals named "arguments" or "eval".
 
@@ -47,10 +48,12 @@
 };
 
 main() {
-  OutputCollector collector = new OutputCollector();
-  asyncTest(() async {
+  runTest({bool useKernel}) async {
+    OutputCollector collector = new OutputCollector();
     await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES, outputProvider: collector);
+        memorySourceFiles: MEMORY_SOURCE_FILES,
+        outputProvider: collector,
+        options: useKernel ? [Flags.useKernel] : []);
     String jsOutput = collector.getOutput('', OutputType.js);
 
     // Skip comments.
@@ -64,5 +67,12 @@
     // 'arguments'.
     RegExp re = new RegExp(r'[^\w$](arguments|eval)[^\w$]');
     Expect.isFalse(re.hasMatch(filtered));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
   });
 }
diff --git a/tests/compiler/dart2js/value_range2_test.dart b/tests/compiler/dart2js/codegen/value_range2_test.dart
similarity index 100%
rename from tests/compiler/dart2js/value_range2_test.dart
rename to tests/compiler/dart2js/codegen/value_range2_test.dart
diff --git a/tests/compiler/dart2js/codegen/value_range3_test.dart b/tests/compiler/dart2js/codegen/value_range3_test.dart
new file mode 100644
index 0000000..9296662
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/value_range3_test.dart
@@ -0,0 +1,44 @@
+// 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.
+
+// Test that global analysis in dart2js propagates positive integers.
+
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:expect/expect.dart';
+import '../memory_compiler.dart';
+
+const MEMORY_SOURCE_FILES = const {
+  'main.dart': '''
+
+var a = [42];
+
+main() {
+  var value = a[0];
+  if (value < 42) {
+    return new List(42)[value];
+  }
+}
+''',
+};
+
+main() {
+  runTest({bool useKernel}) async {
+    var result = await runCompiler(
+        memorySourceFiles: MEMORY_SOURCE_FILES,
+        options: useKernel ? [Flags.useKernel] : []);
+    var compiler = result.compiler;
+    var element =
+        compiler.backendClosedWorldForTesting.elementEnvironment.mainFunction;
+    var code = compiler.backend.getGeneratedCode(element);
+    Expect.isFalse(code.contains('ioore'));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/value_range_kernel_test.dart b/tests/compiler/dart2js/codegen/value_range_kernel_test.dart
new file mode 100644
index 0000000..1e133d6
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/value_range_kernel_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:async_helper/async_helper.dart';
+import 'value_range_test_helper.dart';
+
+main() {
+  asyncTest(() async {
+    // AST part tested in 'value_range_test.dart'.
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/value_range_test.dart b/tests/compiler/dart2js/codegen/value_range_test.dart
new file mode 100644
index 0000000..e03aa79
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/value_range_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:async_helper/async_helper.dart';
+import 'value_range_test_helper.dart';
+
+main() {
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    // Kernel part tested in 'value_range_kernel_test.dart'.
+  });
+}
diff --git a/tests/compiler/dart2js/value_range_test.dart b/tests/compiler/dart2js/codegen/value_range_test_helper.dart
similarity index 88%
rename from tests/compiler/dart2js/value_range_test.dart
rename to tests/compiler/dart2js/codegen/value_range_test_helper.dart
index fe7c1de..c486048 100644
--- a/tests/compiler/dart2js/value_range_test.dart
+++ b/tests/compiler/dart2js/codegen/value_range_test_helper.dart
@@ -1,11 +1,10 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
 import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const int REMOVED = 0;
 const int ABOVE_ZERO = 1;
@@ -242,11 +241,8 @@
   BELOW_ZERO_CHECK,
 ];
 
-// TODO(ahe): It would probably be better if this test used the real
-// core library sources, as its purpose is to detect failure to
-// optimize fixed-sized arrays.
-Future expect(String code, int kind) {
-  return compile(code, check: (String generated) {
+Future expect(String code, int kind, {bool useKernel}) {
+  return compile(code, useKernel: useKernel, check: (String generated) {
     switch (kind) {
       case REMOVED:
         Expect.isTrue(!generated.contains('ioore'));
@@ -287,14 +283,8 @@
   });
 }
 
-main() {
-  int i = 0;
-  Future testNext() {
-    return expect(TESTS[i], TESTS[i + 1]).then((_) {
-      i += 2;
-      if (i < TESTS.length) return testNext();
-    });
+runTests({bool useKernel}) async {
+  for (int i = 0; i < TESTS.length; i += 2) {
+    await expect(TESTS[i], TESTS[i + 1], useKernel: useKernel);
   }
-
-  asyncTest(() => testNext());
 }
diff --git a/tests/compiler/dart2js/codegen_helper.dart b/tests/compiler/dart2js/codegen_helper.dart
deleted file mode 100644
index a5f37bc..0000000
--- a/tests/compiler/dart2js/codegen_helper.dart
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:compiler/src/options.dart' show CompilerOptions;
-import 'package:compiler/src/null_compiler_output.dart';
-import 'memory_source_file_helper.dart';
-
-Future<Map<String, String>> generate(String code,
-    [List<String> options = const []]) {
-  Uri script = currentDirectory.resolveUri(Platform.script);
-  Uri libraryRoot = script.resolve('../../../sdk/');
-  Uri packageRoot = script.resolve('./packages/');
-
-  var provider = new MemorySourceFileProvider({'main.dart': code});
-  var handler = new FormattingDiagnosticHandler(provider);
-
-  Uri uri = Uri.parse('memory:main.dart');
-  CompilerImpl compiler = new CompilerImpl(
-      provider,
-      const NullCompilerOutput(),
-      handler,
-      new CompilerOptions.parse(
-          entryPoint: uri,
-          libraryRoot: libraryRoot,
-          packageRoot: packageRoot,
-          options: options));
-  return compiler.run(uri).then((success) {
-    Expect.isTrue(success);
-    Map<String, String> result = new Map<String, String>();
-    var backend = compiler.backend;
-    for (dynamic element in backend.generatedCode.keys) {
-      if (element.compilationUnit.script.readableUri != uri) continue;
-      var name = element.name;
-      var code = backend.getGeneratedCode(element);
-      result[name] = code;
-    }
-    return result;
-  });
-}
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index 9462622..05f79fd 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -16,12 +16,8 @@
 export 'package:compiler/src/elements/elements.dart';
 
 import 'package:compiler/src/js_backend/js_backend.dart' as js;
-import 'package:compiler/src/js_backend/element_strategy.dart'
-    show ElementCodegenWorkItem;
 
 import 'package:compiler/src/commandline_options.dart';
-import 'package:compiler/src/common/codegen.dart';
-import 'package:compiler/src/common/resolution.dart';
 
 export 'package:compiler/src/diagnostics/messages.dart';
 export 'package:compiler/src/diagnostics/source_span.dart';
@@ -38,17 +34,17 @@
 
 export 'package:compiler/src/tree/tree.dart';
 
-import 'mock_compiler.dart';
-export 'mock_compiler.dart';
+import 'old_frontend/mock_compiler.dart';
+export 'old_frontend/mock_compiler.dart';
 
-import 'memory_compiler.dart' hide compilerFor;
+import 'memory_compiler.dart';
 
 import 'output_collector.dart';
 export 'output_collector.dart';
 
 enum CompileMode { mock, memory, kernel }
 
-/// Compile [code] and returns either the code for [entry] or, if [returnAll] is
+/// Compile [code] and returns either the code for [methodName] or, if [returnAll] is
 /// true, the code for the entire program.
 ///
 /// If [check] is provided, it is executed on the code for [entry] before
@@ -56,97 +52,61 @@
 /// compilation, otherwise the memory compiler is used.
 Future<String> compile(String code,
     {String entry: 'main',
+    String methodName,
     bool enableTypeAssertions: false,
     bool minify: false,
     bool analyzeAll: false,
     bool disableInlining: true,
     bool trustJSInteropTypeAnnotations: false,
-    CompileMode compileMode: CompileMode.memory,
+    bool useKernel: false,
     void check(String generatedEntry),
     bool returnAll: false}) async {
   OutputCollector outputCollector = returnAll ? new OutputCollector() : null;
-  if (compileMode == CompileMode.mock) {
-    // TODO(johnniwinther): Remove this when no longer needed by
-    // `arithmetic_simplication_test.dart`.
-    MockCompiler compiler = new MockCompiler.internal(
-        enableTypeAssertions: enableTypeAssertions,
-        // Type inference does not run when manually
-        // compiling a method.
-        disableTypeInference: true,
-        enableMinification: minify,
-        disableInlining: disableInlining,
-        trustJSInteropTypeAnnotations: trustJSInteropTypeAnnotations,
-        outputProvider: outputCollector);
-    await compiler.init();
-    compiler.parseScript(code);
-    ElementEnvironment elementEnvironment =
-        compiler.frontendStrategy.elementEnvironment;
-    MethodElement element = compiler.mainApp.find(entry);
-    if (element == null) return null;
-    compiler.phase = Compiler.PHASE_RESOLVING;
-    compiler.processQueue(elementEnvironment, compiler.enqueuer.resolution,
-        element, compiler.libraryLoader.libraries);
-    ResolutionWorkItem resolutionWork =
-        new ResolutionWorkItem(compiler.resolution, element);
-    resolutionWork.run();
-    ClosedWorld closedWorld = compiler.closeResolution(element).closedWorld;
-    CodegenWorkItem work =
-        new ElementCodegenWorkItem(compiler.backend, closedWorld, element);
-    compiler.phase = Compiler.PHASE_COMPILING;
-    work.run();
-    js.JavaScriptBackend backend = compiler.backend;
-    String generated = backend.getGeneratedCode(element);
-    if (check != null) {
-      check(generated);
-    }
-    return returnAll ? outputCollector.getOutput('', OutputType.js) : generated;
-  } else {
-    List<String> options = <String>[Flags.disableTypeInference];
-    if (enableTypeAssertions) {
-      options.add(Flags.enableCheckedMode);
-    }
-    if (minify) {
-      options.add(Flags.minify);
-    }
-    if (analyzeAll) {
-      options.add(Flags.analyzeAll);
-    }
-    if (trustJSInteropTypeAnnotations) {
-      options.add(Flags.trustJSInteropTypeAnnotations);
-    }
-    if (compileMode == CompileMode.kernel) {
-      options.add(Flags.useKernel);
-    }
-
-    if (disableInlining) {
-      options.add(Flags.disableInlining);
-    }
-
-    Map<String, String> source;
-    if (entry != 'main') {
-      source = {'main.dart': "$code\n\nmain() => $entry;"};
-    } else {
-      source = {'main.dart': code};
-    }
-
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: source,
-        options: options,
-        outputProvider: outputCollector);
-    Expect.isTrue(result.isSuccess);
-    Compiler compiler = result.compiler;
-    ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
-    ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
-    LibraryEntity mainLibrary = elementEnvironment.mainLibrary;
-    FunctionEntity element =
-        elementEnvironment.lookupLibraryMember(mainLibrary, entry);
-    js.JavaScriptBackend backend = compiler.backend;
-    String generated = backend.getGeneratedCode(element);
-    if (check != null) {
-      check(generated);
-    }
-    return returnAll ? outputCollector.getOutput('', OutputType.js) : generated;
+  List<String> options = <String>[Flags.disableTypeInference];
+  if (enableTypeAssertions) {
+    options.add(Flags.enableCheckedMode);
   }
+  if (minify) {
+    options.add(Flags.minify);
+  }
+  if (analyzeAll) {
+    options.add(Flags.analyzeAll);
+  }
+  if (trustJSInteropTypeAnnotations) {
+    options.add(Flags.trustJSInteropTypeAnnotations);
+  }
+  if (useKernel) {
+    options.add(Flags.useKernel);
+  }
+  if (disableInlining) {
+    options.add(Flags.disableInlining);
+  }
+
+  Map<String, String> source;
+  methodName ??= entry;
+  if (entry != 'main') {
+    source = {'main.dart': "$code\n\nmain() => $entry;"};
+  } else {
+    source = {'main.dart': code};
+  }
+
+  CompilationResult result = await runCompiler(
+      memorySourceFiles: source,
+      options: options,
+      outputProvider: outputCollector);
+  Expect.isTrue(result.isSuccess);
+  Compiler compiler = result.compiler;
+  ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+  ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
+  LibraryEntity mainLibrary = elementEnvironment.mainLibrary;
+  FunctionEntity element =
+      elementEnvironment.lookupLibraryMember(mainLibrary, methodName);
+  js.JavaScriptBackend backend = compiler.backend;
+  String generated = backend.getGeneratedCode(element);
+  if (check != null) {
+    check(generated);
+  }
+  return returnAll ? outputCollector.getOutput('', OutputType.js) : generated;
 }
 
 Future<String> compileAll(String code,
@@ -155,32 +115,62 @@
     bool trustTypeAnnotations: false,
     bool minify: false,
     int expectedErrors,
-    int expectedWarnings}) {
-  Uri uri = new Uri(scheme: 'source');
+    int expectedWarnings,
+    CompileMode compileMode: CompileMode.mock}) async {
   OutputCollector outputCollector = new OutputCollector();
-  MockCompiler compiler = compilerFor(code, uri,
-      coreSource: coreSource,
-      disableInlining: disableInlining,
-      minify: minify,
-      expectedErrors: expectedErrors,
-      trustTypeAnnotations: trustTypeAnnotations,
-      expectedWarnings: expectedWarnings,
-      outputProvider: outputCollector);
-  compiler.diagnosticHandler = createHandler(compiler, code);
-  return compiler.run(uri).then((compilationSucceded) {
+  if (compileMode == CompileMode.mock) {
+    Uri uri = new Uri(scheme: 'source');
+    MockCompiler compiler = mockCompilerFor(code, uri,
+        coreSource: coreSource,
+        disableInlining: disableInlining,
+        minify: minify,
+        expectedErrors: expectedErrors,
+        trustTypeAnnotations: trustTypeAnnotations,
+        expectedWarnings: expectedWarnings,
+        outputProvider: outputCollector);
+    compiler.diagnosticHandler = createHandler(compiler, code);
+    bool compilationSucceeded = await compiler.run(uri);
     Expect.isTrue(
-        compilationSucceded,
+        compilationSucceeded,
         'Unexpected compilation error(s): '
         '${compiler.diagnosticCollector.errors}');
-    return outputCollector.getOutput('', OutputType.js);
-  });
+  } else {
+    DiagnosticCollector diagnosticCollector = new DiagnosticCollector();
+    if (coreSource != null) {
+      throw new UnsupportedError(
+          'coreSource is not supported for $compileMode');
+    }
+    List<String> options = <String>[];
+    if (disableInlining) {
+      options.add(Flags.disableInlining);
+    }
+    if (trustTypeAnnotations) {
+      options.add(Flags.trustTypeAnnotations);
+    }
+    if (minify) {
+      options.add(Flags.minify);
+    }
+    if (compileMode == CompileMode.kernel) {
+      options.add(Flags.useKernel);
+    }
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: {'main.dart': code},
+        options: options,
+        outputProvider: outputCollector,
+        diagnosticHandler: diagnosticCollector);
+    Expect.isTrue(
+        result.isSuccess,
+        'Unexpected compilation error(s): '
+        '${diagnosticCollector.errors}');
+  }
+  return outputCollector.getOutput('', OutputType.js);
 }
 
 Future analyzeAndCheck(
     String code, String name, check(MockCompiler compiler, Element element),
     {int expectedErrors, int expectedWarnings}) {
   Uri uri = new Uri(scheme: 'source');
-  MockCompiler compiler = compilerFor(code, uri,
+  MockCompiler compiler = mockCompilerFor(code, uri,
       expectedErrors: expectedErrors,
       expectedWarnings: expectedWarnings,
       analyzeOnly: true);
@@ -196,7 +186,7 @@
   Uri mainUri = base.resolve('main.dart');
   String mainCode = sources['main.dart'];
   Expect.isNotNull(mainCode, 'No source code found for "main.dart"');
-  MockCompiler compiler = compilerFor(mainCode, mainUri);
+  MockCompiler compiler = mockCompilerFor(mainCode, mainUri);
   sources.forEach((String path, String code) {
     if (path == 'main.dart') return;
     compiler.registerSource(base.resolve(path), code);
@@ -239,8 +229,8 @@
 }
 
 Future compileAndMatch(String code, String entry, RegExp regexp,
-    {CompileMode compileMode: CompileMode.memory}) {
-  return compile(code, entry: entry, compileMode: compileMode,
+    {bool useKernel: false}) {
+  return compile(code, entry: entry, useKernel: useKernel,
       check: (String generated) {
     Expect.isTrue(
         regexp.hasMatch(generated), '"$generated" does not match /$regexp/');
@@ -248,8 +238,8 @@
 }
 
 Future compileAndDoNotMatch(String code, String entry, RegExp regexp,
-    {CompileMode compileMode: CompileMode.memory}) {
-  return compile(code, entry: entry, compileMode: compileMode,
+    {bool useKernel: false}) {
+  return compile(code, entry: entry, useKernel: useKernel,
       check: (String generated) {
     Expect.isFalse(
         regexp.hasMatch(generated), '"$generated" has a match in /$regexp/');
@@ -260,17 +250,22 @@
 
 // Does a compile and then a match where every 'x' is replaced by something
 // that matches any variable, and every space is optional.
-Future compileAndMatchFuzzy(String code, String entry, String regexp) {
-  return compileAndMatchFuzzyHelper(code, entry, regexp, true);
+Future compileAndMatchFuzzy(String code, String entry, String regexp,
+    {bool useKernel: false}) {
+  return compileAndMatchFuzzyHelper(code, entry, regexp,
+      shouldMatch: true, useKernel: useKernel);
 }
 
-Future compileAndDoNotMatchFuzzy(String code, String entry, String regexp) {
-  return compileAndMatchFuzzyHelper(code, entry, regexp, false);
+Future compileAndDoNotMatchFuzzy(String code, String entry, String regexp,
+    {bool useKernel: false}) {
+  return compileAndMatchFuzzyHelper(code, entry, regexp,
+      shouldMatch: false, useKernel: useKernel);
 }
 
-Future compileAndMatchFuzzyHelper(
-    String code, String entry, String regexp, bool shouldMatch) {
-  return compile(code, entry: entry, check: (String generated) {
+Future compileAndMatchFuzzyHelper(String code, String entry, String regexp,
+    {bool shouldMatch, bool useKernel: false}) {
+  return compile(code, entry: entry, useKernel: useKernel,
+      check: (String generated) {
     final xRe = new RegExp('\\bx\\b');
     regexp = regexp.replaceAll(xRe, '(?:$anyIdentifier)');
     final spaceRe = new RegExp('\\s+');
diff --git a/tests/compiler/dart2js/constant_folding_codeUnitAt_test.dart b/tests/compiler/dart2js/constant_folding_codeUnitAt_test.dart
deleted file mode 100644
index 5e2ff3c..0000000
--- a/tests/compiler/dart2js/constant_folding_codeUnitAt_test.dart
+++ /dev/null
@@ -1,43 +0,0 @@
-// 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.
-// Test constant folding on numbers.
-
-import 'dart:async';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_1 = """
-foo() {
-  var a = 'Hello';
-  var b = 0;
-  return a.codeUnitAt(b);
-}
-""";
-
-// No folding of index type error.
-const String TEST_2 = """
-foo() {
-  var a = 'Hello';
-  var b = 1.5;
-  return a.codeUnitAt(b);
-}
-""";
-
-// No folding of index range error.
-const String TEST_3 = """
-foo() {
-  var a = 'Hello';
-  var b = 55;
-  return a.codeUnitAt(b);
-}
-""";
-
-main() {
-  asyncTest(() => Future.wait([
-        compileAndMatch(TEST_1, 'foo', new RegExp(r'return 72')),
-        compileAndDoNotMatch(TEST_1, 'foo', new RegExp(r'Hello')),
-        compileAndMatch(TEST_2, 'foo', new RegExp(r'Hello')),
-        compileAndMatch(TEST_3, 'foo', new RegExp(r'Hello')),
-      ]));
-}
diff --git a/tests/compiler/dart2js/constant_folding_test.dart b/tests/compiler/dart2js/constant_folding_test.dart
deleted file mode 100644
index 0c25553..0000000
--- a/tests/compiler/dart2js/constant_folding_test.dart
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-// Test constant folding on numbers.
-
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String NUMBER_FOLDING = """
-void main() {
-  var a = 4;
-  var b = 3;
-  print(a + b);
-}
-""";
-
-const String NEGATIVE_NUMBER_FOLDING = """
-void main() {
-  var a = 4;
-  var b = -3;
-  print(a + b);
-}
-""";
-
-const String NULL_EQUALS_FOLDING = """
-foo(a, b, c, d) {
-  if (a == null) return 1;
-  if (null == b) return 2;
-  if (4 == c) return 3;
-  if ("foo" == d) return 3;
-}
-""";
-
-const String LIST_LENGTH_FOLDING = """
-foo() {
-  return const [1, 2, 3].length;
-}
-""";
-
-const String STRING_LENGTH_FOLDING = """
-foo() {
-  return '123'.length;
-}
-""";
-
-const String LIST_INDEX_FOLDING = """
-foo() {
-  return const [1, 2, 3][0];
-}
-""";
-
-const String RANGE_ERROR_INDEX_FOLDING = """
-foo() {
-  return [1][1];
-}
-""";
-
-main() {
-  asyncTest(() => Future.wait([
-        compileAndMatch(NUMBER_FOLDING, 'main', new RegExp(r"print\(7\)")),
-        compileAndMatch(
-            NEGATIVE_NUMBER_FOLDING, 'main', new RegExp(r"print\(1\)")),
-        compile(NULL_EQUALS_FOLDING, entry: 'foo', check: (String generated) {
-          RegExp regexp = new RegExp(r'a == null');
-          Expect.isTrue(regexp.hasMatch(generated));
-
-          regexp = new RegExp(r'null == b');
-          Expect.isTrue(regexp.hasMatch(generated));
-
-          regexp = new RegExp(r'4 === c');
-          Expect.isTrue(regexp.hasMatch(generated));
-
-          regexp = new RegExp('"foo" === d');
-          Expect.isTrue(regexp.hasMatch(generated));
-        }),
-        compileAndMatch(LIST_LENGTH_FOLDING, 'foo', new RegExp(r"return 3")),
-        compileAndMatch(LIST_INDEX_FOLDING, 'foo', new RegExp(r"return 1")),
-        compileAndDoNotMatch(LIST_INDEX_FOLDING, 'foo', new RegExp(r"ioore")),
-        compileAndMatch(STRING_LENGTH_FOLDING, 'foo', new RegExp(r"return 3")),
-        compileAndMatch(RANGE_ERROR_INDEX_FOLDING, 'foo', new RegExp(r"ioore")),
-      ]));
-}
diff --git a/tests/compiler/dart2js/constant_namer_test.dart b/tests/compiler/dart2js/constant_namer_test.dart
deleted file mode 100644
index b59fbf66..0000000
--- a/tests/compiler/dart2js/constant_namer_test.dart
+++ /dev/null
@@ -1,37 +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:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-  class Token {
-    final name;
-    final value;
-    const Token(this.name, [this.value]);
-    use() { print(this); }
-  }
-  test() {
-    const [12,53].use();
-    const Token('start').use();
-    const Token('end').use();
-    const Token('yes', 12).use();
-    const Token(true, false).use();
-  }
-""";
-
-main() {
-  check(generated, text) {
-    Expect.isTrue(generated.contains(text), text);
-  }
-
-  asyncTest(() => compile(TEST_ONE, entry: 'test').then((String generated) {
-        check(generated, '.List_12_53.');
-        check(generated, '.Token_start_null.');
-        check(generated, '.Token_end_null.');
-        check(generated, '.Token_yes_12.');
-        check(generated, '.Token_true_false.');
-      }));
-}
diff --git a/tests/compiler/dart2js/container_mask_equal_test.dart b/tests/compiler/dart2js/container_mask_equal_test.dart
deleted file mode 100644
index 978797d..0000000
--- a/tests/compiler/dart2js/container_mask_equal_test.dart
+++ /dev/null
@@ -1,55 +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.
-
-// Regression test for dart2js that used to have a bogus
-// implementation of var.== and
-// var.hashCode.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'memory_compiler.dart';
-
-const MEMORY_SOURCE_FILES = const {
-  'main.dart': '''
-
-import 'dart:typed_data';
-
-a() => [0];
-b() => [1, 2];
-c() => new Uint8List(1);
-d() => new Uint8List(2);
-
-main() {
-  print(a); print(b); print(c); print(d);
-}
-''',
-};
-
-main() {
-  asyncTest(() async {
-    var result = await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
-    var compiler = result.compiler;
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    var closedWorld = typesInferrer.closedWorld;
-
-    var element =
-        compiler.frontendStrategy.elementEnvironment.mainLibrary.find('a');
-    var mask1 = typesInferrer.getReturnTypeOfMember(element);
-
-    element =
-        compiler.frontendStrategy.elementEnvironment.mainLibrary.find('b');
-    var mask2 = typesInferrer.getReturnTypeOfMember(element);
-
-    element =
-        compiler.frontendStrategy.elementEnvironment.mainLibrary.find('c');
-    var mask3 = typesInferrer.getReturnTypeOfMember(element);
-
-    element =
-        compiler.frontendStrategy.elementEnvironment.mainLibrary.find('d');
-    var mask4 = typesInferrer.getReturnTypeOfMember(element);
-
-    Expect.notEquals(
-        mask1.union(mask2, closedWorld), mask3.union(mask4, closedWorld));
-  });
-}
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index 71a41a9..5984d35 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -4,25 +4,35 @@
 analyze_dart_test: Slow, Pass
 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.
-backend_dart/opt_cyclic_redundant_phi_test: Fail # Issue 20159
 boolified_operator_test: Fail # Issue 8001
-old_frontend/check_elements_invariants_test: Skip # Times out even with Slow marker. Slow due to inlining in the CPS backend
-old_frontend/compile_with_empty_libraries_test: Fail # Issue 24223
+codegen/gvn_dynamic_field_get_test: Fail # Issue 18519
+codegen/load_elimination_test: Pass, Slow
+codegen/logical_expression_test: Fail # Issue 17027
+codegen/simple_function_subtype_test: Fail # simple_function_subtype_test is temporarily(?) disabled due to new method for building function type tests.
+deferred_loading/deferred_loading_test: Slow, Pass
 equivalence/id_equivalence_test: Pass, Slow
-gvn_dynamic_field_get_test: Fail # Issue 18519
 inference/inference_test: Slow, Pass
+inference/simple_inferrer_const_closure2_test: Fail # Issue 16507
+inference/simple_inferrer_const_closure_test: Fail # Issue 16507
+inference/simple_inferrer_global_field_closure_test: Fail # Issue 16507
 inference/swarm_test: Slow, Pass
 inlining/inlining_test: Slow, Pass
 kernel/*: Slow, Pass
-logical_expression_test: Fail # Issue 17027
+kernel/compile_from_dill_fast_startup_test: RuntimeError # Test must be updated to support FE with patching.
+kernel/compile_from_dill_test: RuntimeError # Test must be updated to support FE with patching.
 mirrors/library_exports_hidden_test: Fail
 mirrors/library_exports_shown_test: Fail
 mirrors/library_imports_hidden_test: Fail
 mirrors/library_imports_prefixed_show_hide_test: Fail
 mirrors/library_imports_prefixed_test: Fail
 mirrors/library_imports_shown_test: Fail
+no_such_method_enabled_test: Pass, Slow
+old_frontend/check_elements_invariants_test: Skip # Times out even with Slow marker. Slow due to inlining in the CPS backend
+old_frontend/check_elements_invariants_test: Skip # Times out even with Slow marker. Slow due to inlining in the CPS backend
+old_frontend/compile_with_empty_libraries_test: Fail # Issue 24223
+old_frontend/compile_with_empty_libraries_test: Fail # Issue 24223
+old_frontend/patch_test/bug: RuntimeError # Issue 21132
 packages/*: Skip # Skip packages folder
-patch_test/bug: RuntimeError # Issue 21132
 quarantined/http_test: Pass, Slow
 serialization/analysis1_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
 serialization/analysis3_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
@@ -41,66 +51,58 @@
 serialization/model5_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
 serialization/model_1_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
 serialization/native_data_test: Skip # Skip most serialization tests. These are very slow and are no longer a priority.
-simple_function_subtype_test: Fail # simple_function_subtype_test is temporarily(?) disabled due to new method for building function type tests.
-simple_inferrer_const_closure2_test: Fail # Issue 16507
-simple_inferrer_const_closure_test: Fail # Issue 16507
-simple_inferrer_global_field_closure_test: Fail # Issue 16507
 sourcemaps/source_mapping_invokes_test: Pass, Slow
 sourcemaps/source_mapping_operators_test: Pass, Slow
 sourcemaps/source_mapping_test: Pass, Slow
 subtype_test: Slow, Pass
 uri_retention_test: Fail # Issue 26504
-kernel/compile_from_dill_fast_startup_test: RuntimeError # Test must be updated to support FE with patching.
-kernel/compile_from_dill_test: RuntimeError # Test must be updated to support FE with patching.
-kernel/closed_world2_test: RuntimeError # Test must be updated to support FE with patching.
-inference/swarm_test: RuntimeError # Test must be updated to support FE with patching.
 
 [ $mode == debug ]
+deferred/load_graph_segmentation_test: Pass, Slow
+deferred/load_mapping_test: Pass, Slow
+end_to_end/dart2js_batch_test: Pass, Slow
+end_to_end/exit_code_test: Pass, Slow
+in_user_code_test: Pass, Slow
+mirrors/deferred_mirrors_test: Pass, Slow
+mirrors/import_mirrors_test: Pass, Slow
+mirrors/mirror_final_field_inferrer2_test: Crash, Pass, Slow # Issue 15581
 old_frontend/analyze_api_test: Pass, Slow # DON'T CHANGE THIS LINE -- Don't mark these tests as failing. Instead, fix the errors/warnings that they report or update the whitelist in the test-files to temporarily allow digression.
 old_frontend/analyze_dart2js_test: Pass, Slow # DON'T CHANGE THIS LINE -- Don't mark these tests as failing. Instead, fix the errors/warnings that they report or update the whitelist in the test-files to temporarily allow digression.
 old_frontend/analyze_unused_dart2js_test: Pass, Slow
 old_frontend/check_elements_invariants_test: Skip # Slow and only needs to be run in one configuration
 old_frontend/check_members_test: Pass, Slow
-dart2js_batch_test: Pass, Slow
-deferred_load_graph_segmentation_test: Pass, Slow
-deferred_load_mapping_test: Pass, Slow
-deferred_mirrors_test: Pass, Slow
-duplicate_library_test: Pass, Slow
-exit_code_test: Pass, Slow
-import_mirrors_test: Pass, Slow
-in_user_code_test: Pass, Slow
-message_kind_test: Pass, Slow
-mirror_final_field_inferrer2_test: Crash, Pass, Slow # Issue 15581
+old_frontend/duplicate_library_test: Pass, Slow
+old_frontend/message_kind_test: Pass, Slow
 show_package_warnings_test: Pass, Slow
-source_map_pub_build_validity_test: Pass, Slow
+sourcemaps/source_map_pub_build_validity_test: Pass, Slow
 
 [ $system == linux ]
 dart2js_batch2_test: Pass, RuntimeError # Issue 29021
 
 [ $checked ]
+codegen/value_range_test: Pass, Slow
+codegen/value_range_kernel_test: Pass, Slow
+end_to_end/exit_code_test: Pass, Slow
+jsinterop/declaration_test: Slow, Pass
+jsinterop/interop_anonymous_unreachable_test: Pass, Slow
+jsinterop/world_test: Pass, Slow
+kernel/visitor_test: Pass, Slow
+mirrors/deferred_mirrors_test: Pass, Slow
+mirrors/import_mirrors_test: Slow, Pass
+mirrors/mirror_final_field_inferrer2_test: Pass, Slow
+mirrors/preserve_uris_test: Pass, Slow
 old_frontend/analyze_dart2js_helpers_test: Pass, Slow
 old_frontend/analyze_dart2js_test: Pass, Slow
 old_frontend/analyze_unused_dart2js_test: Pass, Slow
-dart2js_resolver_test: Pass, Slow
-deferred_mirrors_test: Pass, Slow
-duplicate_library_test: Pass, Slow
-exit_code_test: Pass, Slow
-import_mirrors_test: Slow, Pass
-interop_anonymous_unreachable_test: Pass, Slow
-jsinterop/declaration_test: Slow, Pass
-jsinterop/world_test: Pass, Slow
-kernel/visitor_test: Pass, Slow
-mirror_final_field_inferrer2_test: Pass, Slow
+old_frontend/duplicate_library_test: Pass, Slow
 output_type_test: Pass, Slow
-preserve_uris_test: Pass, Slow
 serialization*: Slow, Pass
-source_map_pub_build_validity_test: Pass, Slow
+sourcemaps/source_map_pub_build_validity_test: Pass, Slow
 sourcemaps/stacktrace_test: Pass, Slow
 uri_retention_test: Pass, Slow
-value_range_test: Pass, Slow
 
 [ !$checked ]
-exit_code_test: Skip # This tests requires checked mode.
+end_to_end/exit_code_test: Skip # This tests requires checked mode.
 jsinterop/declaration_test: Slow, Pass
 serialization*: Slow, Pass
 
diff --git a/tests/compiler/dart2js/dead_code_test.dart b/tests/compiler/dart2js/dead_code_test.dart
deleted file mode 100644
index eace363..0000000
--- a/tests/compiler/dart2js/dead_code_test.dart
+++ /dev/null
@@ -1,24 +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 'compiler_helper.dart';
-
-String TEST = r'''
-main() {
-  foo(null);
-}
-foo(a) {
-  if (a != null) return 42;
-  return 54;
-}
-''';
-
-main() {
-  asyncTest(() => compileAll(TEST).then((generated) {
-        Expect.isFalse(
-            generated.contains('return 42'), 'dead code not eliminated');
-      }));
-}
diff --git a/tests/compiler/dart2js/dead_phi_eliminator_test.dart b/tests/compiler/dart2js/dead_phi_eliminator_test.dart
deleted file mode 100644
index 6b0b67b..0000000
--- a/tests/compiler/dart2js/dead_phi_eliminator_test.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-void foo(bar) {
-  var toBeRemoved = 1;
-  if (bar) {
-    toBeRemoved = 2;
-  } else {
-    toBeRemoved = 3;
-  }
-}
-""";
-
-main() {
-  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
-        RegExp regexp = new RegExp("toBeRemoved");
-        Expect.isTrue(!regexp.hasMatch(generated));
-      }));
-}
diff --git a/tests/compiler/dart2js/declare_once_test.dart b/tests/compiler/dart2js/declare_once_test.dart
deleted file mode 100644
index 63535eb..0000000
--- a/tests/compiler/dart2js/declare_once_test.dart
+++ /dev/null
@@ -1,28 +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.
-// Test that parameters keep their names in the output.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-import 'compiler_helper.dart';
-
-main() {
-  // For a function with only one variable we declare it inline for more
-  // compactness.  Test that we don't also declare it at the start of the
-  // method.
-  asyncTest(() => compile(
-          'final List a = const ["bar", "baz"];'
-          'int foo() {'
-          '  for (int i = 0; i < a.length; i++) {'
-          '    print(a[i]);'
-          '  }'
-          '}',
-          entry: 'foo',
-          minify: false).then((String generated) {
-        RegExp re = new RegExp(r"var ");
-        Expect.isTrue(re.hasMatch(generated));
-        print(generated);
-        Expect.equals(1, re.allMatches(generated).length);
-      }));
-}
diff --git a/tests/compiler/dart2js/deferred_closures_test.dart b/tests/compiler/dart2js/deferred/closures_test.dart
similarity index 84%
rename from tests/compiler/dart2js/deferred_closures_test.dart
rename to tests/compiler/dart2js/deferred/closures_test.dart
index 747b9a9..30279cc 100644
--- a/tests/compiler/dart2js/deferred_closures_test.dart
+++ b/tests/compiler/dart2js/deferred/closures_test.dart
@@ -9,17 +9,19 @@
 import 'package:compiler/src/commandline_options.dart';
 import 'package:expect/expect.dart';
 
-import 'memory_compiler.dart';
-import 'output_collector.dart';
+import '../memory_compiler.dart';
+import '../output_collector.dart';
 
 void main() {
   asyncTest(() async {
-    await runTest(false);
-    await runTest(true);
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
   });
 }
 
-runTest(bool useKernel) async {
+runTest({bool useKernel}) async {
   OutputCollector collector = new OutputCollector();
   var options = useKernel ? [Flags.useKernel] : [];
   await runCompiler(
diff --git a/tests/compiler/dart2js/deferred/custom_element_test.dart b/tests/compiler/dart2js/deferred/custom_element_test.dart
new file mode 100644
index 0000000..385e3c1
--- /dev/null
+++ b/tests/compiler/dart2js/deferred/custom_element_test.dart
@@ -0,0 +1,65 @@
+// 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.
+
+// Test of the graph segmentation algorithm used by deferred loading
+// to determine which elements can be deferred and which libraries
+// much be included in the initial download (loaded eagerly).
+
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:expect/expect.dart';
+import '../memory_compiler.dart';
+
+void main() {
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
+
+runTest({bool useKernel}) async {
+  CompilationResult result = await runCompiler(
+      memorySourceFiles: MEMORY_SOURCE_FILES,
+      options: useKernel ? [Flags.useKernel] : []);
+  Compiler compiler = result.compiler;
+  var closedWorld = compiler.backendClosedWorldForTesting;
+  var outputUnitForEntity = compiler.backend.outputUnitData.outputUnitForEntity;
+  var mainOutputUnit = compiler.backend.outputUnitData.mainOutputUnit;
+  var elementEnvironment = closedWorld.elementEnvironment;
+  dynamic lib = elementEnvironment.lookupLibrary(Uri.parse("memory:lib.dart"));
+  var customType = elementEnvironment.lookupClass(lib, "CustomType");
+  var foo = elementEnvironment.lookupLibraryMember(lib, "foo");
+  Expect.notEquals(mainOutputUnit, outputUnitForEntity(foo));
+  // Native elements are not deferred
+  Expect.equals(mainOutputUnit, outputUnitForEntity(customType));
+}
+
+// The main library imports a file defining a custom element.
+// Registering this class implicitly causes the constructors to be
+// live. Check that this is handled.
+const Map MEMORY_SOURCE_FILES = const {
+  "main.dart": """
+import "lib.dart" deferred as a;
+import 'dart:html';
+
+main() {
+  document.registerElement("foo-tag", a.a);
+  a.foo();
+}
+""",
+  "lib.dart": """
+import 'dart:html';
+var a = CustomType;
+
+class CustomType extends HtmlElement {
+  factory CustomType() => null;
+  CustomType.created() : super.created() ;
+}
+
+foo() {}
+""",
+};
diff --git a/tests/compiler/dart2js/deferred_dont_inline_deferred_constants_test.dart b/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart
similarity index 80%
rename from tests/compiler/dart2js/deferred_dont_inline_deferred_constants_test.dart
rename to tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart
index d6c9f69d..ddb130f 100644
--- a/tests/compiler/dart2js/deferred_dont_inline_deferred_constants_test.dart
+++ b/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart
@@ -7,35 +7,40 @@
 
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/compiler_new.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:expect/expect.dart';
-import 'memory_compiler.dart';
-import 'output_collector.dart';
+import '../memory_compiler.dart';
+import '../output_collector.dart';
 
 void main() {
-  asyncTest(() async {
+  runTest({bool useKernel}) async {
     OutputCollector collector = new OutputCollector();
     CompilationResult result = await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES, outputProvider: collector);
+        memorySourceFiles: MEMORY_SOURCE_FILES,
+        outputProvider: collector,
+        options: useKernel ? [Flags.useKernel] : []);
     Compiler compiler = result.compiler;
+    var closedWorld = compiler.backendClosedWorldForTesting;
+    var elementEnvironment = closedWorld.elementEnvironment;
 
     lookupLibrary(name) {
-      return compiler.libraryLoader.lookupLibrary(Uri.parse(name));
+      return elementEnvironment.lookupLibrary(Uri.parse(name));
     }
 
     var outputUnitForEntity =
         compiler.backend.outputUnitData.outputUnitForEntity;
 
     dynamic lib1 = lookupLibrary("memory:lib1.dart");
-    var foo1 = lib1.find("foo");
+    var foo1 = elementEnvironment.lookupLibraryMember(lib1, "foo");
     var ou_lib1 = outputUnitForEntity(foo1);
 
     dynamic lib2 = lookupLibrary("memory:lib2.dart");
-    var foo2 = lib2.find("foo");
+    var foo2 = elementEnvironment.lookupLibraryMember(lib2, "foo");
     var ou_lib2 = outputUnitForEntity(foo2);
 
-    dynamic mainApp = compiler.frontendStrategy.elementEnvironment.mainLibrary;
-    var fooMain = mainApp.find("foo");
+    dynamic mainApp = elementEnvironment.mainLibrary;
+    var fooMain = elementEnvironment.lookupLibraryMember(mainApp, "foo");
     var ou_lib1_lib2 = outputUnitForEntity(fooMain);
 
     String mainOutput = collector.getOutput("", OutputType.js);
@@ -80,6 +85,14 @@
     Expect.isTrue(new RegExp(r"= .string4").hasMatch(lib1Output));
     Expect.isTrue(new RegExp(r"= .string4").hasMatch(lib2Output));
     Expect.isFalse(new RegExp(r"= .string4").hasMatch(lib12Output));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    // TODO(sigmund): Handle this for kernel.
+    //print('--test from kernel------------------------------------------------');
+    //await runTest(useKernel: true);
   });
 }
 
diff --git a/tests/compiler/dart2js/deferred_dont_inline_deferred_globals_test.dart b/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart
similarity index 68%
rename from tests/compiler/dart2js/deferred_dont_inline_deferred_globals_test.dart
rename to tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart
index a036a6a..af56ad9 100644
--- a/tests/compiler/dart2js/deferred_dont_inline_deferred_globals_test.dart
+++ b/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart
@@ -7,26 +7,32 @@
 
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/compiler_new.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:expect/expect.dart';
-import 'memory_compiler.dart';
-import 'output_collector.dart';
+import '../memory_compiler.dart';
+import '../output_collector.dart';
 
 void main() {
-  OutputCollector collector = new OutputCollector();
-  asyncTest(() async {
+  runTest({bool useKernel}) async {
+    OutputCollector collector = new OutputCollector();
     CompilationResult result = await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES, outputProvider: collector);
+        memorySourceFiles: MEMORY_SOURCE_FILES,
+        outputProvider: collector,
+        options: useKernel ? [Flags.useKernel] : []);
     Compiler compiler = result.compiler;
+    var closedWorld = compiler.backendClosedWorldForTesting;
+    var elementEnvironment = closedWorld.elementEnvironment;
+
     lookupLibrary(name) {
-      return compiler.libraryLoader.lookupLibrary(Uri.parse(name));
+      return elementEnvironment.lookupLibrary(Uri.parse(name));
     }
 
     var outputUnitForEntity =
         compiler.backend.outputUnitData.outputUnitForEntity;
 
     dynamic lib1 = lookupLibrary("memory:lib1.dart");
-    var foo1 = lib1.find("finalVar");
+    var foo1 = elementEnvironment.lookupLibraryMember(lib1, "finalVar");
     var ou_lib1 = outputUnitForEntity(foo1);
 
     String mainOutput = collector.getOutput("", OutputType.js);
@@ -39,6 +45,13 @@
     Expect.isTrue(re2.hasMatch(lib1Output));
     Expect.isFalse(re1.hasMatch(mainOutput));
     Expect.isFalse(re2.hasMatch(mainOutput));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
   });
 }
 
diff --git a/tests/compiler/dart2js/deferred_emit_type_checks_test.dart b/tests/compiler/dart2js/deferred/emit_type_checks_test.dart
similarity index 76%
rename from tests/compiler/dart2js/deferred_emit_type_checks_test.dart
rename to tests/compiler/dart2js/deferred/emit_type_checks_test.dart
index 1751a3c..e1aedd5b 100644
--- a/tests/compiler/dart2js/deferred_emit_type_checks_test.dart
+++ b/tests/compiler/dart2js/deferred/emit_type_checks_test.dart
@@ -7,17 +7,20 @@
 
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/compiler_new.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/js_backend/js_backend.dart' show JavaScriptBackend;
 import 'package:expect/expect.dart';
-import 'memory_compiler.dart';
-import 'output_collector.dart';
+import '../memory_compiler.dart';
+import '../output_collector.dart';
 
 void main() {
-  asyncTest(() async {
+  runTest({bool useKernel}) async {
     OutputCollector collector = new OutputCollector();
     CompilationResult result = await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES, outputProvider: collector);
+        memorySourceFiles: MEMORY_SOURCE_FILES,
+        outputProvider: collector,
+        options: useKernel ? [Flags.useKernel] : []);
     Compiler compiler = result.compiler;
     String mainOutput = collector.getOutput('', OutputType.js);
     String deferredOutput = collector.getOutput('out_1', OutputType.jsPart);
@@ -28,6 +31,13 @@
         "Deferred output doesn't contain '${isPrefix}A: 1':\n"
         "$deferredOutput");
     Expect.isFalse(mainOutput.contains('${isPrefix}A: 1'));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
   });
 }
 
diff --git a/tests/compiler/dart2js/deferred_follow_constant_dependencies_test.dart b/tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart
similarity index 81%
rename from tests/compiler/dart2js/deferred_follow_constant_dependencies_test.dart
rename to tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart
index 4bf9cb6..f309a9c 100644
--- a/tests/compiler/dart2js/deferred_follow_constant_dependencies_test.dart
+++ b/tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart
@@ -5,15 +5,17 @@
 // Test that constants depended on by other constants are correctly deferred.
 
 import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/constants/values.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/constants/values.dart';
 import 'package:expect/expect.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 void main() {
-  asyncTest(() async {
-    CompilationResult result =
-        await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
+  runTest({bool useKernel}) async {
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: MEMORY_SOURCE_FILES,
+        options: useKernel ? [Flags.useKernel] : []);
     Compiler compiler = result.compiler;
     var outputUnitForConstant =
         compiler.backend.outputUnitData.outputUnitForConstant;
@@ -40,6 +42,13 @@
           "Constant value ${constant.toStructuredText()} "
           "is in the main output unit.");
     }
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
   });
 }
 
diff --git a/tests/compiler/dart2js/deferred_follow_implicit_super_regression_test.dart b/tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart
similarity index 65%
rename from tests/compiler/dart2js/deferred_follow_implicit_super_regression_test.dart
rename to tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart
index 566ad29..93ca8bc 100644
--- a/tests/compiler/dart2js/deferred_follow_implicit_super_regression_test.dart
+++ b/tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart
@@ -2,33 +2,44 @@
 // 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 'memory_compiler.dart';
-
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart' as dart2js;
+import 'package:expect/expect.dart';
+
+import '../memory_compiler.dart';
 
 void main() {
-  asyncTest(() async {
-    CompilationResult result =
-        await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
+  runTest({bool useKernel}) async {
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: MEMORY_SOURCE_FILES,
+        options: useKernel ? [Flags.useKernel] : []);
     dart2js.Compiler compiler = result.compiler;
+    var closedWorld = compiler.backendClosedWorldForTesting;
+    var elementEnvironment = closedWorld.elementEnvironment;
 
     lookupLibrary(name) {
-      return compiler.libraryLoader.lookupLibrary(Uri.parse(name));
+      return elementEnvironment.lookupLibrary(Uri.parse(name));
     }
 
     var outputUnitForEntity =
         compiler.backend.outputUnitData.outputUnitForEntity;
 
     dynamic lib = lookupLibrary("memory:lib.dart");
-    var a = lib.find("a");
-    var b = lib.find("b");
-    var c = lib.find("c");
-    var d = lib.find("d");
+    var a = elementEnvironment.lookupLibraryMember(lib, "a");
+    var b = elementEnvironment.lookupLibraryMember(lib, "b");
+    var c = elementEnvironment.lookupLibraryMember(lib, "c");
+    var d = elementEnvironment.lookupLibraryMember(lib, "d");
     Expect.equals(outputUnitForEntity(a), outputUnitForEntity(b));
     Expect.equals(outputUnitForEntity(a), outputUnitForEntity(c));
     Expect.equals(outputUnitForEntity(a), outputUnitForEntity(d));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
   });
 }
 
diff --git a/tests/compiler/dart2js/deferred_inline_restrictions_test.dart b/tests/compiler/dart2js/deferred/inline_restrictions_test.dart
similarity index 98%
rename from tests/compiler/dart2js/deferred_inline_restrictions_test.dart
rename to tests/compiler/dart2js/deferred/inline_restrictions_test.dart
index a7293c4..12585ca 100644
--- a/tests/compiler/dart2js/deferred_inline_restrictions_test.dart
+++ b/tests/compiler/dart2js/deferred/inline_restrictions_test.dart
@@ -9,7 +9,7 @@
 import 'package:compiler/compiler_new.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:expect/expect.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 void main() {
   asyncTest(() async {
diff --git a/tests/compiler/dart2js/deferred_load_graph_segmentation2_test.dart b/tests/compiler/dart2js/deferred/load_graph_segmentation2_test.dart
similarity index 97%
rename from tests/compiler/dart2js/deferred_load_graph_segmentation2_test.dart
rename to tests/compiler/dart2js/deferred/load_graph_segmentation2_test.dart
index 9578590..8043235 100644
--- a/tests/compiler/dart2js/deferred_load_graph_segmentation2_test.dart
+++ b/tests/compiler/dart2js/deferred/load_graph_segmentation2_test.dart
@@ -9,7 +9,7 @@
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:expect/expect.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 void main() {
   asyncTest(() async {
diff --git a/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart b/tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart
similarity index 98%
rename from tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart
rename to tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart
index 626a0ad..028be89 100644
--- a/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart
+++ b/tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart
@@ -10,7 +10,7 @@
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/deferred_load.dart';
 import 'package:expect/expect.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 void main() {
   asyncTest(() async {
diff --git a/tests/compiler/dart2js/deferred_load_mapping_test.dart b/tests/compiler/dart2js/deferred/load_mapping_test.dart
similarity index 94%
rename from tests/compiler/dart2js/deferred_load_mapping_test.dart
rename to tests/compiler/dart2js/deferred/load_mapping_test.dart
index e4aebd3..c5de70f 100644
--- a/tests/compiler/dart2js/deferred_load_mapping_test.dart
+++ b/tests/compiler/dart2js/deferred/load_mapping_test.dart
@@ -3,10 +3,10 @@
 // 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:async_helper/async_helper.dart';
 import 'package:compiler/compiler_new.dart';
-import 'memory_source_file_helper.dart';
-import "memory_compiler.dart";
+import '../memory_source_file_helper.dart';
+import '../memory_compiler.dart';
 
 void main() {
   asyncTest(() async {
diff --git a/tests/compiler/dart2js/deferred_not_in_main_test.dart b/tests/compiler/dart2js/deferred/not_in_main_test.dart
similarity index 98%
rename from tests/compiler/dart2js/deferred_not_in_main_test.dart
rename to tests/compiler/dart2js/deferred/not_in_main_test.dart
index 7927ee2..b495e9a 100644
--- a/tests/compiler/dart2js/deferred_not_in_main_test.dart
+++ b/tests/compiler/dart2js/deferred/not_in_main_test.dart
@@ -9,7 +9,7 @@
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:expect/expect.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 void main() {
   deferredTest1();
diff --git a/tests/compiler/dart2js/unneeded_part_js_test.dart b/tests/compiler/dart2js/deferred/unneeded_part_js_test.dart
similarity index 71%
rename from tests/compiler/dart2js/unneeded_part_js_test.dart
rename to tests/compiler/dart2js/deferred/unneeded_part_js_test.dart
index 7a13c83..2ef6af6 100644
--- a/tests/compiler/dart2js/unneeded_part_js_test.dart
+++ b/tests/compiler/dart2js/deferred/unneeded_part_js_test.dart
@@ -5,20 +5,29 @@
 // Test that no parts are emitted when deferred loading isn't used.
 
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:expect/expect.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 main() {
-  asyncTest(() async {
+  runTest({bool useKernel}) async {
     DiagnosticCollector diagnostics = new DiagnosticCollector();
     OutputCollector output = new OutputCollector();
     CompilationResult result = await runCompiler(
         memorySourceFiles: MEMORY_SOURCE_FILES,
         diagnosticHandler: diagnostics,
-        outputProvider: output);
+        outputProvider: output,
+        options: useKernel ? [Flags.useKernel] : []);
     Expect.isFalse(diagnostics.hasRegularMessages);
     Expect.isFalse(output.hasExtraOutput);
     Expect.isTrue(result.isSuccess);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
   });
 }
 
diff --git a/tests/compiler/dart2js/deferred_custom_element_test.dart b/tests/compiler/dart2js/deferred_custom_element_test.dart
deleted file mode 100644
index e3a667a..0000000
--- a/tests/compiler/dart2js/deferred_custom_element_test.dart
+++ /dev/null
@@ -1,56 +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.
-
-// Test of the graph segmentation algorithm used by deferred loading
-// to determine which elements can be deferred and which libraries
-// much be included in the initial download (loaded eagerly).
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/compiler.dart';
-import 'package:expect/expect.dart';
-import 'memory_compiler.dart';
-
-void main() {
-  asyncTest(() async {
-    CompilationResult result =
-        await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
-    Compiler compiler = result.compiler;
-    var outputUnitForEntity =
-        compiler.backend.outputUnitData.outputUnitForEntity;
-    var mainOutputUnit = compiler.backend.outputUnitData.mainOutputUnit;
-    dynamic lib =
-        compiler.libraryLoader.lookupLibrary(Uri.parse("memory:lib.dart"));
-    var customType = lib.find("CustomType");
-    var foo = lib.find("foo");
-    Expect.notEquals(mainOutputUnit, outputUnitForEntity(foo));
-    // Native elements are not deferred
-    Expect.equals(mainOutputUnit, outputUnitForEntity(customType));
-  });
-}
-
-// The main library imports a file defining a custom element.
-// Registering this class implicitly causes the constructors to be
-// live. Check that this is handled.
-const Map MEMORY_SOURCE_FILES = const {
-  "main.dart": """
-import "lib.dart" deferred as a;
-import 'dart:html';
-
-main() {
-  document.registerElement("foo-tag", a.a);
-  a.foo();
-}
-""",
-  "lib.dart": """
-import 'dart:html';
-var a = CustomType;
-
-class CustomType extends HtmlElement {
-  factory CustomType() => null;
-  CustomType.created() : super.created() ;
-}
-
-foo() {}
-""",
-};
diff --git a/tests/compiler/dart2js/deferred_loading/data/basic_deferred.dart b/tests/compiler/dart2js/deferred_loading/data/basic_deferred.dart
new file mode 100644
index 0000000..b7d44ab
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/data/basic_deferred.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+import '../libs/basic_deferred_lib.dart' deferred as lib;
+
+/*element: main:OutputUnit(main, {})*/
+main() => lib.loadLibrary().then((_) {
+      (lib.funky)();
+    });
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_class.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_class.dart
new file mode 100644
index 0000000..0ded6cf
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_class.dart
@@ -0,0 +1,12 @@
+// 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 '../libs/deferred_class_library.dart' deferred as lib;
+
+/*element: main:OutputUnit(main, {})*/
+main() {
+  lib.loadLibrary().then((_) {
+    return new lib.MyClass().foo(87);
+  });
+}
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant1.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant1.dart
new file mode 100644
index 0000000..513d43b
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant1.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../libs/deferred_constant1_lib1.dart' as lib1 hide C2, C3;
+import '../libs/deferred_constant1_lib2.dart' deferred as lib2;
+
+/*element: main:OutputUnit(main, {})*/
+main() async {
+  lib1.C1.value;
+  await lib2.loadLibrary();
+  lib2.C2.value;
+  lib2.C3.value;
+}
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant2.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant2.dart
new file mode 100644
index 0000000..9f82270
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant2.dart
@@ -0,0 +1,14 @@
+// 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:expect/expect.dart';
+
+import '../libs/deferred_constant2_lib.dart' deferred as lib;
+
+/*element: main:OutputUnit(main, {})*/
+main() {
+  lib.loadLibrary().then((_) {
+    Expect.equals(499, lib.C1.value);
+  });
+}
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_fail_and_retry.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_fail_and_retry.dart
new file mode 100644
index 0000000..819032b
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_fail_and_retry.dart
@@ -0,0 +1,48 @@
+// 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.
+
+// Test that when a deferred import fails to load, it is possible to retry.
+
+import "../libs/deferred_fail_and_retry_lib.dart" deferred as lib;
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+import "dart:js" as js;
+
+/*element: main:OutputUnit(main, {})*/
+main() {
+  // We patch document.body.appendChild to change the script src on first
+  // invocation.
+  js.context.callMethod("eval", [
+    """
+    if (self.document) {
+      oldAppendChild = document.body.appendChild;
+      document.body.appendChild = function(element) {
+        element.src = "non_existing.js";
+        document.body.appendChild = oldAppendChild;
+        document.body.appendChild(element);
+      }
+    }
+    if (self.load) {
+      oldLoad = load;
+      load = function(uri) {
+        load = oldLoad;
+        load("non_existing.js");
+      }
+    }
+  """
+  ]);
+
+  asyncStart();
+  lib.loadLibrary().then((_) {
+    Expect.fail("Library should not have loaded");
+  }, onError: (error) {
+    lib.loadLibrary().then((_) {
+      Expect.equals("loaded", lib.foo());
+    }, onError: (error) {
+      Expect.fail("Library should have loaded this time");
+    }).whenComplete(() {
+      asyncEnd();
+    });
+  });
+}
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_function.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_function.dart
new file mode 100644
index 0000000..d8895f7
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_function.dart
@@ -0,0 +1,21 @@
+// 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.
+
+// Test that loading of a library (with top-level functions only) can
+// be deferred.
+
+import '../libs/deferred_function_lib.dart' deferred as lib;
+
+/*element: readFoo:OutputUnit(main, {})*/
+readFoo() {
+  return lib.foo;
+}
+
+/*element: main:OutputUnit(main, {})*/
+main() {
+  lib.loadLibrary().then((_) {
+    lib.foo('b');
+    readFoo();
+  });
+}
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping.dart
new file mode 100644
index 0000000..ea2354b
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "../libs/deferred_overlapping_lib1.dart" deferred as lib1;
+import "../libs/deferred_overlapping_lib2.dart" deferred as lib2;
+
+// lib1.C1 and lib2.C2 has a shared base class. It will go in its own hunk.
+/*element: main:OutputUnit(main, {})*/
+void main() {
+  lib1.loadLibrary().then((_) {
+    new lib1.C1();
+    lib2.loadLibrary().then((_) {
+      new lib2.C2();
+    });
+  });
+}
diff --git a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants.dart b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants.dart
new file mode 100644
index 0000000..47347ea
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants.dart
@@ -0,0 +1,7 @@
+// 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.
+
+// TODO(sigmund): remove this indirection and move the main code here. This is
+// needed because of the id-equivalence frameworks overrides the entrypoint URI.
+export '../libs/dont_inline_deferred_constants_main.dart';
diff --git a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_global.dart b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_global.dart
new file mode 100644
index 0000000..58669a5
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_global.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../libs/dont_inline_deferred_global_lib.dart' deferred as lib;
+
+/*element: main:OutputUnit(main, {})*/
+void main() {
+  lib.loadLibrary().then((_) {
+    print(lib.finalVar);
+    print(lib.globalVar);
+    lib.globalVar = "foobar";
+    print(lib.globalVar);
+  });
+}
diff --git a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
new file mode 100644
index 0000000..ec84fcd
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
@@ -0,0 +1,172 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io' hide Link;
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/common.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/deferred_load.dart';
+import 'package:compiler/src/elements/elements.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/kernel/element_map.dart';
+import 'package:compiler/src/kernel/kernel_backend_strategy.dart';
+import 'package:expect/expect.dart';
+import '../equivalence/id_equivalence.dart';
+import '../equivalence/id_equivalence_helper.dart';
+import 'package:compiler/src/constants/values.dart';
+
+import 'package:kernel/ast.dart' as ir;
+
+const List<String> skipForKernel = const <String>[
+  'dont_inline_deferred_constants.dart',
+];
+
+///  Add in options to pass to the compiler like
+/// `Flags.disableTypeInference` or `Flags.disableInlining`
+const List<String> compilerOptions = const <String>[];
+
+/// Compute the [OutputUnit]s for all source files involved in the test, and
+/// ensure that the compiler is correctly calculating what is used and what is
+/// not. We expect all test entry points to be in the `data` directory and any
+/// or all supporting libraries to be in the `libs` folder, starting with the
+/// same name as the original file in `data`.
+main(List<String> args) {
+  asyncTest(() async {
+    Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
+    await checkTests(
+        dataDir, computeAstOutputUnitData, computeKernelOutputUnitData,
+        libDirectory: new Directory.fromUri(Platform.script.resolve('libs')),
+        forMainLibraryOnly: false,
+        forUserSourceFilesOnly: true,
+        skipForKernel: skipForKernel,
+        options: compilerOptions,
+        args: args, setUpFunction: () {
+      importPrefixes.clear();
+    });
+  });
+}
+
+// For ease of testing and making our tests easier to read, we impose an
+// artificial constraint of requiring every deferred import use a different
+// named prefix per test. We enforce this constraint here by checking that no
+// prefix name responds to two different libraries.
+Map<String, Uri> importPrefixes = <String, Uri>{};
+
+/// Create a consistent string representation of [OutputUnit]s for both
+/// KImportEntities and ImportElements.
+String outputUnitString(OutputUnit unit) {
+  if (unit == null) return 'null';
+  StringBuffer sb = new StringBuffer();
+  bool first = true;
+  for (ImportEntity import in unit.importsForTesting) {
+    if (!first) sb.write(', ');
+    sb.write('${import.name}');
+    first = false;
+    Expect.isTrue(import.isDeferred);
+
+    if (importPrefixes.containsKey(import.name)) {
+      Expect.equals(
+          importPrefixes[import.name], import.enclosingLibrary.canonicalUri);
+    }
+    importPrefixes[import.name] = import.enclosingLibrary.canonicalUri;
+  }
+  return 'OutputUnit(${unit.name}, {$sb})';
+}
+
+/// Compute closure data mapping for [member] as a [MemberElement].
+///
+/// Fills [actualMap] with the data computed about what the resulting OutputUnit
+/// is.
+void computeAstOutputUnitData(
+    Compiler compiler, MemberEntity _member, Map<Id, ActualData> actualMap,
+    {bool verbose: false}) {
+  MemberElement member = _member;
+  OutputUnitData data = compiler.backend.outputUnitData;
+  String value = outputUnitString(data.outputUnitForEntity(member));
+
+  _registerValue(computeElementId(member), value, member, member.sourcePosition,
+      actualMap, compiler.reporter);
+
+  if (member is FieldElement && member.isConst) {
+    var node = member.initializer;
+    var constant = compiler.constants.getConstantValue(member.constant);
+    _registerValue(
+        new NodeId(node.getBeginToken().charOffset, IdKind.node),
+        outputUnitString(data.outputUnitForConstant(constant)),
+        member,
+        new SourceSpan(member.resolvedAst.sourceUri,
+            node.getBeginToken().charOffset, node.getEndToken().charEnd),
+        actualMap,
+        compiler.reporter);
+  }
+}
+
+/// OutputData for [member] as a kernel based element.
+///
+/// At this point the compiler has already been run, so it is holding the
+/// relevant OutputUnits, we just need to extract that information from it. We
+/// fill [actualMap] with the data computed about what the resulting OutputUnit
+/// is.
+void computeKernelOutputUnitData(
+    Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+    {bool verbose: false}) {
+  OutputUnitData data = compiler.backend.outputUnitData;
+  String value = outputUnitString(data.outputUnitForEntity(member));
+
+  KernelBackendStrategy backendStrategy = compiler.backendStrategy;
+  KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
+  MemberDefinition definition = elementMap.getMemberDefinition(member);
+
+  _registerValue(
+      computeEntityId(definition.node),
+      value,
+      member,
+      computeSourceSpanFromTreeNode(definition.node),
+      actualMap,
+      compiler.reporter);
+
+  ir.Member memberNode = definition.node;
+  if (memberNode is ir.Field && memberNode.isConst) {
+    ir.Expression node = memberNode.initializer;
+    ConstantValue constant = elementMap.getConstantValue(node);
+    SourceSpan span = computeSourceSpanFromTreeNode(node);
+    if (node is ir.ConstructorInvocation ||
+        node is ir.ListLiteral ||
+        node is ir.MapLiteral) {
+      // Adjust the source-span to match the AST-based location. The kernel FE
+      // skips the "const" keyword for the expression offset (-6 is an
+      // approximation assuming that there is just a single space after "const",
+      // this is likely good enough for our small unit tests).
+      span = new SourceSpan(span.uri, span.begin - 6, span.end - 6);
+    }
+    _registerValue(
+        new NodeId(span.begin, IdKind.node),
+        outputUnitString(data.outputUnitForConstant(constant)),
+        member,
+        computeSourceSpanFromTreeNode(node),
+        actualMap,
+        compiler.reporter);
+  }
+}
+
+/// Set [actualMap] to hold a key of [id] with the computed data [value]
+/// corresponding to [object] at location [sourceSpan]. We also perform error
+/// checking to ensure that the same [id] isn't added twice.
+void _registerValue(Id id, String value, Object object, SourceSpan sourceSpan,
+    Map<Id, ActualData> actualMap, CompilerDiagnosticReporter reporter) {
+  if (actualMap.containsKey(id)) {
+    ActualData existingData = actualMap[id];
+    reportHere(reporter, sourceSpan,
+        "Duplicate id ${id}, value=$value, object=$object");
+    reportHere(
+        reporter,
+        sourceSpan,
+        "Duplicate id ${id}, value=${existingData.value}, "
+        "object=${existingData.object}");
+    Expect.fail("Duplicate id $id.");
+  }
+  if (value != null) {
+    actualMap[id] = new ActualData(new IdValue(id, value), sourceSpan, object);
+  }
+}
diff --git a/tests/compiler/dart2js/deferred_loading/libs/basic_deferred_lib.dart b/tests/compiler/dart2js/deferred_loading/libs/basic_deferred_lib.dart
new file mode 100644
index 0000000..bbd9bae
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/basic_deferred_lib.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: defaultArg:OutputUnit(1, {lib})*/
+defaultArg() => "";
+
+/*element: funky:OutputUnit(1, {lib})*/
+funky([x = defaultArg]) => x();
+
+final int notUsed = 3;
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_class_library.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_class_library.dart
new file mode 100644
index 0000000..95f54b4
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_class_library.dart
@@ -0,0 +1,18 @@
+// 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.
+
+// Imported by deferred_class.dart.
+
+library deferred_class_library;
+
+class MyClass {
+  /*element: MyClass.:OutputUnit(1, {lib})*/
+  const MyClass();
+
+  /*element: MyClass.foo:OutputUnit(1, {lib})*/
+  foo(x) {
+    print('MyClass.foo($x)');
+    return (x - 3) ~/ 2;
+  }
+}
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib1.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib1.dart
new file mode 100644
index 0000000..7758772
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib1.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library deferred_constants1_lib1;
+
+class C {
+  /*element: C.value:OutputUnit(main, {})*/
+  final value;
+  /*element: C.:OutputUnit(main, {})*/
+  const C(this.value);
+}
+
+/// ---------------------------------------------------------------------------
+/// Constant used from main: not deferred.
+/// ---------------------------------------------------------------------------
+
+/*element: C1:OutputUnit(main, {})*/
+const C1 = /*OutputUnit(main, {})*/ const C(1);
+
+/// ---------------------------------------------------------------------------
+/// Constant completely deferred.
+/// ---------------------------------------------------------------------------
+
+/*element: C2:OutputUnit(1, {lib2})*/
+const C2 = /*OutputUnit(1, {lib2})*/ const C(2);
+
+/// ---------------------------------------------------------------------------
+/// Constant field not used from main, but the constant value is: so the field
+/// and the constant value are in different output units.
+/// ---------------------------------------------------------------------------
+
+/*element: C3:OutputUnit(1, {lib2})*/
+const C3 = /*OutputUnit(main, {})*/ const C(1);
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib2.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib2.dart
new file mode 100644
index 0000000..d21aec4
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_constant1_lib2.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library deferred_constants1_lib2;
+
+export 'deferred_constant1_lib1.dart' show C2, C3;
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_constant2_lib.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_constant2_lib.dart
new file mode 100644
index 0000000..1967a3c
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_constant2_lib.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library deferred_constants2_lib;
+
+class MyClass {
+  const MyClass();
+
+  foo(x) {
+    print('MyClass.foo($x)');
+    return (x - 3) ~/ 2;
+  }
+}
+
+class Constant {
+  /*element: Constant.value:OutputUnit(1, {lib})*/
+  final value;
+  /*element: Constant.:OutputUnit(1, {lib})*/
+  const Constant(this.value);
+
+  /*element: Constant.==:OutputUnit(1, {lib})*/
+  operator ==(other) => other is Constant && value == other.value;
+  /*element: Constant.hashCode:OutputUnit(1, {lib})*/
+  get hashCode => 0;
+}
+
+/*element: C1:OutputUnit(1, {lib})*/
+const C1 = /*OutputUnit(1, {lib})*/ const Constant(499);
+
+const C2 = const [const Constant(99)];
+
+foo([x = const Constant(42)]) => x;
+bar() => const Constant(777);
+
+class Gee {
+  get value => c.value;
+  final c;
+
+  Gee([this.c = const Constant(111)]);
+  const Gee.n321([this.c = const Constant(321)]);
+  Gee.n135({arg: const Constant(135)}) : this.c = arg;
+  const Gee.n246({arg: const Constant(246)}) : this.c = arg;
+  const Gee.n888() : this.c = const Constant(888);
+  const Gee.constant(this.c);
+}
+
+class Gee2 extends Gee {
+  Gee2() : super(const Constant(979));
+  const Gee2.n321() : super.n321();
+  const Gee2.n151() : super.constant(const Constant(151));
+  const Gee2.n888() : super.n888();
+}
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_fail_and_retry_lib.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_fail_and_retry_lib.dart
new file mode 100644
index 0000000..ed22832
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_fail_and_retry_lib.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.
+
+/*element: foo:OutputUnit(1, {lib})*/
+foo() {
+  return "loaded";
+}
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_function_lib.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_function_lib.dart
new file mode 100644
index 0000000..5d40356
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_function_lib.dart
@@ -0,0 +1,13 @@
+// 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.
+
+// Imported by deferred_function.dart and
+
+library deferred_function_library;
+
+/*element: foo:OutputUnit(1, {lib})*/
+foo(x) {
+  print('foo($x)');
+  return 42;
+}
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib1.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib1.dart
new file mode 100644
index 0000000..e1c3a03
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib1.dart
@@ -0,0 +1,8 @@
+// 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 "deferred_overlapping_lib3.dart";
+
+/*element: C1.:OutputUnit(1, {lib1})*/
+class C1 extends C3 {}
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib2.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib2.dart
new file mode 100644
index 0000000..4d7c620
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib2.dart
@@ -0,0 +1,8 @@
+// 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 "deferred_overlapping_lib3.dart";
+
+/*element: C2.:OutputUnit(3, {lib2})*/
+class C2 extends C3 {}
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib3.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib3.dart
new file mode 100644
index 0000000..6804b23
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib3.dart
@@ -0,0 +1,6 @@
+// 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.
+
+/*element: C3.:OutputUnit(2, {lib1, lib2})*/
+class C3 {}
diff --git a/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_lib1.dart b/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_lib1.dart
new file mode 100644
index 0000000..14e96f5
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_lib1.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dont_inline_deferred_constants_main.dart" as main;
+
+/*element: C1:OutputUnit(1, {lib1})*/
+const C1 = /*OutputUnit(1, {lib1})*/ "string1";
+
+/*element: C2:OutputUnit(1, {lib1})*/
+const C2 = /*OutputUnit(1, {lib1})*/ 1010;
+
+class C {
+  /*element: C.C3:OutputUnit(1, {lib1})*/
+  static const C3 = /*OutputUnit(1, {lib1})*/ "string2";
+}
+
+/*element: C4:OutputUnit(1, {lib1})*/
+const C4 = /*OutputUnit(main, {})*/ "string4";
+
+/*element: C5:OutputUnit(1, {lib1})*/
+const C5 = /*OutputUnit(main, {})*/ const main.C(1);
+
+/*element: C6:OutputUnit(1, {lib1})*/
+const C6 = /*OutputUnit(2, {lib1, lib2})*/ const main.C(2);
+
+/*element: foo:OutputUnit(1, {lib1})*/
+foo() {
+  print("lib1");
+  main.foo();
+}
diff --git a/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_lib2.dart b/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_lib2.dart
new file mode 100644
index 0000000..16ed499
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_lib2.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dont_inline_deferred_constants_main.dart" as main;
+
+/*element: C4:OutputUnit(3, {lib2})*/
+const C4 = /*OutputUnit(main, {})*/ "string4";
+
+/*element: C5:OutputUnit(3, {lib2})*/
+const C5 = /*OutputUnit(main, {})*/ const main.C(1);
+
+/*element: C6:OutputUnit(3, {lib2})*/
+const C6 = /*OutputUnit(2, {lib1, lib2})*/ const main.C(2);
+
+/*element: foo:OutputUnit(3, {lib2})*/
+foo() {
+  print("lib2");
+  main.foo();
+}
diff --git a/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_main.dart b/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_main.dart
new file mode 100644
index 0000000..8d3ed21
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_constants_main.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dont_inline_deferred_constants_lib1.dart' deferred as lib1;
+import 'dont_inline_deferred_constants_lib2.dart' deferred as lib2;
+
+/*element: c:OutputUnit(main, {})*/
+const c = /*OutputUnit(main, {})*/ "string3";
+
+class C {
+  /*element: C.p:OutputUnit(main, {})*/
+  final p;
+
+  /*element: C.:OutputUnit(main, {})*/
+  const C(this.p);
+}
+
+/*element: foo:OutputUnit(2, {lib1, lib2})*/
+foo() => print("main");
+
+/*element: main:OutputUnit(main, {})*/
+void main() {
+  lib1.loadLibrary().then((_) {
+    lib2.loadLibrary().then((_) {
+      lib1.foo();
+      lib2.foo();
+      print(lib1.C1);
+      print(lib1.C2);
+      print(lib1.C.C3);
+      print(c);
+      print(lib1.C4);
+      print(lib2.C4);
+      print(lib1.C5);
+      print(lib2.C5);
+      print(lib1.C6);
+      print(lib2.C6);
+      print("string4");
+      print(const C(1));
+    });
+  });
+}
diff --git a/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_global_lib.dart b/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_global_lib.dart
new file mode 100644
index 0000000..626b672
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_loading/libs/dont_inline_deferred_global_lib.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: finalVar:OutputUnit(1, {lib})*/
+final finalVar = "string1";
+
+/*element: globalVar:OutputUnit(1, {lib})*/
+var globalVar = "string2";
diff --git a/tests/compiler/dart2js/dictionary_types_test.dart b/tests/compiler/dart2js/dictionary_types_test.dart
deleted file mode 100644
index f58280d..0000000
--- a/tests/compiler/dart2js/dictionary_types_test.dart
+++ /dev/null
@@ -1,158 +0,0 @@
-// 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:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'memory_compiler.dart';
-import 'compiler_helper.dart' show findElement;
-
-var SOURCES = const {
-  'AddAll.dart': """
-  var dictionaryA = {'string': "aString", 'int': 42, 'double': 21.5,
-                     'list': []};
-  var dictionaryB = {'string': "aString", 'int': 42, 'double': 21.5,
-                     'list': []};
-  var otherDict = {'stringTwo' : "anotherString", 'intTwo' : 84};
-  var int = 0;
-  var anotherInt = 0;
-  var nullOrInt = 0;
-  var dynamic = 0;
-
-  main() {
-    dictionaryA.addAll(otherDict);
-    dictionaryB.addAll({'stringTwo' : "anotherString", 'intTwo' : 84});
-    int = dictionaryB['int'];
-    anotherInt = otherDict['intTwo'];
-    dynamic = dictionaryA['int'];
-    nullOrInt = dictionaryB['intTwo'];
-  }
-""",
-  'Union.dart': """
-  var dictionaryA = {'string': "aString", 'int': 42, 'double': 21.5,
-                     'list': []};
-  var dictionaryB = {'string': "aString", 'intTwo': 42, 'list': []};
-  var nullOrInt = 0;
-  var aString = "";
-  var doubleOrNull = 22.2;
-  var key = "string";
-
-  main() {
-    var union = dictionaryA['foo'] ? dictionaryA : dictionaryB;
-    nullOrInt = union['intTwo'];
-    aString = union['string'];
-    doubleOrNull = union['double'];
-  }
-""",
-  'ValueType.dart': """
-  var dictionary = {'string': "aString", 'int': 42, 'double': 21.5, 'list': []};
-  var keyD = 'double';
-  var keyI = 'int';
-  var keyN = 'notFoundInMap';
-  var knownDouble = 42.2;
-  var intOrNull = dictionary[keyI];
-  var justNull = dictionary[keyN];
-
-  main() {
-    knownDouble = dictionary[keyD];
-    var x = [intOrNull, justNull];
-  }
-""",
-  'Propagation.dart': """
-  class A {
-    A();
-    foo(value) {
-      return value['anInt'];
-    }
-  }
-
-  class B {
-    B();
-    foo(value) {
-      return 0;
-    }
-  }
-
-  main() {
-    var dictionary = {'anInt': 42, 'aString': "theString"};
-    var it;
-    if ([true, false][0]) {
-      it = new A();
-    } else {
-      it = new B();
-    }
-    print(it.foo(dictionary) + 2);
-  }
-""",
-  'Bailout.dart': """
-  var dict = makeMap([1,2]);
-  var notInt = 0;
-  var alsoNotInt = 0;
-
-  makeMap(values) {
-    return {'moo': values[0], 'boo': values[1]};
-  }
-
-  main () {
-    dict['goo'] = 42;
-    var closure = () => dict;
-    notInt = closure()['boo'];
-    alsoNotInt = dict['goo'];
-    print("\$notInt and \$alsoNotInt.");
-  }
-"""
-};
-
-void main() {
-  asyncTest(() async {
-    await compileAndTest("AddAll.dart", (types, getType, closedWorld) {
-      Expect.equals(getType('int'), types.uint31Type);
-      Expect.equals(getType('anotherInt'), types.uint31Type);
-      Expect.equals(getType('dynamic'), types.dynamicType);
-      Expect.equals(getType('nullOrInt'), types.uint31Type.nullable());
-    });
-    await compileAndTest("Union.dart", (types, getType, closedWorld) {
-      Expect.equals(getType('nullOrInt'), types.uint31Type.nullable());
-      Expect.isTrue(getType('aString').containsOnlyString(closedWorld));
-      Expect.equals(getType('doubleOrNull'), types.doubleType.nullable());
-    });
-    await compileAndTest("ValueType.dart", (types, getType, closedWorld) {
-      Expect.equals(getType('knownDouble'), types.doubleType);
-      Expect.equals(getType('intOrNull'), types.uint31Type.nullable());
-      Expect.equals(getType('justNull'), types.nullType);
-    });
-    await compileAndTest("Propagation.dart", (code) {
-      Expect.isFalse(code.contains("J.\$add\$ns"));
-    }, createCode: true);
-    await compileAndTest("Bailout.dart", (types, getType, closedWorld) {
-      Expect.equals(getType('notInt'), types.dynamicType);
-      Expect.equals(getType('alsoNotInt'), types.dynamicType);
-      Expect.isFalse(getType('dict').isDictionary);
-    });
-  });
-}
-
-compileAndTest(source, checker, {createCode: false}) async {
-  CompilationResult result = await runCompiler(
-      entryPoint: Uri.parse('memory:' + source),
-      memorySourceFiles: SOURCES,
-      beforeRun: (compiler) {
-        compiler.stopAfterTypeInference = !createCode;
-      });
-  var compiler = result.compiler;
-  var typesInferrer = compiler.globalInference.typesInferrerInternal;
-  var closedWorld = typesInferrer.closedWorld;
-  var commonMasks = closedWorld.commonMasks;
-  getType(String name) {
-    var element = findElement(compiler, name);
-    return typesInferrer.getTypeOfMember(element);
-  }
-
-  if (!createCode) {
-    checker(commonMasks, getType, closedWorld);
-  } else {
-    var element = compiler.frontendStrategy.elementEnvironment.mainFunction;
-    var code = compiler.backend.getGeneratedCode(element);
-    checker(code);
-  }
-}
diff --git a/tests/compiler/dart2js/dump_info_test.dart b/tests/compiler/dart2js/dump_info_test.dart
index e7fbc5e..f628019 100644
--- a/tests/compiler/dart2js/dump_info_test.dart
+++ b/tests/compiler/dart2js/dump_info_test.dart
@@ -4,8 +4,9 @@
 // Test that parameters keep their names in the output.
 
 import 'dart:convert';
-import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:expect/expect.dart';
 import 'memory_compiler.dart';
 
 const String TEST_BASIC = r"""
@@ -96,17 +97,19 @@
 
 typedef void JsonTaking(Map<String, dynamic> json);
 
-jsonTest(String program, JsonTaking testFn) async {
+jsonTest(String program, JsonTaking testFn, {bool useKernel}) async {
+  var options = ['--out=out.js', Flags.dumpInfo];
+  if (useKernel) {
+    options.add(Flags.useKernel);
+  }
   var result = await runCompiler(
-      memorySourceFiles: {'main.dart': program},
-      options: ['--out=out.js', '--dump-info']);
+      memorySourceFiles: {'main.dart': program}, options: options);
   var compiler = result.compiler;
   Expect.isFalse(compiler.compilationFailed);
   var dumpTask = compiler.dumpInfoTask;
 
   StringBuffer sb = new StringBuffer();
-  dumpTask.dumpInfoJson(
-      sb, compiler.resolutionWorldBuilder.closedWorldForTesting);
+  dumpTask.dumpInfoJson(sb, compiler.backendClosedWorldForTesting);
   String jsonString = sb.toString();
   Map<String, dynamic> map = json.decode(jsonString);
 
@@ -114,10 +117,15 @@
 }
 
 main() {
-  asyncTest(runTests);
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
 }
 
-runTests() async {
+runTests({bool useKernel}) async {
   await jsonTest(TEST_BASIC, (map) {
     Expect.isTrue(map['elements'].isNotEmpty);
     Expect.isTrue(map['elements']['function'].isNotEmpty);
@@ -131,7 +139,7 @@
     Expect.isTrue(map['elements']['function'].values.any((fun) {
       return fun['name'] == 'f';
     }));
-  });
+  }, useKernel: useKernel);
 
   await jsonTest(TEST_CLOSURES, (map) {
     var functions = map['elements']['function'].values;
@@ -141,7 +149,7 @@
     Expect.isTrue(functions.any((fn) {
       return fn['name'] == 'foo' && fn['children'].length == 10;
     }));
-  });
+  }, useKernel: useKernel);
 
   await jsonTest(TEST_STATICS, (map) {
     var functions = map['elements']['function'].values;
@@ -152,7 +160,7 @@
     Expect.isTrue(classes.any((cls) {
       return cls['name'] == 'ContainsStatics' && cls['children'].length >= 1;
     }));
-  });
+  }, useKernel: useKernel);
 
   await jsonTest(TEST_INLINED_1, (map) {
     var functions = map['elements']['function'].values;
@@ -163,7 +171,7 @@
     Expect.isTrue(classes.any((cls) {
       return cls['name'] == 'Doubler' && cls['children'].length >= 1;
     }));
-  });
+  }, useKernel: useKernel);
 
   await jsonTest(TEST_INLINED_2, (map) {
     var functions = map['elements']['function'].values;
@@ -179,5 +187,5 @@
     Expect.isTrue(deps.containsKey(fn2['id']));
     Expect.isTrue(deps[main_['id']].any((dep) => dep['id'] == fn1['id']));
     Expect.isTrue(deps[fn1['id']].any((dep) => dep['id'] == fn2['id']));
-  });
+  }, useKernel: useKernel);
 }
diff --git a/tests/compiler/dart2js/elide_callthrough_stub_test.dart b/tests/compiler/dart2js/elide_callthrough_stub_test.dart
deleted file mode 100644
index 2ae8f1d..0000000
--- a/tests/compiler/dart2js/elide_callthrough_stub_test.dart
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Check that calls through fields elide the call-through stub.  This
-// optimization is done by the simplifier, so inlining does not need to be
-// enabled.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-import 'compiler_helper.dart';
-
-const String TEST1 = r'''
-class W {
-  final Function _fun;
-  W(this._fun);
-  foo(zzz) => _fun(zzz); //   this._fun$1(zzz) -->  this._fun.call$1(zzz)
-}
-add1(x) => x + 1;
-main() {
-  var w = new W(add1);
-  var x = w.foo(42);
-}
-''';
-
-const String TEST2 = r'''
-class W {
-  final Function __fun;
-  Function get _fun => __fun;
-  W(this.__fun);
-  foo(zzz) => _fun(zzz); //   this._fun$1(zzz) stays same.
-}
-add1(x) => x + 1;
-main() {
-  var w = new W(add1);
-  var x = w.foo(42);
-}
-''';
-
-main() {
-  asyncTest(() => compileAll(TEST1).then((generated) {
-        // Direct call through field.
-        Expect.isTrue(generated.contains(r'this._fun.call$1(zzz)'));
-        // No stub.
-        Expect.isFalse(generated.contains(r'_fun$1:'));
-        // No call to stub.
-        Expect.isFalse(generated.contains(r'_fun$1('));
-      }));
-
-  asyncTest(() => compileAll(TEST2).then((generated) {
-        // No call through field.
-        Expect.isFalse(generated.contains(r'this._fun.call$1(zzz)'));
-        // Call through stub.
-        Expect.isTrue(generated.contains(r'this._fun$1(zzz)'));
-        // Stub is generated.
-        Expect.isTrue(generated.contains(r'_fun$1:'));
-        // Call through getter (inside stub).
-        Expect.isTrue(generated.contains(r'get$_fun().call$1'));
-      }));
-}
diff --git a/tests/compiler/dart2js/emit_const_fields_test.dart b/tests/compiler/dart2js/emit_const_fields_test.dart
deleted file mode 100644
index 3076df7..0000000
--- a/tests/compiler/dart2js/emit_const_fields_test.dart
+++ /dev/null
@@ -1,26 +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.
-// Test that unused static consts are not emitted.
-
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
-
-const String TEST_GUIDE = r"""
-class Guide {
-  static const LTUAE = 42;
-  static const TITLE = 'Life, the Universe and Everything';
-}
-
-main() {
-  return "${Guide.LTUAE}, ${Guide.TITLE}";
-}
-""";
-
-main() {
-  asyncTest(() => compileAll(TEST_GUIDE).then((generated) {
-        Expect.isTrue(generated.contains("42"));
-        Expect.isFalse(generated.contains("TITLE"));
-      }));
-}
diff --git a/tests/compiler/dart2js/async_compiler_input_provider_test.dart b/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart
similarity index 87%
rename from tests/compiler/dart2js/async_compiler_input_provider_test.dart
rename to tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart
index 7ce403a0..ba08d5c 100644
--- a/tests/compiler/dart2js/async_compiler_input_provider_test.dart
+++ b/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart
@@ -11,7 +11,6 @@
 import "package:async_helper/async_helper.dart";
 
 import 'package:compiler/compiler.dart' as compiler;
-import 'package:compiler/src/filenames.dart';
 
 const SOURCES = const {
   "/main.dart": """
@@ -44,9 +43,8 @@
   var entrypoint = Uri.parse("file:///main.dart");
 
   // Find the path to sdk/ in the repo relative to this script.
-  Uri script = currentDirectory.resolveUri(Platform.script);
-  Uri libraryRoot = script.resolve('../../../sdk/');
-  Uri packageRoot = script.resolve('./packages/');
+  Uri libraryRoot = Uri.base.resolve('sdk/');
+  Uri packageRoot = Uri.base.resolve('packages/');
 
   asyncTest(() => compiler.compile(entrypoint, libraryRoot, packageRoot,
           provideInput, handleDiagnostic, []).then((code) {
diff --git a/tests/compiler/dart2js/bad_output_io_test.dart b/tests/compiler/dart2js/end_to_end/bad_output_io_test.dart
similarity index 100%
rename from tests/compiler/dart2js/bad_output_io_test.dart
rename to tests/compiler/dart2js/end_to_end/bad_output_io_test.dart
diff --git a/tests/compiler/dart2js/command_line_split_test.dart b/tests/compiler/dart2js/end_to_end/command_line_split_test.dart
similarity index 100%
rename from tests/compiler/dart2js/command_line_split_test.dart
rename to tests/compiler/dart2js/end_to_end/command_line_split_test.dart
diff --git a/tests/compiler/dart2js/command_line_test.dart b/tests/compiler/dart2js/end_to_end/command_line_test.dart
similarity index 96%
rename from tests/compiler/dart2js/command_line_test.dart
rename to tests/compiler/dart2js/end_to_end/command_line_test.dart
index 95cf063..a45172b 100644
--- a/tests/compiler/dart2js/command_line_test.dart
+++ b/tests/compiler/dart2js/end_to_end/command_line_test.dart
@@ -19,6 +19,8 @@
   asyncTest(() async {
     await test([], exitCode: 1);
     await test(['foo.dart']);
+    await test([Flags.useKernel], exitCode: 1);
+    await test([Flags.useKernel, 'foo.dart']);
     await test([Flags.resolveOnly, 'foo.dart'],
         resolveOnly: true, resolutionOutput: Uri.base.resolve('out.data'));
     await test(['--resolution-input=bar.dart', 'foo.dart'],
diff --git a/tests/compiler/dart2js/dart2js_batch2_test.dart b/tests/compiler/dart2js/end_to_end/dart2js_batch2_test.dart
similarity index 92%
rename from tests/compiler/dart2js/dart2js_batch2_test.dart
rename to tests/compiler/dart2js/end_to_end/dart2js_batch2_test.dart
index 931b803..76d0448 100644
--- a/tests/compiler/dart2js/dart2js_batch2_test.dart
+++ b/tests/compiler/dart2js/end_to_end/dart2js_batch2_test.dart
@@ -39,7 +39,7 @@
     tmpDir = directory;
     String newPath = path.join(directory.path, "dart2js_batch2_run.dart");
     File source = new File.fromUri(
-        Platform.script.resolve("data/dart2js_batch2_run.dart"));
+        Platform.script.resolve("../data/dart2js_batch2_run.dart"));
     source.copySync(newPath);
   });
 }
@@ -51,8 +51,8 @@
 
 Future<Process> launchDart2Js(_) {
   String ext = Platform.isWindows ? '.bat' : '';
-  String command = path.normalize(path.join(
-      path.fromUri(Platform.script), '../../../../sdk/bin/dart2js${ext}'));
+  String command = path
+      .normalize(path.join(path.fromUri(Uri.base), 'sdk/bin/dart2js${ext}'));
   print("Running '$command --batch' from '${tmpDir}'.");
   return Process.start(command, ['--batch'], workingDirectory: tmpDir.path);
 }
diff --git a/tests/compiler/dart2js/dart2js_batch_test.dart b/tests/compiler/dart2js/end_to_end/dart2js_batch_test.dart
similarity index 93%
rename from tests/compiler/dart2js/dart2js_batch_test.dart
rename to tests/compiler/dart2js/end_to_end/dart2js_batch_test.dart
index bd43218..1f59093 100644
--- a/tests/compiler/dart2js/dart2js_batch_test.dart
+++ b/tests/compiler/dart2js/end_to_end/dart2js_batch_test.dart
@@ -39,8 +39,8 @@
 Future setup() {
   return createTempDir().then((Directory directory) {
     tmpDir = directory;
-    Directory sunflowerDir = new Directory.fromUri(
-        Platform.script.resolve('../../../third_party/sunflower'));
+    Directory sunflowerDir =
+        new Directory.fromUri(Uri.base.resolve('third_party/sunflower'));
 
     print("Copying '${sunflowerDir.path}' to '${tmpDir.path}'.");
     copyDirectory(sunflowerDir, tmpDir);
@@ -55,7 +55,7 @@
 Future<Process> launchDart2Js(_) {
   return Process.start(
       // Use an absolute path because we are changing the cwd below.
-      path.fromUri(Uri.base.resolve(Platform.executable)),
+      path.absolute(Platform.executable),
       dart2JsCommand(['--batch']),
       workingDirectory: tmpDir.path);
 }
diff --git a/tests/compiler/dart2js/diagnostic_reporter_helper.dart b/tests/compiler/dart2js/end_to_end/diagnostic_reporter_helper.dart
similarity index 97%
rename from tests/compiler/dart2js/diagnostic_reporter_helper.dart
rename to tests/compiler/dart2js/end_to_end/diagnostic_reporter_helper.dart
index 0ca8649..7a3c4c7 100644
--- a/tests/compiler/dart2js/diagnostic_reporter_helper.dart
+++ b/tests/compiler/dart2js/end_to_end/diagnostic_reporter_helper.dart
@@ -9,8 +9,8 @@
 import 'package:compiler/src/diagnostics/source_span.dart';
 import 'package:compiler/src/diagnostics/spannable.dart';
 import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/options.dart';
 import 'package:front_end/src/fasta/scanner.dart';
-import 'options_helper.dart';
 
 abstract class DiagnosticReporterWrapper extends DiagnosticReporter {
   DiagnosticReporter get reporter;
diff --git a/tests/compiler/dart2js/exit_code_test.dart b/tests/compiler/dart2js/end_to_end/exit_code_test.dart
similarity index 98%
rename from tests/compiler/dart2js/exit_code_test.dart
rename to tests/compiler/dart2js/end_to_end/exit_code_test.dart
index fe5784a..9898b8b 100644
--- a/tests/compiler/dart2js/exit_code_test.dart
+++ b/tests/compiler/dart2js/end_to_end/exit_code_test.dart
@@ -5,7 +5,6 @@
 // Test the exit code of dart2js in case of exceptions, errors, warnings, etc.
 
 import 'dart:async';
-import 'dart:io' show Platform;
 
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
@@ -242,7 +241,7 @@
     entry.compileFunc = compile;
 
     List<String> args = new List<String>.from(options)
-      ..add("--library-root=${Platform.script.resolve('../../../sdk/')}")
+      ..add("--library-root=${Uri.base.resolve('sdk/')}")
       ..add("tests/compiler/dart2js/data/exit_code_helper.dart");
     Future result = entry.internalMain(args);
     return result.catchError((e, s) {
diff --git a/tests/compiler/dart2js/launch_helper.dart b/tests/compiler/dart2js/end_to_end/launch_helper.dart
similarity index 100%
rename from tests/compiler/dart2js/launch_helper.dart
rename to tests/compiler/dart2js/end_to_end/launch_helper.dart
diff --git a/tests/compiler/dart2js/library_env_test.dart b/tests/compiler/dart2js/end_to_end/library_env_test.dart
similarity index 98%
rename from tests/compiler/dart2js/library_env_test.dart
rename to tests/compiler/dart2js/end_to_end/library_env_test.dart
index 0960b39..f6496d2 100644
--- a/tests/compiler/dart2js/library_env_test.dart
+++ b/tests/compiler/dart2js/end_to_end/library_env_test.dart
@@ -7,7 +7,7 @@
 
 import 'dart:async';
 
-import 'memory_source_file_helper.dart';
+import '../memory_source_file_helper.dart';
 
 import "package:async_helper/async_helper.dart";
 
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence.dart b/tests/compiler/dart2js/equivalence/id_equivalence.dart
index 2bb2070..2d0a4ed 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence.dart
@@ -211,15 +211,6 @@
 
   TreeElements get elements => resolvedAst.elements;
 
-  ElementId computeElementId(AstElement element) {
-    String memberName = element.name;
-    if (element.isSetter) {
-      memberName += '=';
-    }
-    String className = element.enclosingClass?.name;
-    return new ElementId.internal(memberName, className);
-  }
-
   ast.Node computeAccessPosition(ast.Send node, AccessSemantics access) {
     switch (access.kind) {
       case AccessKind.THIS_PROPERTY:
@@ -522,6 +513,29 @@
   }
 }
 
+/// Compute a canonical [Id] for AST-based nodes.
+ElementId computeElementId(AstElement element) {
+  String memberName = element.name;
+  if (element.isSetter) {
+    memberName += '=';
+  }
+  String className = element.enclosingClass?.name;
+  return new ElementId.internal(memberName, className);
+}
+
+/// Compute a canonical [Id] for kernel-based nodes.
+Id computeEntityId(ir.Member node) {
+  String className;
+  if (node.enclosingClass != null) {
+    className = node.enclosingClass.name;
+  }
+  String memberName = node.name.name;
+  if (node is ir.Procedure && node.kind == ir.ProcedureKind.Setter) {
+    memberName += '=';
+  }
+  return new ElementId.internal(memberName, className);
+}
+
 /// Abstract IR visitor for computing data corresponding to a node or element,
 /// and record it with a generic [Id]
 abstract class IrDataExtractor extends ir.Visitor with DataRegistry {
@@ -539,20 +553,9 @@
   String computeNodeValue(Id id, ir.TreeNode node);
 
   IrDataExtractor(this.reporter, this.actualMap);
-  Id computeElementId(ir.Member node) {
-    String className;
-    if (node.enclosingClass != null) {
-      className = node.enclosingClass.name;
-    }
-    String memberName = node.name.name;
-    if (node is ir.Procedure && node.kind == ir.ProcedureKind.Setter) {
-      memberName += '=';
-    }
-    return new ElementId.internal(memberName, className);
-  }
 
   void computeForMember(ir.Member member) {
-    ElementId id = computeElementId(member);
+    ElementId id = computeEntityId(member);
     if (id == null) return;
     String value = computeMemberValue(id, member);
     registerValue(computeSourceSpan(member), id, value, member);
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
index c3d22e2..a19dc4b 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
@@ -77,8 +77,7 @@
 /// Compute actual data for all members defined in the program with the
 /// [entryPoint] and [memorySourceFiles].
 ///
-/// Actual data is computed using [computeMemberData] and [code] is compiled
-/// using [compileFunction].
+/// Actual data is computed using [computeMemberData].
 Future<CompiledData> computeData(
     Uri entryPoint,
     Map<String, String> memorySourceFiles,
@@ -87,21 +86,33 @@
     bool verbose: false,
     bool forMainLibraryOnly: true,
     bool skipUnprocessedMembers: false,
-    bool skipFailedCompilations: false}) async {
-  Compiler compiler =
-      compilerFor(memorySourceFiles: memorySourceFiles, options: options);
-  compiler.stopAfterTypeInference = options.contains(stopAfterTypeInference);
-  await compiler.run(entryPoint);
-  if (compiler.compilationFailed) {
+    bool skipFailedCompilations: false,
+    bool forUserSourceFilesOnly: false}) async {
+  CompilationResult result = await runCompiler(
+      entryPoint: entryPoint,
+      memorySourceFiles: memorySourceFiles,
+      options: options,
+      beforeRun: (compiler) {
+        compiler.stopAfterTypeInference =
+            options.contains(stopAfterTypeInference);
+      });
+  if (!result.isSuccess) {
     if (skipFailedCompilations) return null;
-    Expect.isFalse(compiler.compilationFailed, "Unexpected compilation error.");
+    Expect.isTrue(result.isSuccess, "Unexpected compilation error.");
   }
+  Compiler compiler = result.compiler;
   ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
   ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
 
   Map<Uri, Map<Id, ActualData>> actualMaps = <Uri, Map<Id, ActualData>>{};
 
   Map<Id, ActualData> actualMapFor(Entity entity) {
+    if (entity is Element) {
+      // TODO(johnniwinther): Remove this when patched members from kernel are
+      // no longer ascribed to the patch file.
+      Element element = entity;
+      entity = element.implementation;
+    }
     SourceSpan span =
         compiler.backendStrategy.spanFromSpannable(entity, entity);
     Uri uri = resolveFastaUri(span.uri);
@@ -134,7 +145,7 @@
     computeMemberData(compiler, member, actualMapFor(member), verbose: verbose);
   }
 
-  if (forMainLibraryOnly) {
+  if (forMainLibraryOnly && !forUserSourceFilesOnly) {
     LibraryEntity mainLibrary = elementEnvironment.mainLibrary;
     elementEnvironment.forEachClass(mainLibrary, (ClassEntity cls) {
       if (!elementEnvironment.isEnumClass(cls)) {
@@ -143,6 +154,11 @@
       elementEnvironment.forEachLocalClassMember(cls, processMember);
     });
     elementEnvironment.forEachLibraryMember(mainLibrary, processMember);
+  } else if (forUserSourceFilesOnly) {
+    closedWorld.processedMembers
+        .where((MemberEntity member) =>
+            userFiles.contains(member.library.canonicalUri.pathSegments.last))
+        .forEach(processMember);
   } else {
     closedWorld.processedMembers.forEach(processMember);
   }
@@ -172,7 +188,7 @@
   }
 
   Map<int, List<String>> computeDiffAnnotationsAgainst(
-      Map<Id, ActualData> thisMap, Map<Id, ActualData> otherMap,
+      Map<Id, ActualData> thisMap, Map<Id, ActualData> otherMap, Uri uri,
       {bool includeMatches: false}) {
     Map<int, List<String>> annotations = <int, List<String>>{};
     thisMap.forEach((Id id, ActualData data1) {
@@ -192,8 +208,7 @@
     otherMap.forEach((Id id, ActualData data2) {
       if (!thisMap.containsKey(id)) {
         int offset = compiler.reporter
-            .spanFromSpannable(
-                computeSpannable(elementEnvironment, mainUri, id))
+            .spanFromSpannable(computeSpannable(elementEnvironment, uri, id))
             .begin;
         String value1 = '---';
         String value2 = '${data2.value}';
@@ -230,34 +245,39 @@
 
 /// Data collected by [computeData].
 class IdData {
-  final AnnotatedCode code;
-  final Map<Id, IdValue> expectedMap;
+  final Map<Uri, AnnotatedCode> code;
+  final MemberAnnotations<IdValue> expectedMaps;
   final CompiledData compiledData;
+  final MemberAnnotations<ActualData> _actualMaps = new MemberAnnotations();
 
-  IdData(this.code, this.expectedMap, this.compiledData);
+  IdData(this.code, this.expectedMaps, this.compiledData) {
+    for (Uri uri in code.keys) {
+      _actualMaps[uri] = compiledData.actualMaps[uri] ?? <Id, ActualData>{};
+    }
+  }
 
   Compiler get compiler => compiledData.compiler;
   ElementEnvironment get elementEnvironment => compiledData.elementEnvironment;
   Uri get mainUri => compiledData.mainUri;
-  Map<Id, ActualData> get actualMap => compiledData.actualMaps[mainUri];
+  MemberAnnotations<ActualData> get actualMaps => _actualMaps;
 
-  String get actualCode {
+  String actualCode(Uri uri) {
     Map<int, List<String>> annotations = <int, List<String>>{};
-    actualMap.forEach((Id id, ActualData data) {
+    actualMaps[uri].forEach((Id id, ActualData data) {
       annotations
           .putIfAbsent(data.sourceSpan.begin, () => [])
           .add('${data.value}');
     });
-    return withAnnotations(code.sourceCode, annotations);
+    return withAnnotations(code[uri].sourceCode, annotations);
   }
 
-  String get diffCode {
+  String diffCode(Uri uri) {
     Map<int, List<String>> annotations = <int, List<String>>{};
-    actualMap.forEach((Id id, ActualData data) {
-      IdValue value = expectedMap[id];
+    actualMaps[uri].forEach((Id id, ActualData data) {
+      IdValue value = expectedMaps[uri][id];
       if (data.value != value || value == null && data.value.value != '') {
         String expected = value?.toString() ?? '';
-        int offset = getOffsetFromId(id);
+        int offset = getOffsetFromId(id, uri);
         String value1 = '${expected}';
         String value2 = '${data.value}';
         annotations
@@ -265,9 +285,9 @@
             .add(colorizeDiff(value1, ' | ', value2));
       }
     });
-    expectedMap.forEach((Id id, IdValue expected) {
-      if (!actualMap.containsKey(id)) {
-        int offset = getOffsetFromId(id);
+    expectedMaps[uri].forEach((Id id, IdValue expected) {
+      if (!actualMaps[uri].containsKey(id)) {
+        int offset = getOffsetFromId(id, uri);
         String value1 = '${expected}';
         String value2 = '---';
         annotations
@@ -275,28 +295,73 @@
             .add(colorizeDiff(value1, ' | ', value2));
       }
     });
-    return withAnnotations(code.sourceCode, annotations);
+    return withAnnotations(code[uri].sourceCode, annotations);
   }
 
-  int getOffsetFromId(Id id) {
+  int getOffsetFromId(Id id, Uri uri) {
     return compiler.reporter
-        .spanFromSpannable(computeSpannable(elementEnvironment, mainUri, id))
+        .spanFromSpannable(computeSpannable(elementEnvironment, uri, id))
         .begin;
   }
 }
 
+/// Encapsulates the member data computed for each source file of interest.
+/// It's a glorified wrapper around a map of maps, but written this way to
+/// provide a little more information about what it's doing. [DataType] refers
+/// to the type this map is holding -- it is either [IdValue] or [ActualData].
+class MemberAnnotations<DataType> {
+  /// For each Uri, we create a map associating an element id with its
+  /// corresponding annotations.
+  final Map<Uri, Map<Id, DataType>> _computedDataForEachFile =
+      new Map<Uri, Map<Id, DataType>>();
+
+  void operator []=(Uri file, Map<Id, DataType> computedData) {
+    _computedDataForEachFile[file] = computedData;
+  }
+
+  void forEach(void f(Uri file, Map<Id, DataType> computedData)) {
+    _computedDataForEachFile.forEach(f);
+  }
+
+  Map<Id, DataType> operator [](Uri file) {
+    if (!_computedDataForEachFile.containsKey(file)) {
+      _computedDataForEachFile[file] = <Id, DataType>{};
+    }
+    return _computedDataForEachFile[file];
+  }
+}
+
+typedef void Callback();
+
 /// Check code for all test files int [data] using [computeFromAst] and
 /// [computeFromKernel] from the respective front ends. If [skipForKernel]
 /// contains the name of the test file it isn't tested for kernel.
+///
+/// [libDirectory] contains the directory for any supporting libraries that need
+/// to be loaded. We expect supporting libraries to have the same prefix as the
+/// original test in [dataDir]. So, for example, if testing `foo.dart` in
+/// [dataDir], then this function will consider any files named `foo.*\.dart`,
+/// such as `foo2.dart`, `foo_2.dart`, and `foo_blah_blah_blah.dart` in
+/// [libDirectory] to be supporting library files for `foo.dart`.
+/// [setUpFunction] is called once for every test that is executed.
+/// If [forUserSourceFilesOnly] is true, we examine the elements in the main
+/// file and any supporting libraries.
 Future checkTests(Directory dataDir, ComputeMemberDataFunction computeFromAst,
     ComputeMemberDataFunction computeFromKernel,
     {List<String> skipforAst: const <String>[],
     List<String> skipForKernel: const <String>[],
     bool filterActualData(IdValue idValue, ActualData actualData),
     List<String> options: const <String>[],
-    List<String> args: const <String>[]}) async {
+    List<String> args: const <String>[],
+    Directory libDirectory: null,
+    bool forMainLibraryOnly: true,
+    bool forUserSourceFilesOnly: false,
+    Callback setUpFunction}) async {
   args = args.toList();
   bool verbose = args.remove('-v');
+
+  var relativeDir = dataDir.uri.path.replaceAll(Uri.base.path, '');
+  print('Data dir: ${relativeDir}');
   await for (FileSystemEntity entity in dataDir.list()) {
     String name = entity.uri.pathSegments.last;
     if (args.isNotEmpty && !args.contains(name)) continue;
@@ -305,99 +370,149 @@
       testOptions.add(Flags.enableAsserts);
     }
     print('----------------------------------------------------------------');
-    print('Checking ${entity.uri}');
-    print('----------------------------------------------------------------');
+    print('Test: $name');
     // Pretend this is a dart2js_native test to allow use of 'native' keyword
     // and import of private libraries.
+    String commonTestPath = 'sdk/tests/compiler';
     Uri entryPoint =
-        Uri.parse('memory:sdk/tests/compiler/dart2js_native/main.dart');
+        Uri.parse('memory:$commonTestPath/dart2js_native/main.dart');
     String annotatedCode = await new File.fromUri(entity.uri).readAsString();
-    AnnotatedCode code =
-        new AnnotatedCode.fromText(annotatedCode, commentStart, commentEnd);
-    List<Map<Id, IdValue>> expectedMaps = computeExpectedMap(code);
-    Map<String, String> memorySourceFiles = {entryPoint.path: code.sourceCode};
+    userFiles.add('main.dart');
+    Map<Uri, AnnotatedCode> code = {
+      entryPoint:
+          new AnnotatedCode.fromText(annotatedCode, commentStart, commentEnd)
+    };
+    Map<String, MemberAnnotations<IdValue>> expectedMaps = {
+      astMarker: new MemberAnnotations<IdValue>(),
+      kernelMarker: new MemberAnnotations<IdValue>()
+    };
+    computeExpectedMap(entryPoint, code[entryPoint], expectedMaps);
+    Map<String, String> memorySourceFiles = {
+      entryPoint.path: code[entryPoint].sourceCode
+    };
+
+    if (libDirectory != null) {
+      print('Supporting libraries:');
+      String filePrefix = name.substring(0, name.lastIndexOf('.'));
+      await for (FileSystemEntity libEntity in libDirectory.list()) {
+        String libFileName = libEntity.uri.pathSegments.last;
+        if (libFileName.startsWith(filePrefix)) {
+          print('    - libs/$libFileName');
+          Uri libFileUri =
+              Uri.parse('memory:$commonTestPath/libs/$libFileName');
+          userFiles.add(libEntity.uri.pathSegments.last);
+          String libCode = await new File.fromUri(libEntity.uri).readAsString();
+          AnnotatedCode annotatedLibCode =
+              new AnnotatedCode.fromText(libCode, commentStart, commentEnd);
+          memorySourceFiles[libFileUri.path] = annotatedLibCode.sourceCode;
+          code[libFileUri] = annotatedLibCode;
+          computeExpectedMap(libFileUri, annotatedLibCode, expectedMaps);
+        }
+      }
+    }
+
+    if (setUpFunction != null) setUpFunction();
 
     if (skipforAst.contains(name)) {
-      print('--skipped for kernel------------------------------------------');
+      print('--skipped for ast-----------------------------------------------');
     } else {
       print('--from ast------------------------------------------------------');
       CompiledData compiledData1 = await computeData(
           entryPoint, memorySourceFiles, computeFromAst,
-          options: testOptions, verbose: verbose);
-      await checkCode(code, expectedMaps[0], compiledData1);
+          options: testOptions,
+          verbose: verbose,
+          forMainLibraryOnly: forMainLibraryOnly,
+          forUserSourceFilesOnly: forUserSourceFilesOnly);
+      await checkCode(code, expectedMaps[astMarker], compiledData1);
     }
     if (skipForKernel.contains(name)) {
-      print('--skipped for kernel------------------------------------------');
+      print('--skipped for kernel--------------------------------------------');
     } else {
       print('--from kernel---------------------------------------------------');
       CompiledData compiledData2 = await computeData(
           entryPoint, memorySourceFiles, computeFromKernel,
-          options: [Flags.useKernel]..addAll(testOptions), verbose: verbose);
-      await checkCode(code, expectedMaps[1], compiledData2,
+          options: [Flags.useKernel]..addAll(testOptions),
+          verbose: verbose,
+          forMainLibraryOnly: forMainLibraryOnly,
+          forUserSourceFilesOnly: forUserSourceFilesOnly);
+      await checkCode(code, expectedMaps[kernelMarker], compiledData2,
           filterActualData: filterActualData);
     }
   }
 }
 
+final Set<String> userFiles = new Set<String>();
+
 /// Checks [compiledData] against the expected data in [expectedMap] derived
 /// from [code].
-Future checkCode(
-    AnnotatedCode code, Map<Id, IdValue> expectedMap, CompiledData compiledData,
+Future checkCode(Map<Uri, AnnotatedCode> code,
+    MemberAnnotations<IdValue> expectedMaps, CompiledData compiledData,
     {bool filterActualData(IdValue expected, ActualData actualData)}) async {
-  IdData data = new IdData(code, expectedMap, compiledData);
+  IdData data = new IdData(code, expectedMaps, compiledData);
 
-  data.actualMap.forEach((Id id, ActualData actualData) {
-    IdValue actual = actualData.value;
-    if (!data.expectedMap.containsKey(id)) {
-      if (actual.value != '') {
-        reportHere(
-            data.compiler.reporter,
-            actualData.sourceSpan,
-            'Id $id = ${actual} for ${actualData.object} '
-            '(${actualData.object.runtimeType}) '
-            'not expected in ${data.expectedMap.keys}');
-        print('--annotations diff--------------------------------------------');
-        print(data.diffCode);
-        print('--------------------------------------------------------------');
+  data.actualMaps.forEach((Uri uri, Map<Id, ActualData> actualMap) {
+    actualMap.forEach((Id id, ActualData actualData) {
+      IdValue actual = actualData.value;
+      if (!data.expectedMaps[uri].containsKey(id)) {
+        if (actual.value != '') {
+          reportHere(
+              data.compiler.reporter,
+              actualData.sourceSpan,
+              'Id $id = ${actual} for ${actualData.object} '
+              '(${actualData.object.runtimeType}) '
+              'not expected in ${data.expectedMaps[uri].keys}');
+          print('--annotations diff [${uri.pathSegments.last}]---------------');
+          print(data.diffCode(uri));
+          print('------------------------------------------------------------');
+        }
+        if (filterActualData == null || filterActualData(null, actualData)) {
+          Expect.equals('', actual.value);
+        }
+      } else {
+        IdValue expected = data.expectedMaps[uri][id];
+        if (actual != expected) {
+          reportHere(
+              data.compiler.reporter,
+              actualData.sourceSpan,
+              'Object: ${actualData.object} (${actualData.object.runtimeType}), '
+              'expected: ${expected}, actual: ${actual}');
+          print('--annotations diff [${uri.pathSegments.last}]---------------');
+          print(data.diffCode(uri));
+          print('------------------------------------------------------------');
+        }
+        if (filterActualData == null ||
+            filterActualData(expected, actualData)) {
+          Expect.equals(expected, actual);
+        }
       }
-      if (filterActualData == null || filterActualData(null, actualData)) {
-        Expect.equals('', actual.value);
-      }
-    } else {
-      IdValue expected = data.expectedMap[id];
-      if (actual != expected) {
-        reportHere(
-            data.compiler.reporter,
-            actualData.sourceSpan,
-            'Object: ${actualData.object} (${actualData.object.runtimeType}), '
-            'expected: ${expected}, actual: ${actual}');
-        print('--annotations diff--------------------------------------------');
-        print(data.diffCode);
-        print('--------------------------------------------------------------');
-      }
-      if (filterActualData == null || filterActualData(expected, actualData)) {
-        Expect.equals(expected, actual);
-      }
-    }
+    });
   });
 
   Set<Id> missingIds = new Set<Id>();
-  data.expectedMap.forEach((Id id, IdValue expected) {
-    if (!data.actualMap.containsKey(id)) {
-      missingIds.add(id);
-      StringBuffer sb = new StringBuffer();
-      for (Id id in data.actualMap.keys /*.where((d) => d.kind == id.kind)*/) {
-        sb.write('\n  $id');
+  StringBuffer combinedAnnotationsDiff = new StringBuffer();
+  data.expectedMaps.forEach((Uri uri, Map<Id, IdValue> expectedMap) {
+    expectedMap.forEach((Id id, IdValue expected) {
+      if (!data.actualMaps[uri].containsKey(id)) {
+        missingIds.add(id);
+        StringBuffer sb = new StringBuffer();
+        for (Id id
+            in data.actualMaps[uri].keys /*.where((d) => d.kind == id.kind)*/) {
+          sb.write('\n  $id');
+        }
+        reportHere(
+            data.compiler.reporter,
+            computeSpannable(data.elementEnvironment, uri, id),
+            'Expected $expected for id $id missing in${sb}');
       }
-      reportHere(
-          data.compiler.reporter,
-          computeSpannable(data.elementEnvironment, data.mainUri, id),
-          'Expected $expected for id $id missing in${sb}');
+    });
+    if (missingIds.isNotEmpty) {
+      combinedAnnotationsDiff.write('Missing in $uri:\n');
+      combinedAnnotationsDiff.write('${data.diffCode(uri)}\n');
     }
   });
-  if (missingIds.isNotEmpty) {
+  if (combinedAnnotationsDiff.isNotEmpty) {
     print('--annotations diff--------------------------------------------');
-    print(data.diffCode);
+    print(combinedAnnotationsDiff.toString());
     print('--------------------------------------------------------------');
   }
   Expect.isTrue(missingIds.isEmpty, "Ids not found: ${missingIds}.");
@@ -443,7 +558,8 @@
 const String astMarker = 'ast.';
 const String kernelMarker = 'kernel.';
 
-/// Compute two expectancy maps from [code]; one corresponding to the old
+/// Compute two [MemberAnnotations] objects from [code] specifying the expected
+/// annotations we anticipate encountering; one corresponding to the old
 /// implementation, one for the new implementation.
 ///
 /// If an annotation starts with 'ast.' it is only expected for the old
@@ -452,23 +568,22 @@
 ///
 /// Most nodes have the same and expectations should match this by using
 /// annotations without prefixes.
-List<Map<Id, IdValue>> computeExpectedMap(AnnotatedCode code) {
-  Map<String, AnnotatedCode> split =
-      splitByPrefixes(code, [astMarker, kernelMarker]);
+void computeExpectedMap(Uri sourceUri, AnnotatedCode code,
+    Map<String, MemberAnnotations<IdValue>> maps) {
+  List<String> mapKeys = [astMarker, kernelMarker];
+  Map<String, AnnotatedCode> split = splitByPrefixes(code, mapKeys);
 
-  List<Map<Id, IdValue>> maps = [];
   split.forEach((String marker, AnnotatedCode code) {
-    Map<Id, IdValue> map = <Id, IdValue>{};
+    MemberAnnotations<IdValue> fileAnnotations = maps[marker];
+    Map<Id, IdValue> expectedValues = fileAnnotations[sourceUri];
     for (Annotation annotation in code.annotations) {
       String text = annotation.text;
       IdValue idValue = IdValue.decode(annotation.offset, text);
-      Expect.isFalse(map.containsKey(idValue.id),
+      Expect.isFalse(expectedValues.containsKey(idValue.id),
           "Duplicate annotations for ${idValue.id}.");
-      map[idValue.id] = idValue;
+      expectedValues[idValue.id] = idValue;
     }
-    maps.add(map);
   });
-  return maps;
 }
 
 Future<bool> compareData(
@@ -480,7 +595,8 @@
     bool forMainLibraryOnly: true,
     bool skipUnprocessedMembers: false,
     bool skipFailedCompilations: false,
-    bool verbose: false}) async {
+    bool verbose: false,
+    bool whiteList(Uri uri, Id id)}) async {
   print('--from ast----------------------------------------------------------');
   CompiledData data1 = await computeData(
       entryPoint, memorySourceFiles, computeAstData,
@@ -498,12 +614,19 @@
       skipFailedCompilations: skipFailedCompilations);
   if (data2 == null) return false;
   await compareCompiledData(data1, data2,
-      skipMissingUris: !forMainLibraryOnly, verbose: verbose);
+      whiteList: whiteList,
+      skipMissingUris: !forMainLibraryOnly,
+      verbose: verbose);
   return true;
 }
 
 Future compareCompiledData(CompiledData data1, CompiledData data2,
-    {bool skipMissingUris: false, bool verbose: false}) async {
+    {bool skipMissingUris: false,
+    bool verbose: false,
+    bool whiteList(Uri uri, Id id)}) async {
+  if (whiteList == null) {
+    whiteList = (uri, id) => false;
+  }
   bool hasErrors = false;
   String libraryRoot1;
 
@@ -549,7 +672,9 @@
       if (value1 != value2) {
         reportHere(data1.compiler.reporter, actualData1.sourceSpan,
             '$id: from source:${value1},from dill:${value2}');
-        hasErrors = hasErrorsInUri = true;
+        if (!whiteList(uri1, id)) {
+          hasErrors = hasErrorsInUri = true;
+        }
       }
     });
     actualMap2.forEach((Id id, ActualData actualData2) {
@@ -558,14 +683,16 @@
       if (value1 != value2) {
         reportHere(data2.compiler.reporter, actualData2.sourceSpan,
             '$id: from source:${value1},from dill:${value2}');
-        hasErrors = hasErrorsInUri = true;
+        if (!whiteList(uri1, id)) {
+          hasErrors = hasErrorsInUri = true;
+        }
       }
     });
     if (hasErrorsInUri) {
       print('--annotations diff $uri1---------------------------------------');
       print(withAnnotations(
           sourceCode1,
-          data1.computeDiffAnnotationsAgainst(actualMap1, actualMap2,
+          data1.computeDiffAnnotationsAgainst(actualMap1, actualMap2, uri1,
               includeMatches: verbose)));
       print('----------------------------------------------------------');
     }
diff --git a/tests/compiler/dart2js/expect_annotations_test.dart b/tests/compiler/dart2js/expect_annotations_test.dart
deleted file mode 100644
index 09ab2e9..0000000
--- a/tests/compiler/dart2js/expect_annotations_test.dart
+++ /dev/null
@@ -1,134 +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.
-
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/elements/elements.dart';
-import 'package:compiler/src/js_backend/annotations.dart' as optimizerHints;
-import 'package:compiler/src/types/types.dart';
-import 'package:compiler/src/world.dart' show ClosedWorld;
-import 'type_mask_test_helper.dart';
-import 'memory_compiler.dart';
-
-const Map MEMORY_SOURCE_FILES = const {
-  'main.dart': r"""
-import 'package:expect/expect.dart';
-
-int method(String arg) => arg.length;
-
-@AssumeDynamic()
-int methodAssumeDynamic(String arg) => arg.length;
-
-@TrustTypeAnnotations()
-int methodTrustTypeAnnotations(String arg) => arg.length;
-
-@NoInline()
-int methodNoInline(String arg) => arg.length;
-
-@NoInline() @TrustTypeAnnotations()
-int methodNoInlineTrustTypeAnnotations(String arg) => arg.length;
-
-@AssumeDynamic() @TrustTypeAnnotations()
-int methodAssumeDynamicTrustTypeAnnotations(String arg) => arg.length;
-
-
-void main(List<String> args) {
-  print(method(args[0]));
-  print(methodAssumeDynamic('foo'));
-  print(methodTrustTypeAnnotations(42));
-  print(methodTrustTypeAnnotations("fourtyTwo"));
-  print(methodNoInline('bar'));
-  print(methodNoInlineTrustTypeAnnotations(42));
-  print(methodNoInlineTrustTypeAnnotations("fourtyTwo"));
-  print(methodAssumeDynamicTrustTypeAnnotations(null));
-}
-"""
-};
-
-main() {
-  asyncTest(() async {
-    CompilationResult result =
-        await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
-    Compiler compiler = result.compiler;
-    ClosedWorld closedWorld =
-        compiler.resolutionWorldBuilder.closedWorldForTesting;
-    Expect.isFalse(compiler.compilationFailed, 'Unsuccessful compilation');
-    Expect.isNotNull(closedWorld.commonElements.expectNoInlineClass,
-        'NoInlineClass is unresolved.');
-    Expect.isNotNull(closedWorld.commonElements.expectTrustTypeAnnotationsClass,
-        'TrustTypeAnnotations is unresolved.');
-    Expect.isNotNull(closedWorld.commonElements.expectAssumeDynamicClass,
-        'AssumeDynamicClass is unresolved.');
-
-    void testTypeMatch(MethodElement function, TypeMask expectedParameterType,
-        TypeMask expectedReturnType, TypesInferrer inferrer) {
-      for (ParameterElement parameter in function.parameters) {
-        TypeMask type = inferrer.getTypeOfParameter(parameter);
-        Expect.equals(
-            expectedParameterType, simplify(type, closedWorld), "$parameter");
-      }
-      if (expectedReturnType != null) {
-        TypeMask type = inferrer.getReturnTypeOfMember(function);
-        Expect.equals(
-            expectedReturnType, simplify(type, closedWorld), "$function");
-      }
-    }
-
-    void test(String name,
-        {bool expectNoInline: false,
-        bool expectTrustTypeAnnotations: false,
-        TypeMask expectedParameterType: null,
-        TypeMask expectedReturnType: null,
-        bool expectAssumeDynamic: false}) {
-      LibraryElement mainApp =
-          compiler.frontendStrategy.elementEnvironment.mainLibrary;
-      MethodElement method = mainApp.find(name);
-      Expect.isNotNull(method);
-      Expect.equals(
-          expectNoInline,
-          optimizerHints.noInline(closedWorld.elementEnvironment,
-              closedWorld.commonElements, method),
-          "Unexpected annotation of @NoInline on '$method'.");
-      Expect.equals(
-          expectTrustTypeAnnotations,
-          optimizerHints.trustTypeAnnotations(closedWorld.elementEnvironment,
-              closedWorld.commonElements, method),
-          "Unexpected annotation of @TrustTypeAnnotations on '$method'.");
-      Expect.equals(
-          expectAssumeDynamic,
-          optimizerHints.assumeDynamic(closedWorld.elementEnvironment,
-              closedWorld.commonElements, method),
-          "Unexpected annotation of @AssumeDynamic on '$method'.");
-      TypesInferrer inferrer = compiler.globalInference.typesInferrerInternal;
-      if (expectTrustTypeAnnotations && expectedParameterType != null) {
-        testTypeMatch(
-            method, expectedParameterType, expectedReturnType, inferrer);
-      } else if (expectAssumeDynamic) {
-        testTypeMatch(
-            method, closedWorld.commonMasks.dynamicType, null, inferrer);
-      }
-    }
-
-    TypeMask jsStringType = closedWorld.commonMasks.stringType;
-    TypeMask jsIntType = closedWorld.commonMasks.intType;
-    TypeMask coreStringType = new TypeMask.subtype(
-        closedWorld.commonElements.stringClass, closedWorld);
-
-    test('method');
-    test('methodAssumeDynamic', expectAssumeDynamic: true);
-    test('methodTrustTypeAnnotations',
-        expectTrustTypeAnnotations: true, expectedParameterType: jsStringType);
-    test('methodNoInline', expectNoInline: true);
-    test('methodNoInlineTrustTypeAnnotations',
-        expectNoInline: true,
-        expectTrustTypeAnnotations: true,
-        expectedParameterType: jsStringType,
-        expectedReturnType: jsIntType);
-    test('methodAssumeDynamicTrustTypeAnnotations',
-        expectAssumeDynamic: true,
-        expectTrustTypeAnnotations: true,
-        expectedParameterType: coreStringType);
-  });
-}
diff --git a/tests/compiler/dart2js/field_codegen_test.dart b/tests/compiler/dart2js/field_codegen_test.dart
deleted file mode 100644
index 893bc1f..0000000
--- a/tests/compiler/dart2js/field_codegen_test.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-// Test that parameters keep their names in the output.
-
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
-
-const String TEST_NULL0 = r"""
-class A { static var x; }
-
-main() { return A.x; }
-""";
-
-const String TEST_NULL1 = r"""
-var x;
-
-main() { return x; }
-""";
-
-main() {
-  asyncTest(() => compileAll(TEST_NULL0).then((generated) {
-        Expect.isTrue(generated.contains("null"));
-      }));
-
-  asyncTest(() => compileAll(TEST_NULL1).then((generated) {
-        Expect.isTrue(generated.contains("null"));
-      }));
-}
diff --git a/tests/compiler/dart2js/field_update_test.dart b/tests/compiler/dart2js/field_update_test.dart
deleted file mode 100644
index c81422a..0000000
--- a/tests/compiler/dart2js/field_update_test.dart
+++ /dev/null
@@ -1,96 +0,0 @@
-// 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:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
-
-// Test for emitting JavaScript pre- and post-increment and assignment ops.
-
-const String TEST_1 = """
-class A {
-  var a = 42;
-  int foo() { var r = a; a = a + 1; return r; }  // this.a++
-}
-
-void main() {
-  var a = new A();
-  print(a.foo());
-}
-""";
-
-const String TEST_2 = """
-class A {
-  var a = 42;
-  int foo() { var r = a; a = a + 1; return a; }  // ++this.a
-}
-
-void main() {
-  var a = new A();
-  print(a.foo());
-}
-""";
-
-const String TEST_3 = """
-class A {
-  var a = 42;
-  int foo() { var r = a; a = a - 1; return r; }  // this.a--
-}
-
-void main() {
-  var a = new A();
-  print(a.foo());
-}
-""";
-
-const String TEST_4 = """
-class A {
-  var a = 42;
-  int foo() { var r = a; a = a - 1; return a; }  // --this.a
-}
-
-void main() {
-  var a = new A();
-  print(a.foo());
-}
-""";
-
-const String TEST_5 = """
-class A {
-  var a = 42;
-  int foo() { var r = a; a = a - 2; return a; }  // this.a -= 2
-}
-
-void main() {
-  var a = new A();
-  print(a.foo());
-}
-""";
-
-const String TEST_6 = """
-class A {
-  var a = 42;
-  int foo() { var r = a; a = a * 2; return a; }  // this.a *= 2
-}
-
-void main() {
-  var a = new A();
-  print(a.foo());
-}
-""";
-
-main() {
-  test(String code, Function f) {
-    asyncTest(() => compileAll(code, disableInlining: true).then((generated) {
-          Expect.isTrue(f(generated));
-        }));
-  }
-
-  test(TEST_1, (generated) => generated.contains(r'return this.a++;'));
-  test(TEST_2, (generated) => generated.contains(r'return ++this.a;'));
-  test(TEST_3, (generated) => generated.contains(r'return this.a--;'));
-  test(TEST_4, (generated) => generated.contains(r'return --this.a;'));
-  test(TEST_5, (generated) => generated.contains(r' this.a -= 2;'));
-  test(TEST_6, (generated) => generated.contains(r' this.a *= 2;'));
-}
diff --git a/tests/compiler/dart2js/for_in_test.dart b/tests/compiler/dart2js/for_in_test.dart
deleted file mode 100644
index 3f02023..0000000
--- a/tests/compiler/dart2js/for_in_test.dart
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-foo(a) {
-  int x = 0;
-  for (int i in a) {
-    x += i;
-  }
-  return x;
-}
-""";
-
-const String TEST_TWO = r"""
-foo(a) {
-  int x = 0;
-  for (int i in a) {
-    if (i == 5) continue;
-    x += i;
-  }
-  return x;
-}
-""";
-
-main() {
-  asyncTest(() => Future.wait([
-        compile(TEST_ONE, entry: 'foo', check: (String generated) {
-          Expect.isTrue(!generated.contains(r'break'));
-        }),
-        compile(TEST_TWO, entry: 'foo', check: (String generated) {
-          Expect.isTrue(generated.contains(r'continue'));
-        }),
-      ]));
-}
diff --git a/tests/compiler/dart2js/forloop_box_test.dart b/tests/compiler/dart2js/forloop_box_test.dart
deleted file mode 100644
index f27995f..0000000
--- a/tests/compiler/dart2js/forloop_box_test.dart
+++ /dev/null
@@ -1,57 +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.
-
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
-
-String SHOULD_NOT_BE_BOXED_TEST = r'''
-main() {
-  var a;
-  for (var i=0; i<10; i++) {
-    a = () => i;
-  }
-  print(a());
-}
-''';
-
-String SHOULD_BE_BOXED_TEST = r'''
-run(f) => f();
-main() {
-  var a;
-  for (var i=0; i<10; run(() => i++)) {
-    a = () => i;
-  }
-  print(a());
-}
-''';
-
-String ONLY_UPDATE_LOOP_VAR_TEST = r'''
-run(f) => f();
-main() {
-  var a;
-  for (var i=0; i<10; run(() => i++)) {
-    var b = 3;
-    a = () => b = i;
-  }
-  print(a());
-}
-''';
-
-main() {
-  asyncTest(() => compileAll(SHOULD_NOT_BE_BOXED_TEST).then((generated) {
-        Expect.isTrue(generated.contains('main_closure(i)'),
-            'for-loop variable should not have been boxed');
-      }));
-  asyncTest(() => compileAll(SHOULD_BE_BOXED_TEST).then((generated) {
-        Expect.isFalse(generated.contains('main_closure(i)'),
-            'for-loop variable should have been boxed');
-      }));
-  asyncTest(() => compileAll(ONLY_UPDATE_LOOP_VAR_TEST).then((generated) {
-        Expect.isFalse(generated.contains('main_closure(i)'),
-            'for-loop variable should have been boxed');
-        Expect.isFalse(generated.contains(', _box_0.b = 3,'),
-            'non for-loop captured variable should not be updated in loop');
-      }));
-}
diff --git a/tests/compiler/dart2js/function_type_variable_test.dart b/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
similarity index 96%
rename from tests/compiler/dart2js/function_type_variable_test.dart
rename to tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
index ba64289..c302094 100644
--- a/tests/compiler/dart2js/function_type_variable_test.dart
+++ b/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/elements/types.dart';
-import 'package:compiler/src/kernel/element_map_impl.dart';
 import 'package:expect/expect.dart';
-import 'type_test_helper.dart';
+import '../type_test_helper.dart';
 
 const List<FunctionTypeData> existentialTypeData = const <FunctionTypeData>[
   // TODO(johnniwinther): Test generic bounds when #31531 is fixed.
@@ -21,13 +21,12 @@
 ];
 
 main() {
-  DartTypeConverter.enableFunctionTypeVariables = true;
   asyncTest(() async {
     var env = await TypeEnvironment
         .create(createTypedefs(existentialTypeData, additionalData: """
     class C1 {}
     class C2 {}
-  """), compileMode: CompileMode.kernel);
+  """), compileMode: CompileMode.kernel, options: [Flags.strongMode]);
 
     testToString(FunctionType type, String expectedToString) {
       Expect.equals(expectedToString, type.toString());
diff --git a/tests/compiler/dart2js/generic_method_test.dart b/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart
similarity index 89%
rename from tests/compiler/dart2js/generic_method_test.dart
rename to tests/compiler/dart2js/generic_methods/generic_method_type_test.dart
index 8f01ba3..0357757 100644
--- a/tests/compiler/dart2js/generic_method_test.dart
+++ b/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart
@@ -3,12 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/types.dart';
-import 'package:compiler/src/kernel/element_map_impl.dart';
 import 'package:compiler/src/universe/call_structure.dart';
 import 'package:expect/expect.dart';
-import 'type_test_helper.dart';
+import '../type_test_helper.dart';
 
 List<FunctionTypeData> signatures = const <FunctionTypeData>[
   const FunctionTypeData("void", "0", "()"),
@@ -21,13 +21,14 @@
 ];
 
 main() {
-  DartTypeConverter.enableFunctionTypeVariables = true;
-
   asyncTest(() async {
-    TypeEnvironment env = await TypeEnvironment.create("""
+    TypeEnvironment env = await TypeEnvironment.create(
+        """
       ${createTypedefs(signatures, prefix: 't')}
       ${createMethods(signatures, prefix: 'm')}
-    """, compileMode: CompileMode.kernel);
+    """,
+        compileMode: CompileMode.kernel,
+        options: [Flags.strongMode]);
 
     for (FunctionTypeData data in signatures) {
       FunctionType functionType = env.getElementType('t${data.name}');
diff --git a/tests/compiler/dart2js/gvn_dynamic_field_get_test.dart b/tests/compiler/dart2js/gvn_dynamic_field_get_test.dart
deleted file mode 100644
index d7c0bec..0000000
--- a/tests/compiler/dart2js/gvn_dynamic_field_get_test.dart
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-// Test that dart2js gvns dynamic getters that don't have side
-// effects.
-
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-import 'package:compiler/src/elements/names.dart';
-import 'package:compiler/src/universe/selector.dart' show Selector;
-
-const String TEST = r"""
-class A {
-  var foo;
-  bar(a) {
-    return a.foo + a.foo;
-  }
-}
-
-main() {
-  new A().bar(new Object());
-}
-""";
-
-main() {
-  Uri uri = new Uri(scheme: 'source');
-  dynamic compiler = compilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        String generated = compiler.assembledCode;
-        RegExp regexp = new RegExp(r"get\$foo");
-        Iterator matches = regexp.allMatches(generated).iterator;
-        checkNumberOfMatches(matches, 1);
-        dynamic cls = findElement(compiler, 'A');
-        Expect.isNotNull(cls);
-        String name = 'foo';
-        var element = cls.lookupLocalMember(name);
-        Expect.isNotNull(element);
-        Selector selector = new Selector.getter(new PublicName(name));
-        Expect.isFalse(compiler.resolutionWorldBuilder.closedWorldForTesting
-            .hasAnyUserDefinedGetter(selector, null));
-      }));
-}
diff --git a/tests/compiler/dart2js/gvn_test.dart b/tests/compiler/dart2js/gvn_test.dart
deleted file mode 100644
index 2497dc9..0000000
--- a/tests/compiler/dart2js/gvn_test.dart
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-void foo(bar) {
-  for (int i = 0; i < 1; i++) {
-    print(1 + bar);
-    print(1 + bar);
-  }
-}
-""";
-
-// Check that modulo does not have any side effect and we are
-// GVN'ing the length of [:list:].
-const String TEST_TWO = r"""
-void foo(a) {
-  var list = new List<int>();
-  list[0] = list[0 % a];
-  list[1] = list[1 % a];
-}
-""";
-
-// Check that is checks get GVN'ed.
-const String TEST_THREE = r"""
-void foo(a) {
-  print(42);  // Make sure numbers are used.
-  print(a is num);
-  print(a is num);
-}
-""";
-
-// Check that instructions that don't have a builtin equivalent can
-// still be GVN'ed.
-const String TEST_FOUR = r"""
-void foo(a) {
-  print(1 >> a);
-  print(1 >> a);
-}
-""";
-
-// Check that [HCheck] instructions do not prevent GVN.
-const String TEST_FIVE = r"""
-class A {
-  var foo = 21;
-}
-
-class B {}
-
-main() {
-  var a = [new B(), new A()][0];
-  var b = a.foo;
-  var c = a.foo;
-  if (a is B) {
-    c = a.foo;
-  }
-  return b + c;
-}
-""";
-
-// Check that a gvn'able instruction in the loop header gets hoisted.
-const String TEST_SIX = r"""
-class A {
-  final field = 54;
-}
-
-main() {
-  var a = new A();
-  while (a.field == 54) { a.field = 42; }
-}
-""";
-
-// Check that a gvn'able instruction that may throw in the loop header
-// gets hoisted.
-const String TEST_SEVEN = r"""
-class A {
-  final field;
-  A() : field = null;
-  A.bar() : field = 42;
-}
-
-main() {
-  var a = new A();
-  var b = new A.bar();
-  while (a.field == 54) { a.field = 42; b.field = 42; }
-}
-""";
-
-// Check that a check in a loop header gets hoisted.
-const String TEST_EIGHT = r"""
-class A {
-  final field;
-  A() : field = null;
-  A.bar() : field = 42;
-}
-
-main() {
-  var a = new A();
-  var b = new A.bar();
-  for (int i = 0; i < a.field; i++) { a.field = 42; b.field = 42; }
-}
-""";
-
-main() {
-  asyncTest(() => Future.wait([
-        compile(TEST_ONE, entry: 'foo', check: (String generated) {
-          RegExp regexp = new RegExp(r"1 \+ [a-z]+");
-          checkNumberOfMatches(regexp.allMatches(generated).iterator, 1);
-        }),
-        compile(TEST_TWO, entry: 'foo', check: (String generated) {
-          checkNumberOfMatches(
-              new RegExp("length").allMatches(generated).iterator, 1);
-        }),
-        compile(TEST_THREE, entry: 'foo', check: (String generated) {
-          checkNumberOfMatches(
-              new RegExp("number").allMatches(generated).iterator, 1);
-        }),
-        compile(TEST_FOUR, entry: 'foo', check: (String generated) {
-          checkNumberOfMatches(
-              new RegExp("shr").allMatches(generated).iterator, 1);
-        }),
-        compileAll(TEST_FIVE).then((generated) {
-          checkNumberOfMatches(
-              new RegExp("get\\\$foo").allMatches(generated).iterator, 1);
-        }),
-        compileAll(TEST_SIX).then((generated) {
-          Expect.isTrue(generated.contains('for (t1 = a.field === 54; t1;)'));
-        }),
-        compileAll(TEST_SEVEN).then((generated) {
-          Expect.isTrue(generated.contains('for (t1 = a.field === 54; t1;)'));
-        }),
-        compileAll(TEST_EIGHT).then((generated) {
-          Expect.isTrue(generated.contains('for (; i < t1; ++i)'));
-        }),
-      ]));
-}
diff --git a/tests/compiler/dart2js/identity_test.dart b/tests/compiler/dart2js/identity_test.dart
deleted file mode 100644
index f534e29..0000000
--- a/tests/compiler/dart2js/identity_test.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-class A {}
-bool foo(bar) {
-  var x = new A();
-  var y = new A();
-  return identical(x, y);
-}
-""";
-
-main() {
-  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
-        // Check that no boolify code is generated.
-        RegExp regexp = new RegExp("=== true");
-        Iterator matches = regexp.allMatches(generated).iterator;
-        Expect.isFalse(matches.moveNext());
-
-        regexp = new RegExp("===");
-        matches = regexp.allMatches(generated).iterator;
-        Expect.isTrue(matches.moveNext());
-        Expect.isFalse(matches.moveNext());
-      }));
-}
diff --git a/tests/compiler/dart2js/if_do_while_test.dart b/tests/compiler/dart2js/if_do_while_test.dart
deleted file mode 100644
index 929e76b..0000000
--- a/tests/compiler/dart2js/if_do_while_test.dart
+++ /dev/null
@@ -1,29 +0,0 @@
-// 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:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST = r"""
-foo(param0, param1, param2) {
-  if (param0)
-    do {
-      param1();
-    } while(param2());
-  else {
-    param2();
-  }
-}
-""";
-
-main() {
-  print("foo");
-  asyncTest(() => compile(TEST, entry: 'foo', check: (String generated) {
-        // Check that the do-while in the 'then' is enclosed in braces.
-        // Otherwise Android 4.0 stock browser has a syntax error. See issue 10923.
-        Expect.isTrue(
-            new RegExp(r'if[ ]*\([^)]+\)[ ]*\{[\n ]*do').hasMatch(generated));
-      }));
-}
diff --git a/tests/compiler/dart2js/inference/assert_message_throw_test.dart b/tests/compiler/dart2js/inference/assert_message_throw_test.dart
index b6f202b..d64ba79 100644
--- a/tests/compiler/dart2js/inference/assert_message_throw_test.dart
+++ b/tests/compiler/dart2js/inference/assert_message_throw_test.dart
@@ -11,8 +11,8 @@
 import 'package:compiler/src/types/masks.dart';
 import 'package:compiler/src/world.dart' show ClosedWorld;
 import 'package:expect/expect.dart';
+import 'type_mask_test_helper.dart';
 import '../memory_compiler.dart';
-import '../type_mask_test_helper.dart';
 
 const String SOURCE = '''
 main(args) {
diff --git a/tests/compiler/dart2js/inference/call_site_simple_type_inferer_test.dart b/tests/compiler/dart2js/inference/call_site_simple_type_inferer_test.dart
index 1337230..4047641 100644
--- a/tests/compiler/dart2js/inference/call_site_simple_type_inferer_test.dart
+++ b/tests/compiler/dart2js/inference/call_site_simple_type_inferer_test.dart
@@ -3,19 +3,20 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// TODO(johnniwinther): Port this test to use the equivalence framework.
+/// Currently it only works with the mock compiler.
 
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/elements/elements.dart';
 import 'package:compiler/src/types/masks.dart';
 import 'package:expect/expect.dart';
 
+import 'type_mask_test_helper.dart';
 import '../compiler_helper.dart';
-import '../type_mask_test_helper.dart';
 
 void compileAndFind(String code, String className, String memberName,
     bool disableInlining, check(compiler, element)) {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(code, uri, disableInlining: disableInlining);
+  var compiler = mockCompilerFor(code, uri, disableInlining: disableInlining);
   asyncTest(() => compiler.run(uri).then((_) {
         ClassElement cls = findElement(compiler, className);
         var member = cls.lookupLocalMember(memberName);
diff --git a/tests/compiler/dart2js/inference/closure_tracer_28919_test.dart b/tests/compiler/dart2js/inference/closure_tracer_28919_test.dart
new file mode 100644
index 0000000..46ad3d3
--- /dev/null
+++ b/tests/compiler/dart2js/inference/closure_tracer_28919_test.dart
@@ -0,0 +1,114 @@
+// 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.
+
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
+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/inferrer/type_graph_inferrer.dart';
+import 'package:compiler/src/types/types.dart';
+import 'package:compiler/src/world.dart';
+import 'package:expect/expect.dart';
+
+import 'type_mask_test_helper.dart';
+import '../memory_compiler.dart';
+
+bool isContainer(TypeMask mask) {
+  return mask is ContainerTypeMask;
+}
+
+const String TEST = '''
+
+foo1() {
+  final methods = [];
+  var res, sum;
+  for (int i = 0; i != 3; i++) {
+    methods.add((int x) { res = x; sum = x + i; });
+  }
+  methods[0](499);
+  probe1res(res);
+  probe1sum(sum);
+  probe1methods(methods);
+}
+probe1res(x) => x;
+probe1sum(x) => x;
+probe1methods(x) => x;
+
+nonContainer(choice) {
+  var m = choice == 0 ? [] : "<String>";
+  if (m is !List) throw 123;
+  // The union then filter leaves us with a non-container type.
+  return m;
+}
+
+foo2(int choice) {
+  final methods = nonContainer(choice);
+  var res, sum;
+  for (int i = 0; i != 3; i++) {
+    methods.add((int x) { res = x; sum = x + i; });
+  }
+  methods[0](499);
+  probe2res(res);
+  probe2methods(methods);
+}
+probe2res(x) => x;
+probe2methods(x) => x;
+
+main() {
+  foo1();
+  foo2(0);
+  foo2(1);
+}
+''';
+
+void main() {
+  runTest({bool useKernel}) async {
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: {'main.dart': TEST},
+        options: useKernel ? [Flags.useKernel] : []);
+    Expect.isTrue(result.isSuccess);
+    Compiler compiler = result.compiler;
+
+    TypeGraphInferrer typesInferrer =
+        compiler.globalInference.typesInferrerInternal;
+    ClosedWorld closedWorld = typesInferrer.closedWorld;
+    ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
+    CommonMasks commonMasks = closedWorld.commonMasks;
+
+    typeOf(String name) {
+      LibraryEntity library = elementEnvironment.mainLibrary;
+      MemberEntity member =
+          elementEnvironment.lookupLibraryMember(library, name);
+      return typesInferrer.getReturnTypeOfMember(member);
+    }
+
+    checkType(String name, type) {
+      var mask = typeOf(name);
+      Expect.equals(type.nullable(), simplify(mask, closedWorld), name);
+    }
+
+    checkContainer(String name, bool value) {
+      var mask = typeOf(name);
+      Expect.equals(
+          value, isContainer(mask), '$name is container (mask: $mask)');
+    }
+
+    checkContainer('probe1methods', true);
+    checkType('probe1res', commonMasks.uint31Type);
+    checkType('probe1sum', commonMasks.positiveIntType);
+
+    checkContainer('probe2methods', false);
+    checkType('probe2res', commonMasks.dynamicType);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/closure_tracer_test.dart b/tests/compiler/dart2js/inference/closure_tracer_test.dart
similarity index 94%
rename from tests/compiler/dart2js/closure_tracer_test.dart
rename to tests/compiler/dart2js/inference/closure_tracer_test.dart
index c9f519b..be82ef3 100644
--- a/tests/compiler/dart2js/closure_tracer_test.dart
+++ b/tests/compiler/dart2js/inference/closure_tracer_test.dart
@@ -2,11 +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.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+/// Currently it only works with the mock compiler.
+
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 
-import 'compiler_helper.dart';
 import 'type_mask_test_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = '''
 testFunctionStatement() {
@@ -152,7 +155,7 @@
 
 void main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
+  var compiler = mockCompilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
         var typesInferrer = compiler.globalInference.typesInferrerInternal;
         var closedWorld = typesInferrer.closedWorld;
diff --git a/tests/compiler/dart2js/concrete_type_inference_test.dart b/tests/compiler/dart2js/inference/concrete_type_inference_test.dart
similarity index 95%
rename from tests/compiler/dart2js/concrete_type_inference_test.dart
rename to tests/compiler/dart2js/inference/concrete_type_inference_test.dart
index 5beabf3..4b1b6b5 100644
--- a/tests/compiler/dart2js/concrete_type_inference_test.dart
+++ b/tests/compiler/dart2js/inference/concrete_type_inference_test.dart
@@ -2,14 +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.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import 'dart:async';
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 Future compileAndFind(String code, String name, check(compiler, element)) {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(code, uri);
+  var compiler = mockCompilerFor(code, uri);
   return compiler.run(uri).then((_) {
     var element = findElement(compiler, name);
     check(compiler, element);
diff --git a/tests/compiler/dart2js/inference/container_mask_equal_test.dart b/tests/compiler/dart2js/inference/container_mask_equal_test.dart
new file mode 100644
index 0000000..5f8af3a
--- /dev/null
+++ b/tests/compiler/dart2js/inference/container_mask_equal_test.dart
@@ -0,0 +1,68 @@
+// 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.
+
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
+// Regression test for dart2js that used to have a bogus
+// implementation of var.== and
+// var.hashCode.
+
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:expect/expect.dart';
+import '../memory_compiler.dart';
+
+const MEMORY_SOURCE_FILES = const {
+  'main.dart': '''
+
+import 'dart:typed_data';
+
+a() => [0];
+b() => [1, 2];
+c() => new Uint8List(1);
+d() => new Uint8List(2);
+
+main() {
+  print(a); print(b); print(c); print(d);
+}
+''',
+};
+
+main() {
+  runTests({bool useKernel}) async {
+    var result = await runCompiler(
+        memorySourceFiles: MEMORY_SOURCE_FILES,
+        options: useKernel ? [Flags.useKernel] : []);
+    var compiler = result.compiler;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
+    var closedWorld = typesInferrer.closedWorld;
+    var elementEnvironment = closedWorld.elementEnvironment;
+
+    var element = elementEnvironment.lookupLibraryMember(
+        elementEnvironment.mainLibrary, 'a');
+    var mask1 = typesInferrer.getReturnTypeOfMember(element);
+
+    element = elementEnvironment.lookupLibraryMember(
+        elementEnvironment.mainLibrary, 'b');
+    var mask2 = typesInferrer.getReturnTypeOfMember(element);
+
+    element = elementEnvironment.lookupLibraryMember(
+        elementEnvironment.mainLibrary, 'c');
+    var mask3 = typesInferrer.getReturnTypeOfMember(element);
+
+    element = elementEnvironment.lookupLibraryMember(
+        elementEnvironment.mainLibrary, 'd');
+    var mask4 = typesInferrer.getReturnTypeOfMember(element);
+
+    Expect.notEquals(
+        mask1.union(mask2, closedWorld), mask3.union(mask4, closedWorld));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/inference/data/foreign.dart b/tests/compiler/dart2js/inference/data/foreign.dart
index 4f9c9be..525c027 100644
--- a/tests/compiler/dart2js/inference/data/foreign.dart
+++ b/tests/compiler/dart2js/inference/data/foreign.dart
@@ -18,7 +18,6 @@
   jsCallVoid();
   jsCallUnion();
 
-  jsBuiltin_createFunctionTypeRti();
   jsBuiltin_rawRtiToJsConstructorName();
 
   jsEmbeddedGlobal_getTypeFromName();
@@ -41,12 +40,6 @@
 /*element: jsCallUnion:Union([exact=JSString], [subclass=JSInt])*/
 jsCallUnion() => JS('int|String', '#', 0);
 
-/*element: jsBuiltin_createFunctionTypeRti:[exact=Object]*/
-jsBuiltin_createFunctionTypeRti() {
-  return JS_BUILTIN('returns:=Object;effects:none;depends:none',
-      JsBuiltin.createFunctionTypeRti);
-}
-
 /*element: jsBuiltin_rawRtiToJsConstructorName:[exact=JSString]*/
 jsBuiltin_rawRtiToJsConstructorName() {
   return JS_BUILTIN('String', JsBuiltin.rawRtiToJsConstructorName, null);
diff --git a/tests/compiler/dart2js/inference/dictionary_types_test.dart b/tests/compiler/dart2js/inference/dictionary_types_test.dart
new file mode 100644
index 0000000..1d934e6
--- /dev/null
+++ b/tests/compiler/dart2js/inference/dictionary_types_test.dart
@@ -0,0 +1,173 @@
+// 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.
+
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:expect/expect.dart';
+
+import '../memory_compiler.dart';
+
+var SOURCES = const {
+  'AddAll.dart': """
+  var dictionaryA = {'string': "aString", 'int': 42, 'double': 21.5,
+                     'list': []};
+  var dictionaryB = {'string': "aString", 'int': 42, 'double': 21.5,
+                     'list': []};
+  var otherDict = {'stringTwo' : "anotherString", 'intTwo' : 84};
+  var int = 0;
+  var anotherInt = 0;
+  var nullOrInt = 0;
+  var dynamic = 0;
+
+  main() {
+    dictionaryA.addAll(otherDict);
+    dictionaryB.addAll({'stringTwo' : "anotherString", 'intTwo' : 84});
+    int = dictionaryB['int'];
+    anotherInt = otherDict['intTwo'];
+    dynamic = dictionaryA['int'];
+    nullOrInt = dictionaryB['intTwo'];
+  }
+""",
+  'Union.dart': """
+  var dictionaryA = {'string': "aString", 'int': 42, 'double': 21.5,
+                     'list': []};
+  var dictionaryB = {'string': "aString", 'intTwo': 42, 'list': []};
+  var nullOrInt = 0;
+  var aString = "";
+  var doubleOrNull = 22.2;
+  var key = "string";
+
+  main() {
+    var union = dictionaryA['foo'] ? dictionaryA : dictionaryB;
+    nullOrInt = union['intTwo'];
+    aString = union['string'];
+    doubleOrNull = union['double'];
+  }
+""",
+  'ValueType.dart': """
+  var dictionary = {'string': "aString", 'int': 42, 'double': 21.5, 'list': []};
+  var keyD = 'double';
+  var keyI = 'int';
+  var keyN = 'notFoundInMap';
+  var knownDouble = 42.2;
+  var intOrNull = dictionary[keyI];
+  var justNull = dictionary[keyN];
+
+  main() {
+    knownDouble = dictionary[keyD];
+    var x = [intOrNull, justNull];
+  }
+""",
+  'Propagation.dart': """
+  class A {
+    A();
+    foo(value) {
+      return value['anInt'];
+    }
+  }
+
+  class B {
+    B();
+    foo(value) {
+      return 0;
+    }
+  }
+
+  main() {
+    var dictionary = {'anInt': 42, 'aString': "theString"};
+    var it;
+    if ([true, false][0]) {
+      it = new A();
+    } else {
+      it = new B();
+    }
+    print(it.foo(dictionary) + 2);
+  }
+""",
+  'Bailout.dart': """
+  var dict = makeMap([1,2]);
+  var notInt = 0;
+  var alsoNotInt = 0;
+
+  makeMap(values) {
+    return {'moo': values[0], 'boo': values[1]};
+  }
+
+  main () {
+    dict['goo'] = 42;
+    var closure = () => dict;
+    notInt = closure()['boo'];
+    alsoNotInt = dict['goo'];
+    print("\$notInt and \$alsoNotInt.");
+  }
+"""
+};
+
+void main() {
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
+
+runTests({bool useKernel}) async {
+  await compileAndTest("AddAll.dart", (types, getType, closedWorld) {
+    Expect.equals(getType('int'), types.uint31Type);
+    Expect.equals(getType('anotherInt'), types.uint31Type);
+    Expect.equals(getType('dynamic'), types.dynamicType);
+    Expect.equals(getType('nullOrInt'), types.uint31Type.nullable());
+  }, useKernel: useKernel);
+  await compileAndTest("Union.dart", (types, getType, closedWorld) {
+    Expect.equals(getType('nullOrInt'), types.uint31Type.nullable());
+    Expect.isTrue(getType('aString').containsOnlyString(closedWorld));
+    Expect.equals(getType('doubleOrNull'), types.doubleType.nullable());
+  }, useKernel: useKernel);
+  await compileAndTest("ValueType.dart", (types, getType, closedWorld) {
+    Expect.equals(getType('knownDouble'), types.doubleType);
+    Expect.equals(getType('intOrNull'), types.uint31Type.nullable());
+    Expect.equals(getType('justNull'), types.nullType);
+  }, useKernel: useKernel);
+  await compileAndTest("Propagation.dart", (code) {
+    Expect.isFalse(code.contains("J.\$add\$ns"));
+  }, createCode: true, useKernel: useKernel);
+  await compileAndTest("Bailout.dart", (types, getType, closedWorld) {
+    Expect.equals(getType('notInt'), types.dynamicType);
+    Expect.equals(getType('alsoNotInt'), types.dynamicType);
+    Expect.isFalse(getType('dict').isDictionary);
+  }, useKernel: useKernel);
+}
+
+compileAndTest(source, checker,
+    {bool createCode: false, bool useKernel}) async {
+  CompilationResult result = await runCompiler(
+      entryPoint: Uri.parse('memory:' + source),
+      memorySourceFiles: SOURCES,
+      beforeRun: (compiler) {
+        compiler.stopAfterTypeInference = !createCode;
+      },
+      options: useKernel ? [Flags.useKernel] : []);
+  var compiler = result.compiler;
+  var typesInferrer = compiler.globalInference.typesInferrerInternal;
+  var closedWorld = typesInferrer.closedWorld;
+  var elementEnvironment = closedWorld.elementEnvironment;
+  var commonMasks = closedWorld.commonMasks;
+  getType(String name) {
+    var element = elementEnvironment.lookupLibraryMember(
+        elementEnvironment.mainLibrary, name);
+    Expect.isNotNull(element, "No class '$name' found.");
+    return typesInferrer.getTypeOfMember(element);
+  }
+
+  if (!createCode) {
+    checker(commonMasks, getType, closedWorld);
+  } else {
+    var element = elementEnvironment.mainFunction;
+    var code = compiler.backend.getGeneratedCode(element);
+    checker(code);
+  }
+}
diff --git a/tests/compiler/dart2js/field_type_simple_inferer_test.dart b/tests/compiler/dart2js/inference/field_type_simple_inferer_test.dart
similarity index 97%
rename from tests/compiler/dart2js/field_type_simple_inferer_test.dart
rename to tests/compiler/dart2js/inference/field_type_simple_inferer_test.dart
index 07ee7dc..6b46ce7 100644
--- a/tests/compiler/dart2js/field_type_simple_inferer_test.dart
+++ b/tests/compiler/dart2js/inference/field_type_simple_inferer_test.dart
@@ -2,18 +2,21 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+/// Currently it only works with the mock compiler.
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/types/types.dart' show TypeMask;
 import 'package:compiler/src/world.dart' show ClosedWorld;
 
-import 'compiler_helper.dart';
 import 'type_mask_test_helper.dart';
+import '../compiler_helper.dart';
 
 void compileAndFind(String code, String className, String memberName,
     bool disableInlining, check(compiler, element)) {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(code, uri, disableInlining: disableInlining);
+  var compiler = mockCompilerFor(code, uri, disableInlining: disableInlining);
   asyncTest(() => compiler.run(uri).then((_) {
         dynamic cls = findElement(compiler, className);
         var member = cls.lookupMember(memberName);
diff --git a/tests/compiler/dart2js/inference/inference_equivalence.dart b/tests/compiler/dart2js/inference/inference_equivalence.dart
index c793404..2641692 100644
--- a/tests/compiler/dart2js/inference/inference_equivalence.dart
+++ b/tests/compiler/dart2js/inference/inference_equivalence.dart
@@ -13,12 +13,14 @@
 import 'package:compiler/src/resolution/class_hierarchy.dart';
 import '../equivalence/id_equivalence_helper.dart';
 import 'inference_test_helper.dart';
+import '../equivalence/id_equivalence.dart';
 
 main(List<String> args) {
   mainInternal(args);
 }
 
-Future<bool> mainInternal(List<String> args) async {
+Future<bool> mainInternal(List<String> args,
+    {bool whiteList(Uri uri, Id id)}) async {
   ArgParser argParser = new ArgParser(allowTrailingOptions: true);
   argParser.addFlag('verbose', negatable: true, defaultsTo: false);
   argParser.addFlag('colors', negatable: true);
@@ -52,7 +54,7 @@
       try {
         print('--$uri------------------------------------------------------');
         bool isSuccess = await runZoned(() {
-          return testUri(uri, verbose: verbose);
+          return testUri(uri, verbose: verbose, whiteList: whiteList);
         }, zoneSpecification: specification);
         if (!isSuccess) {
           success = false;
@@ -69,12 +71,14 @@
   return success;
 }
 
-Future<bool> testUri(Uri uri, {bool verbose: false}) {
+Future<bool> testUri(Uri uri,
+    {bool verbose: false, bool whiteList(Uri uri, Id id)}) {
   return compareData(
       uri, const {}, computeMemberAstTypeMasks, computeMemberIrTypeMasks,
       options: [stopAfterTypeInference],
       forMainLibraryOnly: false,
       skipUnprocessedMembers: true,
       skipFailedCompilations: true,
-      verbose: verbose);
+      verbose: verbose,
+      whiteList: whiteList);
 }
diff --git a/tests/compiler/dart2js/inference/issue13354_test.dart b/tests/compiler/dart2js/inference/issue13354_test.dart
new file mode 100644
index 0000000..e5c7b4ea
--- /dev/null
+++ b/tests/compiler/dart2js/inference/issue13354_test.dart
@@ -0,0 +1,73 @@
+// 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.
+
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:expect/expect.dart';
+import 'type_mask_test_helper.dart';
+import '../memory_compiler.dart';
+
+const String TEST = """
+bar() => 42;
+baz() => bar;
+
+class A {
+  foo() => 42;
+}
+
+class B extends A {
+  foo() => super.foo;
+}
+
+main() {
+  baz();
+  new B().foo();
+}
+""";
+
+void main() {
+  runTest({bool useKernel}) async {
+    var result = await runCompiler(
+        memorySourceFiles: {'main.dart': TEST},
+        options: useKernel ? [Flags.useKernel] : []);
+    var compiler = result.compiler;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
+    var closedWorld = typesInferrer.closedWorld;
+    var elementEnvironment = closedWorld.elementEnvironment;
+    var commonMasks = closedWorld.commonMasks;
+
+    checkReturn(String name, type) {
+      MemberEntity element = elementEnvironment.lookupLibraryMember(
+          elementEnvironment.mainLibrary, name);
+      Expect.equals(
+          type,
+          simplify(typesInferrer.getReturnTypeOfMember(element), closedWorld),
+          name);
+    }
+
+    checkReturnInClass(String className, String methodName, type) {
+      dynamic cls = elementEnvironment.lookupClass(
+          elementEnvironment.mainLibrary, className);
+      var element = elementEnvironment.lookupClassMember(cls, methodName);
+      Expect.equals(type,
+          simplify(typesInferrer.getReturnTypeOfMember(element), closedWorld));
+    }
+
+    checkReturn('bar', commonMasks.uint31Type);
+    checkReturn('baz', commonMasks.functionType);
+
+    checkReturnInClass('A', 'foo', commonMasks.uint31Type);
+    checkReturnInClass('B', 'foo', commonMasks.functionType);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/inference/list_tracer2_test.dart b/tests/compiler/dart2js/inference/list_tracer2_test.dart
new file mode 100644
index 0000000..b76158d
--- /dev/null
+++ b/tests/compiler/dart2js/inference/list_tracer2_test.dart
@@ -0,0 +1,52 @@
+// 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.
+
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
+// We used to always nullify the element type of a list we are tracing in
+// the presence of a fixed length list constructor call.
+
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/types/types.dart' show ContainerTypeMask;
+import 'package:expect/expect.dart';
+import 'type_mask_test_helper.dart';
+import '../memory_compiler.dart';
+
+const String TEST = r'''
+var myList = [42];
+main() {
+  var a = new List(42);
+  return myList[0];
+}
+''';
+
+void main() {
+  runTest({bool useKernel}) async {
+    var result = await runCompiler(
+        memorySourceFiles: {'main.dart': TEST},
+        options: useKernel ? [Flags.useKernel] : []);
+    var compiler = result.compiler;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
+    var closedWorld = typesInferrer.closedWorld;
+    var elementEnvironment = closedWorld.elementEnvironment;
+
+    checkType(String name, type) {
+      MemberEntity element = elementEnvironment.lookupLibraryMember(
+          elementEnvironment.mainLibrary, name);
+      ContainerTypeMask mask = typesInferrer.getTypeOfMember(element);
+      Expect.equals(type, simplify(mask.elementType, closedWorld), name);
+    }
+
+    checkType('myList', typesInferrer.closedWorld.commonMasks.uint31Type);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/list_tracer3_test.dart b/tests/compiler/dart2js/inference/list_tracer3_test.dart
similarity index 86%
rename from tests/compiler/dart2js/list_tracer3_test.dart
rename to tests/compiler/dart2js/inference/list_tracer3_test.dart
index c68ce62..b229cf6 100644
--- a/tests/compiler/dart2js/list_tracer3_test.dart
+++ b/tests/compiler/dart2js/inference/list_tracer3_test.dart
@@ -2,6 +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.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+/// Currently it only works with the mock compiler.
+
 // We used to always nullify the element type of a list we are tracing in
 // the presence of a fixed length list constructor call.
 
@@ -9,8 +12,8 @@
 import "package:async_helper/async_helper.dart";
 import 'package:compiler/src/types/types.dart' show ContainerTypeMask;
 
-import 'compiler_helper.dart';
 import 'type_mask_test_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = r'''
 var myList = [];
@@ -24,7 +27,7 @@
 
 void main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
+  var compiler = mockCompilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
         var typesInferrer = compiler.globalInference.typesInferrerInternal;
         var closedWorld = typesInferrer.closedWorld;
diff --git a/tests/compiler/dart2js/list_tracer_length_test.dart b/tests/compiler/dart2js/inference/list_tracer_length_test.dart
similarity index 92%
rename from tests/compiler/dart2js/list_tracer_length_test.dart
rename to tests/compiler/dart2js/inference/list_tracer_length_test.dart
index e2d7b6a..01523e2 100644
--- a/tests/compiler/dart2js/list_tracer_length_test.dart
+++ b/tests/compiler/dart2js/inference/list_tracer_length_test.dart
@@ -2,9 +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.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+/// Currently it only works with the mock compiler.
+
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST1 = r"""
 var a = [42];
diff --git a/tests/compiler/dart2js/list_tracer_node_type_test.dart b/tests/compiler/dart2js/inference/list_tracer_node_type_test.dart
similarity index 93%
rename from tests/compiler/dart2js/list_tracer_node_type_test.dart
rename to tests/compiler/dart2js/inference/list_tracer_node_type_test.dart
index 7c91c8c..62b25da 100644
--- a/tests/compiler/dart2js/list_tracer_node_type_test.dart
+++ b/tests/compiler/dart2js/inference/list_tracer_node_type_test.dart
@@ -2,9 +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.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+/// Currently it only works with the mock compiler.
+
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST1 = r"""
 main() {
diff --git a/tests/compiler/dart2js/list_tracer_test.dart b/tests/compiler/dart2js/inference/list_tracer_test.dart
similarity index 96%
rename from tests/compiler/dart2js/list_tracer_test.dart
rename to tests/compiler/dart2js/inference/list_tracer_test.dart
index e448b57..b9f5e819 100644
--- a/tests/compiler/dart2js/list_tracer_test.dart
+++ b/tests/compiler/dart2js/inference/list_tracer_test.dart
@@ -2,12 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+/// Currently it only works with the mock compiler.
+
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import 'package:compiler/src/types/types.dart' show ContainerTypeMask, TypeMask;
 
-import 'compiler_helper.dart';
 import 'type_mask_test_helper.dart';
+import '../compiler_helper.dart';
 
 String generateTest(String listAllocation) {
   return """
@@ -195,7 +198,7 @@
 
 void doTest(String allocation, {bool nullify}) {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(generateTest(allocation), uri,
+  var compiler = mockCompilerFor(generateTest(allocation), uri,
       expectedErrors: 0, expectedWarnings: 1);
   asyncTest(() => compiler.run(uri).then((_) {
         var typesInferrer = compiler.globalInference.typesInferrerInternal;
diff --git a/tests/compiler/dart2js/inference/list_tracer_typed_data_length_test.dart b/tests/compiler/dart2js/inference/list_tracer_typed_data_length_test.dart
new file mode 100644
index 0000000..f0c9780
--- /dev/null
+++ b/tests/compiler/dart2js/inference/list_tracer_typed_data_length_test.dart
@@ -0,0 +1,58 @@
+// 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.
+
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/types/types.dart' show TypeMask, ContainerTypeMask;
+import 'package:expect/expect.dart';
+import 'type_mask_test_helper.dart';
+import '../memory_compiler.dart';
+
+const TEST = const {
+  'main.dart': r'''
+import 'dart:typed_data';
+
+var myList = new Float32List(42);
+var myOtherList = new Uint8List(32);
+
+main() {
+  var a = new Float32List(9);
+  return myList[0] + myOtherList[0];
+}
+'''
+};
+
+void main() {
+  runTest({bool useKernel}) async {
+    var result = await runCompiler(
+        memorySourceFiles: TEST, options: useKernel ? [Flags.useKernel] : []);
+    var compiler = result.compiler;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
+    var closedWorld = typesInferrer.closedWorld;
+    var elementEnvironment = closedWorld.elementEnvironment;
+
+    checkType(String name, type, length) {
+      MemberEntity element = elementEnvironment.lookupLibraryMember(
+          elementEnvironment.mainLibrary, name);
+      TypeMask mask = typesInferrer.getTypeOfMember(element);
+      Expect.isTrue(mask.isContainer);
+      ContainerTypeMask container = mask;
+      Expect.equals(type, simplify(container.elementType, closedWorld), name);
+      Expect.equals(container.length, length);
+    }
+
+    checkType('myList', closedWorld.commonMasks.numType, 42);
+    checkType('myOtherList', closedWorld.commonMasks.uint31Type, 32);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/inference/map_tracer_const_test.dart b/tests/compiler/dart2js/inference/map_tracer_const_test.dart
new file mode 100644
index 0000000..391a38e
--- /dev/null
+++ b/tests/compiler/dart2js/inference/map_tracer_const_test.dart
@@ -0,0 +1,57 @@
+// 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.
+
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:expect/expect.dart';
+import 'type_mask_test_helper.dart';
+import '../memory_compiler.dart';
+
+const String TEST = '''
+int closure(int x) {
+  return x;
+}
+
+class A {
+  static const DEFAULT = const {'fun' : closure};
+
+  final map;
+
+  A([maparg]) : map = maparg == null ? DEFAULT : maparg;
+}
+
+main() {
+  var a = new A();
+  a.map['fun'](3.3);
+  print(closure(22));
+}
+''';
+
+void main() {
+  runTest({bool useKernel}) async {
+    var result = await runCompiler(
+        memorySourceFiles: {'main.dart': TEST},
+        options: useKernel ? [Flags.useKernel] : []);
+    var compiler = result.compiler;
+    var typesInferrer = compiler.globalInference.typesInferrerInternal;
+    var closedWorld = typesInferrer.closedWorld;
+    var elementEnvironment = closedWorld.elementEnvironment;
+    var commonMasks = closedWorld.commonMasks;
+
+    MemberEntity element = elementEnvironment.lookupLibraryMember(
+        elementEnvironment.mainLibrary, 'closure');
+    var mask = typesInferrer.getReturnTypeOfMember(element);
+    Expect.equals(commonMasks.numType, simplify(mask, closedWorld));
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/map_tracer_keys_test.dart b/tests/compiler/dart2js/inference/map_tracer_keys_test.dart
similarity index 90%
rename from tests/compiler/dart2js/map_tracer_keys_test.dart
rename to tests/compiler/dart2js/inference/map_tracer_keys_test.dart
index d5ee14f..e968733 100644
--- a/tests/compiler/dart2js/map_tracer_keys_test.dart
+++ b/tests/compiler/dart2js/inference/map_tracer_keys_test.dart
@@ -2,11 +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.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+/// Currently it only works with the mock compiler.
+
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import 'package:compiler/src/types/types.dart' show ContainerTypeMask, TypeMask;
 
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 String generateTest(String key, String value, bool initial) {
   return """
@@ -54,7 +57,7 @@
     bool bail: false,
     bool initial: false}) {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(generateTest(key, value, initial), uri,
+  var compiler = mockCompilerFor(generateTest(key, value, initial), uri,
       expectedErrors: 0, expectedWarnings: 0);
   asyncTest(() => compiler.run(uri).then((_) {
         var typesInferrer = compiler.globalInference.typesInferrerInternal;
diff --git a/tests/compiler/dart2js/map_tracer_test.dart b/tests/compiler/dart2js/inference/map_tracer_test.dart
similarity index 97%
rename from tests/compiler/dart2js/map_tracer_test.dart
rename to tests/compiler/dart2js/inference/map_tracer_test.dart
index 399d5b0..ddac6fd 100644
--- a/tests/compiler/dart2js/map_tracer_test.dart
+++ b/tests/compiler/dart2js/inference/map_tracer_test.dart
@@ -2,12 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+/// Currently it only works with the mock compiler.
+
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import 'package:compiler/src/types/types.dart' show MapTypeMask, TypeMask;
 
-import 'compiler_helper.dart';
 import 'type_mask_test_helper.dart';
+import '../compiler_helper.dart';
 
 String generateTest(String mapAllocation) {
   return """
@@ -210,7 +213,7 @@
 void doTest(String allocation,
     [String keyElementName, String valueElementName]) {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(generateTest(allocation), uri,
+  var compiler = mockCompilerFor(generateTest(allocation), uri,
       expectedErrors: 0, expectedWarnings: 1);
   asyncTest(() => compiler.run(uri).then((_) {
         var keyType, valueType;
diff --git a/tests/compiler/dart2js/mixin_constructor_default_parameter_values_test.dart b/tests/compiler/dart2js/inference/mixin_constructor_default_parameter_values_test.dart
similarity index 67%
rename from tests/compiler/dart2js/mixin_constructor_default_parameter_values_test.dart
rename to tests/compiler/dart2js/inference/mixin_constructor_default_parameter_values_test.dart
index 4ff2338..c0d8ade 100644
--- a/tests/compiler/dart2js/mixin_constructor_default_parameter_values_test.dart
+++ b/tests/compiler/dart2js/inference/mixin_constructor_default_parameter_values_test.dart
@@ -2,13 +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.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 // Ensure that the inferrer looks at default values for parameters in
 // synthetic constructors using the correct context. If the constructor call
 // to D without optional parameters is inferred using D's context, the default
 // value `_SECRET` will not be visible and compilation will fail.
 
 import 'package:async_helper/async_helper.dart';
-import 'memory_compiler.dart';
+import 'package:compiler/src/commandline_options.dart';
+import '../memory_compiler.dart';
 
 const Map MEMORY_SOURCE_FILES = const {
   "main.dart": r"""
@@ -41,5 +44,16 @@
 };
 
 main() {
-  asyncTest(() => runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES));
+  runTest({bool useKernel}) async {
+    await runCompiler(
+        memorySourceFiles: MEMORY_SOURCE_FILES,
+        options: useKernel ? [Flags.useKernel] : []);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
 }
diff --git a/tests/compiler/dart2js/inference/side_effects/foreign.dart b/tests/compiler/dart2js/inference/side_effects/foreign.dart
index 00f8667..9c4e18a 100644
--- a/tests/compiler/dart2js/inference/side_effects/foreign.dart
+++ b/tests/compiler/dart2js/inference/side_effects/foreign.dart
@@ -24,13 +24,6 @@
 jsCallEffectsNoInstanceDependsNoStatic() =>
     JS('effects:no-instance;depends:no-static', '#', 0);
 
-/*element: jsBuiltin_createFunctionTypeRti:SideEffects(reads static; writes nothing)*/
-jsBuiltin_createFunctionTypeRti() {
-  // TODO(johnniwinther): Why doesn't this have `Depends on nothing`?
-  return JS_BUILTIN('returns:=Object;effects:none;depends:none',
-      JsBuiltin.createFunctionTypeRti);
-}
-
 /*element: jsBuiltin_rawRtiToJsConstructorName:SideEffects(reads anything; writes anything)*/
 jsBuiltin_rawRtiToJsConstructorName() {
   return JS_BUILTIN('String', JsBuiltin.rawRtiToJsConstructorName, null);
@@ -59,7 +52,6 @@
   jsCallEffectsAllDependsNoIndex();
   jsCallEffectsNoInstanceDependsNoStatic();
 
-  jsBuiltin_createFunctionTypeRti();
   jsBuiltin_rawRtiToJsConstructorName();
 
   jsEmbeddedGlobal_getTypeFromName();
diff --git a/tests/compiler/dart2js/simple_inferrer_and_or_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_and_or_test.dart
similarity index 94%
rename from tests/compiler/dart2js/simple_inferrer_and_or_test.dart
rename to tests/compiler/dart2js/inference/simple_inferrer_and_or_test.dart
index c026c54..eaacd3e 100644
--- a/tests/compiler/dart2js/simple_inferrer_and_or_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_and_or_test.dart
@@ -2,10 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
 import 'type_mask_test_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = """
 class X {}
@@ -94,7 +96,7 @@
 
 void main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
+  var compiler = mockCompilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
         var typesInferrer = compiler.globalInference.typesInferrerInternal;
         var closedWorld = typesInferrer.closedWorld;
diff --git a/tests/compiler/dart2js/simple_inferrer_callers_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_callers_test.dart
similarity index 92%
rename from tests/compiler/dart2js/simple_inferrer_callers_test.dart
rename to tests/compiler/dart2js/inference/simple_inferrer_callers_test.dart
index 6c3b15f..91fd918 100644
--- a/tests/compiler/dart2js/simple_inferrer_callers_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_callers_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 // Test that computation of callers of an element works when two
 // elements of the same name are being invoked in the same method.
 
@@ -11,7 +13,7 @@
 import 'package:compiler/src/inferrer/type_graph_inferrer.dart';
 import 'package:compiler/src/world.dart' show ClosedWorld, ClosedWorldRefiner;
 
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = """
 class A {
@@ -38,7 +40,7 @@
 
 void main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri, analyzeOnly: true);
+  var compiler = mockCompilerFor(TEST, uri, analyzeOnly: true);
   asyncTest(() => compiler.run(uri).then((_) {
         ElementEnvironment elementEnvironment =
             compiler.frontendStrategy.elementEnvironment;
diff --git a/tests/compiler/dart2js/simple_inferrer_closure_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_closure_test.dart
similarity index 95%
rename from tests/compiler/dart2js/simple_inferrer_closure_test.dart
rename to tests/compiler/dart2js/inference/simple_inferrer_closure_test.dart
index 570304c..9b418e9 100644
--- a/tests/compiler/dart2js/simple_inferrer_closure_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_closure_test.dart
@@ -2,10 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
 import 'type_mask_test_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = """
 returnInt1() {
@@ -116,7 +118,7 @@
 
 void main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
+  var compiler = mockCompilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
         var typesInferrer = compiler.globalInference.typesInferrerInternal;
         var closedWorld = typesInferrer.closedWorld;
diff --git a/tests/compiler/dart2js/simple_inferrer_const_closure2_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_const_closure2_test.dart
similarity index 87%
rename from tests/compiler/dart2js/simple_inferrer_const_closure2_test.dart
rename to tests/compiler/dart2js/inference/simple_inferrer_const_closure2_test.dart
index 200fb71..d7c416e 100644
--- a/tests/compiler/dart2js/simple_inferrer_const_closure2_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_const_closure2_test.dart
@@ -2,9 +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.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = """
 
@@ -26,7 +28,7 @@
 
 void main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
+  var compiler = mockCompilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
         var typesInferrer = compiler.globalInference.typesInferrerInternal;
         var closedWorld = typesInferrer.closedWorld;
diff --git a/tests/compiler/dart2js/simple_inferrer_const_closure3_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_const_closure3_test.dart
similarity index 88%
rename from tests/compiler/dart2js/simple_inferrer_const_closure3_test.dart
rename to tests/compiler/dart2js/inference/simple_inferrer_const_closure3_test.dart
index e8c30ef..0904d1c 100644
--- a/tests/compiler/dart2js/simple_inferrer_const_closure3_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_const_closure3_test.dart
@@ -2,10 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
 import 'type_mask_test_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = """
 
@@ -26,7 +28,7 @@
 
 void main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
+  var compiler = mockCompilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
         var typesInferrer = compiler.globalInference.typesInferrerInternal;
         var closedWorld = typesInferrer.closedWorld;
diff --git a/tests/compiler/dart2js/simple_inferrer_const_closure4_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_const_closure4_test.dart
similarity index 89%
rename from tests/compiler/dart2js/simple_inferrer_const_closure4_test.dart
rename to tests/compiler/dart2js/inference/simple_inferrer_const_closure4_test.dart
index e51c434..31af6f6 100644
--- a/tests/compiler/dart2js/simple_inferrer_const_closure4_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_const_closure4_test.dart
@@ -2,10 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
 import 'type_mask_test_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = """
 
@@ -27,7 +29,7 @@
 
 void main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
+  var compiler = mockCompilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
         var typesInferrer = compiler.globalInference.typesInferrerInternal;
         var closedWorld = typesInferrer.closedWorld;
diff --git a/tests/compiler/dart2js/simple_inferrer_const_closure5_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_const_closure5_test.dart
similarity index 89%
rename from tests/compiler/dart2js/simple_inferrer_const_closure5_test.dart
rename to tests/compiler/dart2js/inference/simple_inferrer_const_closure5_test.dart
index 0344ebb..3546e9c 100644
--- a/tests/compiler/dart2js/simple_inferrer_const_closure5_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_const_closure5_test.dart
@@ -2,10 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
 import 'type_mask_test_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = """
 
@@ -27,7 +29,7 @@
 
 void main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
+  var compiler = mockCompilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
         var typesInferrer = compiler.globalInference.typesInferrerInternal;
         var closedWorld = typesInferrer.closedWorld;
diff --git a/tests/compiler/dart2js/simple_inferrer_const_closure_default_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_const_closure_default_test.dart
similarity index 94%
rename from tests/compiler/dart2js/simple_inferrer_const_closure_default_test.dart
rename to tests/compiler/dart2js/inference/simple_inferrer_const_closure_default_test.dart
index ae936f5..b16c576 100644
--- a/tests/compiler/dart2js/simple_inferrer_const_closure_default_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_const_closure_default_test.dart
@@ -2,10 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
 import 'type_mask_test_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = """
 
@@ -40,7 +42,7 @@
 
 void main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
+  var compiler = mockCompilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
         var typesInferrer = compiler.globalInference.typesInferrerInternal;
         var closedWorld = typesInferrer.closedWorld;
diff --git a/tests/compiler/dart2js/simple_inferrer_const_closure_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_const_closure_test.dart
similarity index 89%
rename from tests/compiler/dart2js/simple_inferrer_const_closure_test.dart
rename to tests/compiler/dart2js/inference/simple_inferrer_const_closure_test.dart
index 738a43d..0c2d202 100644
--- a/tests/compiler/dart2js/simple_inferrer_const_closure_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_const_closure_test.dart
@@ -2,9 +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.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = """
 
@@ -35,7 +37,7 @@
 
 void main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
+  var compiler = mockCompilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
         var typesInferrer = compiler.globalInference.typesInferrerInternal;
         var closedWorld = typesInferrer.closedWorld;
diff --git a/tests/compiler/dart2js/simple_inferrer_final_field2_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_final_field2_test.dart
similarity index 89%
rename from tests/compiler/dart2js/simple_inferrer_final_field2_test.dart
rename to tests/compiler/dart2js/inference/simple_inferrer_final_field2_test.dart
index 5d522e8..53db6e1 100644
--- a/tests/compiler/dart2js/simple_inferrer_final_field2_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_final_field2_test.dart
@@ -2,13 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 // Test that a non-used generative constructor does not prevent
 // inferring types for fields.
 
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = """
 
@@ -26,7 +28,7 @@
 
 void main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
+  var compiler = mockCompilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
         var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
diff --git a/tests/compiler/dart2js/simple_inferrer_final_field3_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_final_field3_test.dart
similarity index 88%
rename from tests/compiler/dart2js/simple_inferrer_final_field3_test.dart
rename to tests/compiler/dart2js/inference/simple_inferrer_final_field3_test.dart
index fa81111..20c319a 100644
--- a/tests/compiler/dart2js/simple_inferrer_final_field3_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_final_field3_test.dart
@@ -2,12 +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.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 // Test that we are analyzing field parameters correctly.
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
 import 'type_mask_test_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = """
 
@@ -25,7 +27,7 @@
 
 void main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
+  var compiler = mockCompilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
         var typesInferrer = compiler.globalInference.typesInferrerInternal;
         var closedWorld = typesInferrer.closedWorld;
diff --git a/tests/compiler/dart2js/simple_inferrer_final_field_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_final_field_test.dart
similarity index 91%
rename from tests/compiler/dart2js/simple_inferrer_final_field_test.dart
rename to tests/compiler/dart2js/inference/simple_inferrer_final_field_test.dart
index d470de8..233ab02 100644
--- a/tests/compiler/dart2js/simple_inferrer_final_field_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_final_field_test.dart
@@ -2,11 +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.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 
-import 'compiler_helper.dart';
 import 'type_mask_test_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = """
 
@@ -29,7 +31,7 @@
 
 void main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
+  var compiler = mockCompilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
         var typesInferrer = compiler.globalInference.typesInferrerInternal;
         var closedWorld = typesInferrer.closedWorld;
diff --git a/tests/compiler/dart2js/simple_inferrer_global_field_closure2_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_global_field_closure2_test.dart
similarity index 88%
rename from tests/compiler/dart2js/simple_inferrer_global_field_closure2_test.dart
rename to tests/compiler/dart2js/inference/simple_inferrer_global_field_closure2_test.dart
index 44eeee8..45bcf56 100644
--- a/tests/compiler/dart2js/simple_inferrer_global_field_closure2_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_global_field_closure2_test.dart
@@ -2,10 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
 import 'type_mask_test_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = """
 
@@ -26,7 +28,7 @@
 
 void main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
+  var compiler = mockCompilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
         var typesInferrer = compiler.globalInference.typesInferrerInternal;
         var closedWorld = typesInferrer.closedWorld;
diff --git a/tests/compiler/dart2js/simple_inferrer_global_field_closure_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_global_field_closure_test.dart
similarity index 89%
rename from tests/compiler/dart2js/simple_inferrer_global_field_closure_test.dart
rename to tests/compiler/dart2js/inference/simple_inferrer_global_field_closure_test.dart
index d81580f..c087cf8 100644
--- a/tests/compiler/dart2js/simple_inferrer_global_field_closure_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_global_field_closure_test.dart
@@ -2,9 +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.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = """
 
@@ -35,7 +37,7 @@
 
 void main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
+  var compiler = mockCompilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
         var typesInferrer = compiler.globalInference.typesInferrerInternal;
         var closedWorld = typesInferrer.closedWorld;
diff --git a/tests/compiler/dart2js/simple_inferrer_no_such_method_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_no_such_method_test.dart
similarity index 94%
rename from tests/compiler/dart2js/simple_inferrer_no_such_method_test.dart
rename to tests/compiler/dart2js/inference/simple_inferrer_no_such_method_test.dart
index 8abe812..50a2f86 100644
--- a/tests/compiler/dart2js/simple_inferrer_no_such_method_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_no_such_method_test.dart
@@ -2,12 +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.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import 'package:expect/expect.dart';
 
-import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
+import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/types/types.dart';
 import 'type_mask_test_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST1 = """
 class A {
@@ -172,7 +174,7 @@
 
 test1() async {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST1, uri);
+  var compiler = mockCompilerFor(TEST1, uri);
   await compiler.run(uri);
   var closedWorld = compiler.resolutionWorldBuilder.closedWorldForTesting;
   checkReturn(compiler, 'test1', closedWorld.commonMasks.uint31Type);
@@ -188,7 +190,7 @@
 
 test2() async {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST2, uri);
+  var compiler = mockCompilerFor(TEST2, uri);
   await compiler.run(uri);
   var closedWorld = compiler.resolutionWorldBuilder.closedWorldForTesting;
   checkReturn(compiler, 'test1', closedWorld.commonMasks.mapType.nonNullable());
@@ -207,7 +209,7 @@
 
 test3() async {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST3, uri);
+  var compiler = mockCompilerFor(TEST3, uri);
   await compiler.run(uri);
   var closedWorld = compiler.resolutionWorldBuilder.closedWorldForTesting;
   checkReturn(compiler, 'test1', const TypeMask.nonNullEmpty());
@@ -220,7 +222,7 @@
 
 test4() async {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST4, uri);
+  var compiler = mockCompilerFor(TEST4, uri);
   await compiler.run(uri);
   var closedWorld = compiler.resolutionWorldBuilder.closedWorldForTesting;
   checkReturn(compiler, 'test1', const TypeMask.nonNullEmpty());
diff --git a/tests/compiler/dart2js/simple_inferrer_postfix_prefix_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_postfix_prefix_test.dart
similarity index 95%
rename from tests/compiler/dart2js/simple_inferrer_postfix_prefix_test.dart
rename to tests/compiler/dart2js/inference/simple_inferrer_postfix_prefix_test.dart
index 290856e..ff472fb 100644
--- a/tests/compiler/dart2js/simple_inferrer_postfix_prefix_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_postfix_prefix_test.dart
@@ -2,11 +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.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 
-import 'compiler_helper.dart';
 import 'type_mask_test_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = """
 
@@ -64,7 +66,7 @@
 
 void main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
+  var compiler = mockCompilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
         var typesInferrer = compiler.globalInference.typesInferrerInternal;
         var closedWorld = typesInferrer.closedWorld;
diff --git a/tests/compiler/dart2js/simple_inferrer_relations_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_relations_test.dart
similarity index 93%
rename from tests/compiler/dart2js/simple_inferrer_relations_test.dart
rename to tests/compiler/dart2js/inference/simple_inferrer_relations_test.dart
index db2e48d..9125ad8 100644
--- a/tests/compiler/dart2js/simple_inferrer_relations_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_relations_test.dart
@@ -2,10 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 // Test that if (x == y) where we know nothing about x and y will get optimized
 // to if ($.$eq(x, y)) and not
diff --git a/tests/compiler/dart2js/simple_inferrer_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_test.dart
similarity index 98%
rename from tests/compiler/dart2js/simple_inferrer_test.dart
rename to tests/compiler/dart2js/inference/simple_inferrer_test.dart
index 6a42b2f..9f79e36 100644
--- a/tests/compiler/dart2js/simple_inferrer_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_test.dart
@@ -2,12 +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.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import 'package:compiler/src/types/types.dart' show TypeMask;
-import 'type_mask_test_helper.dart';
 
-import 'compiler_helper.dart';
+import 'type_mask_test_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = """
 returnNum1(a) {
@@ -724,7 +726,7 @@
 
 void main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
+  var compiler = mockCompilerFor(TEST, uri);
   compiler.diagnosticHandler = createHandler(compiler, TEST);
   asyncTest(() => compiler.run(uri).then((_) {
         var typesInferrer = compiler.globalInference.typesInferrerInternal;
diff --git a/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_try_catch_test.dart
similarity index 95%
rename from tests/compiler/dart2js/simple_inferrer_try_catch_test.dart
rename to tests/compiler/dart2js/inference/simple_inferrer_try_catch_test.dart
index bb2c812..8105bd0 100644
--- a/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_try_catch_test.dart
@@ -2,12 +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.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import 'package:compiler/src/types/types.dart' show TypeMask;
 
-import 'compiler_helper.dart';
 import 'type_mask_test_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = """
 returnInt1() {
@@ -165,7 +167,7 @@
 
 void main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
+  var compiler = mockCompilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
         var typesInferrer = compiler.globalInference.typesInferrerInternal;
         var closedWorld = typesInferrer.closedWorld;
diff --git a/tests/compiler/dart2js/simple_inferrer_unregister_call_test.dart b/tests/compiler/dart2js/inference/simple_inferrer_unregister_call_test.dart
similarity index 89%
rename from tests/compiler/dart2js/simple_inferrer_unregister_call_test.dart
rename to tests/compiler/dart2js/inference/simple_inferrer_unregister_call_test.dart
index 6a3cd40..5356f65 100644
--- a/tests/compiler/dart2js/simple_inferrer_unregister_call_test.dart
+++ b/tests/compiler/dart2js/inference/simple_inferrer_unregister_call_test.dart
@@ -2,10 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = """
 var a = '';
@@ -30,7 +32,7 @@
 
 void main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
+  var compiler = mockCompilerFor(TEST, uri);
   asyncTest(() => compiler.run(uri).then((_) {
         var typesInferrer = compiler.globalInference.typesInferrerInternal;
 
diff --git a/tests/compiler/dart2js/inference/swarm_test.dart b/tests/compiler/dart2js/inference/swarm_test.dart
index 47feef7..c374b3f 100644
--- a/tests/compiler/dart2js/inference/swarm_test.dart
+++ b/tests/compiler/dart2js/inference/swarm_test.dart
@@ -4,11 +4,21 @@
 
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
+import '../equivalence/id_equivalence.dart';
 import 'inference_equivalence.dart';
 
 main(List<String> args) {
   asyncTest(() async {
     Expect.isTrue(
-        await mainInternal(['samples-dev/swarm/swarm.dart']..addAll(args)));
+        await mainInternal(['samples-dev/swarm/swarm.dart']..addAll(args),
+            whiteList: (Uri uri, Id id) {
+      if (uri.pathSegments.last == 'date_time.dart' &&
+          '$id' == 'IdKind.node:15944') {
+        // DateTime.== uses `if (!(other is DateTime))` for which kernel is
+        // smarter.
+        return true;
+      }
+      return false;
+    }));
   });
 }
diff --git a/tests/compiler/dart2js/type_combination_test.dart b/tests/compiler/dart2js/inference/type_combination_test.dart
similarity index 99%
rename from tests/compiler/dart2js/type_combination_test.dart
rename to tests/compiler/dart2js/inference/type_combination_test.dart
index b5b0c40..dbbd030 100644
--- a/tests/compiler/dart2js/type_combination_test.dart
+++ b/tests/compiler/dart2js/inference/type_combination_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// TODO(johnniwinther): Port this test to be frontend agnostic.
+
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 import 'package:compiler/src/js_backend/backend.dart' show JavaScriptBackend;
@@ -10,7 +12,7 @@
 import 'package:compiler/src/world.dart';
 import 'package:compiler/src/universe/use.dart';
 import 'package:compiler/src/universe/world_impact.dart';
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 import 'type_mask_test_helper.dart';
 
 TypeMask nullType;
diff --git a/tests/compiler/dart2js/type_inference6_test.dart b/tests/compiler/dart2js/inference/type_inference6_test.dart
similarity index 87%
rename from tests/compiler/dart2js/type_inference6_test.dart
rename to tests/compiler/dart2js/inference/type_inference6_test.dart
index 8be0c1d..0c899a5 100644
--- a/tests/compiler/dart2js/type_inference6_test.dart
+++ b/tests/compiler/dart2js/inference/type_inference6_test.dart
@@ -2,9 +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.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 import 'type_mask_test_helper.dart';
 
 import 'dart:async';
@@ -22,7 +24,7 @@
 
 Future runTest() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
+  var compiler = mockCompilerFor(TEST, uri);
   return compiler.run(uri).then((_) {
     var typesInferrer = compiler.globalInference.typesInferrerInternal;
     var closedWorld = typesInferrer.closedWorld;
diff --git a/tests/compiler/dart2js/type_inference7_test.dart b/tests/compiler/dart2js/inference/type_inference7_test.dart
similarity index 91%
rename from tests/compiler/dart2js/type_inference7_test.dart
rename to tests/compiler/dart2js/inference/type_inference7_test.dart
index 8875fb3..fd12b55 100644
--- a/tests/compiler/dart2js/type_inference7_test.dart
+++ b/tests/compiler/dart2js/inference/type_inference7_test.dart
@@ -2,9 +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.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 import 'type_mask_test_helper.dart';
 import 'dart:async';
 
@@ -21,7 +23,7 @@
   Uri uri = new Uri(scheme: 'source');
   {
     // Assertions enabled:
-    var compiler = compilerFor(TEST, uri, enableUserAssertions: true);
+    var compiler = mockCompilerFor(TEST, uri, enableUserAssertions: true);
     await compiler.run(uri);
     var typesInferrer = compiler.globalInference.typesInferrerInternal;
     var closedWorld = typesInferrer.closedWorld;
@@ -52,7 +54,7 @@
 
   {
     // Assertions disabled:
-    var compiler = compilerFor(TEST, uri, enableUserAssertions: false);
+    var compiler = mockCompilerFor(TEST, uri, enableUserAssertions: false);
     await compiler.run(uri);
     var typesInferrer = compiler.globalInference.typesInferrerInternal;
     var closedWorld = typesInferrer.closedWorld;
diff --git a/tests/compiler/dart2js/type_inference8_test.dart b/tests/compiler/dart2js/inference/type_inference8_test.dart
similarity index 93%
rename from tests/compiler/dart2js/type_inference8_test.dart
rename to tests/compiler/dart2js/inference/type_inference8_test.dart
index 1a77ca5..18c4aa7 100644
--- a/tests/compiler/dart2js/type_inference8_test.dart
+++ b/tests/compiler/dart2js/inference/type_inference8_test.dart
@@ -2,11 +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.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import "package:async_helper/async_helper.dart";
 import "package:compiler/src/constants/values.dart";
 import "package:compiler/src/types/types.dart";
 import "package:expect/expect.dart";
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 import 'dart:async';
 
@@ -31,7 +33,7 @@
 
 Future runTest1() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST1, uri);
+  var compiler = mockCompilerFor(TEST1, uri);
   return compiler.run(uri).then((_) {
     var typesInferrer = compiler.globalInference.typesInferrerInternal;
     var commonMasks = typesInferrer.closedWorld.commonMasks;
@@ -74,7 +76,7 @@
 
 Future runTest2() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST2, uri);
+  var compiler = mockCompilerFor(TEST2, uri);
   return compiler.run(uri).then((_) {
     var typesInferrer = compiler.globalInference.typesInferrerInternal;
     var commonMasks = typesInferrer.closedWorld.commonMasks;
diff --git a/tests/compiler/dart2js/type_inference_switch_test.dart b/tests/compiler/dart2js/inference/type_inference_switch_test.dart
similarity index 94%
rename from tests/compiler/dart2js/type_inference_switch_test.dart
rename to tests/compiler/dart2js/inference/type_inference_switch_test.dart
index 8b0b8e4..20da364 100644
--- a/tests/compiler/dart2js/type_inference_switch_test.dart
+++ b/tests/compiler/dart2js/inference/type_inference_switch_test.dart
@@ -2,9 +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.
 
+/// TODO(johnniwinther): Port this test to use the equivalence framework.
+
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 import 'type_mask_test_helper.dart';
 
 import 'dart:async';
@@ -132,7 +134,7 @@
 
 Future runTest(String test, checker) {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(test, uri);
+  var compiler = mockCompilerFor(test, uri);
   return compiler.run(uri).then((_) {
     var typesInferrer = compiler.globalInference.typesInferrerInternal;
     var closedWorld = typesInferrer.closedWorld;
diff --git a/tests/compiler/dart2js/type_mask2_test.dart b/tests/compiler/dart2js/inference/type_mask2_test.dart
similarity index 83%
rename from tests/compiler/dart2js/type_mask2_test.dart
rename to tests/compiler/dart2js/inference/type_mask2_test.dart
index 5c6e159..2f2362a 100644
--- a/tests/compiler/dart2js/type_mask2_test.dart
+++ b/tests/compiler/dart2js/inference/type_mask2_test.dart
@@ -7,10 +7,10 @@
 import 'dart:async';
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import 'type_test_helper.dart';
-import 'package:compiler/src/elements/elements.dart' show ClassElement;
+import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/types/types.dart';
 import 'package:compiler/src/world.dart' show ClosedWorld;
+import '../type_test_helper.dart';
 
 isCheckedMode() {
   try {
@@ -24,18 +24,25 @@
 }
 
 void main() {
+  runTests(CompileMode compileMode) async {
+    await testUnionTypeMaskFlatten(compileMode);
+    await testStringSubtypes(compileMode);
+  }
+
   asyncTest(() async {
-    await testUnionTypeMaskFlatten();
-    await testStringSubtypes();
+    print('--test from ast---------------------------------------------------');
+    await runTests(CompileMode.memory);
+    print('--test from kernel------------------------------------------------');
+    await runTests(CompileMode.kernel);
   });
 }
 
-checkMasks(ClosedWorld closedWorld, List<ClassElement> allClasses,
+checkMasks(ClosedWorld closedWorld, List<ClassEntity> allClasses,
     List<FlatTypeMask> masks,
     {FlatTypeMask result,
     List<FlatTypeMask> disjointMasks,
     FlatTypeMask flattened,
-    List<ClassElement> containedClasses}) {
+    List<ClassEntity> containedClasses}) {
   List<FlatTypeMask> disjoint = <FlatTypeMask>[];
   UnionTypeMask.unionOfHelper(masks, disjoint, closedWorld);
   Expect.listEquals(disjointMasks, disjoint,
@@ -72,7 +79,7 @@
         result, union, 'Unexpected union of $masks: $union, expected $result.');
   }
   if (containedClasses != null) {
-    for (ClassElement cls in allClasses) {
+    for (ClassEntity cls in allClasses) {
       if (containedClasses.contains(cls)) {
         Expect.isTrue(union.contains(cls, closedWorld),
             'Expected $union to contain $cls.');
@@ -85,7 +92,7 @@
   return union;
 }
 
-Future testUnionTypeMaskFlatten() async {
+Future testUnionTypeMaskFlatten(CompileMode compileMode) async {
   TypeEnvironment env = await TypeEnvironment.create(r"""
       class A {}
       class B {}
@@ -100,24 +107,24 @@
         new D();
         new E();
       }
-      """, compileMode: CompileMode.memory);
+      """, compileMode: compileMode);
 
   ClosedWorld closedWorld = env.closedWorld;
 
-  ClassElement Object_ = env.getElement("Object");
-  ClassElement A = env.getElement("A");
-  ClassElement B = env.getElement("B");
-  ClassElement C = env.getElement("C");
-  ClassElement D = env.getElement("D");
-  ClassElement E = env.getElement("E");
+  ClassEntity Object_ = env.getElement("Object");
+  ClassEntity A = env.getElement("A");
+  ClassEntity B = env.getElement("B");
+  ClassEntity C = env.getElement("C");
+  ClassEntity D = env.getElement("D");
+  ClassEntity E = env.getElement("E");
 
-  List<ClassElement> allClasses = <ClassElement>[Object_, A, B, C, D, E];
+  List<ClassEntity> allClasses = <ClassEntity>[Object_, A, B, C, D, E];
 
   check(List<FlatTypeMask> masks,
       {FlatTypeMask result,
       List<FlatTypeMask> disjointMasks,
       FlatTypeMask flattened,
-      List<ClassElement> containedClasses}) {
+      List<ClassEntity> containedClasses}) {
     return checkMasks(closedWorld, allClasses, masks,
         result: result,
         disjointMasks: disjointMasks,
@@ -203,19 +210,19 @@
       containedClasses: [A, B, E]);
 }
 
-Future testStringSubtypes() async {
+Future testStringSubtypes(CompileMode compileMode) async {
   TypeEnvironment env = await TypeEnvironment.create('',
       mainSource: r"""
       main() {
         '' is String;
       }
       """,
-      compileMode: CompileMode.memory);
+      compileMode: compileMode);
   ClosedWorld closedWorld = env.closedWorld;
 
-  ClassElement Object_ = env.getElement("Object");
-  ClassElement String_ = env.getElement("String");
-  ClassElement JSString = closedWorld.commonElements.jsStringClass;
+  ClassEntity Object_ = env.getElement("Object");
+  ClassEntity String_ = env.getElement("String");
+  ClassEntity JSString = closedWorld.commonElements.jsStringClass;
 
   Expect.isFalse(closedWorld.isDirectlyInstantiated(Object_));
   Expect.isTrue(closedWorld.isIndirectlyInstantiated(Object_));
diff --git a/tests/compiler/dart2js/inference/type_mask_disjoint_test.dart b/tests/compiler/dart2js/inference/type_mask_disjoint_test.dart
new file mode 100644
index 0000000..f67dd0a
--- /dev/null
+++ b/tests/compiler/dart2js/inference/type_mask_disjoint_test.dart
@@ -0,0 +1,210 @@
+// 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:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/common_elements.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/types/types.dart';
+import 'package:compiler/src/world.dart';
+
+import '../memory_compiler.dart';
+
+const String CODE = """
+class A {}
+class B extends A {}
+class C extends A {}
+
+class D implements A {}
+
+class E {}
+class F extends E {}
+class G implements E {}
+
+class H {}
+class I implements H {}
+class J extends D implements I {}
+
+class K {}
+class M extends K with A {}
+
+class N extends H with I {}
+
+main() {
+  print([new A(), new B(), new C(), new D(), new E(), new F(), new G(),
+      new H(), new I(), new J(), new K(), new M(), new N()]);
+}
+""";
+
+main() {
+  runTests({bool useKernel}) async {
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: {'main.dart': CODE},
+        options: useKernel ? [Flags.useKernel] : []);
+    Expect.isTrue(result.isSuccess);
+    Compiler compiler = result.compiler;
+    ClosedWorld world = compiler.backendClosedWorldForTesting;
+    ElementEnvironment elementEnvironment = world.elementEnvironment;
+
+    /// Checks the expectation of `isDisjoint` for two mask. Also checks that
+    /// the result is consistent with an equivalent (but slower) implementation
+    /// based on intersection.
+    checkMask(TypeMask m1, TypeMask m2, {areDisjoint: false}) {
+      print('masks: $m1 $m2');
+      Expect.equals(areDisjoint, m1.isDisjoint(m2, world));
+      Expect.equals(areDisjoint, m2.isDisjoint(m1, world));
+      var i1 = m1.intersection(m2, world);
+      Expect.equals(areDisjoint, i1.isEmpty && !i1.isNullable);
+      var i2 = m2.intersection(m1, world);
+      Expect.equals(areDisjoint, i2.isEmpty && !i2.isNullable);
+    }
+
+    Map _maskCache = {};
+    Map _elementCache = {};
+
+    /// Parses a descriptor of a flat mask. A descriptor is of the form "AXY"
+    /// where:
+    ///   A: either a type T or " " (base class or empty)
+    ///   X: can be either ! or " " (nullable/nonnullable)
+    ///   Y: can be either " " (no flag), = (exact), < (subclass), * (subtype)
+    ///
+    /// Examples:
+    ///   "-! " - empty, non-null
+    ///   "-  " - null
+    ///   "Type!=" - non-null exact Type
+    ///   "Type =" - nullable exact Type
+    ///   "Type!<" - non-null subclass of Type
+    ///   "Type!*" - non-null subtype of Type
+    TypeMask maskOf(String descriptor) =>
+        _maskCache.putIfAbsent(descriptor, () {
+          Expect.isTrue(descriptor.length >= 3);
+          var type = descriptor.substring(0, descriptor.length - 2);
+          bool isNullable = descriptor[descriptor.length - 2] != '!';
+          bool isExact = descriptor[descriptor.length - 1] == '=';
+          bool isSubclass = descriptor[descriptor.length - 1] == '<';
+          bool isSubtype = descriptor[descriptor.length - 1] == '*';
+
+          if (type == " ") {
+            Expect.isFalse(isExact || isSubclass || isSubtype);
+            return isNullable
+                ? new TypeMask.empty()
+                : new TypeMask.nonNullEmpty();
+          }
+
+          Expect.isTrue(isExact || isSubclass || isSubtype);
+          var element = _elementCache.putIfAbsent(type, () {
+            if (type == " ") return null;
+            ClassEntity cls = elementEnvironment.lookupClass(
+                elementEnvironment.mainLibrary, type);
+            Expect.isNotNull(cls, "No class '$type' found.");
+            return cls;
+          });
+
+          var mask = isExact
+              ? new TypeMask.nonNullExact(element, world)
+              : (isSubclass
+                  ? new TypeMask.nonNullSubclass(element, world)
+                  : new TypeMask.nonNullSubtype(element, world));
+          return isNullable ? mask.nullable() : mask;
+        });
+
+    /// Checks the expectation of `isDisjoint` for two mask descriptors (see
+    /// [maskOf] for details).
+    check(String typeMaskDescriptor1, String typeMaskDescriptor2,
+        {areDisjoint: true}) {
+      print('[$typeMaskDescriptor1] & [$typeMaskDescriptor2]');
+      checkMask(maskOf(typeMaskDescriptor1), maskOf(typeMaskDescriptor2),
+          areDisjoint: areDisjoint);
+    }
+
+    checkUnions(List<String> descriptors1, List<String> descriptors2,
+        {areDisjoint: true}) {
+      print('[$descriptors1] & [$descriptors2]');
+      var m1 = new TypeMask.unionOf(descriptors1.map(maskOf).toList(), world);
+      var m2 = new TypeMask.unionOf(descriptors2.map(maskOf).toList(), world);
+      checkMask(m1, m2, areDisjoint: areDisjoint);
+    }
+
+    // Empty
+    check(' ! ', ' ! '); // both non-null
+    check(' ! ', '   '); // one non-null
+    check('   ', ' ! '); // one non-null
+    check('   ', '   ', areDisjoint: false); // null is common
+
+    // Exact
+    check('A!=', 'A!=', areDisjoint: false);
+    check('A!=', 'B!=');
+    check('A!=', 'E!=');
+    check('A =', 'E =', areDisjoint: false); // null is common
+    check('M!=', 'K!=');
+    check('M!=', 'A!=');
+
+    // Exact with subclass
+    check('A!=', 'A!<', areDisjoint: false);
+    check('B!=', 'A!<', areDisjoint: false);
+    check('A!=', 'B!<');
+    check('A!=', 'E!<');
+    check('A =', 'E!<');
+    check('A =', 'E <', areDisjoint: false);
+    check('M!=', 'K!<', areDisjoint: false);
+    check('M!=', 'A!<');
+
+    // Exact with subtype
+    check('A!=', 'A!*', areDisjoint: false);
+    check('B!=', 'A!*', areDisjoint: false);
+    check('A!=', 'B!*');
+    check('A!=', 'E!*');
+    check('A!=', 'I!*');
+    check('J!=', 'H!*', areDisjoint: false);
+    check('M!=', 'K!*', areDisjoint: false);
+    check('M!=', 'A!*', areDisjoint: false);
+
+    // Subclass with subclass
+    check('A!<', 'A!<', areDisjoint: false);
+    check('A!<', 'B!<', areDisjoint: false);
+    check('A!<', 'E!<');
+    check('A!<', 'H!<');
+    check('D!<', 'I!<');
+    check('H!<', 'I!*', areDisjoint: false);
+
+    // Subclass with subtype
+    check('A!<', 'A!*', areDisjoint: false);
+    check('A!<', 'B!*', areDisjoint: false);
+    check('A!<', 'E!*');
+    check('A!<', 'H!*');
+    check('D!<', 'I!*', areDisjoint: false);
+
+    // Subtype with subtype
+    check('A!*', 'A!*', areDisjoint: false);
+    check('A!*', 'B!*', areDisjoint: false);
+    check('A!*', 'E!*');
+    check('A!*', 'H!*', areDisjoint: false);
+    check('D!*', 'I!*', areDisjoint: false);
+
+    // Unions!
+    checkUnions(['B!=', 'C!='], ['A!=']);
+    checkUnions(['B!=', 'C!='], ['A =']);
+    checkUnions(['B!=', 'C ='], ['A ='], areDisjoint: false);
+
+    checkUnions(['B!=', 'C!='], ['A!<'], areDisjoint: false);
+    checkUnions(['B!=', 'C!='], ['B!='], areDisjoint: false);
+    checkUnions(['A!<', 'E!<'], ['C!='], areDisjoint: false);
+    checkUnions(['A!<', 'E!<'], ['F!='], areDisjoint: false);
+
+    checkUnions(['A!=', 'E!='], ['C!=', 'F!=']);
+    checkUnions(['A!=', 'E!='], ['A!=', 'F!='], areDisjoint: false);
+    checkUnions(['B!=', 'E!='], ['A!<', 'F!='], areDisjoint: false);
+    checkUnions(['A!<', 'E!<'], ['C!=', 'F!='], areDisjoint: false);
+    checkUnions(['A!=', 'E!='], ['C!=', 'F!=']);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/inference/type_mask_test.dart b/tests/compiler/dart2js/inference/type_mask_test.dart
new file mode 100644
index 0000000..fc668d0
--- /dev/null
+++ b/tests/compiler/dart2js/inference/type_mask_test.dart
@@ -0,0 +1,146 @@
+// 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:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+import 'package:compiler/src/types/types.dart';
+
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/common_elements.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/world.dart';
+import '../memory_compiler.dart';
+
+const String CODE = """
+class A {}
+class B extends A {}
+class C implements A {}
+class D implements A {}
+main() {
+  print([new A(), new B(), new C(), new D()]);
+}
+""";
+
+main() {
+  runTests({bool useKernel}) async {
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: {'main.dart': CODE},
+        options: useKernel ? [Flags.useKernel] : []);
+    Expect.isTrue(result.isSuccess);
+    Compiler compiler = result.compiler;
+    ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+    ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
+
+    dynamic classA =
+        elementEnvironment.lookupClass(elementEnvironment.mainLibrary, 'A');
+    dynamic classB =
+        elementEnvironment.lookupClass(elementEnvironment.mainLibrary, 'B');
+    dynamic classC =
+        elementEnvironment.lookupClass(elementEnvironment.mainLibrary, 'C');
+    dynamic classD =
+        elementEnvironment.lookupClass(elementEnvironment.mainLibrary, 'D');
+
+    var exactA = new TypeMask.nonNullExact(classA, closedWorld);
+    var exactB = new TypeMask.nonNullExact(classB, closedWorld);
+    var exactC = new TypeMask.nonNullExact(classC, closedWorld);
+    var exactD = new TypeMask.nonNullExact(classD, closedWorld);
+
+    var subclassA = new TypeMask.nonNullSubclass(classA, closedWorld);
+    var subtypeA = new TypeMask.nonNullSubtype(classA, closedWorld);
+
+    var subclassObject = new TypeMask.nonNullSubclass(
+        closedWorld.commonElements.objectClass, closedWorld);
+
+    var unionABC = UnionTypeMask.unionOf([exactA, exactB, exactC], closedWorld);
+    var unionABnC =
+        UnionTypeMask.unionOf([exactA, exactB.nullable(), exactC], closedWorld);
+    var unionAB = UnionTypeMask.unionOf([exactA, exactB], closedWorld);
+    var unionSubtypeAC = UnionTypeMask.unionOf([subtypeA, exactC], closedWorld);
+    var unionSubclassAC =
+        UnionTypeMask.unionOf([subclassA, exactC], closedWorld);
+    var unionBCD = UnionTypeMask.unionOf([exactB, exactC, exactD], closedWorld);
+    var unionBCDn =
+        UnionTypeMask.unionOf([exactB, exactC, exactD.nullable()], closedWorld);
+
+    Expect.isFalse(unionABC.isNullable);
+    Expect.isTrue(unionABnC.isNullable);
+    Expect.isFalse(unionBCD.isNullable);
+    Expect.isTrue(unionBCDn.isNullable);
+
+    rule(a, b, c) => Expect.equals(c, a.isInMask(b, closedWorld));
+
+    rule(exactA, exactA, true);
+    rule(exactA, exactB, false);
+    rule(exactA, exactC, false);
+    rule(exactA, subclassA, true);
+    rule(exactA, subtypeA, true);
+
+    rule(exactB, exactA, false);
+    rule(exactB, exactB, true);
+    rule(exactB, exactC, false);
+    rule(exactB, subclassA, true);
+    rule(exactB, subtypeA, true);
+
+    rule(exactC, exactA, false);
+    rule(exactC, exactB, false);
+    rule(exactC, exactC, true);
+    rule(exactC, subclassA, false);
+    rule(exactC, subtypeA, true);
+
+    rule(subclassA, exactA, false);
+    rule(subclassA, exactB, false);
+    rule(subclassA, exactC, false);
+    rule(subclassA, subclassA, true);
+    rule(subclassA, subtypeA, true);
+
+    rule(subtypeA, exactA, false);
+    rule(subtypeA, exactB, false);
+    rule(subtypeA, exactC, false);
+    rule(subtypeA, subclassA, false);
+    rule(subtypeA, subtypeA, true);
+
+    rule(unionABC, unionSubtypeAC, true);
+    rule(unionSubtypeAC, unionABC, true);
+    rule(unionAB, unionSubtypeAC, true);
+    rule(unionSubtypeAC, unionAB, false);
+    rule(unionABC, unionSubclassAC, true);
+    rule(unionSubclassAC, unionABC, true);
+    rule(unionAB, unionSubclassAC, true);
+    rule(unionSubclassAC, unionAB, false);
+    rule(unionAB, subclassA, true);
+    rule(subclassA, unionAB, true);
+    rule(unionABC, subtypeA, true);
+    rule(subtypeA, unionABC, true);
+    rule(unionABC, subclassA, false);
+    rule(subclassA, unionABC, true);
+    rule(unionAB, subclassA, true);
+    rule(subclassA, unionAB, true);
+
+    rule(exactA, subclassObject, true);
+    rule(exactB, subclassObject, true);
+    rule(subclassA, subclassObject, true);
+    rule(subtypeA, subclassObject, true);
+    rule(unionABC, subclassObject, true);
+    rule(unionAB, subclassObject, true);
+    rule(unionSubtypeAC, subclassObject, true);
+    rule(unionSubclassAC, subclassObject, true);
+
+    rule(unionABnC, unionABC, false);
+    rule(unionABC, unionABnC, true);
+    rule(exactA.nullable(), unionABnC, true);
+    rule(exactA.nullable(), unionABC, false);
+    rule(exactB, unionABnC, true);
+    rule(unionBCDn, unionBCD, false);
+    rule(unionBCD, unionBCDn, true);
+    rule(exactB.nullable(), unionBCDn, true);
+    rule(exactB.nullable(), unionBCD, false);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/type_mask_test_helper.dart b/tests/compiler/dart2js/inference/type_mask_test_helper.dart
similarity index 100%
rename from tests/compiler/dart2js/type_mask_test_helper.dart
rename to tests/compiler/dart2js/inference/type_mask_test_helper.dart
diff --git a/tests/compiler/dart2js/union_type_test.dart b/tests/compiler/dart2js/inference/union_type_test.dart
similarity index 72%
rename from tests/compiler/dart2js/union_type_test.dart
rename to tests/compiler/dart2js/inference/union_type_test.dart
index 8f6259a..6b0bcdf 100644
--- a/tests/compiler/dart2js/union_type_test.dart
+++ b/tests/compiler/dart2js/inference/union_type_test.dart
@@ -6,10 +6,10 @@
 import "package:expect/expect.dart";
 import "package:compiler/src/types/types.dart";
 import "package:compiler/src/world.dart";
-import 'type_test_helper.dart';
+import '../type_test_helper.dart';
 
 main() {
-  asyncTest(() async {
+  runTest(CompileMode compileMode) async {
     TypeEnvironment env = await TypeEnvironment.create(r"""
       class A {}
       class B {}
@@ -18,12 +18,19 @@
         new A();
         new B();
       }
-      """, compileMode: CompileMode.memory);
+      """, compileMode: compileMode);
     ClosedWorld world = env.closedWorld;
     FlatTypeMask mask1 = new FlatTypeMask.exact(env.getClass('A'));
     FlatTypeMask mask2 = new FlatTypeMask.exact(env.getClass('B'));
     UnionTypeMask union1 = mask1.nonNullable().union(mask2, world);
     UnionTypeMask union2 = mask2.nonNullable().union(mask1, world);
     Expect.equals(union1, union2);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(CompileMode.memory);
+    print('--test from kernel------------------------------------------------');
+    await runTest(CompileMode.kernel);
   });
 }
diff --git a/tests/compiler/dart2js/inferrer_factory_test.dart b/tests/compiler/dart2js/inferrer_factory_test.dart
deleted file mode 100644
index 2639517..0000000
--- a/tests/compiler/dart2js/inferrer_factory_test.dart
+++ /dev/null
@@ -1,31 +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 'compiler_helper.dart';
-
-const String TEST1 = r"""
-class A implements List {
-  factory A() {
-    // Avoid inlining by using try/catch.
-    try {
-      return new List();
-    } catch (e) {
-    }
-  }
-}
-
-main() {
-  new A()[0] = 42;
-}
-""";
-
-main() {
-  asyncTest(() => compileAll(TEST1).then((generated) {
-        // Check that we're using the index operator on the object returned
-        // by the A factory.
-        Expect.isTrue(generated.contains('[0] = 42'));
-      }));
-}
diff --git a/tests/compiler/dart2js/inlining/data/conditional.dart b/tests/compiler/dart2js/inlining/data/conditional.dart
new file mode 100644
index 0000000..5203943
--- /dev/null
+++ b/tests/compiler/dart2js/inlining/data/conditional.dart
@@ -0,0 +1,63 @@
+// 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.
+
+// Tests for the heuristics on conditional expression whose condition is a
+// parameter for which the max, instead of the sum, of the branch sizes is used.
+
+// ignore: IMPORT_INTERNAL_LIBRARY
+import 'dart:_js_helper';
+
+/*element: main:[]*/
+main() {
+  conditionalField();
+  conditionalParameter();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Conditional expression on a non-parameter (here a top-level field). The
+// size of the condition is the sum of the nodes in the conditional expression.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: _method1:[_conditionalField]*/
+_method1() => 42;
+
+var _field1;
+
+/*element: _conditionalField:[]*/
+_conditionalField() {
+  return _field1
+      ? _method1() + _method1() + _method1()
+      : _method1() + _method1() + _method1();
+}
+
+/*element: conditionalField:[]*/
+@NoInline()
+conditionalField() {
+  _field1 = false;
+  _conditionalField();
+  _field1 = true;
+  _conditionalField();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Conditional expression on a parameter. The size of the condition is the
+// max of the branches + the condition itself.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: _method2:[conditionalParameter]*/
+_method2() => 42;
+
+/*element: _conditionalParameter:[conditionalParameter]*/
+_conditionalParameter(o) {
+  return o
+      ? _method2() + _method2() + _method2()
+      : _method2() + _method2() + _method2();
+}
+
+/*element: conditionalParameter:[]*/
+@NoInline()
+conditionalParameter() {
+  _conditionalParameter(true);
+  _conditionalParameter(false);
+}
diff --git a/tests/compiler/dart2js/inlining/data/heuristics.dart b/tests/compiler/dart2js/inlining/data/heuristics.dart
index 76e346d..6433d50 100644
--- a/tests/compiler/dart2js/inlining/data/heuristics.dart
+++ b/tests/compiler/dart2js/inlining/data/heuristics.dart
@@ -11,6 +11,10 @@
   outsideLoopNoArgsCalledTwice();
   outsideLoopOneArgCalledOnce();
   outsideLoopOneArgCalledTwice();
+  insideLoopNoArgsCalledOnce();
+  insideLoopNoArgsCalledTwice();
+  insideLoopOneArgCalledOnce();
+  insideLoopOneArgCalledTwice();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -145,3 +149,177 @@
   _outsideLoopOneArg2(0);
   _outsideLoopOneArg2(0);
 }
+
+////////////////////////////////////////////////////////////////////////////////
+// Inline a method with no parameters called once based regardless the number of
+// static no-arg calls in its body.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: _method5:[insideLoopNoArgsCalledOnce]*/
+_method5() {}
+
+/*element: _insideLoopNoArgsCalledOnce:[insideLoopNoArgsCalledOnce]*/
+_insideLoopNoArgsCalledOnce() {
+  _method5();
+  _method5();
+  _method5();
+  _method5();
+  _method5();
+  _method5();
+  _method5();
+  _method5();
+  _method5();
+  // This would be one too many calls if this method were called twice.
+  _method5();
+}
+
+/*element: insideLoopNoArgsCalledOnce:loop*/
+@NoInline()
+insideLoopNoArgsCalledOnce() {
+  // ignore: UNUSED_LOCAL_VARIABLE
+  for (var e in [1, 2, 3, 4]) {
+    _insideLoopNoArgsCalledOnce();
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Inline a method with no parameters called twice based on the number of
+// static no-arg calls in its body.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: _method6:[_insideLoopNoArgs2,insideLoopNoArgsCalledTwice]*/
+_method6() {}
+
+/*element: _insideLoopNoArgs1:[insideLoopNoArgsCalledTwice]*/
+_insideLoopNoArgs1() {
+  _method6();
+  _method6();
+  _method6();
+  _method6();
+  _method6();
+  _method6();
+  _method6();
+  _method6();
+  _method6();
+  _method6();
+}
+
+/*element: _insideLoopNoArgs2:[]*/
+_insideLoopNoArgs2() {
+  _method6();
+  _method6();
+  _method6();
+  _method6();
+  _method6();
+  _method6();
+  _method6();
+  _method6();
+  _method6();
+  _method6();
+  _method6();
+  _method6();
+  // One too many calls:
+  _method6();
+}
+
+/*element: insideLoopNoArgsCalledTwice:loop*/
+@NoInline()
+insideLoopNoArgsCalledTwice() {
+  // ignore: UNUSED_LOCAL_VARIABLE
+  for (var e in [1, 2, 3, 4]) {
+    _insideLoopNoArgs1();
+    _insideLoopNoArgs1();
+    _insideLoopNoArgs2();
+    _insideLoopNoArgs2();
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Inline a method with one parameter called once based regardless the number of
+// static no-arg calls in its body.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: _method7:[insideLoopOneArgCalledOnce]*/
+_method7() {}
+
+/*element: _insideLoopOneArgCalledOnce:[insideLoopOneArgCalledOnce]*/
+_insideLoopOneArgCalledOnce(arg) {
+  _method7();
+  _method7();
+  _method7();
+  _method7();
+  _method7();
+  // This would be too many calls if this method were called twice.
+  _method7();
+  _method7();
+  _method7();
+  _method7();
+  _method7();
+  _method7();
+  _method7();
+  _method7();
+  _method7();
+  _method7();
+  _method7();
+}
+
+/*element: insideLoopOneArgCalledOnce:loop*/
+@NoInline()
+insideLoopOneArgCalledOnce() {
+  for (var e in [1, 2, 3, 4]) {
+    _insideLoopOneArgCalledOnce(e);
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Inline a method with one parameter called twice based on the number of
+// static no-arg calls in its body.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: _method8:[_insideLoopOneArg2,insideLoopOneArgCalledTwice]*/
+_method8() {}
+
+/*element: _insideLoopOneArg1:[insideLoopOneArgCalledTwice]*/
+_insideLoopOneArg1(arg) {
+  _method8();
+  _method8();
+  _method8();
+  _method8();
+  _method8();
+  _method8();
+  _method8();
+  _method8();
+  _method8();
+  // Extra calls granted by one parameter.
+  _method8();
+  _method8();
+}
+
+/*element: _insideLoopOneArg2:[]*/
+_insideLoopOneArg2(arg) {
+  _method8();
+  _method8();
+  _method8();
+  _method8();
+  _method8();
+  _method8();
+  _method8();
+  _method8();
+  _method8();
+  // Extra calls granted by one parameter.
+  _method8();
+  _method8();
+  // One too many calls:
+  _method8();
+}
+
+/*element: insideLoopOneArgCalledTwice:loop*/
+@NoInline()
+insideLoopOneArgCalledTwice() {
+  for (var e in [1, 2, 3, 4]) {
+    _insideLoopOneArg1(e);
+    _insideLoopOneArg1(e);
+    _insideLoopOneArg2(e);
+    _insideLoopOneArg2(e);
+  }
+}
diff --git a/tests/compiler/dart2js/meta_annotations2_test.dart b/tests/compiler/dart2js/inlining/meta_annotations2_test.dart
similarity index 77%
rename from tests/compiler/dart2js/meta_annotations2_test.dart
rename to tests/compiler/dart2js/inlining/meta_annotations2_test.dart
index d615372..2797238 100644
--- a/tests/compiler/dart2js/meta_annotations2_test.dart
+++ b/tests/compiler/dart2js/inlining/meta_annotations2_test.dart
@@ -7,7 +7,8 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import 'package:compiler/compiler_new.dart';
-import 'memory_compiler.dart';
+import 'package:compiler/src/commandline_options.dart';
+import '../memory_compiler.dart';
 
 const MEMORY_SOURCE_FILES = const {
   'main.dart': r'''
@@ -38,10 +39,12 @@
 };
 
 void main() {
-  asyncTest(() async {
+  runTests({bool useKernel}) async {
     OutputCollector collector = new OutputCollector();
     await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES, outputProvider: collector);
+        memorySourceFiles: MEMORY_SOURCE_FILES,
+        outputProvider: collector,
+        options: useKernel ? [Flags.useKernel] : []);
     // Simply check that the constants of the small functions are still in the
     // output, and that we don't see the result of constant folding.
     String jsOutput = collector.getOutput('', OutputType.js);
@@ -62,5 +65,12 @@
     hasNot('211109');
     hasNot('82155031');
     hasNot('4712');
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
   });
 }
diff --git a/tests/compiler/dart2js/meta_annotations3_test.dart b/tests/compiler/dart2js/inlining/meta_annotations3_test.dart
similarity index 80%
rename from tests/compiler/dart2js/meta_annotations3_test.dart
rename to tests/compiler/dart2js/inlining/meta_annotations3_test.dart
index 005cbf1..37d1b76 100644
--- a/tests/compiler/dart2js/meta_annotations3_test.dart
+++ b/tests/compiler/dart2js/inlining/meta_annotations3_test.dart
@@ -7,7 +7,8 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import 'package:compiler/compiler_new.dart';
-import 'memory_compiler.dart';
+import 'package:compiler/src/commandline_options.dart';
+import '../memory_compiler.dart';
 
 const MEMORY_SOURCE_FILES = const {
   'main.dart': r'''
@@ -50,10 +51,12 @@
 };
 
 void main() {
-  asyncTest(() async {
+  runTests({bool useKernel}) async {
     OutputCollector collector = new OutputCollector();
     await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES, outputProvider: collector);
+        memorySourceFiles: MEMORY_SOURCE_FILES,
+        outputProvider: collector,
+        options: useKernel ? [Flags.useKernel] : []);
     String jsOutput = collector.getOutput('', OutputType.js);
 
     void has(String text) {
@@ -77,5 +80,12 @@
     hasNot('48000993');
     has('48001992');
     has('48001993');
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
   });
 }
diff --git a/tests/compiler/dart2js/meta_annotations_test.dart b/tests/compiler/dart2js/inlining/meta_annotations_test.dart
similarity index 70%
rename from tests/compiler/dart2js/meta_annotations_test.dart
rename to tests/compiler/dart2js/inlining/meta_annotations_test.dart
index f3ad7fb..2eaee34 100644
--- a/tests/compiler/dart2js/meta_annotations_test.dart
+++ b/tests/compiler/dart2js/inlining/meta_annotations_test.dart
@@ -4,11 +4,13 @@
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/elements/elements.dart';
+import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/js_backend/annotations.dart' as optimizerHints;
 import 'package:compiler/src/world.dart' show ClosedWorld;
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 const Map MEMORY_SOURCE_FILES = const {
   'main.dart': r"""
@@ -32,12 +34,14 @@
 };
 
 main() {
-  asyncTest(() async {
-    CompilationResult result =
-        await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
+  runTests({bool useKernel}) async {
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: MEMORY_SOURCE_FILES,
+        options: useKernel ? [Flags.useKernel] : []);
     Compiler compiler = result.compiler;
     ClosedWorld closedWorld =
         compiler.resolutionWorldBuilder.closedWorldForTesting;
+    ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
     Expect.isFalse(compiler.compilationFailed, 'Unsuccessful compilation');
     Expect.isNotNull(closedWorld.commonElements.metaNoInlineClass,
         'NoInlineClass is unresolved.');
@@ -46,9 +50,9 @@
 
     void test(String name,
         {bool expectNoInline: false, bool expectTryInline: false}) {
-      LibraryElement mainApp =
-          compiler.frontendStrategy.elementEnvironment.mainLibrary;
-      MethodElement method = mainApp.find(name);
+      LibraryEntity mainLibrary = elementEnvironment.mainLibrary;
+      FunctionEntity method =
+          elementEnvironment.lookupLibraryMember(mainLibrary, name);
       Expect.isNotNull(method);
       Expect.equals(
           expectNoInline,
@@ -65,5 +69,12 @@
     test('method');
     test('methodNoInline', expectNoInline: true);
     test('methodTryInline', expectTryInline: true);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
   });
 }
diff --git a/tests/compiler/dart2js/instantiated_classes_test.dart b/tests/compiler/dart2js/instantiated_classes_test.dart
index 1b9d1d0..11a276a 100644
--- a/tests/compiler/dart2js/instantiated_classes_test.dart
+++ b/tests/compiler/dart2js/instantiated_classes_test.dart
@@ -12,66 +12,82 @@
 import 'type_test_helper.dart';
 
 void main() {
-  asyncTest(() => Future.forEach([
-        () => test("class Class {}", ["Class"]),
-        () => test("""abstract class A {}
-                  class Class extends A {}""", ["Class"]),
-        () => test("""class A {}
-                  class Class extends A {}""", ["Class"]),
-        () => test("""class A {}
+  Future runTests({bool useKernel}) async {
+    Future test(String source, List<String> directlyInstantiatedClasses,
+        [List<String> newClasses = const <String>["Class"]]) async {
+      StringBuffer mainSource = new StringBuffer();
+      mainSource.write('main() {\n');
+      for (String newClass in newClasses) {
+        mainSource.write('  new $newClass();\n');
+      }
+      mainSource.write('}');
+      dynamic env = await TypeEnvironment.create(source,
+          mainSource: mainSource.toString(),
+          compileMode: useKernel ? CompileMode.kernel : CompileMode.memory);
+      LibraryEntity mainLibrary =
+          env.compiler.frontendStrategy.elementEnvironment.mainLibrary;
+      Iterable<ClassEntity> expectedClasses =
+          directlyInstantiatedClasses.map(env.getElement);
+      Iterable<ClassEntity> actualClasses = env
+          .compiler.resolutionWorldBuilder.directlyInstantiatedClasses
+          .where((c) => c.library == mainLibrary);
+      Expect.setEquals(
+          expectedClasses,
+          actualClasses,
+          "Instantiated classes mismatch: "
+          "Expected $expectedClasses, actual: $actualClasses");
+    }
+
+    await test("class Class {}", ["Class"]);
+    await test("""abstract class A {}
+                  class Class extends A {}""", ["Class"]);
+    await test("""class A {}
+                  class Class extends A {}""", ["Class"]);
+    await test("""class A {}
                   class B {}
-                  class Class extends A {}""", ["Class"]),
-        () => test("""class A {}
-                  class Class implements A {}""", ["Class"]),
-        () => test("""class A {}
-                  class Class extends Object with A {}""", ["Class"]),
-        () => test("""class A {}
+                  class Class extends A {}""", ["Class"]);
+    await test("""class A {}
+                  class Class implements A {}""", ["Class"]);
+    await test("""class A {}
+                  class Class extends Object with A {}""", ["Class"]);
+    await test("""class A {}
                   class B {}
                   class Class extends Object with B implements A {}""",
-            ["Class"]),
+        ["Class"]);
 
-        () => test("""class A {}
-                  class Class {}""", ["Class", "A"], ["Class", "A"]),
-        () => test("""class A {}
-                  class Class extends A {}""", ["Class", "A"], ["Class", "A"]),
-        () => test("""class A {}
+    await test("""class A {}
+                  class Class {}""", ["Class", "A"], ["Class", "A"]);
+    await test("""class A {}
+                  class Class extends A {}""", ["Class", "A"], ["Class", "A"]);
+    await test("""class A {}
                   class Class implements A {}""", ["Class", "A"],
-            ["Class", "A"]),
-        () => test("""class A {}
+        ["Class", "A"]);
+    await test("""class A {}
                   class B extends A {}
-                  class Class extends B {}""", ["Class", "A"], ["Class", "A"]),
-        () => test("""class A {}
+                  class Class extends B {}""", ["Class", "A"], ["Class", "A"]);
+    await test("""class A {}
                   class B {}
                   class Class extends B with A {}""", ["Class", "A"],
-            ["Class", "A"]),
+        ["Class", "A"]);
 
-        // TODO(johnniwinther): Avoid registration of `Class` as instantiated.
-        () => test("""class A {}
-                  class Class implements A {
-                    factory Class() = A;
-                  }""", ["Class", "A"], ["Class"]),
-      ], (f) => f()));
-}
-
-Future test(String source, List<String> directlyInstantiatedClasses,
-    [List<String> newClasses = const <String>["Class"]]) {
-  StringBuffer mainSource = new StringBuffer();
-  mainSource.write('main() {\n');
-  for (String newClass in newClasses) {
-    mainSource.write('  new $newClass();\n');
+    if (!useKernel) {
+      // TODO(johnniwinther): Avoid registration of `Class` as instantiated.
+      await test("""class A {}
+                    class Class implements A {
+                      factory Class() = A;
+                    }""", ["Class", "A"], ["Class"]);
+    } else {
+      await test("""class A {}
+                    class Class implements A {
+                      factory Class() = A;
+                    }""", ["A"], ["Class"]);
+    }
   }
-  mainSource.write('}');
-  return TypeEnvironment
-      .create(source,
-          mainSource: mainSource.toString(), compileMode: CompileMode.mock)
-      .then((dynamic env) {
-    LibraryEntity mainLibrary =
-        env.compiler.frontendStrategy.elementEnvironment.mainLibrary;
-    Iterable<ClassEntity> expectedClasses =
-        directlyInstantiatedClasses.map(env.getElement);
-    Iterable<ClassEntity> actualClasses = env
-        .compiler.resolutionWorldBuilder.directlyInstantiatedClasses
-        .where((c) => c.library == mainLibrary);
-    Expect.setEquals(expectedClasses, actualClasses);
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
   });
 }
diff --git a/tests/compiler/dart2js/interceptor_almost_constant_test.dart b/tests/compiler/dart2js/interceptor_almost_constant_test.dart
deleted file mode 100644
index 72838d76..0000000
--- a/tests/compiler/dart2js/interceptor_almost_constant_test.dart
+++ /dev/null
@@ -1,25 +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.
-
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-  foo(b) {
-    var a = b ? [1,2,3] : null;
-    print(a.first);
-  }
-""";
-
-main() {
-  asyncTest(() => Future.wait([
-        // Check that almost-constant interceptor is used.
-        compile(TEST_ONE, entry: 'foo', check: (String generated) {
-          String re = r'a && [\w\.]*_methods';
-          Expect.isTrue(generated.contains(new RegExp(re)), 'contains /$re/');
-        })
-      ]));
-}
diff --git a/tests/compiler/dart2js/interceptor_test.dart b/tests/compiler/dart2js/interceptor_test.dart
deleted file mode 100644
index b7d375d..0000000
--- a/tests/compiler/dart2js/interceptor_test.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-  foo(a) {
-    var myVariableName = a.toString();
-    print(myVariableName);
-    print(myVariableName);
-  }
-""";
-
-const String TEST_TWO = r"""
-  class A {
-    var length;
-  }
-  foo(a) {
-    print([]); // Make sure the array class is instantiated.
-    return new A().length + a.length;
-  }
-""";
-
-main() {
-  asyncTest(() => Future.wait([
-        // Check that one-shot interceptors preserve variable names, see
-        // https://code.google.com/p/dart/issues/detail?id=8106.
-        compile(TEST_ONE, entry: 'foo', check: (String generated) {
-          Expect.isTrue(
-              generated.contains(new RegExp(r'[$A-Z]+\.toString\$0\$\(a\)')));
-          Expect.isTrue(generated.contains('myVariableName'));
-        }),
-        // Check that an intercepted getter that does not need to be
-        // intercepted, is turned into a regular getter call or field
-        // access.
-        compile(TEST_TWO, entry: 'foo', check: (String generated) {
-          Expect.isFalse(generated.contains(r'a.get$length()'));
-          Expect.isTrue(
-              generated.contains(new RegExp(r'[$A-Z]+\.A\$\(\)\.length')));
-          Expect.isTrue(
-              generated.contains(new RegExp(r'[$A-Z]+\.get\$length\$as\(a\)')));
-        }),
-      ]));
-}
diff --git a/tests/compiler/dart2js/interop_anonymous_unreachable_test.dart b/tests/compiler/dart2js/interop_anonymous_unreachable_test.dart
deleted file mode 100644
index 33b8ea3..0000000
--- a/tests/compiler/dart2js/interop_anonymous_unreachable_test.dart
+++ /dev/null
@@ -1,172 +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 tests.dart2js.interop_anonymous_unreachable_test;
-
-import 'package:test/test.dart';
-import 'compiler_helper.dart';
-
-main() {
-  test("unreachable code doesn't crash the compiler", () async {
-    // This test is a regression for Issue #24974
-    String generated = await compile("""
-        import 'package:js/js.dart';
-
-        @JS() @anonymous
-        class UniqueLongNameForTesting_A {
-          external factory UniqueLongNameForTesting_A();
-        }
-        main() {}
-    """, returnAll: true);
-
-    // the code should not be included in the output either.
-    expect(generated, isNot(contains("UniqueLongNameForTesting_A")));
-  });
-
-  group('tree-shaking interop types', () {
-    String program = """
-        import 'package:js/js.dart';
-
-        // reachable and allocated
-        @JS() @anonymous
-        class UniqueLongNameForTesting_A {
-          external bool get x;
-          external UniqueLongNameForTesting_D get d;
-          external UniqueLongNameForTesting_E get e;
-          external factory UniqueLongNameForTesting_A(
-              {UniqueLongNameForTesting_B arg0});
-        }
-
-        // visible through the parameter above, but not used.
-        @JS() @anonymous
-        class UniqueLongNameForTesting_B {
-          external factory UniqueLongNameForTesting_B();
-        }
-
-        // unreachable
-        @JS() @anonymous
-        class UniqueLongNameForTesting_C {
-          external factory UniqueLongNameForTesting_C();
-        }
-
-        // visible and reached through `d`.
-        @JS() @anonymous
-        class UniqueLongNameForTesting_D {
-          external factory UniqueLongNameForTesting_D();
-        }
-
-        // visible through `e`, but not reached.
-        @JS() @anonymous
-        class UniqueLongNameForTesting_E {
-          external factory UniqueLongNameForTesting_E();
-        }
-
-        main() {
-          print(new UniqueLongNameForTesting_A().x);
-          print(new UniqueLongNameForTesting_A().d);
-        }
-    """;
-
-    test('no tree-shaking by default', () async {
-      String generated = await compile(program, returnAll: true);
-      expect(generated.contains("UniqueLongNameForTesting_A"), isTrue);
-      expect(generated.contains("UniqueLongNameForTesting_D"), isTrue);
-
-      expect(generated.contains("UniqueLongNameForTesting_B"), isTrue);
-      expect(generated.contains("UniqueLongNameForTesting_C"), isTrue);
-      expect(generated.contains("UniqueLongNameForTesting_E"), isTrue);
-    });
-
-    test('tree-shake when using flag', () async {
-      String generated = await compile(program,
-          trustJSInteropTypeAnnotations: true, returnAll: true);
-      expect(generated.contains("UniqueLongNameForTesting_A"), isTrue);
-      expect(generated.contains("UniqueLongNameForTesting_D"), isTrue);
-
-      expect(generated.contains("UniqueLongNameForTesting_B"), isFalse);
-      expect(generated.contains("UniqueLongNameForTesting_C"), isFalse);
-      expect(generated.contains("UniqueLongNameForTesting_E"), isFalse);
-    });
-  });
-
-  group('tree-shaking other native types', () {
-    String program = """
-        import 'dart:html';
-        import 'package:js/js.dart';
-
-        @JS() @anonymous
-        class UniqueLongNameForTesting_A {
-          external dynamic get x;
-        }
-
-        @JS() @anonymous
-        class UniqueLongNameForTesting_B {
-          external dynamic get y;
-        }
-
-        main() {
-          print(new UniqueLongNameForTesting_A().x);
-        }
-    """;
-
-    test('allocation effect of dynamic excludes native types', () async {
-      String generated = await compile(program, returnAll: true);
-      expect(generated.contains("UniqueLongNameForTesting_A"), isTrue);
-      // any js-interop type could be allocated by `get x`
-      expect(generated.contains("UniqueLongNameForTesting_B"), isTrue);
-      // but we exclude other native types like HTMLAudioElement
-      expect(generated.contains("HTMLAudioElement"), isFalse);
-    });
-
-    test('allocation effect of dynamic excludes native types [flag]', () async {
-      // Trusting types doesn't make a difference.
-      String generated = await compile(program,
-          trustJSInteropTypeAnnotations: true, returnAll: true);
-      expect(generated.contains("UniqueLongNameForTesting_A"), isTrue);
-      expect(generated.contains("UniqueLongNameForTesting_B"), isTrue);
-      expect(generated.contains("HTMLAudioElement"), isFalse);
-    });
-
-    test('declared native types are included in allocation effect', () async {
-      String program2 = """
-          import 'dart:html';
-          import 'package:js/js.dart';
-
-          @JS() @anonymous
-          class UniqueLongNameForTesting_A {
-            external AudioElement get x;
-          }
-
-          main() {
-            print(new UniqueLongNameForTesting_A().x is AudioElement);
-          }
-      """;
-
-      String generated = await compile(program2, returnAll: true);
-      expect(generated.contains("UniqueLongNameForTesting_A"), isTrue);
-      expect(generated.contains("HTMLAudioElement"), isTrue);
-
-      program2 = """
-          import 'dart:html';
-          import 'package:js/js.dart';
-
-          @JS() @anonymous
-          class UniqueLongNameForTesting_A {
-            external dynamic get x;
-          }
-
-          main() {
-            print(new UniqueLongNameForTesting_A().x is AudioElement);
-          }
-      """;
-
-      generated = await compile(program2, returnAll: true);
-      expect(generated.contains("UniqueLongNameForTesting_A"), isTrue);
-      // This extra check is to make sure that we don't include HTMLAudioElement
-      // just because of the is-check. It is optimized away in this case because
-      // we believe it was never instantiated.
-      expect(generated.contains("HTMLAudioElement"), isFalse);
-    });
-  });
-}
diff --git a/tests/compiler/dart2js/interpolation_folding_test.dart b/tests/compiler/dart2js/interpolation_folding_test.dart
deleted file mode 100644
index ad99195..0000000
--- a/tests/compiler/dart2js/interpolation_folding_test.dart
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-import 'compiler_helper.dart';
-
-// Tests for
-const String TEST_1 = r"""
-  foo() {
-    int a = 120;
-    String b = 'hello';
-    return 'u${a}v${b}w';
-  }
-""";
-
-const String TEST_2 = r"""
-  foo(a, b) {
-    return 'aaaaa${a}xxxxx'
-           "yyyyy${b}zzzzz";
-  }
-""";
-
-const String TEST_3 = r"""
-  foo(a) {
-    var b = '$a#';
-    return '${b}x${b}';
-  }
-""";
-
-const String TEST_4 = r"""
-  foo(a) {
-    var b = [];
-    if (a) b.add(123);
-    return '${b.length}';
-  }
-""";
-
-main() {
-  Future check(String test, String contained) {
-    return compile(test, entry: 'foo').then((String generated) {
-      Expect.isTrue(generated.contains(contained), contained);
-    });
-  }
-
-  asyncTest(() => Future.wait([
-        // Full substitution.
-        check(TEST_1, r'"u120vhellow"'),
-
-        // Adjacent string fragments get merged.
-        check(TEST_2, r'"xxxxxyyyyy"'),
-
-        // 1. No merging of fragments that are multi-use.  Prevents exponential code
-        //    and keeps author's manual CSE.
-        // 2. Know string values require no stringification.
-        check(TEST_3, r'return b + "x" + b'),
-
-        // Known int value can be formatted directly.
-        check(TEST_4, r'return "" + b.length'),
-      ]));
-}
diff --git a/tests/compiler/dart2js/inverse_operator_test.dart b/tests/compiler/dart2js/inverse_operator_test.dart
deleted file mode 100644
index 44c10de..0000000
--- a/tests/compiler/dart2js/inverse_operator_test.dart
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String MAIN = r"""
-int inscrutable(int x) => x == 0 ? 0 : x | inscrutable(x & (x - 1));
-main() {
-  var x = 1;
-  if (inscrutable(x) == 0) {
-    main();
-    x = 2;
-  }
-  print(!(1 < x));
-}""";
-
-main() {
-  // Make sure we don't introduce a new variable.
-  asyncTest(() => compileAndMatchFuzzy(MAIN, 'main', "1 >= x"));
-}
diff --git a/tests/compiler/dart2js/is_inference2_test.dart b/tests/compiler/dart2js/is_inference2_test.dart
deleted file mode 100644
index 9177a11..0000000
--- a/tests/compiler/dart2js/is_inference2_test.dart
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_IF_BOOL_FIRST_INSTRUCTION = r"""
-negate(x) {
-  if (x is bool) return !x;
-  return x;
-}
-""";
-
-main() {
-  asyncTest(() => compile(TEST_IF_BOOL_FIRST_INSTRUCTION, entry: 'negate',
-          check: (String generated) {
-        Expect.isTrue(generated.contains("!")); // We want to see !x.
-        Expect.isFalse(generated.contains("!=")); // And not !== true.
-        Expect.isFalse(generated.contains("true"));
-        Expect.isFalse(generated.contains("false"));
-      }));
-}
diff --git a/tests/compiler/dart2js/issue13354_test.dart b/tests/compiler/dart2js/issue13354_test.dart
deleted file mode 100644
index e1952b7..0000000
--- a/tests/compiler/dart2js/issue13354_test.dart
+++ /dev/null
@@ -1,60 +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 'compiler_helper.dart';
-import 'type_mask_test_helper.dart';
-
-const String TEST = """
-bar() => 42;
-baz() => bar;
-
-class A {
-  foo() => 42;
-}
-
-class B extends A {
-  foo() => super.foo;
-}
-
-main() {
-  baz();
-  new B().foo();
-}
-""";
-
-void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
-        var commonMasks = closedWorld.commonMasks;
-
-        checkReturn(String name, type) {
-          MemberElement element = findElement(compiler, name);
-          Expect.equals(
-              type,
-              simplify(
-                  typesInferrer.getReturnTypeOfMember(element), closedWorld),
-              name);
-        }
-
-        checkReturnInClass(String className, String methodName, type) {
-          dynamic cls = findElement(compiler, className);
-          var element = cls.lookupLocalMember(methodName);
-          Expect.equals(
-              type,
-              simplify(
-                  typesInferrer.getReturnTypeOfMember(element), closedWorld));
-        }
-
-        checkReturn('bar', commonMasks.uint31Type);
-        checkReturn('baz', commonMasks.functionType);
-
-        checkReturnInClass('A', 'foo', commonMasks.uint31Type);
-        checkReturnInClass('B', 'foo', commonMasks.functionType);
-      }));
-}
diff --git a/tests/compiler/dart2js/js/js_constant_test.dart b/tests/compiler/dart2js/js/js_constant_test.dart
new file mode 100644
index 0000000..b9754d3
--- /dev/null
+++ b/tests/compiler/dart2js/js/js_constant_test.dart
@@ -0,0 +1,52 @@
+// 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:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:expect/expect.dart';
+import '../compiler_helper.dart';
+import '../memory_compiler.dart';
+
+const String TEST_1 = r"""
+  import 'dart:_foreign_helper';
+  main() {
+    JS('', '#.toString()', -5);
+    // absent: "5.toString"
+    // present: "(-5).toString"
+  }
+""";
+
+main() {
+  runTest({bool useKernel}) async {
+    check(String test) async {
+      // Pretend this is a dart2js_native test to allow use of 'native' keyword
+      // and import of private libraries.
+      String main = 'sdk/tests/compiler/dart2js_native/main.dart';
+      Uri entryPoint = Uri.parse('memory:$main');
+      var result = await runCompiler(
+          entryPoint: entryPoint,
+          memorySourceFiles: {main: test},
+          options: useKernel ? [Flags.useKernel] : []);
+      Expect.isTrue(result.isSuccess);
+      var compiler = result.compiler;
+      var closedWorld = compiler.backendClosedWorldForTesting;
+      var elementEnvironment = closedWorld.elementEnvironment;
+
+      MemberEntity element = elementEnvironment.mainFunction;
+      var backend = compiler.backend;
+      String generated = backend.getGeneratedCode(element);
+      checkerForAbsentPresent(test)(generated);
+    }
+
+    await check(TEST_1);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTest(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTest(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/js/js_parser_statements_test.dart b/tests/compiler/dart2js/js/js_parser_statements_test.dart
new file mode 100644
index 0000000..d5d1de7
--- /dev/null
+++ b/tests/compiler/dart2js/js/js_parser_statements_test.dart
@@ -0,0 +1,476 @@
+// 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:expect/expect.dart';
+import 'package:compiler/src/js/js.dart' as jsAst;
+import 'package:compiler/src/js/js.dart' show js;
+
+testStatement(String statement, arguments, String expect) {
+  jsAst.Node node = js.statement(statement, arguments);
+  String jsText = jsAst.prettyPrint(node, allowVariableMinification: false);
+  Expect.stringEquals(expect.trim(), jsText.trim());
+}
+
+testError(String statement, arguments, [String expect = ""]) {
+  bool doCheck(exception) {
+    String message = '$exception';
+    Expect.isTrue(message.contains(expect), '"$message" contains "$expect"');
+    return true;
+  }
+
+  void action() {
+    js.statement(statement, arguments);
+  }
+
+  Expect.throws(action, doCheck);
+}
+
+// Function declaration and named function.
+const NAMED_FUNCTION_1 = r'''
+function foo/*function declaration*/() {
+  return function harry/*named function*/() { return #; }
+}''';
+
+const NAMED_FUNCTION_1_NAMED_HOLE = r'''
+function foo/*function declaration*/() {
+  return function harry/*named function*/() { return #hole; }
+}''';
+
+const NAMED_FUNCTION_1_ONE = r'''
+function foo() {
+  return function harry() {
+    return 1;
+  };
+}''';
+
+const MISC_1 = r'''
+function foo() {
+  /a/;
+  #;
+}''';
+
+const MISC_1_NAMED_HOLE = r'''
+function foo() {
+  /a/;
+  #hole;
+}''';
+
+const MISC_1_1 = r'''
+function foo() {
+  /a/;
+  1;
+  2;
+}''';
+
+void main() {
+  var eOne = js('1');
+  var eTwo = js('2');
+  var eTrue = js('true');
+  var eVar = js('x');
+  var block12 = js.statement('{ 1; 2; }');
+  var stm = js.statement('foo();');
+  var seq1 = js('1, 2, 3');
+
+  Expect.isTrue(eOne is jsAst.LiteralNumber);
+  Expect.isTrue(eTrue is jsAst.LiteralBool);
+  Expect.isTrue(block12 is jsAst.Block);
+
+  // Interpolated Expressions are upgraded to ExpressionStatements.
+  testStatement('{ #; #; }', [eOne, eOne], '{\n  1;\n  1;\n}');
+  testStatement('{ #a; #b; }', {'a': eOne, 'b': eOne}, '{\n  1;\n  1;\n}');
+
+  // Interpolated sub-blocks are spliced.
+  testStatement(
+      '{ #; #; }', [block12, block12], '{\n  1;\n  2;\n  1;\n  2;\n}\n');
+  testStatement('{ #a; #b; }', {'a': block12, 'b': block12},
+      '{\n  1;\n  2;\n  1;\n  2;\n}\n');
+
+  // If-condition.  Dart booleans are evaluated, JS Expression booleans are
+  // substituted.
+  testStatement('if (#) #', [eOne, block12], 'if (1) {\n  1;\n  2;\n}');
+  testStatement('if (#) #;', [eTrue, block12], 'if (true) {\n  1;\n  2;\n}');
+  testStatement('if (#) #;', [eVar, block12], 'if (x) {\n  1;\n  2;\n}');
+  testStatement('if (#) #;', ['a', block12], 'if (a) {\n  1;\n  2;\n}');
+  testStatement('if (#) #;', [true, block12], '{\n  1;\n  2;\n}');
+  testStatement('if (#) #;', [false, block12], ';');
+  testStatement('if (#) 3; else #;', [true, block12], '3;');
+  testStatement('if (#) 3; else #;', [false, block12], '{\n  1;\n  2;\n}');
+  testStatement(
+      'if (#a) #b', {'a': eOne, 'b': block12}, 'if (1) {\n  1;\n  2;\n}');
+  testStatement(
+      'if (#a) #b;', {'a': eTrue, 'b': block12}, 'if (true) {\n  1;\n  2;\n}');
+  testStatement(
+      'if (#a) #b;', {'a': eVar, 'b': block12}, 'if (x) {\n  1;\n  2;\n}');
+  testStatement(
+      'if (#a) #b;', {'a': 'a', 'b': block12}, 'if (a) {\n  1;\n  2;\n}');
+  testStatement('if (#a) #b;', {'a': true, 'b': block12}, '{\n  1;\n  2;\n}');
+  testStatement('if (#a) #b;', {'a': false, 'b': block12}, ';');
+  testStatement('if (#a) 3; else #b;', {'a': true, 'b': block12}, '3;');
+  testStatement(
+      'if (#a) 3; else #b;', {'a': false, 'b': block12}, '{\n  1;\n  2;\n}');
+
+  testStatement('while (#) #', [eOne, block12], 'while (1) {\n  1;\n  2;\n}');
+  testStatement(
+      'while (#) #;', [eTrue, block12], 'while (true) {\n  1;\n  2;\n}');
+  testStatement('while (#) #;', [eVar, block12], 'while (x) {\n  1;\n  2;\n}');
+  testStatement('while (#) #;', ['a', block12], 'while (a) {\n  1;\n  2;\n}');
+  testStatement('while (#) #;', ['a', stm], 'while (a)\n  foo();');
+
+  testStatement(
+      'do { {print(1);} do while(true); while (false) } while ( true )', [], '''
+do {
+  print(1);
+  do
+    while (true)
+      ;
+  while (false);
+} while (true);
+''');
+  testStatement(
+      'do #; while ( # )', [block12, eOne], 'do {\n  1;\n  2;\n} while (1); ');
+  testStatement('do #; while ( # )', [block12, eTrue],
+      'do {\n  1;\n  2;\n} while (true); ');
+  testStatement(
+      'do #; while ( # );', [block12, eVar], 'do {\n  1;\n  2;\n} while (x);');
+  testStatement(
+      'do { # } while ( # )', [block12, 'a'], 'do {\n  1;\n  2;\n} while (a);');
+  testStatement('do #; while ( # )', [stm, 'a'], 'do\n  foo();\nwhile (a);');
+
+  testStatement('switch (#) {}', [eOne], 'switch (1) {\n}');
+  testStatement('''
+        switch (#) {
+          case #: { # }
+        }''', [eTrue, eOne, block12],
+      'switch (true) {\n  case 1:\n    1;\n    2;\n}');
+  testStatement('''
+        switch (#) {
+          case #: { # }
+            break;
+          case #: { # }
+          default: { # }
+        }''', [eTrue, eOne, block12, eTwo, block12, stm], '''
+switch (true) {
+  case 1:
+    1;
+    2;
+    break;
+  case 2:
+    1;
+    2;
+  default:
+    foo();
+}''');
+
+  testStatement(NAMED_FUNCTION_1, [eOne], NAMED_FUNCTION_1_ONE);
+  testStatement(
+      NAMED_FUNCTION_1_NAMED_HOLE, {'hole': eOne}, NAMED_FUNCTION_1_ONE);
+
+  testStatement(MISC_1, [block12], MISC_1_1);
+  testStatement(MISC_1_NAMED_HOLE, {'hole': block12}, MISC_1_1);
+
+  // Argument list splicing.
+  testStatement('foo(#)', [[]], 'foo();');
+  testStatement(
+      'foo(#)',
+      [
+        [eOne]
+      ],
+      'foo(1);');
+  testStatement('foo(#)', [eOne], 'foo(1);');
+  testStatement(
+      'foo(#)',
+      [
+        [eTrue, eOne]
+      ],
+      'foo(true, 1);');
+  testStatement('foo(#a)', {'a': []}, 'foo();');
+  testStatement(
+      'foo(#a)',
+      {
+        'a': [eOne]
+      },
+      'foo(1);');
+  testStatement('foo(#a)', {'a': eOne}, 'foo(1);');
+  testStatement(
+      'foo(#a)',
+      {
+        'a': [eTrue, eOne]
+      },
+      'foo(true, 1);');
+
+  testStatement('foo(2,#)', [[]], 'foo(2);');
+  testStatement(
+      'foo(2,#)',
+      [
+        [eOne]
+      ],
+      'foo(2, 1);');
+  testStatement('foo(2,#)', [eOne], 'foo(2, 1);');
+  testStatement(
+      'foo(2,#)',
+      [
+        [eTrue, eOne]
+      ],
+      'foo(2, true, 1);');
+  testStatement('foo(2,#a)', {'a': []}, 'foo(2);');
+  testStatement(
+      'foo(2,#a)',
+      {
+        'a': [eOne]
+      },
+      'foo(2, 1);');
+  testStatement('foo(2,#a)', {'a': eOne}, 'foo(2, 1);');
+  testStatement(
+      'foo(2,#a)',
+      {
+        'a': [eTrue, eOne]
+      },
+      'foo(2, true, 1);');
+
+  testStatement('foo(#,3)', [[]], 'foo(3);');
+  testStatement(
+      'foo(#,3)',
+      [
+        [eOne]
+      ],
+      'foo(1, 3);');
+  testStatement('foo(#,3)', [eOne], 'foo(1, 3);');
+  testStatement(
+      'foo(#,3)',
+      [
+        [eTrue, eOne]
+      ],
+      'foo(true, 1, 3);');
+  testStatement('foo(#a,3)', {'a': []}, 'foo(3);');
+  testStatement(
+      'foo(#a,3)',
+      {
+        'a': [eOne]
+      },
+      'foo(1, 3);');
+  testStatement('foo(#a,3)', {'a': eOne}, 'foo(1, 3);');
+  testStatement(
+      'foo(#a,3)',
+      {
+        'a': [eTrue, eOne]
+      },
+      'foo(true, 1, 3);');
+
+  testStatement('foo(2,#,3)', [[]], 'foo(2, 3);');
+  testStatement(
+      'foo(2,#,3)',
+      [
+        [eOne]
+      ],
+      'foo(2, 1, 3);');
+  testStatement('foo(2,#,3)', [eOne], 'foo(2, 1, 3);');
+  testStatement(
+      'foo(2,#,3)',
+      [
+        [eTrue, eOne]
+      ],
+      'foo(2, true, 1, 3);');
+  testStatement('foo(2,#a,3)', {'a': []}, 'foo(2, 3);');
+  testStatement(
+      'foo(2,#a,3)',
+      {
+        'a': [eOne]
+      },
+      'foo(2, 1, 3);');
+  testStatement('foo(2,#a,3)', {'a': eOne}, 'foo(2, 1, 3);');
+  testStatement(
+      'foo(2,#a,3)',
+      {
+        'a': [eTrue, eOne]
+      },
+      'foo(2, true, 1, 3);');
+
+  // Interpolated Literals
+  testStatement('a = {#: 1}', [eOne], 'a = {1: 1};');
+  testStatement('a = {#a: 1}', {'a': eOne}, 'a = {1: 1};');
+  // Maybe we should make this work?
+  testError('a = {#: 1}', [1], 'is not a Literal: 1');
+  testError('a = {#a: 1}', {'a': 1}, 'is not a Literal: 1');
+
+  // Interpolated parameter splicing.
+  testStatement(
+      'function foo(#){}', [new jsAst.Parameter('x')], 'function foo(x) {\n}');
+  testStatement('function foo(#){}', ['x'], 'function foo(x) {\n}');
+  testStatement('function foo(#){}', [[]], 'function foo() {\n}');
+  testStatement(
+      'function foo(#){}',
+      [
+        ['x']
+      ],
+      'function foo(x) {\n}');
+  testStatement(
+      'function foo(#){}',
+      [
+        ['x', 'y']
+      ],
+      'function foo(x, y) {\n}');
+  testStatement('function foo(#a){}', {'a': new jsAst.Parameter('x')},
+      'function foo(x) {\n}');
+  testStatement('function foo(#a){}', {'a': 'x'}, 'function foo(x) {\n}');
+  testStatement('function foo(#a){}', {'a': []}, 'function foo() {\n}');
+  testStatement(
+      'function foo(#a){}',
+      {
+        'a': ['x']
+      },
+      'function foo(x) {\n}');
+  testStatement(
+      'function foo(#a){}',
+      {
+        'a': ['x', 'y']
+      },
+      'function foo(x, y) {\n}');
+
+  testStatement('function foo() async {}', [], 'function foo() async {\n}');
+  testStatement('function foo() sync* {}', [], 'function foo() sync* {\n}');
+  testStatement('function foo() async* {}', [], 'function foo() async* {\n}');
+
+  testStatement('a = #.#', [eVar, eOne], 'a = x[1];');
+  testStatement('a = #.#', [eVar, 'foo'], 'a = x.foo;');
+  testStatement('a = #a.#b', {'a': eVar, 'b': eOne}, 'a = x[1];');
+  testStatement('a = #a.#b', {'a': eVar, 'b': 'foo'}, 'a = x.foo;');
+
+  testStatement('function f(#) { return #.#; }', ['x', eVar, 'foo'],
+      'function f(x) {\n  return x.foo;\n}');
+  testStatement('function f(#a) { return #b.#c; }',
+      {'a': 'x', 'b': eVar, 'c': 'foo'}, 'function f(x) {\n  return x.foo;\n}');
+
+  testStatement(
+      '#.prototype.# = function(#) { return #.# };',
+      [
+        'className',
+        'getterName',
+        ['r', 'y'],
+        'r',
+        'fieldName'
+      ],
+      'className.prototype.getterName = function(r, y) {\n'
+      '  return r.fieldName;\n'
+      '};');
+  testStatement(
+      '#a.prototype.#b = function(#c) { return #d.#e };',
+      {
+        'a': 'className',
+        'b': 'getterName',
+        'c': ['r', 'y'],
+        'd': 'r',
+        'e': 'fieldName'
+      },
+      'className.prototype.getterName = function(r, y) {\n'
+      '  return r.fieldName;\n'
+      '};');
+
+  testStatement(
+      'function foo(r, #) { return #[r](#) }',
+      [
+        ['a', 'b'],
+        'g',
+        ['b', 'a']
+      ],
+      'function foo(r, a, b) {\n  return g[r](b, a);\n}');
+  testStatement(
+      'function foo(r, #a) { return #b[r](#c) }',
+      {
+        'a': ['a', 'b'],
+        'b': 'g',
+        'c': ['b', 'a']
+      },
+      'function foo(r, a, b) {\n  return g[r](b, a);\n}');
+
+  // Sequence is printed flattened
+  testStatement('x = #', [seq1], 'x = (1, 2, 3);');
+  testStatement('x = (#, #)', [seq1, seq1], 'x = (1, 2, 3, 1, 2, 3);');
+  testStatement('x = #, #', [seq1, seq1], 'x = (1, 2, 3), 1, 2, 3;');
+  testStatement('for (i = 0, j = #, k = 0; ; ++i, ++j, ++k){}', [seq1],
+      'for (i = 0, j = (1, 2, 3), k = 0;; ++i, ++j, ++k) {\n}');
+  testStatement('x = #a', {'a': seq1}, 'x = (1, 2, 3);');
+  testStatement(
+      'x = (#a, #b)', {'a': seq1, 'b': seq1}, 'x = (1, 2, 3, 1, 2, 3);');
+  testStatement(
+      'x = #a, #b', {'a': seq1, 'b': seq1}, 'x = (1, 2, 3), 1, 2, 3;');
+  testStatement('for (i = 0, j = #a, k = 0; ; ++i, ++j, ++k){}', {'a': seq1},
+      'for (i = 0, j = (1, 2, 3), k = 0;; ++i, ++j, ++k) {\n}');
+
+  // Use the same name several times.
+  testStatement(
+      '#a.prototype.#a = function(#b) { return #c.#c };',
+      {
+        'a': 'name1_2',
+        'b': ['r', 'y'],
+        'c': 'name4_5'
+      },
+      'name1_2.prototype.name1_2 = function(r, y) {\n'
+      '  return name4_5.name4_5;\n'
+      '};');
+
+  testStatement('label: while (a) { label2: break label;}', [],
+      'label:\n  while (a)\n    label2:\n      break label;\n  ');
+
+  testStatement('var # = 3', ['x'], 'var x = 3;');
+  testStatement(
+      'var # = 3', [new jsAst.VariableDeclaration('x')], 'var x = 3;');
+  testStatement(
+      'var # = 3, # = #', ['x', 'y', js.number(2)], 'var x = 3, y = 2;');
+  testStatement('var #a = 3, #b = #c', {"a": 'x', "b": 'y', "c": js.number(2)},
+      'var x = 3, y = 2;');
+  testStatement('function #() {}', ['x'], 'function x() {\n}');
+  testStatement('function #() {}', [new jsAst.VariableDeclaration('x')],
+      'function x() {\n}');
+  testStatement('try {} catch (#) {}', ['x'], 'try {\n} catch (x) {\n}');
+  testStatement('try {} catch (#a) {}', {"a": 'x'}, 'try {\n} catch (x) {\n}');
+  testStatement('try {} catch (#a) {}',
+      {"a": new jsAst.VariableDeclaration('x')}, 'try {\n} catch (x) {\n}');
+
+  // Test that braces around a single-statement block are removed by printer.
+  testStatement('while (a) {foo()}', [], 'while (a)\n  foo();');
+  testStatement('if (a) {foo();}', [], 'if (a)\n  foo();');
+  testStatement('if (a) {foo();} else {foo2();}', [],
+      'if (a)\n  foo();\nelse\n  foo2();');
+  testStatement(
+      'if (a) foo(); else {foo2();}', [], 'if (a)\n  foo();\nelse\n  foo2();');
+  testStatement('do {foo();} while(a);', [], 'do\n  foo();\nwhile (a);');
+  testStatement('label: {foo();}', [], 'label:\n  foo();');
+  testStatement(
+      'for (var key in a) {foo();}', [], 'for (var key in a)\n  foo();');
+  // `label: break label;` gives problems on IE. Test that it is avoided.
+  testStatement('label: {break label;}', [], ';');
+  // This works on IE:
+  testStatement('label: {label2: {break label;}}', [],
+      'label:\n  label2:\n    break label;\n');
+  // Test dangling else:
+  testStatement('if (a) {if (b) {foo1();}} else {foo2();}', [], """
+if (a) {
+  if (b)
+    foo1();
+} else
+  foo2();""");
+  testStatement('if (a) {if (b) {foo1();} else {foo2();}}', [], """
+if (a)
+  if (b)
+    foo1();
+  else
+    foo2();
+""");
+  testStatement(
+      'if (a) {if (b) {foo1();} else {foo2();}} else {foo3();}', [], """
+if (a)
+  if (b)
+    foo1();
+  else
+    foo2();
+else
+  foo3();""");
+  testStatement('if (a) {while (true) if (b) {foo1();}} else {foo2();}', [], """
+if (a) {
+  while (true)
+    if (b)
+      foo1();
+} else
+  foo2();""");
+}
diff --git a/tests/compiler/dart2js/js/js_parser_test.dart b/tests/compiler/dart2js/js/js_parser_test.dart
new file mode 100644
index 0000000..7d76533
--- /dev/null
+++ b/tests/compiler/dart2js/js/js_parser_test.dart
@@ -0,0 +1,191 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:compiler/src/js/js.dart' as jsAst;
+import 'package:compiler/src/js/js.dart' show js;
+
+testExpression(String expression, [String expect = ""]) {
+  jsAst.Node node = js(expression);
+  String jsText = jsAst.prettyPrint(node, allowVariableMinification: false);
+  if (expect == "") {
+    Expect.stringEquals(expression, jsText);
+  } else {
+    Expect.stringEquals(expect, jsText);
+  }
+}
+
+testError(String expression, [String expect = ""]) {
+  bool doCheck(exception) {
+    Expect.isTrue(exception.toString().contains(expect));
+    return true;
+  }
+
+  Expect.throws(() => js(expression), doCheck);
+}
+
+void main() {
+  // Asterisk indicates deviations from real JS.
+  // Simple var test.
+  testExpression('var a = ""');
+  // Parse and print will normalize whitespace.
+  testExpression(' var  a  =  "" ', 'var a = ""');
+  // Operator precedence.
+  testExpression('x = a + b * c');
+  testExpression('x = a * b + c');
+  testExpression('x = a + b * c + d');
+  testExpression('x = a * b + c * d');
+  testExpression(
+      'remaining = (remaining / 88) | 0', 'remaining = remaining / 88 | 0');
+  // Binary operators have left associativity.
+  testExpression('x = a + b + c');
+  // We can cope with relational operators and non-relational.
+  testExpression('a + b == c + d');
+  // The prettyprinter will insert braces where needed.
+  testExpression('a + (b == c) + d');
+  // We can handle () for calls.
+  testExpression('foo(bar)');
+  testExpression('foo(bar, baz)');
+  // Chained calls without parentheses.
+  testExpression('foo(bar)(baz)');
+  // Chained calls with and without new.
+  testExpression('new foo(bar)(baz)');
+  testExpression('new foo.bar(bar)(baz)');
+  testExpression('foo.bar(bar)(baz)');
+  testExpression('constructor = new Function(str)()');
+  // The prettyprinter understands chained calls without extra parentheses.
+  testExpression('(foo(bar))(baz)', 'foo(bar)(baz)');
+  // Chains of dotting and calls.
+  testExpression('foo.bar(baz)');
+  // String literal.
+  testExpression('var x = "fisk"');
+  // String literal with \n.
+  testExpression(r'var x = "\n"');
+  // String literal with escaped quote.
+  testExpression(r'var x = "\""');
+  // *No clever escapes.
+  testError(r'var x = "\x42"', 'escapes are not allowed in literals');
+  // Operator new.
+  testExpression('new Foo()');
+  // New with dotted access.
+  testExpression('new Frobinator.frobinate()');
+  testExpression('new Frobinator().frobinate()');
+  // The prettyprinter strips some superfluous parentheses.
+  testExpression(
+      '(new Frobinator()).frobinate()', 'new Frobinator().frobinate()');
+  // *We want a bracket on 'new'.
+  testError('new Foo', 'Parentheses are required');
+  testError('(new Foo)', 'Parentheses are required');
+  // Bogus operators.
+  testError('a +++ b', 'Unknown operator');
+  // This isn't perl.  There are rules.
+  testError('a <=> b', 'Unknown operator');
+  // Typeof.
+  testExpression('typeof foo == "number"');
+  // Strange relation.
+  testExpression('a < b < c');
+  // Chained var.
+  testExpression('var x = 0, y = 1.2, z = 42');
+  // Empty object literal.
+  testExpression('foo({}, {})');
+  // *Can't handle non-empty object literals
+  testExpression('foo({meaning: 42})');
+  // Literals.
+  testExpression('x(false, true, null)');
+  // *We should really throw here.
+  testExpression('var false = 42');
+  testExpression('var new = 42');
+  // Bad keyword.
+  testError('var typeof = 42', "Expected ALPHA");
+  // Malformed decimal/hex.
+  testError('var x = 1.1.1', "Unparseable number");
+  testError('var x = 0xabcdefga', "Unparseable number");
+  testError('var x = 0xabcdef\$a', "Unparseable number");
+  testError('var x = 0x ', "Unparseable number");
+  // Good hex constants.
+  testExpression('var x = 0xff');
+  testExpression('var x = 0xff + 0xff');
+  testExpression('var x = 0xaF + 0x0123456789abcdefABCDEF');
+  // All sorts of keywords are allowed as property names in ES5.
+  testExpression('x.new = 0');
+  testExpression('x.delete = 0');
+  testExpression('x.for = 0');
+  testExpression('x.instanceof = 0');
+  testExpression('x.in = 0');
+  testExpression('x.void = 0');
+  testExpression('x.continue = 0');
+  // More unary.
+  testExpression('x = !x');
+  testExpression('!x == false');
+  testExpression('var foo = void 0');
+  testExpression('delete foo.bar');
+  testExpression('delete foo');
+  testExpression('x in y');
+  testExpression('x instanceof y');
+  testExpression('a * b in c * d');
+  testExpression('a * b instanceof c * d');
+  testError('x typeof y', 'Unparsed junk');
+  testExpression('x &= ~mask');
+  // Await is parsed as an unary prefix operator.
+  testExpression('var foo = await 0');
+  testExpression('await x++');
+  testExpression('void (await (x++))', 'void await x++');
+  testExpression('void (await x)++');
+  testExpression('++(await x)++');
+  // Adjacent tokens.
+  testExpression('foo[x[bar]]');
+  testExpression('foo[[bar]]');
+  // Prefix ++ etc.
+  testExpression("++x");
+  testExpression("++foo.bar");
+  testExpression("+x");
+  testExpression("+foo.bar");
+  testExpression("-x");
+  testExpression("-foo.bar");
+  testExpression("--x");
+  testExpression("--foo.bar");
+  // Postfix ++ etc.
+  testExpression("x++");
+  testExpression("foo.bar++");
+  testExpression("x--");
+  testExpression("foo.bar--");
+  // Both!
+  testExpression("++x++");
+  testExpression("++foo.bar++");
+  testExpression("--x--");
+  testExpression("--foo.bar--");
+  // *We can't handle stacked unary operators (apart from !).
+  testError("x++ ++");
+  testError("++ typeof x");
+  testExpression(r"var $supportsProtoName = !!{}.__proto__");
+  // ++ used as a binary operator.
+  testError("x++ ++ 42");
+  // Shift operators.
+  testExpression("x << 5");
+  testExpression("x << y + 1");
+  testExpression("x <<= y + 1");
+  // Array initializers.
+  testExpression("x = ['foo', 'bar', x[4]]");
+  testExpression("[]");
+  testError("[42 42]");
+  testExpression('beebop([1, 2, 3])');
+  // Array literals with holes in them.
+  testExpression("[1,, 2]");
+  testExpression("[1,]", "[1]");
+  testExpression("[1,,]", "[1,,]");
+  testExpression("[,]");
+  testExpression("[,,]");
+  testExpression("[, 42]");
+  // Ternary operator.
+  testExpression("x = a ? b : c");
+  testExpression("y = a == null ? b : a");
+  testExpression("y = a == null ? b + c : a + c");
+  testExpression("foo = a ? b : c ? d : e");
+  testExpression("foo = a ? b ? c : d : e");
+  testExpression("foo = (a = v) ? b = w : c = x ? d = y : e = z");
+  testExpression("foo = (a = v) ? b = w ? c = x : d = y : e = z");
+  // Stacked assignment.
+  testExpression("a = b = c");
+  testExpression("var a = b = c");
+}
diff --git a/tests/compiler/dart2js/js_safety_test.dart b/tests/compiler/dart2js/js/js_safety_test.dart
similarity index 100%
rename from tests/compiler/dart2js/js_safety_test.dart
rename to tests/compiler/dart2js/js/js_safety_test.dart
diff --git a/tests/compiler/dart2js/js_spec_optimization_test.dart b/tests/compiler/dart2js/js/js_spec_optimization_test.dart
similarity index 67%
rename from tests/compiler/dart2js/js_spec_optimization_test.dart
rename to tests/compiler/dart2js/js/js_spec_optimization_test.dart
index 439299a..9cd6a88 100644
--- a/tests/compiler/dart2js/js_spec_optimization_test.dart
+++ b/tests/compiler/dart2js/js/js_spec_optimization_test.dart
@@ -2,9 +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:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:expect/expect.dart';
+import '../compiler_helper.dart';
+import '../memory_compiler.dart';
 
 const String TEST_1 = r"""
   import 'dart:_foreign_helper';
@@ -84,23 +87,37 @@
 """;
 
 main() {
-  Future check(String test) {
-    var checker = checkerForAbsentPresent(test);
-    Uri uri = new Uri(scheme: 'dart', path: 'test');
-    var compiler = compilerFor(test, uri, expectedErrors: 0);
-    return compiler.run(uri).then((_) {
-      MemberElement element = findElement(compiler, 'main');
+  runTests({bool useKernel}) async {
+    check(String test) async {
+      var checker = checkerForAbsentPresent(test);
+      String main = 'sdk/tests/compiler/dart2js_native/main.dart';
+      Uri entryPoint = Uri.parse('memory:$main');
+      var result = await runCompiler(
+          entryPoint: entryPoint,
+          memorySourceFiles: {main: test},
+          options: useKernel ? [Flags.useKernel] : []);
+      Expect.isTrue(result.isSuccess);
+      var compiler = result.compiler;
+      var closedWorld = compiler.backendClosedWorldForTesting;
+      var elementEnvironment = closedWorld.elementEnvironment;
+
+      MemberEntity element = elementEnvironment.mainFunction;
       var backend = compiler.backend;
       String generated = backend.getGeneratedCode(element);
       checker(generated);
-    });
+    }
+
+    await check(TEST_1);
+    await check(TEST_2);
+    await check(TEST_3);
+    await check(TEST_4);
+    await check(TEST_5);
   }
 
-  asyncTest(() => Future.wait([
-        check(TEST_1),
-        check(TEST_2),
-        check(TEST_3),
-        check(TEST_4),
-        check(TEST_5),
-      ]));
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
 }
diff --git a/tests/compiler/dart2js/js_spec_string_test.dart b/tests/compiler/dart2js/js/js_spec_string_test.dart
similarity index 100%
rename from tests/compiler/dart2js/js_spec_string_test.dart
rename to tests/compiler/dart2js/js/js_spec_string_test.dart
diff --git a/tests/compiler/dart2js/js_throw_behavior_test.dart b/tests/compiler/dart2js/js/js_throw_behavior_test.dart
similarity index 100%
rename from tests/compiler/dart2js/js_throw_behavior_test.dart
rename to tests/compiler/dart2js/js/js_throw_behavior_test.dart
diff --git a/tests/compiler/dart2js/js_constant_test.dart b/tests/compiler/dart2js/js_constant_test.dart
deleted file mode 100644
index 0438606..0000000
--- a/tests/compiler/dart2js/js_constant_test.dart
+++ /dev/null
@@ -1,33 +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.
-
-import 'dart:async';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_1 = r"""
-  import 'dart:_foreign_helper';
-  main() {
-    JS('', '#.toString()', -5);
-    // absent: "5.toString"
-    // present: "(-5).toString"
-  }
-""";
-
-main() {
-  Future check(String test) {
-    Uri uri = new Uri(scheme: 'dart', path: 'test');
-    var compiler = compilerFor(test, uri, expectedErrors: 0);
-    return compiler.run(uri).then((_) {
-      MemberElement element = findElement(compiler, 'main');
-      var backend = compiler.backend;
-      String generated = backend.getGeneratedCode(element);
-      checkerForAbsentPresent(test)(generated);
-    });
-  }
-
-  asyncTest(() => Future.wait([
-        check(TEST_1),
-      ]));
-}
diff --git a/tests/compiler/dart2js/js_parser_statements_test.dart b/tests/compiler/dart2js/js_parser_statements_test.dart
deleted file mode 100644
index 775e2e2..0000000
--- a/tests/compiler/dart2js/js_parser_statements_test.dart
+++ /dev/null
@@ -1,508 +0,0 @@
-// 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:async';
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'mock_compiler.dart';
-import 'package:compiler/src/js/js.dart' as jsAst;
-import 'package:compiler/src/js/js.dart' show js;
-
-Future testStatement(String statement, arguments, String expect) {
-  jsAst.Node node = js.statement(statement, arguments);
-  return MockCompiler.create((MockCompiler compiler) {
-    String jsText = jsAst.prettyPrint(node, compiler.options,
-        allowVariableMinification: false);
-
-    Expect.stringEquals(expect.trim(), jsText.trim());
-  });
-}
-
-Future testError(String statement, arguments, [String expect = ""]) {
-  return new Future.sync(() {
-    bool doCheck(exception) {
-      String message = '$exception';
-      Expect.isTrue(message.contains(expect), '"$message" contains "$expect"');
-      return true;
-    }
-
-    void action() {
-      js.statement(statement, arguments);
-    }
-
-    Expect.throws(action, doCheck);
-  });
-}
-
-// Function declaration and named function.
-const NAMED_FUNCTION_1 = r'''
-function foo/*function declaration*/() {
-  return function harry/*named function*/() { return #; }
-}''';
-
-const NAMED_FUNCTION_1_NAMED_HOLE = r'''
-function foo/*function declaration*/() {
-  return function harry/*named function*/() { return #hole; }
-}''';
-
-const NAMED_FUNCTION_1_ONE = r'''
-function foo() {
-  return function harry() {
-    return 1;
-  };
-}''';
-
-const MISC_1 = r'''
-function foo() {
-  /a/;
-  #;
-}''';
-
-const MISC_1_NAMED_HOLE = r'''
-function foo() {
-  /a/;
-  #hole;
-}''';
-
-const MISC_1_1 = r'''
-function foo() {
-  /a/;
-  1;
-  2;
-}''';
-
-void main() {
-  var eOne = js('1');
-  var eTwo = js('2');
-  var eTrue = js('true');
-  var eVar = js('x');
-  var block12 = js.statement('{ 1; 2; }');
-  var stm = js.statement('foo();');
-  var seq1 = js('1, 2, 3');
-
-  Expect.isTrue(eOne is jsAst.LiteralNumber);
-  Expect.isTrue(eTrue is jsAst.LiteralBool);
-  Expect.isTrue(block12 is jsAst.Block);
-
-  asyncTest(() => Future.wait([
-        // Interpolated Expressions are upgraded to ExpressionStatements.
-        testStatement('{ #; #; }', [eOne, eOne], '{\n  1;\n  1;\n}'),
-        testStatement(
-            '{ #a; #b; }', {'a': eOne, 'b': eOne}, '{\n  1;\n  1;\n}'),
-
-        // Interpolated sub-blocks are spliced.
-        testStatement(
-            '{ #; #; }', [block12, block12], '{\n  1;\n  2;\n  1;\n  2;\n}\n'),
-        testStatement('{ #a; #b; }', {'a': block12, 'b': block12},
-            '{\n  1;\n  2;\n  1;\n  2;\n}\n'),
-
-        // If-condition.  Dart booleans are evaluated, JS Expression booleans are
-        // substituted.
-        testStatement('if (#) #', [eOne, block12], 'if (1) {\n  1;\n  2;\n}'),
-        testStatement(
-            'if (#) #;', [eTrue, block12], 'if (true) {\n  1;\n  2;\n}'),
-        testStatement('if (#) #;', [eVar, block12], 'if (x) {\n  1;\n  2;\n}'),
-        testStatement('if (#) #;', ['a', block12], 'if (a) {\n  1;\n  2;\n}'),
-        testStatement('if (#) #;', [true, block12], '{\n  1;\n  2;\n}'),
-        testStatement('if (#) #;', [false, block12], ';'),
-        testStatement('if (#) 3; else #;', [true, block12], '3;'),
-        testStatement(
-            'if (#) 3; else #;', [false, block12], '{\n  1;\n  2;\n}'),
-        testStatement(
-            'if (#a) #b', {'a': eOne, 'b': block12}, 'if (1) {\n  1;\n  2;\n}'),
-        testStatement('if (#a) #b;', {'a': eTrue, 'b': block12},
-            'if (true) {\n  1;\n  2;\n}'),
-        testStatement('if (#a) #b;', {'a': eVar, 'b': block12},
-            'if (x) {\n  1;\n  2;\n}'),
-        testStatement(
-            'if (#a) #b;', {'a': 'a', 'b': block12}, 'if (a) {\n  1;\n  2;\n}'),
-        testStatement(
-            'if (#a) #b;', {'a': true, 'b': block12}, '{\n  1;\n  2;\n}'),
-        testStatement('if (#a) #b;', {'a': false, 'b': block12}, ';'),
-        testStatement('if (#a) 3; else #b;', {'a': true, 'b': block12}, '3;'),
-        testStatement('if (#a) 3; else #b;', {'a': false, 'b': block12},
-            '{\n  1;\n  2;\n}'),
-
-        testStatement(
-            'while (#) #', [eOne, block12], 'while (1) {\n  1;\n  2;\n}'),
-        testStatement(
-            'while (#) #;', [eTrue, block12], 'while (true) {\n  1;\n  2;\n}'),
-        testStatement(
-            'while (#) #;', [eVar, block12], 'while (x) {\n  1;\n  2;\n}'),
-        testStatement(
-            'while (#) #;', ['a', block12], 'while (a) {\n  1;\n  2;\n}'),
-        testStatement('while (#) #;', ['a', stm], 'while (a)\n  foo();'),
-
-        testStatement(
-            'do { {print(1);} do while(true); while (false) } while ( true )',
-            [],
-            '''
-do {
-  print(1);
-  do
-    while (true)
-      ;
-  while (false);
-} while (true);
-'''),
-        testStatement('do #; while ( # )', [block12, eOne],
-            'do {\n  1;\n  2;\n} while (1); '),
-        testStatement('do #; while ( # )', [block12, eTrue],
-            'do {\n  1;\n  2;\n} while (true); '),
-        testStatement('do #; while ( # );', [block12, eVar],
-            'do {\n  1;\n  2;\n} while (x);'),
-        testStatement('do { # } while ( # )', [block12, 'a'],
-            'do {\n  1;\n  2;\n} while (a);'),
-        testStatement(
-            'do #; while ( # )', [stm, 'a'], 'do\n  foo();\nwhile (a);'),
-
-        testStatement('switch (#) {}', [eOne], 'switch (1) {\n}'),
-        testStatement('''
-        switch (#) {
-          case #: { # }
-        }''', [eTrue, eOne, block12],
-            'switch (true) {\n  case 1:\n    1;\n    2;\n}'),
-        testStatement('''
-        switch (#) {
-          case #: { # }
-            break;
-          case #: { # }
-          default: { # }
-        }''', [eTrue, eOne, block12, eTwo, block12, stm], '''
-switch (true) {
-  case 1:
-    1;
-    2;
-    break;
-  case 2:
-    1;
-    2;
-  default:
-    foo();
-}'''),
-
-        testStatement(NAMED_FUNCTION_1, [eOne], NAMED_FUNCTION_1_ONE),
-        testStatement(
-            NAMED_FUNCTION_1_NAMED_HOLE, {'hole': eOne}, NAMED_FUNCTION_1_ONE),
-
-        testStatement(MISC_1, [block12], MISC_1_1),
-        testStatement(MISC_1_NAMED_HOLE, {'hole': block12}, MISC_1_1),
-
-        // Argument list splicing.
-        testStatement('foo(#)', [[]], 'foo();'),
-        testStatement(
-            'foo(#)',
-            [
-              [eOne]
-            ],
-            'foo(1);'),
-        testStatement('foo(#)', [eOne], 'foo(1);'),
-        testStatement(
-            'foo(#)',
-            [
-              [eTrue, eOne]
-            ],
-            'foo(true, 1);'),
-        testStatement('foo(#a)', {'a': []}, 'foo();'),
-        testStatement(
-            'foo(#a)',
-            {
-              'a': [eOne]
-            },
-            'foo(1);'),
-        testStatement('foo(#a)', {'a': eOne}, 'foo(1);'),
-        testStatement(
-            'foo(#a)',
-            {
-              'a': [eTrue, eOne]
-            },
-            'foo(true, 1);'),
-
-        testStatement('foo(2,#)', [[]], 'foo(2);'),
-        testStatement(
-            'foo(2,#)',
-            [
-              [eOne]
-            ],
-            'foo(2, 1);'),
-        testStatement('foo(2,#)', [eOne], 'foo(2, 1);'),
-        testStatement(
-            'foo(2,#)',
-            [
-              [eTrue, eOne]
-            ],
-            'foo(2, true, 1);'),
-        testStatement('foo(2,#a)', {'a': []}, 'foo(2);'),
-        testStatement(
-            'foo(2,#a)',
-            {
-              'a': [eOne]
-            },
-            'foo(2, 1);'),
-        testStatement('foo(2,#a)', {'a': eOne}, 'foo(2, 1);'),
-        testStatement(
-            'foo(2,#a)',
-            {
-              'a': [eTrue, eOne]
-            },
-            'foo(2, true, 1);'),
-
-        testStatement('foo(#,3)', [[]], 'foo(3);'),
-        testStatement(
-            'foo(#,3)',
-            [
-              [eOne]
-            ],
-            'foo(1, 3);'),
-        testStatement('foo(#,3)', [eOne], 'foo(1, 3);'),
-        testStatement(
-            'foo(#,3)',
-            [
-              [eTrue, eOne]
-            ],
-            'foo(true, 1, 3);'),
-        testStatement('foo(#a,3)', {'a': []}, 'foo(3);'),
-        testStatement(
-            'foo(#a,3)',
-            {
-              'a': [eOne]
-            },
-            'foo(1, 3);'),
-        testStatement('foo(#a,3)', {'a': eOne}, 'foo(1, 3);'),
-        testStatement(
-            'foo(#a,3)',
-            {
-              'a': [eTrue, eOne]
-            },
-            'foo(true, 1, 3);'),
-
-        testStatement('foo(2,#,3)', [[]], 'foo(2, 3);'),
-        testStatement(
-            'foo(2,#,3)',
-            [
-              [eOne]
-            ],
-            'foo(2, 1, 3);'),
-        testStatement('foo(2,#,3)', [eOne], 'foo(2, 1, 3);'),
-        testStatement(
-            'foo(2,#,3)',
-            [
-              [eTrue, eOne]
-            ],
-            'foo(2, true, 1, 3);'),
-        testStatement('foo(2,#a,3)', {'a': []}, 'foo(2, 3);'),
-        testStatement(
-            'foo(2,#a,3)',
-            {
-              'a': [eOne]
-            },
-            'foo(2, 1, 3);'),
-        testStatement('foo(2,#a,3)', {'a': eOne}, 'foo(2, 1, 3);'),
-        testStatement(
-            'foo(2,#a,3)',
-            {
-              'a': [eTrue, eOne]
-            },
-            'foo(2, true, 1, 3);'),
-
-        // Interpolated Literals
-        testStatement('a = {#: 1}', [eOne], 'a = {1: 1};'),
-        testStatement('a = {#a: 1}', {'a': eOne}, 'a = {1: 1};'),
-        // Maybe we should make this work?
-        testError('a = {#: 1}', [1], 'is not a Literal: 1'),
-        testError('a = {#a: 1}', {'a': 1}, 'is not a Literal: 1'),
-
-        // Interpolated parameter splicing.
-        testStatement('function foo(#){}', [new jsAst.Parameter('x')],
-            'function foo(x) {\n}'),
-        testStatement('function foo(#){}', ['x'], 'function foo(x) {\n}'),
-        testStatement('function foo(#){}', [[]], 'function foo() {\n}'),
-        testStatement(
-            'function foo(#){}',
-            [
-              ['x']
-            ],
-            'function foo(x) {\n}'),
-        testStatement(
-            'function foo(#){}',
-            [
-              ['x', 'y']
-            ],
-            'function foo(x, y) {\n}'),
-        testStatement('function foo(#a){}', {'a': new jsAst.Parameter('x')},
-            'function foo(x) {\n}'),
-        testStatement('function foo(#a){}', {'a': 'x'}, 'function foo(x) {\n}'),
-        testStatement('function foo(#a){}', {'a': []}, 'function foo() {\n}'),
-        testStatement(
-            'function foo(#a){}',
-            {
-              'a': ['x']
-            },
-            'function foo(x) {\n}'),
-        testStatement(
-            'function foo(#a){}',
-            {
-              'a': ['x', 'y']
-            },
-            'function foo(x, y) {\n}'),
-
-        testStatement(
-            'function foo() async {}', [], 'function foo() async {\n}'),
-        testStatement(
-            'function foo() sync* {}', [], 'function foo() sync* {\n}'),
-        testStatement(
-            'function foo() async* {}', [], 'function foo() async* {\n}'),
-
-        testStatement('a = #.#', [eVar, eOne], 'a = x[1];'),
-        testStatement('a = #.#', [eVar, 'foo'], 'a = x.foo;'),
-        testStatement('a = #a.#b', {'a': eVar, 'b': eOne}, 'a = x[1];'),
-        testStatement('a = #a.#b', {'a': eVar, 'b': 'foo'}, 'a = x.foo;'),
-
-        testStatement('function f(#) { return #.#; }', ['x', eVar, 'foo'],
-            'function f(x) {\n  return x.foo;\n}'),
-        testStatement(
-            'function f(#a) { return #b.#c; }',
-            {'a': 'x', 'b': eVar, 'c': 'foo'},
-            'function f(x) {\n  return x.foo;\n}'),
-
-        testStatement(
-            '#.prototype.# = function(#) { return #.# };',
-            [
-              'className',
-              'getterName',
-              ['r', 'y'],
-              'r',
-              'fieldName'
-            ],
-            'className.prototype.getterName = function(r, y) {\n'
-            '  return r.fieldName;\n'
-            '};'),
-        testStatement(
-            '#a.prototype.#b = function(#c) { return #d.#e };',
-            {
-              'a': 'className',
-              'b': 'getterName',
-              'c': ['r', 'y'],
-              'd': 'r',
-              'e': 'fieldName'
-            },
-            'className.prototype.getterName = function(r, y) {\n'
-            '  return r.fieldName;\n'
-            '};'),
-
-        testStatement(
-            'function foo(r, #) { return #[r](#) }',
-            [
-              ['a', 'b'],
-              'g',
-              ['b', 'a']
-            ],
-            'function foo(r, a, b) {\n  return g[r](b, a);\n}'),
-        testStatement(
-            'function foo(r, #a) { return #b[r](#c) }',
-            {
-              'a': ['a', 'b'],
-              'b': 'g',
-              'c': ['b', 'a']
-            },
-            'function foo(r, a, b) {\n  return g[r](b, a);\n}'),
-
-        // Sequence is printed flattened
-        testStatement('x = #', [seq1], 'x = (1, 2, 3);'),
-        testStatement('x = (#, #)', [seq1, seq1], 'x = (1, 2, 3, 1, 2, 3);'),
-        testStatement('x = #, #', [seq1, seq1], 'x = (1, 2, 3), 1, 2, 3;'),
-        testStatement('for (i = 0, j = #, k = 0; ; ++i, ++j, ++k){}', [seq1],
-            'for (i = 0, j = (1, 2, 3), k = 0;; ++i, ++j, ++k) {\n}'),
-        testStatement('x = #a', {'a': seq1}, 'x = (1, 2, 3);'),
-        testStatement(
-            'x = (#a, #b)', {'a': seq1, 'b': seq1}, 'x = (1, 2, 3, 1, 2, 3);'),
-        testStatement(
-            'x = #a, #b', {'a': seq1, 'b': seq1}, 'x = (1, 2, 3), 1, 2, 3;'),
-        testStatement(
-            'for (i = 0, j = #a, k = 0; ; ++i, ++j, ++k){}',
-            {'a': seq1},
-            'for (i = 0, j = (1, 2, 3), k = 0;; ++i, ++j, ++k) {\n}'),
-
-        // Use the same name several times.
-        testStatement(
-            '#a.prototype.#a = function(#b) { return #c.#c };',
-            {
-              'a': 'name1_2',
-              'b': ['r', 'y'],
-              'c': 'name4_5'
-            },
-            'name1_2.prototype.name1_2 = function(r, y) {\n'
-            '  return name4_5.name4_5;\n'
-            '};'),
-
-        testStatement('label: while (a) { label2: break label;}', [],
-            'label:\n  while (a)\n    label2:\n      break label;\n  '),
-
-        testStatement('var # = 3', ['x'], 'var x = 3;'),
-        testStatement(
-            'var # = 3', [new jsAst.VariableDeclaration('x')], 'var x = 3;'),
-        testStatement(
-            'var # = 3, # = #', ['x', 'y', js.number(2)], 'var x = 3, y = 2;'),
-        testStatement('var #a = 3, #b = #c',
-            {"a": 'x', "b": 'y', "c": js.number(2)}, 'var x = 3, y = 2;'),
-        testStatement('function #() {}', ['x'], 'function x() {\n}'),
-        testStatement('function #() {}', [new jsAst.VariableDeclaration('x')],
-            'function x() {\n}'),
-        testStatement('try {} catch (#) {}', ['x'], 'try {\n} catch (x) {\n}'),
-        testStatement(
-            'try {} catch (#a) {}', {"a": 'x'}, 'try {\n} catch (x) {\n}'),
-        testStatement(
-            'try {} catch (#a) {}',
-            {"a": new jsAst.VariableDeclaration('x')},
-            'try {\n} catch (x) {\n}'),
-
-        // Test that braces around a single-statement block are removed by printer.
-        testStatement('while (a) {foo()}', [], 'while (a)\n  foo();'),
-        testStatement('if (a) {foo();}', [], 'if (a)\n  foo();'),
-        testStatement('if (a) {foo();} else {foo2();}', [],
-            'if (a)\n  foo();\nelse\n  foo2();'),
-        testStatement('if (a) foo(); else {foo2();}', [],
-            'if (a)\n  foo();\nelse\n  foo2();'),
-        testStatement('do {foo();} while(a);', [], 'do\n  foo();\nwhile (a);'),
-        testStatement('label: {foo();}', [], 'label:\n  foo();'),
-        testStatement(
-            'for (var key in a) {foo();}', [], 'for (var key in a)\n  foo();'),
-        // `label: break label;` gives problems on IE. Test that it is avoided.
-        testStatement('label: {break label;}', [], ';'),
-        // This works on IE:
-        testStatement('label: {label2: {break label;}}', [],
-            'label:\n  label2:\n    break label;\n'),
-        // Test dangling else:
-        testStatement('if (a) {if (b) {foo1();}} else {foo2();}', [], """
-if (a) {
-  if (b)
-    foo1();
-} else
-  foo2();"""),
-        testStatement('if (a) {if (b) {foo1();} else {foo2();}}', [], """
-if (a)
-  if (b)
-    foo1();
-  else
-    foo2();
-"""),
-        testStatement(
-            'if (a) {if (b) {foo1();} else {foo2();}} else {foo3();}', [], """
-if (a)
-  if (b)
-    foo1();
-  else
-    foo2();
-else
-  foo3();"""),
-        testStatement(
-            'if (a) {while (true) if (b) {foo1();}} else {foo2();}', [], """
-if (a) {
-  while (true)
-    if (b)
-      foo1();
-} else
-  foo2();"""),
-      ]));
-}
diff --git a/tests/compiler/dart2js/js_parser_test.dart b/tests/compiler/dart2js/js_parser_test.dart
deleted file mode 100644
index 21b763e..0000000
--- a/tests/compiler/dart2js/js_parser_test.dart
+++ /dev/null
@@ -1,201 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'mock_compiler.dart';
-import 'package:compiler/src/js/js.dart' as jsAst;
-import 'package:compiler/src/js/js.dart' show js;
-
-Future testExpression(String expression, [String expect = ""]) {
-  jsAst.Node node = js(expression);
-  return MockCompiler.create((MockCompiler compiler) {
-    String jsText = jsAst.prettyPrint(node, compiler.options,
-        allowVariableMinification: false);
-    if (expect == "") {
-      Expect.stringEquals(expression, jsText);
-    } else {
-      Expect.stringEquals(expect, jsText);
-    }
-  });
-}
-
-Future testError(String expression, [String expect = ""]) {
-  return new Future.sync(() {
-    bool doCheck(exception) {
-      Expect.isTrue(exception.toString().contains(expect));
-      return true;
-    }
-
-    Expect.throws(() => js(expression), doCheck);
-  });
-}
-
-void main() {
-  asyncTest(() => Future.wait([
-        // Asterisk indicates deviations from real JS.
-        // Simple var test.
-        testExpression('var a = ""'),
-        // Parse and print will normalize whitespace.
-        testExpression(' var  a  =  "" ', 'var a = ""'),
-        // Operator precedence.
-        testExpression('x = a + b * c'),
-        testExpression('x = a * b + c'),
-        testExpression('x = a + b * c + d'),
-        testExpression('x = a * b + c * d'),
-        testExpression('remaining = (remaining / 88) | 0',
-            'remaining = remaining / 88 | 0'),
-        // Binary operators have left associativity.
-        testExpression('x = a + b + c'),
-        // We can cope with relational operators and non-relational.
-        testExpression('a + b == c + d'),
-        // The prettyprinter will insert braces where needed.
-        testExpression('a + (b == c) + d'),
-        // We can handle () for calls.
-        testExpression('foo(bar)'),
-        testExpression('foo(bar, baz)'),
-        // Chained calls without parentheses.
-        testExpression('foo(bar)(baz)'),
-        // Chained calls with and without new.
-        testExpression('new foo(bar)(baz)'),
-        testExpression('new foo.bar(bar)(baz)'),
-        testExpression('foo.bar(bar)(baz)'),
-        testExpression('constructor = new Function(str)()'),
-        // The prettyprinter understands chained calls without extra parentheses.
-        testExpression('(foo(bar))(baz)', 'foo(bar)(baz)'),
-        // Chains of dotting and calls.
-        testExpression('foo.bar(baz)'),
-        // String literal.
-        testExpression('var x = "fisk"'),
-        // String literal with \n.
-        testExpression(r'var x = "\n"'),
-        // String literal with escaped quote.
-        testExpression(r'var x = "\""'),
-        // *No clever escapes.
-        testError(r'var x = "\x42"', 'escapes are not allowed in literals'),
-        // Operator new.
-        testExpression('new Foo()'),
-        // New with dotted access.
-        testExpression('new Frobinator.frobinate()'),
-        testExpression('new Frobinator().frobinate()'),
-        // The prettyprinter strips some superfluous parentheses.
-        testExpression(
-            '(new Frobinator()).frobinate()', 'new Frobinator().frobinate()'),
-        // *We want a bracket on 'new'.
-        testError('new Foo', 'Parentheses are required'),
-        testError('(new Foo)', 'Parentheses are required'),
-        // Bogus operators.
-        testError('a +++ b', 'Unknown operator'),
-        // This isn't perl.  There are rules.
-        testError('a <=> b', 'Unknown operator'),
-        // Typeof.
-        testExpression('typeof foo == "number"'),
-        // Strange relation.
-        testExpression('a < b < c'),
-        // Chained var.
-        testExpression('var x = 0, y = 1.2, z = 42'),
-        // Empty object literal.
-        testExpression('foo({}, {})'),
-        // *Can't handle non-empty object literals
-        testExpression('foo({meaning: 42})'),
-        // Literals.
-        testExpression('x(false, true, null)'),
-        // *We should really throw here.
-        testExpression('var false = 42'),
-        testExpression('var new = 42'),
-        // Bad keyword.
-        testError('var typeof = 42', "Expected ALPHA"),
-        // Malformed decimal/hex.
-        testError('var x = 1.1.1', "Unparseable number"),
-        testError('var x = 0xabcdefga', "Unparseable number"),
-        testError('var x = 0xabcdef\$a', "Unparseable number"),
-        testError('var x = 0x ', "Unparseable number"),
-        // Good hex constants.
-        testExpression('var x = 0xff'),
-        testExpression('var x = 0xff + 0xff'),
-        testExpression('var x = 0xaF + 0x0123456789abcdefABCDEF'),
-        // All sorts of keywords are allowed as property names in ES5.
-        testExpression('x.new = 0'),
-        testExpression('x.delete = 0'),
-        testExpression('x.for = 0'),
-        testExpression('x.instanceof = 0'),
-        testExpression('x.in = 0'),
-        testExpression('x.void = 0'),
-        testExpression('x.continue = 0'),
-        // More unary.
-        testExpression('x = !x'),
-        testExpression('!x == false'),
-        testExpression('var foo = void 0'),
-        testExpression('delete foo.bar'),
-        testExpression('delete foo'),
-        testExpression('x in y'),
-        testExpression('x instanceof y'),
-        testExpression('a * b in c * d'),
-        testExpression('a * b instanceof c * d'),
-        testError('x typeof y', 'Unparsed junk'),
-        testExpression('x &= ~mask'),
-        // Await is parsed as an unary prefix operator.
-        testExpression('var foo = await 0'),
-        testExpression('await x++'),
-        testExpression('void (await (x++))', 'void await x++'),
-        testExpression('void (await x)++'),
-        testExpression('++(await x)++'),
-        // Adjacent tokens.
-        testExpression('foo[x[bar]]'),
-        testExpression('foo[[bar]]'),
-        // Prefix ++ etc.
-        testExpression("++x"),
-        testExpression("++foo.bar"),
-        testExpression("+x"),
-        testExpression("+foo.bar"),
-        testExpression("-x"),
-        testExpression("-foo.bar"),
-        testExpression("--x"),
-        testExpression("--foo.bar"),
-        // Postfix ++ etc.
-        testExpression("x++"),
-        testExpression("foo.bar++"),
-        testExpression("x--"),
-        testExpression("foo.bar--"),
-        // Both!
-        testExpression("++x++"),
-        testExpression("++foo.bar++"),
-        testExpression("--x--"),
-        testExpression("--foo.bar--"),
-        // *We can't handle stacked unary operators (apart from !).
-        testError("x++ ++"),
-        testError("++ typeof x"),
-        testExpression(r"var $supportsProtoName = !!{}.__proto__"),
-        // ++ used as a binary operator.
-        testError("x++ ++ 42"),
-        // Shift operators.
-        testExpression("x << 5"),
-        testExpression("x << y + 1"),
-        testExpression("x <<= y + 1"),
-        // Array initializers.
-        testExpression("x = ['foo', 'bar', x[4]]"),
-        testExpression("[]"),
-        testError("[42 42]"),
-        testExpression('beebop([1, 2, 3])'),
-        // Array literals with holes in them.
-        testExpression("[1,, 2]"),
-        testExpression("[1,]", "[1]"),
-        testExpression("[1,,]", "[1,,]"),
-        testExpression("[,]"),
-        testExpression("[,,]"),
-        testExpression("[, 42]"),
-        // Ternary operator.
-        testExpression("x = a ? b : c"),
-        testExpression("y = a == null ? b : a"),
-        testExpression("y = a == null ? b + c : a + c"),
-        testExpression("foo = a ? b : c ? d : e"),
-        testExpression("foo = a ? b ? c : d : e"),
-        testExpression("foo = (a = v) ? b = w : c = x ? d = y : e = z"),
-        testExpression("foo = (a = v) ? b = w ? c = x : d = y : e = z"),
-        // Stacked assignment.
-        testExpression("a = b = c"),
-        testExpression("var a = b = c"),
-      ]));
-}
diff --git a/tests/compiler/dart2js/jsinterop/interop_anonymous_unreachable_test.dart b/tests/compiler/dart2js/jsinterop/interop_anonymous_unreachable_test.dart
new file mode 100644
index 0000000..97b27a6
--- /dev/null
+++ b/tests/compiler/dart2js/jsinterop/interop_anonymous_unreachable_test.dart
@@ -0,0 +1,192 @@
+// 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 tests.dart2js.interop_anonymous_unreachable_test;
+
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+import '../compiler_helper.dart';
+
+testUnreachableCrash({bool useKernel}) async {
+  print("-- unreachable code doesn't crash the compiler --");
+  // This test is a regression for Issue #24974
+  String generated = await compile("""
+        import 'package:js/js.dart';
+
+        @JS() @anonymous
+        class UniqueLongNameForTesting_A {
+          external factory UniqueLongNameForTesting_A();
+        }
+        main() {}
+    """, returnAll: true, useKernel: useKernel);
+
+  // the code should not be included in the output either.
+  Expect.isFalse(generated.contains("UniqueLongNameForTesting_A"));
+}
+
+testTreeShakingJsInteropTypes({bool useKernel}) async {
+  print('-- tree-shaking interop types --');
+  String program = """
+        import 'package:js/js.dart';
+
+        // reachable and allocated
+        @JS() @anonymous
+        class UniqueLongNameForTesting_A {
+          external bool get x;
+          external UniqueLongNameForTesting_D get d;
+          external UniqueLongNameForTesting_E get e;
+          external factory UniqueLongNameForTesting_A(
+              {UniqueLongNameForTesting_B arg0});
+        }
+
+        // visible through the parameter above, but not used.
+        @JS() @anonymous
+        class UniqueLongNameForTesting_B {
+          external factory UniqueLongNameForTesting_B();
+        }
+
+        // unreachable
+        @JS() @anonymous
+        class UniqueLongNameForTesting_C {
+          external factory UniqueLongNameForTesting_C();
+        }
+
+        // visible and reached through `d`.
+        @JS() @anonymous
+        class UniqueLongNameForTesting_D {
+          external factory UniqueLongNameForTesting_D();
+        }
+
+        // visible through `e`, but not reached.
+        @JS() @anonymous
+        class UniqueLongNameForTesting_E {
+          external factory UniqueLongNameForTesting_E();
+        }
+
+        main() {
+          print(new UniqueLongNameForTesting_A().x);
+          print(new UniqueLongNameForTesting_A().d);
+        }
+    """;
+
+  print(' - no tree-shaking by default -');
+  String generated1 =
+      await compile(program, returnAll: true, useKernel: useKernel);
+  Expect.isTrue(generated1.contains("UniqueLongNameForTesting_A"));
+  Expect.isTrue(generated1.contains("UniqueLongNameForTesting_D"));
+
+  Expect.isTrue(generated1.contains("UniqueLongNameForTesting_B"));
+  Expect.isTrue(generated1.contains("UniqueLongNameForTesting_C"));
+  Expect.isTrue(generated1.contains("UniqueLongNameForTesting_E"));
+
+  print(' - tree-shake when using flag -');
+  String generated2 = await compile(program,
+      trustJSInteropTypeAnnotations: true,
+      returnAll: true,
+      useKernel: useKernel);
+  Expect.isTrue(generated2.contains("UniqueLongNameForTesting_A"));
+  Expect.isTrue(generated2.contains("UniqueLongNameForTesting_D"));
+
+  Expect.isFalse(generated2.contains("UniqueLongNameForTesting_B"));
+  Expect.isFalse(generated2.contains("UniqueLongNameForTesting_C"));
+  Expect.isFalse(generated2.contains("UniqueLongNameForTesting_E"));
+}
+
+testTreeShakingNativeTypes({bool useKernel}) async {
+  print('-- tree-shaking other native types --');
+
+  String program = """
+        import 'dart:html';
+        import 'package:js/js.dart';
+
+        @JS() @anonymous
+        class UniqueLongNameForTesting_A {
+          external dynamic get x;
+        }
+
+        @JS() @anonymous
+        class UniqueLongNameForTesting_B {
+          external dynamic get y;
+        }
+
+        main() {
+          print(new UniqueLongNameForTesting_A().x);
+        }
+    """;
+
+  print(' - allocation effect of dynamic excludes native types -');
+  String generated1 =
+      await compile(program, returnAll: true, useKernel: useKernel);
+  Expect.isTrue(generated1.contains("UniqueLongNameForTesting_A"));
+  // any js-interop type could be allocated by `get x`
+  Expect.isTrue(generated1.contains("UniqueLongNameForTesting_B"));
+  // but we exclude other native types like HTMLAudioElement
+  Expect.isFalse(generated1.contains("HTMLAudioElement"));
+
+  print(' - allocation effect of dynamic excludes native types [flag] -');
+  // Trusting types doesn't make a difference.
+  String generated2 = await compile(program,
+      trustJSInteropTypeAnnotations: true,
+      returnAll: true,
+      useKernel: useKernel);
+  Expect.isTrue(generated2.contains("UniqueLongNameForTesting_A"));
+  Expect.isTrue(generated2.contains("UniqueLongNameForTesting_B"));
+  Expect.isFalse(generated2.contains("HTMLAudioElement"));
+
+  print(' - declared native types are included in allocation effect -');
+  String program2 = """
+        import 'dart:html';
+        import 'package:js/js.dart';
+
+        @JS() @anonymous
+        class UniqueLongNameForTesting_A {
+          external AudioElement get x;
+        }
+
+        main() {
+          print(new UniqueLongNameForTesting_A().x is AudioElement);
+        }
+    """;
+
+  String generated3 =
+      await compile(program2, returnAll: true, useKernel: useKernel);
+  Expect.isTrue(generated3.contains("UniqueLongNameForTesting_A"));
+  Expect.isTrue(generated3.contains("HTMLAudioElement"));
+
+  program2 = """
+        import 'dart:html';
+        import 'package:js/js.dart';
+
+        @JS() @anonymous
+        class UniqueLongNameForTesting_A {
+          external dynamic get x;
+        }
+
+        main() {
+          print(new UniqueLongNameForTesting_A().x is AudioElement);
+        }
+    """;
+
+  generated3 = await compile(program2, returnAll: true, useKernel: useKernel);
+  Expect.isTrue(generated3.contains("UniqueLongNameForTesting_A"));
+  // This extra check is to make sure that we don't include HTMLAudioElement
+  // just because of the is-check. It is optimized away in this case because
+  // we believe it was never instantiated.
+  Expect.isFalse(generated3.contains("HTMLAudioElement"));
+}
+
+main() {
+  runTests({bool useKernel}) async {
+    await testUnreachableCrash(useKernel: useKernel);
+    await testTreeShakingJsInteropTypes(useKernel: useKernel);
+    await testTreeShakingNativeTypes(useKernel: useKernel);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
+}
diff --git a/tests/compiler/dart2js/kernel/closed_world2_test.dart b/tests/compiler/dart2js/kernel/closed_world2_test.dart
index 1cbd0a0..8a1990b 100644
--- a/tests/compiler/dart2js/kernel/closed_world2_test.dart
+++ b/tests/compiler/dart2js/kernel/closed_world2_test.dart
@@ -196,13 +196,15 @@
 
   print('---- analyze-only ------------------------------------------------');
   DiagnosticCollector collector = new DiagnosticCollector();
-  Compiler compiler1 = compilerFor(
+  CompilationResult result = await runCompiler(
       entryPoint: entryPoint,
       memorySourceFiles: memorySourceFiles,
       diagnosticHandler: collector,
-      options: [Flags.analyzeOnly, Flags.enableAssertMessage]);
-  compiler1.impactCacheDeleter.retainCachesForTesting = true;
-  await compiler1.run(entryPoint);
+      options: [Flags.analyzeOnly, Flags.enableAssertMessage],
+      beforeRun: (compiler) {
+        compiler.impactCacheDeleter.retainCachesForTesting = true;
+      });
+  Compiler compiler1 = result.compiler;
   if (collector.crashes.isNotEmpty) {
     print('Skipping due to crashes.');
     return ResultKind.crashes;
diff --git a/tests/compiler/dart2js/kernel/closed_world_from_dill_test.dart b/tests/compiler/dart2js/kernel/closed_world_from_dill_test.dart
index 7b2e86c..758d342 100644
--- a/tests/compiler/dart2js/kernel/closed_world_from_dill_test.dart
+++ b/tests/compiler/dart2js/kernel/closed_world_from_dill_test.dart
@@ -113,13 +113,15 @@
 
   print('---- analyze-only ------------------------------------------------');
   DiagnosticCollector collector = new DiagnosticCollector();
-  Compiler compiler1 = compilerFor(
+  ElementResolutionWorldBuilder.useInstantiationMap = true;
+  CompilationResult result = await runCompiler(
       entryPoint: entryPoint,
       diagnosticHandler: collector,
-      options: [Flags.analyzeOnly, Flags.enableAssertMessage]);
-  ElementResolutionWorldBuilder.useInstantiationMap = true;
-  compiler1.impactCacheDeleter.retainCachesForTesting = true;
-  await compiler1.run(entryPoint);
+      options: [Flags.analyzeOnly, Flags.enableAssertMessage],
+      beforeRun: (compiler) {
+        compiler.impactCacheDeleter.retainCachesForTesting = true;
+      });
+  Compiler compiler1 = result.compiler;
   if (collector.crashes.isNotEmpty) {
     print('Skipping due to crashes.');
     return ResultKind.crashes;
diff --git a/tests/compiler/dart2js/kernel/compile_from_dill_test_helper.dart b/tests/compiler/dart2js/kernel/compile_from_dill_test_helper.dart
index b94a8e9..9332d51 100644
--- a/tests/compiler/dart2js/kernel/compile_from_dill_test_helper.dart
+++ b/tests/compiler/dart2js/kernel/compile_from_dill_test_helper.dart
@@ -388,15 +388,17 @@
   print('---- compile from ast ----------------------------------------------');
   DiagnosticCollector collector = new DiagnosticCollector();
   OutputCollector collector1 = new OutputCollector();
-  Compiler compiler1 = compilerFor(
+  ElementResolutionWorldBuilder.useInstantiationMap = true;
+  CompilationResult result = await runCompiler(
       entryPoint: entryPoint,
       memorySourceFiles: memorySourceFiles,
       diagnosticHandler: collector,
       outputProvider: collector1,
-      options: <String>[]..addAll(commonOptions)..addAll(options));
-  ElementResolutionWorldBuilder.useInstantiationMap = true;
-  compiler1.impactCacheDeleter.retainCachesForTesting = true;
-  await compiler1.run(entryPoint);
+      options: <String>[]..addAll(commonOptions)..addAll(options),
+      beforeRun: (compiler) {
+        compiler.impactCacheDeleter.retainCachesForTesting = true;
+      });
+  Compiler compiler1 = result.compiler;
   if (collector.crashes.isNotEmpty) {
     print('Skipping due to crashes.');
     return ResultKind.crashes;
diff --git a/tests/compiler/dart2js/kernel/compiler_helper.dart b/tests/compiler/dart2js/kernel/compiler_helper.dart
index 05a434b..56d9b7d 100644
--- a/tests/compiler/dart2js/kernel/compiler_helper.dart
+++ b/tests/compiler/dart2js/kernel/compiler_helper.dart
@@ -21,42 +21,6 @@
 import 'package:kernel/ast.dart' as ir;
 import '../memory_compiler.dart';
 
-typedef Future<Compiler> CompileFunction();
-
-/// Create multiple compilations for a list of [sources].
-///
-/// This methods speeds up testing kernel based compilation by creating the IR
-/// nodes for all [sources] at the same time. The returned list of
-/// [CompileFunction]s compiles one of the [source] at a time using the kernel
-/// based compiler.
-///
-/// Currently, the returned compile function only runs with '--analyze-only'
-/// flag.
-Future<List<CompileFunction>> compileMultiple(List<String> sources) async {
-  Uri entryPoint = Uri.parse('memory:main.dart');
-
-  List<CompileFunction> compilers = <CompileFunction>[];
-  for (String source in sources) {
-    compilers.add(() async {
-      Compiler compiler = compilerFor(
-          entryPoint: entryPoint,
-          memorySourceFiles: {
-            'main.dart': source
-          },
-          options: [
-            Flags.analyzeOnly,
-            Flags.enableAssertMessage,
-            Flags.useKernel
-          ]);
-      ElementResolutionWorldBuilder.useInstantiationMap = true;
-      compiler.impactCacheDeleter.retainCachesForTesting = true;
-      await compiler.run(entryPoint);
-      return compiler;
-    });
-  }
-  return compilers;
-}
-
 /// Analyze [memorySourceFiles] with [entryPoint] as entry-point using the
 /// kernel based element model. The returned [Pair] contains the compiler used
 /// to create the IR and the kernel based compiler.
@@ -66,24 +30,26 @@
   if (printSteps) {
     print('---- analyze-all -------------------------------------------------');
   }
-  Compiler compiler = compilerFor(
+  CompilationResult result1 = await runCompiler(
       entryPoint: entryPoint,
       memorySourceFiles: memorySourceFiles,
-      options: [Flags.analyzeAll, Flags.enableAssertMessage]);
-  compiler.impactCacheDeleter.retainCachesForTesting = true;
-  await compiler.run(entryPoint);
+      options: [Flags.analyzeAll, Flags.enableAssertMessage],
+      beforeRun: (compiler) {
+        compiler.impactCacheDeleter.retainCachesForTesting = true;
+      });
 
   if (printSteps) {
     print('---- closed world from kernel ------------------------------------');
   }
-  Compiler compiler2 = compilerFor(
+  ElementResolutionWorldBuilder.useInstantiationMap = true;
+  CompilationResult result2 = await runCompiler(
       entryPoint: entryPoint,
       memorySourceFiles: memorySourceFiles,
-      options: [Flags.analyzeOnly, Flags.enableAssertMessage, Flags.useKernel]);
-  ElementResolutionWorldBuilder.useInstantiationMap = true;
-  compiler2.impactCacheDeleter.retainCachesForTesting = true;
-  await compiler2.run(entryPoint);
-  return new Pair<Compiler, Compiler>(compiler, compiler2);
+      options: [Flags.analyzeOnly, Flags.enableAssertMessage, Flags.useKernel],
+      beforeRun: (compiler) {
+        compiler.impactCacheDeleter.retainCachesForTesting = true;
+      });
+  return new Pair<Compiler, Compiler>(result1.compiler, result2.compiler);
 }
 
 class MemoryKernelLibraryLoaderTask extends KernelLibraryLoaderTask {
@@ -125,17 +91,18 @@
   if (printSteps) {
     print('---- compile from dill -------------------------------------------');
   }
-  Compiler compiler = compilerFor(
+  CompilationResult result = await runCompiler(
       entryPoint: entryPoint,
       memorySourceFiles: memorySourceFiles,
       options: [Flags.useKernel]..addAll(options),
       diagnosticHandler: diagnosticHandler,
-      outputProvider: compilerOutput);
-  ElementResolutionWorldBuilder.useInstantiationMap = true;
-  compiler.impactCacheDeleter.retainCachesForTesting = true;
-  if (beforeRun != null) {
-    beforeRun(compiler);
-  }
-  await compiler.run(entryPoint);
-  return compiler;
+      outputProvider: compilerOutput,
+      beforeRun: (compiler) {
+        ElementResolutionWorldBuilder.useInstantiationMap = true;
+        compiler.impactCacheDeleter.retainCachesForTesting = true;
+        if (beforeRun != null) {
+          beforeRun(compiler);
+        }
+      });
+  return result.compiler;
 }
diff --git a/tests/compiler/dart2js/licm_test.dart b/tests/compiler/dart2js/licm_test.dart
deleted file mode 100644
index 438d174..0000000
--- a/tests/compiler/dart2js/licm_test.dart
+++ /dev/null
@@ -1,29 +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.
-
-// Check that we hoist instructions in a loop condition, even if that
-// condition involves control flow.
-
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST = '''
-var a = [1];
-
-main() {
-  int count = int.parse('42') == 42 ? 42 : null;
-  for (int i = 0; i < count && i < a[0]; i++) {
-    print(i);
-  }
-  a.removeLast();
-  // Ensure we don't try to generate a bailout method based on a check
-  // of [count].
-  count.removeLast();
-}
-''';
-
-main() {
-  asyncTest(() => compileAndMatch(TEST, 'main',
-      new RegExp('if \\(typeof count !== "number"\\)(.|\\n)*while')));
-}
diff --git a/tests/compiler/dart2js/list_tracer2_test.dart b/tests/compiler/dart2js/list_tracer2_test.dart
deleted file mode 100644
index 3e1d17b..0000000
--- a/tests/compiler/dart2js/list_tracer2_test.dart
+++ /dev/null
@@ -1,38 +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.
-
-// We used to always nullify the element type of a list we are tracing in
-// the presence of a fixed length list constructor call.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'package:compiler/src/types/types.dart' show ContainerTypeMask;
-
-import 'compiler_helper.dart';
-import 'type_mask_test_helper.dart';
-
-const String TEST = r'''
-var myList = [42];
-main() {
-  var a = new List(42);
-  return myList[0];
-}
-''';
-
-void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
-
-        checkType(String name, type) {
-          MemberElement element = findElement(compiler, name);
-          ContainerTypeMask mask = typesInferrer.getTypeOfMember(element);
-          Expect.equals(type, simplify(mask.elementType, closedWorld), name);
-        }
-
-        checkType('myList', typesInferrer.closedWorld.commonMasks.uint31Type);
-      }));
-}
diff --git a/tests/compiler/dart2js/list_tracer_typed_data_length_test.dart b/tests/compiler/dart2js/list_tracer_typed_data_length_test.dart
deleted file mode 100644
index 3e082fd..0000000
--- a/tests/compiler/dart2js/list_tracer_typed_data_length_test.dart
+++ /dev/null
@@ -1,49 +0,0 @@
-// 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:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/elements/elements.dart';
-import 'package:compiler/src/types/types.dart' show ContainerTypeMask, TypeMask;
-import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/world.dart' show ClosedWorld;
-
-import 'memory_compiler.dart';
-import 'compiler_helper.dart' show findElement;
-import 'type_mask_test_helper.dart';
-
-const TEST = const {
-  'main.dart': r'''
-import 'dart:typed_data';
-
-var myList = new Float32List(42);
-var myOtherList = new Uint8List(32);
-
-main() {
-  var a = new Float32List(9);
-  return myList[0] + myOtherList[0];
-}
-'''
-};
-
-void main() {
-  asyncTest(() async {
-    CompilationResult result = await runCompiler(memorySourceFiles: TEST);
-    Compiler compiler = result.compiler;
-    var typesInferrer = compiler.globalInference.typesInferrerInternal;
-    ClosedWorld closedWorld = typesInferrer.closedWorld;
-
-    checkType(String name, type, length) {
-      MemberElement element = findElement(compiler, name);
-      TypeMask mask = typesInferrer.getTypeOfMember(element);
-      Expect.isTrue(mask.isContainer);
-      ContainerTypeMask container = mask;
-      Expect.equals(type, simplify(container.elementType, closedWorld), name);
-      Expect.equals(container.length, length);
-    }
-
-    checkType('myList', closedWorld.commonMasks.numType, 42);
-    checkType('myOtherList', closedWorld.commonMasks.uint31Type, 32);
-  });
-}
diff --git a/tests/compiler/dart2js/literal_list_test.dart b/tests/compiler/dart2js/literal_list_test.dart
deleted file mode 100644
index 32120bf..0000000
--- a/tests/compiler/dart2js/literal_list_test.dart
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-foo() {
-  print([1, 2]);
-  print([3]);
-  var c = [4, 5];
-  print(c);
-}
-""";
-
-main() {
-  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
-        Expect.isTrue(generated.contains('print([1, 2]);'));
-        Expect.isTrue(generated.contains('print([3]);'));
-        Expect.isTrue(generated.contains('print([4, 5]);'));
-      }));
-}
diff --git a/tests/compiler/dart2js/literal_map_test.dart b/tests/compiler/dart2js/literal_map_test.dart
deleted file mode 100644
index e460618..0000000
--- a/tests/compiler/dart2js/literal_map_test.dart
+++ /dev/null
@@ -1,26 +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 'compiler_helper.dart';
-
-const String TEST = """
-foo() {
-  var a = {};
-  var index = foo(); // Make sure we want to optimize this method.
-  while (true) a[index] = 1;
-}
-""";
-
-main() {
-  asyncTest(() => compile(TEST, entry: 'foo', check: (String generated) {
-        // Make sure we have all the type information we need.
-        Expect.isFalse(generated.contains('bailout'));
-        Expect.isFalse(generated.contains('interceptor'));
-        // Make sure we don't go through an interceptor.
-        Expect.isTrue(generated.contains(r'a.$indexSet(a') ||
-            generated.contains(r'.$indexSet(0'));
-      }));
-}
diff --git a/tests/compiler/dart2js/logical_expression_test.dart b/tests/compiler/dart2js/logical_expression_test.dart
deleted file mode 100644
index 423a73a..0000000
--- a/tests/compiler/dart2js/logical_expression_test.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-// 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.
-
-// Test that logical or-expressions don't introduce unnecessary nots.
-
-import 'dart:async';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-foo(bar, gee) {
-  bool cond1 = bar();
-  if (cond1 || gee()) gee();
-  if (cond1 || gee()) gee();
-}
-""";
-
-const String TEST_TWO = r"""
-void foo(list, bar) {
-  if (list == null) bar();
-  if (list == null || bar()) bar();
-  if (list == null || bar()) bar();
-}
-""";
-
-main() {
-  asyncTest(() => Future.wait([
-        // We want something like:
-        //     var t1 = bar.call$0() === true;
-        //     if (t1 || gee.call$0() === true) gee.call$0();
-        //     if (t1 || gee.call$0() === true) gee.call$0();
-        compileAndDoNotMatchFuzzy(
-            TEST_ONE, 'foo', r"""var x = [a-zA-Z0-9$.]+\(\) == true;
-            if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;
-            if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;"""),
-
-        // We want something like:
-        //     var t1 = list == null;
-        //     if (t1) bar.call$0();
-        //     if (t1 || bar.call$0() === true) bar.call$0();
-        //     if (t1 || bar.call$0() === true) bar.call$0();
-        compileAndMatchFuzzy(TEST_TWO, 'foo', r"""var x = x == null;
-            if \(x\) [^;]+;
-            if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;
-            if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;"""),
-      ]));
-}
diff --git a/tests/compiler/dart2js/loop_test.dart b/tests/compiler/dart2js/loop_test.dart
deleted file mode 100644
index c622d72..0000000
--- a/tests/compiler/dart2js/loop_test.dart
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-foo(a) {
-  int x = 0;
-  for (int i = 0; i < 10; i++) {
-    x += i;
-  }
-  return x;
-}
-""";
-
-const String TEST_TWO = r"""
-foo(a) {
-  int x = 0;
-  int i = 0;
-  while (i < 10) {
-    x += i;
-    i++;
-  }
-  return x;
-}
-""";
-
-const String TEST_THREE = r"""
-foo(a) {
-  int x = 0;
-  for (int i = 0; i < 10; i++) {
-    if (i == 5) continue;
-    x += i;
-  }
-  return x;
-}
-""";
-
-const String TEST_FOUR = r"""
-foo(a) {
-  int x = 0;
-  int i = 0;
-  while (i < 10) {
-    i++;
-    if (i == 5) continue;
-    x += i;
-  }
-  return x;
-}
-""";
-
-main() {
-  asyncTest(() => Future.wait([
-        compile(TEST_ONE, entry: 'foo', check: (String generated) {
-          Expect.isTrue(generated.contains(r'for ('));
-        }),
-        compile(TEST_TWO, entry: 'foo', check: (String generated) {
-          Expect.isTrue(!generated.contains(r'break'));
-        }),
-        compile(TEST_THREE, entry: 'foo', check: (String generated) {
-          Expect.isTrue(generated.contains(r'continue'));
-        }),
-        compile(TEST_FOUR, entry: 'foo', check: (String generated) {
-          Expect.isTrue(generated.contains(r'continue'));
-        }),
-      ]));
-}
diff --git a/tests/compiler/dart2js/map_tracer_const_test.dart b/tests/compiler/dart2js/map_tracer_const_test.dart
deleted file mode 100644
index d208996..0000000
--- a/tests/compiler/dart2js/map_tracer_const_test.dart
+++ /dev/null
@@ -1,43 +0,0 @@
-// 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:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-
-import 'compiler_helper.dart';
-import 'type_mask_test_helper.dart';
-
-const String TEST = '''
-int closure(int x) {
-  return x;
-}
-
-class A {
-  static const DEFAULT = const {'fun' : closure};
-
-  final map;
-
-  A([maparg]) : map = maparg == null ? DEFAULT : maparg;
-}
-
-main() {
-  var a = new A();
-  a.map['fun'](3.3);
-  print(closure(22));
-}
-''';
-
-void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri, expectedErrors: 0, expectedWarnings: 0);
-  compiler.stopAfterTypeInference = true;
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
-        var commonMasks = closedWorld.commonMasks;
-        MemberElement element = findElement(compiler, 'closure');
-        var mask = typesInferrer.getReturnTypeOfMember(element);
-        Expect.equals(commonMasks.numType, simplify(mask, closedWorld));
-      }));
-}
diff --git a/tests/compiler/dart2js/memory_compiler.dart b/tests/compiler/dart2js/memory_compiler.dart
index 3f992ba..4fc6919 100644
--- a/tests/compiler/dart2js/memory_compiler.dart
+++ b/tests/compiler/dart2js/memory_compiler.dart
@@ -20,9 +20,11 @@
     show LibraryEntity, MemberEntity;
 import 'package:compiler/src/enqueue.dart' show ResolutionEnqueuer;
 import 'package:compiler/src/null_compiler_output.dart' show NullCompilerOutput;
-import 'package:compiler/src/library_loader.dart' show LoadedLibraries;
+import 'package:compiler/src/library_loader.dart'
+    show LoadedLibraries, KernelLibraryLoaderTask;
 import 'package:compiler/src/options.dart' show CompilerOptions;
 
+import 'package:front_end/src/api_unstable/dart2js.dart' as fe;
 import 'package:front_end/src/compute_platform_binaries_location.dart'
     show computePlatformBinariesLocation;
 
@@ -70,6 +72,8 @@
 Expando<MemorySourceFileProvider> expando =
     new Expando<MemorySourceFileProvider>();
 
+fe.InitializedCompilerState kernelInitializedCompilerState;
+
 /// memorySourceFiles can contain a map of string filename to string file
 /// contents or string file name to binary file contents (hence the `dynamic`
 /// type for the second parameter).
@@ -107,7 +111,13 @@
     beforeRun(compiler);
   }
   bool isSuccess = await compiler.run(entryPoint);
-  return new CompilationResult(compiler, isSuccess: isSuccess);
+  if (compiler.libraryLoader is KernelLibraryLoaderTask) {
+    KernelLibraryLoaderTask loader = compiler.libraryLoader;
+    kernelInitializedCompilerState = loader.initializedCompilerState;
+  }
+  return new CompilationResult(compiler,
+      isSuccess: isSuccess,
+      kernelInitializedCompilerState: kernelInitializedCompilerState);
 }
 
 CompilerImpl compilerFor(
@@ -175,7 +185,8 @@
           environment: {},
           platformBinaries: platformBinaries,
           packageConfig: packageConfig,
-          packagesDiscoveryProvider: packagesDiscoveryProvider));
+          packagesDiscoveryProvider: packagesDiscoveryProvider)
+        ..kernelInitializedCompilerState = kernelInitializedCompilerState);
 
   if (cachedCompiler != null) {
     Map copiedLibraries = {};
diff --git a/tests/compiler/dart2js/minify_many_locals_test.dart b/tests/compiler/dart2js/minify_many_locals_test.dart
deleted file mode 100644
index a44002f..0000000
--- a/tests/compiler/dart2js/minify_many_locals_test.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-// Test that parameters keep their names in the output.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-import 'compiler_helper.dart';
-
-// TODO(johnniwinther): This value is some what arbitrary. With the old
-// [ResolvedVisitor] we could handle 2000, with the new [ResolvedVisitor] build
-// upon the [SemanticVisitor] we can handle <=1000. Update (increase) the value
-// when the [SssBuilder] is no longer build upon the [ResolvedVisitor] .
-const int NUMBER_OF_PARAMETERS = 1000;
-
-main() {
-  var buffer = new StringBuffer();
-  buffer.write("foo(");
-  for (int i = 0; i < NUMBER_OF_PARAMETERS; i++) {
-    buffer.write("x$i, ");
-  }
-  buffer.write("x) { int i = ");
-  for (int i = 0; i < NUMBER_OF_PARAMETERS; i++) {
-    buffer.write("x$i+");
-  }
-  buffer.write("$NUMBER_OF_PARAMETERS; return i; }");
-  String code = buffer.toString();
-
-  asyncTest(
-      () => compile(code, entry: 'foo', minify: true).then((String generated) {
-            RegExp re = new RegExp(r"\(a,b,c");
-            Expect.isTrue(re.hasMatch(generated));
-
-            re = new RegExp(r"x,y,z,a0,a1,a2");
-            Expect.isTrue(re.hasMatch(generated));
-
-            re = new RegExp(r"y,z,a0,a1,a2,a3,a4,a5,a6");
-            Expect.isTrue(re.hasMatch(generated));
-
-            re = new RegExp(r"g8,g9,h0,h1");
-            Expect.isTrue(re.hasMatch(generated));
-
-            re = new RegExp(r"z8,z9,aa0,aa1,aa2");
-            Expect.isTrue(re.hasMatch(generated));
-
-            re = new RegExp(r"aa9,ab0,ab1");
-            Expect.isTrue(re.hasMatch(generated));
-
-            re = new RegExp(r"az9,ba0,ba1");
-            Expect.isTrue(re.hasMatch(generated));
-          }));
-}
diff --git a/tests/compiler/dart2js/deferred_mirrors_test.dart b/tests/compiler/dart2js/mirrors/deferred_mirrors_test.dart
similarity index 99%
rename from tests/compiler/dart2js/deferred_mirrors_test.dart
rename to tests/compiler/dart2js/mirrors/deferred_mirrors_test.dart
index 105c847..40a6746 100644
--- a/tests/compiler/dart2js/deferred_mirrors_test.dart
+++ b/tests/compiler/dart2js/mirrors/deferred_mirrors_test.dart
@@ -9,7 +9,7 @@
 import 'dart:async';
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 Future runTest(String mainScript, test) async {
   CompilationResult result = await runCompiler(
diff --git a/tests/compiler/dart2js/import_mirrors_test.dart b/tests/compiler/dart2js/mirrors/import_mirrors_test.dart
similarity index 99%
rename from tests/compiler/dart2js/import_mirrors_test.dart
rename to tests/compiler/dart2js/mirrors/import_mirrors_test.dart
index 37e4ad7..6ab3053 100644
--- a/tests/compiler/dart2js/import_mirrors_test.dart
+++ b/tests/compiler/dart2js/mirrors/import_mirrors_test.dart
@@ -12,7 +12,7 @@
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/diagnostics/messages.dart'
     show MessageKind, MessageTemplate;
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 const DIRECT_IMPORT = const {
   '/main.dart': '''
diff --git a/tests/compiler/dart2js/mirror_final_field_inferrer2_test.dart b/tests/compiler/dart2js/mirrors/mirror_final_field_inferrer2_test.dart
similarity index 87%
rename from tests/compiler/dart2js/mirror_final_field_inferrer2_test.dart
rename to tests/compiler/dart2js/mirrors/mirror_final_field_inferrer2_test.dart
index bedd0e4..092657c 100644
--- a/tests/compiler/dart2js/mirror_final_field_inferrer2_test.dart
+++ b/tests/compiler/dart2js/mirrors/mirror_final_field_inferrer2_test.dart
@@ -6,9 +6,9 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import 'memory_compiler.dart' show runCompiler;
-import 'compiler_helper.dart' show findElement;
-import 'type_mask_test_helper.dart';
+import '../memory_compiler.dart' show runCompiler;
+import '../compiler_helper.dart' show findElement;
+import '../inference/type_mask_test_helper.dart';
 
 const MEMORY_SOURCE_FILES = const <String, String>{
   'main.dart': """
diff --git a/tests/compiler/dart2js/mirror_final_field_inferrer_test.dart b/tests/compiler/dart2js/mirrors/mirror_final_field_inferrer_test.dart
similarity index 87%
rename from tests/compiler/dart2js/mirror_final_field_inferrer_test.dart
rename to tests/compiler/dart2js/mirrors/mirror_final_field_inferrer_test.dart
index 5df3510..6b2af55 100644
--- a/tests/compiler/dart2js/mirror_final_field_inferrer_test.dart
+++ b/tests/compiler/dart2js/mirrors/mirror_final_field_inferrer_test.dart
@@ -6,9 +6,9 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import 'memory_compiler.dart' show runCompiler;
-import 'compiler_helper.dart' show findElement;
-import 'type_mask_test_helper.dart';
+import '../memory_compiler.dart' show runCompiler;
+import '../compiler_helper.dart' show findElement;
+import '../inference/type_mask_test_helper.dart';
 
 const MEMORY_SOURCE_FILES = const <String, String>{
   'main.dart': """
diff --git a/tests/compiler/dart2js/mirror_private_name_inheritance_test.dart b/tests/compiler/dart2js/mirrors/mirror_private_name_inheritance_test.dart
similarity index 92%
rename from tests/compiler/dart2js/mirror_private_name_inheritance_test.dart
rename to tests/compiler/dart2js/mirrors/mirror_private_name_inheritance_test.dart
index 7ac00ad..b017527 100644
--- a/tests/compiler/dart2js/mirror_private_name_inheritance_test.dart
+++ b/tests/compiler/dart2js/mirrors/mirror_private_name_inheritance_test.dart
@@ -6,8 +6,8 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import 'memory_compiler.dart' show runCompiler;
-import 'compiler_helper.dart' show findElement;
+import '../memory_compiler.dart' show runCompiler;
+import '../compiler_helper.dart' show findElement;
 
 const MEMORY_SOURCE_FILES = const <String, String>{
   'main.dart': """
diff --git a/tests/compiler/dart2js/mirror_tree_shaking_test.dart b/tests/compiler/dart2js/mirrors/mirror_tree_shaking_test.dart
similarity index 98%
rename from tests/compiler/dart2js/mirror_tree_shaking_test.dart
rename to tests/compiler/dart2js/mirrors/mirror_tree_shaking_test.dart
index f3340f5..a430c36 100644
--- a/tests/compiler/dart2js/mirror_tree_shaking_test.dart
+++ b/tests/compiler/dart2js/mirrors/mirror_tree_shaking_test.dart
@@ -9,7 +9,7 @@
 import 'package:compiler/src/js_backend/js_backend.dart' show JavaScriptBackend;
 import 'package:compiler/src/js_backend/mirrors_analysis.dart';
 import 'package:expect/expect.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 main() {
   DiagnosticCollector collector = new DiagnosticCollector();
diff --git a/tests/compiler/dart2js/mirrors_used_test.dart b/tests/compiler/dart2js/mirrors/mirrors_used_test.dart
similarity index 99%
rename from tests/compiler/dart2js/mirrors_used_test.dart
rename to tests/compiler/dart2js/mirrors/mirrors_used_test.dart
index 57922bd..f82d85d 100644
--- a/tests/compiler/dart2js/mirrors_used_test.dart
+++ b/tests/compiler/dart2js/mirrors/mirrors_used_test.dart
@@ -11,7 +11,7 @@
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 
-import 'memory_compiler.dart' show runCompiler;
+import '../memory_compiler.dart' show runCompiler;
 
 import 'package:compiler/src/apiimpl.dart' show CompilerImpl;
 
diff --git a/tests/compiler/dart2js/preserve_uris_test.dart b/tests/compiler/dart2js/mirrors/preserve_uris_test.dart
similarity index 95%
rename from tests/compiler/dart2js/preserve_uris_test.dart
rename to tests/compiler/dart2js/mirrors/preserve_uris_test.dart
index fdf660f..8429c81 100644
--- a/tests/compiler/dart2js/preserve_uris_test.dart
+++ b/tests/compiler/dart2js/mirrors/preserve_uris_test.dart
@@ -5,7 +5,7 @@
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/compiler_new.dart';
-import 'memory_compiler.dart' show runCompiler, OutputCollector;
+import '../memory_compiler.dart' show runCompiler, OutputCollector;
 
 const MEMORY_SOURCE_FILES = const <String, String>{
   'main.dart': """
diff --git a/tests/compiler/dart2js/needs_no_such_method_test.dart b/tests/compiler/dart2js/needs_no_such_method_test.dart
index 93a005b..01e467e 100644
--- a/tests/compiler/dart2js/needs_no_such_method_test.dart
+++ b/tests/compiler/dart2js/needs_no_such_method_test.dart
@@ -5,7 +5,7 @@
 import 'dart:async';
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
-import 'package:compiler/src/elements/elements.dart' show ClassElement;
+import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/names.dart';
 import 'package:compiler/src/universe/call_structure.dart';
 import 'package:compiler/src/universe/selector.dart';
@@ -14,7 +14,10 @@
 
 void main() {
   asyncTest(() async {
-    await testClassSets();
+    print('--test from ast---------------------------------------------------');
+    await testClassSets(CompileMode.memory);
+    print('--test from kernel------------------------------------------------');
+    await testClassSets(CompileMode.kernel);
   });
 }
 
@@ -30,10 +33,10 @@
 }
 """;
 
-testClassSets() async {
+testClassSets(CompileMode compileMode) async {
   Selector foo, bar, baz;
   ClosedWorld closedWorld;
-  ClassElement superclass, subclass, subtype;
+  ClassEntity superclass, subclass, subtype;
   String testMode;
 
   Future run(List<String> instantiated) async {
@@ -46,7 +49,7 @@
     testMode = '$instantiated';
 
     var env = await TypeEnvironment.create(CLASSES,
-        mainSource: main.toString(), compileMode: CompileMode.memory);
+        mainSource: main.toString(), compileMode: compileMode);
     foo = new Selector.call(const PublicName('foo'), CallStructure.NO_ARGS);
     bar = new Selector.call(const PublicName('bar'), CallStructure.NO_ARGS);
     baz = new Selector.call(const PublicName('baz'), CallStructure.NO_ARGS);
@@ -57,9 +60,15 @@
     subtype = env.getElement('Subtype');
   }
 
-  void check(ClassElement cls, ClassQuery query, Selector selector,
+  void check(ClassEntity cls, ClassQuery query, Selector selector,
       bool expectedResult) {
-    bool result = closedWorld.needsNoSuchMethod(cls, selector, query);
+    bool result;
+    if (closedWorld.getClassSet(cls) == null) {
+      // The class isn't live, so it can't need a noSuchMethod for [selector].
+      result = false;
+    } else {
+      result = closedWorld.needsNoSuchMethod(cls, selector, query);
+    }
     Expect.equals(
         expectedResult,
         result,
diff --git a/tests/compiler/dart2js/no_constructor_body_test.dart b/tests/compiler/dart2js/no_constructor_body_test.dart
deleted file mode 100644
index 495f2d9..0000000
--- a/tests/compiler/dart2js/no_constructor_body_test.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
-
-const String TEST = r"""
-class A {
-  A.foo() {}
-  A();
-}
-main() {
-  new A();
-  new A.foo();
-}
-""";
-
-main() {
-  asyncTest(() => compileAll(TEST).then((generated) {
-        Expect.isTrue(generated
-            .contains(new RegExp('A: {[ \n]*"\\^": "Object;",[ \n]*static:')));
-      }));
-}
diff --git a/tests/compiler/dart2js/no_duplicate_constructor_body2_test.dart b/tests/compiler/dart2js/no_duplicate_constructor_body2_test.dart
deleted file mode 100644
index ab1aa74..0000000
--- a/tests/compiler/dart2js/no_duplicate_constructor_body2_test.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'compiler_helper.dart';
-import "package:async_helper/async_helper.dart";
-
-const String CODE = """
-var x = 0;
-class A {
-  A() { x++; }
-}
-
-class B extends A {
-  B();
-}
-
-main() {
-  new B();
-  new A();
-}
-""";
-
-main() {
-  asyncTest(() => compileAll(CODE).then((generated) {
-        RegExp regexp = new RegExp(r'A\$0: function');
-        Iterator<Match> matches = regexp.allMatches(generated).iterator;
-        checkNumberOfMatches(matches, 1);
-      }));
-}
diff --git a/tests/compiler/dart2js/no_duplicate_constructor_body_test.dart b/tests/compiler/dart2js/no_duplicate_constructor_body_test.dart
deleted file mode 100644
index 135b87d..0000000
--- a/tests/compiler/dart2js/no_duplicate_constructor_body_test.dart
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
-
-const String CODE = """
-class A {
-  A(String b) { b.length; }
-}
-
-main() {
-  new A("foo");
-}
-""";
-
-main() {
-  asyncTest(() => compileAll(CODE).then((generated) {
-        RegExp regexp = new RegExp(r'\A: {[ \n]*"\^": "[A-Za-z]+;"');
-        Iterator<Match> matches = regexp.allMatches(generated).iterator;
-        checkNumberOfMatches(matches, 1);
-      }));
-}
diff --git a/tests/compiler/dart2js/no_duplicate_stub_test.dart b/tests/compiler/dart2js/no_duplicate_stub_test.dart
deleted file mode 100644
index 5327507..0000000
--- a/tests/compiler/dart2js/no_duplicate_stub_test.dart
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
-
-const String TEST = r"""
-class A {
-  foo({a, b}) {}
-}
-
-class B extends A {
-}
-
-main() {
-  var a = [bar, baz];
-  a[0](new A());
-  a[1](new A());
-}
-
-bar(a) {
-  if (a is A) a.foo(a: 42);
-}
-
-baz(a) {
-  if (a is B) a.foo(a: 42);
-}
-""";
-
-main() {
-  asyncTest(() => compileAll(TEST).then((generated) {
-        RegExp regexp = new RegExp('foo\\\$1\\\$a: function');
-        Iterator<Match> matches = regexp.allMatches(generated).iterator;
-        checkNumberOfMatches(matches, 1);
-      }));
-}
diff --git a/tests/compiler/dart2js/no_such_method_enabled_test.dart b/tests/compiler/dart2js/no_such_method_enabled_test.dart
index ca6310e..74c1826 100644
--- a/tests/compiler/dart2js/no_such_method_enabled_test.dart
+++ b/tests/compiler/dart2js/no_such_method_enabled_test.dart
@@ -3,14 +3,14 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
 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/no_such_method_registry.dart';
 import 'package:compiler/src/world.dart';
 import 'package:expect/expect.dart';
-import 'kernel/compiler_helper.dart';
-import 'compiler_helper.dart';
+import 'memory_compiler.dart';
 
 class NoSuchMethodInfo {
   final String className;
@@ -159,7 +159,7 @@
   const NoSuchMethodTest("""
 class A {
   noSuchMethod(Invocation x) {
-    throw new UnsupportedException();
+    throw new UnsupportedError();
   }
 }
 main() {
@@ -206,63 +206,55 @@
 ];
 
 main() {
-  asyncTest(() async {
+  runTests({bool useKernel}) async {
     for (NoSuchMethodTest test in TESTS) {
       print('---- testing -------------------------------------------------');
       print(test.code);
-      Uri uri = new Uri(scheme: 'source');
-      Compiler compiler = compilerFor(test.code, uri);
-      await compiler.run(uri);
-      checkTest(compiler, test, testComplexReturns: true);
+      CompilationResult result = await runCompiler(
+          memorySourceFiles: {'main.dart': test.code},
+          options: useKernel ? [Flags.useKernel] : []);
+      Compiler compiler = result.compiler;
+      checkTest(compiler, test);
     }
+  }
 
-    List<String> sources = <String>[];
-    for (NoSuchMethodTest test in TESTS) {
-      sources.add(test.code);
-    }
-
-    print('---- preparing for kernel tests ----------------------------------');
-    List<CompileFunction> results = await compileMultiple(sources);
-    for (int index = 0; index < results.length; index++) {
-      print('---- testing with kernel --------------------------------------');
-      print(sources[index]);
-      Compiler compiler = await results[index]();
-      compiler.resolutionWorldBuilder.closeWorld();
-      // Complex returns are computed during inference.
-      checkTest(compiler, TESTS[index], testComplexReturns: false);
-    }
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
   });
 }
 
-checkTest(Compiler compiler, NoSuchMethodTest test, {bool testComplexReturns}) {
-  ElementEnvironment elementEnvironment =
+checkTest(Compiler compiler, NoSuchMethodTest test) {
+  ElementEnvironment frontendEnvironment =
       compiler.frontendStrategy.elementEnvironment;
   NoSuchMethodRegistryImpl registry = compiler.backend.noSuchMethodRegistry;
   NoSuchMethodResolver resolver = registry.internalResolverForTesting;
-  FunctionEntity ObjectNSM = elementEnvironment.lookupClassMember(
+  FunctionEntity ObjectNSM = frontendEnvironment.lookupClassMember(
       compiler.frontendStrategy.commonElements.objectClass, 'noSuchMethod');
-  ClosedWorld closedWorld =
-      compiler.resolutionWorldBuilder.closedWorldForTesting;
-  NoSuchMethodDataImpl data = closedWorld.noSuchMethodData;
+  ClosedWorld backendClosedWorld = compiler.backendClosedWorldForTesting;
+  ElementEnvironment backendEnvironment = backendClosedWorld.elementEnvironment;
+  NoSuchMethodDataImpl data = backendClosedWorld.noSuchMethodData;
 
   // Test [NoSuchMethodResolver] results for each method.
   for (NoSuchMethodInfo info in test.methods) {
-    ClassEntity cls = elementEnvironment.lookupClass(
-        elementEnvironment.mainLibrary, info.className);
+    ClassEntity cls = frontendEnvironment.lookupClass(
+        frontendEnvironment.mainLibrary, info.className);
     Expect.isNotNull(cls, "Class ${info.className} not found.");
     FunctionEntity noSuchMethod =
-        elementEnvironment.lookupClassMember(cls, 'noSuchMethod');
+        frontendEnvironment.lookupClassMember(cls, 'noSuchMethod');
     Expect.isNotNull(noSuchMethod, "noSuchMethod not found in $cls.");
 
     if (info.superClassName == null) {
       Expect.equals(ObjectNSM, resolver.getSuperNoSuchMethod(noSuchMethod));
     } else {
-      ClassEntity superclass = elementEnvironment.lookupClass(
-          elementEnvironment.mainLibrary, info.superClassName);
+      ClassEntity superclass = frontendEnvironment.lookupClass(
+          frontendEnvironment.mainLibrary, info.superClassName);
       Expect.isNotNull(
           superclass, "Superclass ${info.superClassName} not found.");
       FunctionEntity superNoSuchMethod =
-          elementEnvironment.lookupClassMember(superclass, 'noSuchMethod');
+          frontendEnvironment.lookupClassMember(superclass, 'noSuchMethod');
       Expect.isNotNull(
           superNoSuchMethod, "noSuchMethod not found in $superclass.");
       Expect.equals(
@@ -285,39 +277,51 @@
   // the [NoSuchMethodResolver] results which are therefore tested for all
   // methods first.
   for (NoSuchMethodInfo info in test.methods) {
-    ClassEntity cls = elementEnvironment.lookupClass(
-        elementEnvironment.mainLibrary, info.className);
-    Expect.isNotNull(cls, "Class ${info.className} not found.");
-    FunctionEntity noSuchMethod =
-        elementEnvironment.lookupClassMember(cls, 'noSuchMethod');
-    Expect.isNotNull(noSuchMethod, "noSuchMethod not found in $cls.");
+    ClassEntity frontendClass = frontendEnvironment.lookupClass(
+        frontendEnvironment.mainLibrary, info.className);
+    Expect.isNotNull(frontendClass, "Class ${info.className} not found.");
+    FunctionEntity frontendNoSuchMethod =
+        frontendEnvironment.lookupClassMember(frontendClass, 'noSuchMethod');
+    Expect.isNotNull(
+        frontendNoSuchMethod, "noSuchMethod not found in $frontendClass.");
 
-    Expect.equals(info.isDefault, registry.defaultImpls.contains(noSuchMethod),
-        "Unexpected isDefault result on $noSuchMethod.");
+    Expect.equals(
+        info.isDefault,
+        registry.defaultImpls.contains(frontendNoSuchMethod),
+        "Unexpected isDefault result on $frontendNoSuchMethod.");
     Expect.equals(
         info.isThrowing,
-        registry.throwingImpls.contains(noSuchMethod),
-        "Unexpected isThrowing result on $noSuchMethod.");
-    Expect.equals(info.isOther, registry.otherImpls.contains(noSuchMethod),
-        "Unexpected isOther result on $noSuchMethod.");
+        registry.throwingImpls.contains(frontendNoSuchMethod),
+        "Unexpected isThrowing result on $frontendNoSuchMethod.");
+    Expect.equals(
+        info.isOther,
+        registry.otherImpls.contains(frontendNoSuchMethod),
+        "Unexpected isOther result on $frontendNoSuchMethod.");
     Expect.equals(
         info.isNotApplicable,
-        registry.notApplicableImpls.contains(noSuchMethod),
-        "Unexpected isNotApplicable result on $noSuchMethod.");
-    if (testComplexReturns) {
-      Expect.equals(
-          info.isComplexNoReturn,
-          data.complexNoReturnImpls.contains(noSuchMethod),
-          "Unexpected isComplexNoReturn result on $noSuchMethod.");
-      Expect.equals(
-          info.isComplexReturn,
-          data.complexReturningImpls.contains(noSuchMethod),
-          "Unexpected isComplexReturn result on $noSuchMethod.");
-    }
+        registry.notApplicableImpls.contains(frontendNoSuchMethod),
+        "Unexpected isNotApplicable result on $frontendNoSuchMethod.");
+
+    ClassEntity backendClass = backendEnvironment.lookupClass(
+        backendEnvironment.mainLibrary, info.className);
+    Expect.isNotNull(backendClass, "Class ${info.className} not found.");
+    FunctionEntity backendNoSuchMethod =
+        backendEnvironment.lookupClassMember(backendClass, 'noSuchMethod');
+    Expect.isNotNull(
+        backendNoSuchMethod, "noSuchMethod not found in $backendClass.");
+
+    Expect.equals(
+        info.isComplexNoReturn,
+        data.complexNoReturnImpls.contains(backendNoSuchMethod),
+        "Unexpected isComplexNoReturn result on $backendNoSuchMethod.");
+    Expect.equals(
+        info.isComplexReturn,
+        data.complexReturningImpls.contains(backendNoSuchMethod),
+        "Unexpected isComplexReturn result on $backendNoSuchMethod.");
   }
 
   Expect.equals(
       test.isNoSuchMethodUsed,
-      closedWorld.backendUsage.isNoSuchMethodUsed,
+      backendClosedWorld.backendUsage.isNoSuchMethodUsed,
       "Unexpected isNoSuchMethodUsed result.");
 }
diff --git a/tests/compiler/dart2js/null_check_test.dart b/tests/compiler/dart2js/null_check_test.dart
deleted file mode 100644
index 5d82a62..0000000
--- a/tests/compiler/dart2js/null_check_test.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "package:expect/expect.dart";
-import 'compiler_helper.dart';
-import "package:async_helper/async_helper.dart";
-
-const String TEST1 = r"""
-main() {
-  var foo;
-  if (main() == 5) {
-    foo = [0];
-  }
-  return foo[0];
-}
-""";
-
-main() {
-  asyncTest(() => compileAll(TEST1).then((generated) {
-        Expect.isFalse(generated.contains('foo.length'));
-      }));
-}
diff --git a/tests/compiler/dart2js/null_type_test.dart b/tests/compiler/dart2js/null_type_test.dart
deleted file mode 100644
index d64c431..0000000
--- a/tests/compiler/dart2js/null_type_test.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-foo() {
-  var c = null;
-  while (true) c = 1 + c;
-}
-""";
-
-main() {
-  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
-        Expect.isFalse(generated.contains('typeof (void 0)'));
-      }));
-}
diff --git a/tests/compiler/dart2js/old_frontend/analyze_dart2js_test.dart b/tests/compiler/dart2js/old_frontend/analyze_dart2js_test.dart
index 3b15544..7abf3d1 100644
--- a/tests/compiler/dart2js/old_frontend/analyze_dart2js_test.dart
+++ b/tests/compiler/dart2js/old_frontend/analyze_dart2js_test.dart
@@ -8,7 +8,7 @@
 import 'package:compiler/src/filenames.dart';
 import 'package:compiler/src/compiler.dart';
 import 'analyze_helper.dart';
-import '../related_types.dart';
+import 'related_types.dart';
 
 /**
  * Map of whitelisted warnings and errors.
diff --git a/tests/compiler/dart2js/old_frontend/async_await_syntax_test.dart b/tests/compiler/dart2js/old_frontend/async_await_syntax_test.dart
index 1823e93..16be073 100644
--- a/tests/compiler/dart2js/old_frontend/async_await_syntax_test.dart
+++ b/tests/compiler/dart2js/old_frontend/async_await_syntax_test.dart
@@ -5,7 +5,7 @@
 // Test that dart2js produces the expected static type warnings and
 // compile-time errors for these tests.
 
-import '../frontend_checker.dart';
+import 'frontend_checker.dart';
 
 /// Map of test files to run together with their associated whitelist.
 ///
diff --git a/tests/compiler/dart2js/old_frontend/begin_end_token_test.dart b/tests/compiler/dart2js/old_frontend/begin_end_token_test.dart
index 33a6853..0a0ce7a 100644
--- a/tests/compiler/dart2js/old_frontend/begin_end_token_test.dart
+++ b/tests/compiler/dart2js/old_frontend/begin_end_token_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:compiler/src/tree/tree.dart';
 import 'package:expect/expect.dart';
-import '../parser_helper.dart';
+import 'parser_helper.dart';
 
 void testNode(Node node, String expected, String text, [bool hard = true]) {
   var debug = 'text=$text,expected=$expected,node:${node}';
diff --git a/tests/compiler/dart2js/old_frontend/check_members_test.dart b/tests/compiler/dart2js/old_frontend/check_members_test.dart
index 08c4718..26a5a53 100644
--- a/tests/compiler/dart2js/old_frontend/check_members_test.dart
+++ b/tests/compiler/dart2js/old_frontend/check_members_test.dart
@@ -6,7 +6,7 @@
 // bound language tests. This ensures that the analyzer and dart2js agrees
 // on these tests.
 
-import '../warnings_checker.dart';
+import 'warnings_checker.dart';
 
 /// Map from test files to a map of their expected status. If the status map is
 /// `null` no warnings must be missing or unexpected, otherwise the status map
diff --git a/tests/compiler/dart2js/old_frontend/compile_with_empty_libraries_test.dart b/tests/compiler/dart2js/old_frontend/compile_with_empty_libraries_test.dart
index 5b6c354..d16fe9e 100644
--- a/tests/compiler/dart2js/old_frontend/compile_with_empty_libraries_test.dart
+++ b/tests/compiler/dart2js/old_frontend/compile_with_empty_libraries_test.dart
@@ -6,7 +6,7 @@
 /// references to core library definitions.
 
 import 'package:async_helper/async_helper.dart';
-import '../mock_compiler.dart';
+import 'mock_compiler.dart';
 
 const String TEST = r"main() {}";
 
diff --git a/tests/compiler/dart2js/old_frontend/compiler_test.dart b/tests/compiler/dart2js/old_frontend/compiler_test.dart
index a2b10f3..82db42a 100644
--- a/tests/compiler/dart2js/old_frontend/compiler_test.dart
+++ b/tests/compiler/dart2js/old_frontend/compiler_test.dart
@@ -10,7 +10,7 @@
 import "package:compiler/src/old_to_new_api.dart";
 import "package:expect/expect.dart";
 
-import "../mock_compiler.dart";
+import "mock_compiler.dart";
 
 Future testErrorHandling() {
   // Test that compiler.currentElement is set correctly when
diff --git a/tests/compiler/dart2js/diagnose_ambiguous_test.dart b/tests/compiler/dart2js/old_frontend/diagnose_ambiguous_test.dart
similarity index 97%
rename from tests/compiler/dart2js/diagnose_ambiguous_test.dart
rename to tests/compiler/dart2js/old_frontend/diagnose_ambiguous_test.dart
index 268db44..7617530 100644
--- a/tests/compiler/dart2js/diagnose_ambiguous_test.dart
+++ b/tests/compiler/dart2js/old_frontend/diagnose_ambiguous_test.dart
@@ -5,7 +5,7 @@
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/compiler_new.dart' show Diagnostic;
 import 'package:expect/expect.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 void main() {
   DiagnosticCollector collector = new DiagnosticCollector();
diff --git a/tests/compiler/dart2js/duplicate_library_test.dart b/tests/compiler/dart2js/old_frontend/duplicate_library_test.dart
similarity index 98%
rename from tests/compiler/dart2js/duplicate_library_test.dart
rename to tests/compiler/dart2js/old_frontend/duplicate_library_test.dart
index 57800dc..8dce246 100644
--- a/tests/compiler/dart2js/duplicate_library_test.dart
+++ b/tests/compiler/dart2js/old_frontend/duplicate_library_test.dart
@@ -10,7 +10,7 @@
 import 'package:expect/expect.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/diagnostics/messages.dart' show MessageKind;
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 void check(String kind, Iterable<CollectedMessage> messages,
     List<MessageKind> expectedMessageKinds) {
diff --git a/tests/compiler/dart2js/erroneous_element_test.dart b/tests/compiler/dart2js/old_frontend/erroneous_element_test.dart
similarity index 100%
rename from tests/compiler/dart2js/erroneous_element_test.dart
rename to tests/compiler/dart2js/old_frontend/erroneous_element_test.dart
diff --git a/tests/compiler/dart2js/error_token_test.dart b/tests/compiler/dart2js/old_frontend/error_token_test.dart
similarity index 97%
rename from tests/compiler/dart2js/error_token_test.dart
rename to tests/compiler/dart2js/old_frontend/error_token_test.dart
index 6386ca1..7cdd28f 100644
--- a/tests/compiler/dart2js/error_token_test.dart
+++ b/tests/compiler/dart2js/old_frontend/error_token_test.dart
@@ -10,7 +10,7 @@
 import 'package:async_helper/async_helper.dart';
 import "package:compiler/src/diagnostics/messages.dart";
 import 'package:expect/expect.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 Future runTest(String code,
     {MessageKind error, int expectedWarningCount: 0}) async {
diff --git a/tests/compiler/dart2js/find_my_name_test.dart b/tests/compiler/dart2js/old_frontend/find_my_name_test.dart
similarity index 100%
rename from tests/compiler/dart2js/find_my_name_test.dart
rename to tests/compiler/dart2js/old_frontend/find_my_name_test.dart
diff --git a/tests/compiler/dart2js/flatten_test.dart b/tests/compiler/dart2js/old_frontend/flatten_test.dart
similarity index 98%
rename from tests/compiler/dart2js/flatten_test.dart
rename to tests/compiler/dart2js/old_frontend/flatten_test.dart
index 68e97a5..5e08375 100644
--- a/tests/compiler/dart2js/flatten_test.dart
+++ b/tests/compiler/dart2js/old_frontend/flatten_test.dart
@@ -6,7 +6,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import 'type_test_helper.dart';
+import '../type_test_helper.dart';
 import 'package:compiler/src/elements/resolution_types.dart';
 import "package:compiler/src/elements/elements.dart" show ClassElement;
 
diff --git a/tests/compiler/dart2js/frontend_checker.dart b/tests/compiler/dart2js/old_frontend/frontend_checker.dart
similarity index 96%
rename from tests/compiler/dart2js/frontend_checker.dart
rename to tests/compiler/dart2js/old_frontend/frontend_checker.dart
index c210ba2..7699405 100644
--- a/tests/compiler/dart2js/frontend_checker.dart
+++ b/tests/compiler/dart2js/old_frontend/frontend_checker.dart
@@ -11,11 +11,11 @@
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/util/uri_extras.dart' show relativize;
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
-import '../../../tools/testing/dart/multitest.dart'
+import '../../../../tools/testing/dart/multitest.dart'
     show extractTestsFromMultitest;
-import '../../../tools/testing/dart/path.dart' show Path;
+import '../../../../tools/testing/dart/path.dart' show Path;
 
 /// Check the analysis of the multitests in [testFiles] to result in the
 /// expected static warnings and compile-time errors.
diff --git a/tests/compiler/dart2js/generic_method_type_usage_test.dart b/tests/compiler/dart2js/old_frontend/generic_method_type_usage_test.dart
similarity index 98%
rename from tests/compiler/dart2js/generic_method_type_usage_test.dart
rename to tests/compiler/dart2js/old_frontend/generic_method_type_usage_test.dart
index 9354cba..1e34c9a 100644
--- a/tests/compiler/dart2js/generic_method_type_usage_test.dart
+++ b/tests/compiler/dart2js/old_frontend/generic_method_type_usage_test.dart
@@ -16,7 +16,7 @@
 import 'package:async_helper/async_helper.dart';
 import "package:compiler/src/diagnostics/messages.dart";
 import 'package:expect/expect.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 const MEMORY_SOURCE_FILES = const {
   'type_variable_is_dynamic.dart': '''
diff --git a/tests/compiler/dart2js/import_test.dart b/tests/compiler/dart2js/old_frontend/import_test.dart
similarity index 98%
rename from tests/compiler/dart2js/import_test.dart
rename to tests/compiler/dart2js/old_frontend/import_test.dart
index 8684fe1..de6daee 100644
--- a/tests/compiler/dart2js/import_test.dart
+++ b/tests/compiler/dart2js/old_frontend/import_test.dart
@@ -9,7 +9,7 @@
 
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/diagnostics/messages.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 const MEMORY_SOURCE_FILES = const {
   'main.dart': '''
diff --git a/tests/compiler/dart2js/least_upper_bound_language_test.dart b/tests/compiler/dart2js/old_frontend/least_upper_bound_language_test.dart
similarity index 100%
rename from tests/compiler/dart2js/least_upper_bound_language_test.dart
rename to tests/compiler/dart2js/old_frontend/least_upper_bound_language_test.dart
diff --git a/tests/compiler/dart2js/least_upper_bound_test.dart b/tests/compiler/dart2js/old_frontend/least_upper_bound_test.dart
similarity index 99%
rename from tests/compiler/dart2js/least_upper_bound_test.dart
rename to tests/compiler/dart2js/old_frontend/least_upper_bound_test.dart
index 6cdbb02..bb2f12d 100644
--- a/tests/compiler/dart2js/least_upper_bound_test.dart
+++ b/tests/compiler/dart2js/old_frontend/least_upper_bound_test.dart
@@ -9,7 +9,7 @@
 import 'package:compiler/src/elements/resolution_types.dart';
 import 'package:compiler/src/elements/elements.dart' show ClassElement;
 
-import 'type_test_helper.dart';
+import '../type_test_helper.dart';
 
 void main() {
   testInterface1();
diff --git a/tests/compiler/dart2js/library_resolution_test.dart b/tests/compiler/dart2js/old_frontend/library_resolution_test.dart
similarity index 98%
rename from tests/compiler/dart2js/library_resolution_test.dart
rename to tests/compiler/dart2js/old_frontend/library_resolution_test.dart
index 7487a13..34742a3 100644
--- a/tests/compiler/dart2js/library_resolution_test.dart
+++ b/tests/compiler/dart2js/old_frontend/library_resolution_test.dart
@@ -8,7 +8,7 @@
 
 import "dart:async";
 
-import "memory_source_file_helper.dart";
+import "../memory_source_file_helper.dart";
 
 import "package:async_helper/async_helper.dart";
 
diff --git a/tests/compiler/dart2js/lookup_member_test.dart b/tests/compiler/dart2js/old_frontend/lookup_member_test.dart
similarity index 98%
rename from tests/compiler/dart2js/lookup_member_test.dart
rename to tests/compiler/dart2js/old_frontend/lookup_member_test.dart
index 4a4e9f8..30d58c7 100644
--- a/tests/compiler/dart2js/lookup_member_test.dart
+++ b/tests/compiler/dart2js/old_frontend/lookup_member_test.dart
@@ -6,7 +6,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import 'type_test_helper.dart';
+import '../type_test_helper.dart';
 import 'package:compiler/src/elements/resolution_types.dart';
 import "package:compiler/src/elements/elements.dart"
     show ClassElement, MemberSignature;
diff --git a/tests/compiler/dart2js/malformed_uri_test.dart b/tests/compiler/dart2js/old_frontend/malformed_uri_test.dart
similarity index 95%
rename from tests/compiler/dart2js/malformed_uri_test.dart
rename to tests/compiler/dart2js/old_frontend/malformed_uri_test.dart
index f36bef0..a3b52ea 100644
--- a/tests/compiler/dart2js/malformed_uri_test.dart
+++ b/tests/compiler/dart2js/old_frontend/malformed_uri_test.dart
@@ -9,7 +9,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 const MEMORY_SOURCE_FILES = const {
   'main.dart': '''
diff --git a/tests/compiler/dart2js/members_test.dart b/tests/compiler/dart2js/old_frontend/members_test.dart
similarity index 99%
rename from tests/compiler/dart2js/members_test.dart
rename to tests/compiler/dart2js/old_frontend/members_test.dart
index 301ad51..f0f03cb 100644
--- a/tests/compiler/dart2js/members_test.dart
+++ b/tests/compiler/dart2js/old_frontend/members_test.dart
@@ -6,7 +6,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import 'type_test_helper.dart';
+import '../type_test_helper.dart';
 import 'package:compiler/src/elements/resolution_types.dart';
 import "package:compiler/src/elements/elements.dart"
     show ClassElement, MemberSignature;
diff --git a/tests/compiler/dart2js/message_kind_helper.dart b/tests/compiler/dart2js/old_frontend/message_kind_helper.dart
similarity index 99%
rename from tests/compiler/dart2js/message_kind_helper.dart
rename to tests/compiler/dart2js/old_frontend/message_kind_helper.dart
index bd1f19c..0703acd 100644
--- a/tests/compiler/dart2js/message_kind_helper.dart
+++ b/tests/compiler/dart2js/old_frontend/message_kind_helper.dart
@@ -13,7 +13,7 @@
     show MessageKind, MessageTemplate;
 import 'package:compiler/compiler_new.dart' show Diagnostic;
 
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 const String ESCAPE_REGEXP = r'[[\]{}()*+?.\\^$|]';
 
diff --git a/tests/compiler/dart2js/message_kind_test.dart b/tests/compiler/dart2js/old_frontend/message_kind_test.dart
similarity index 100%
rename from tests/compiler/dart2js/message_kind_test.dart
rename to tests/compiler/dart2js/old_frontend/message_kind_test.dart
diff --git a/tests/compiler/dart2js/message_span_test.dart b/tests/compiler/dart2js/old_frontend/message_span_test.dart
similarity index 97%
rename from tests/compiler/dart2js/message_span_test.dart
rename to tests/compiler/dart2js/old_frontend/message_span_test.dart
index 5fe26df..9fff9b5 100644
--- a/tests/compiler/dart2js/message_span_test.dart
+++ b/tests/compiler/dart2js/old_frontend/message_span_test.dart
@@ -8,8 +8,8 @@
 import 'package:compiler/src/diagnostics/messages.dart';
 import 'package:compiler/src/io/source_file.dart';
 import 'package:expect/expect.dart';
-import 'memory_compiler.dart';
-import 'memory_source_file_helper.dart';
+import '../memory_compiler.dart';
+import '../memory_source_file_helper.dart';
 
 const List<Test> TESTS = const <Test>[
   const Test('''
diff --git a/tests/compiler/dart2js/metadata_test.dart b/tests/compiler/dart2js/old_frontend/metadata_test.dart
similarity index 98%
rename from tests/compiler/dart2js/metadata_test.dart
rename to tests/compiler/dart2js/old_frontend/metadata_test.dart
index d1e94a6..9130973 100644
--- a/tests/compiler/dart2js/metadata_test.dart
+++ b/tests/compiler/dart2js/old_frontend/metadata_test.dart
@@ -5,7 +5,7 @@
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/constants/values.dart' show PrimitiveConstantValue;
 import 'package:expect/expect.dart';
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 import 'package:compiler/src/parser/partial_elements.dart'
     show PartialMetadataAnnotation;
 import 'package:compiler/src/diagnostics/diagnostic_listener.dart'
@@ -168,7 +168,7 @@
 
     Uri uri = new Uri(scheme: 'source', path: 'main.dart');
 
-    var compiler = compilerFor(source, uri, analyzeOnly: true)
+    var compiler = mockCompilerFor(source, uri, analyzeOnly: true)
       ..registerSource(partUri, partSource)
       ..registerSource(libUri, libSource);
 
diff --git a/tests/compiler/dart2js/minimal_resolution_test.dart b/tests/compiler/dart2js/old_frontend/minimal_resolution_test.dart
similarity index 98%
rename from tests/compiler/dart2js/minimal_resolution_test.dart
rename to tests/compiler/dart2js/old_frontend/minimal_resolution_test.dart
index a571f55..5cebcf2 100644
--- a/tests/compiler/dart2js/minimal_resolution_test.dart
+++ b/tests/compiler/dart2js/old_frontend/minimal_resolution_test.dart
@@ -10,7 +10,7 @@
 import 'package:compiler/src/elements/elements.dart';
 import 'package:compiler/src/enqueue.dart';
 import 'package:expect/expect.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 main() {
   asyncTest(() async {
diff --git a/tests/compiler/dart2js/missing_file_test.dart b/tests/compiler/dart2js/old_frontend/missing_file_test.dart
similarity index 98%
rename from tests/compiler/dart2js/missing_file_test.dart
rename to tests/compiler/dart2js/old_frontend/missing_file_test.dart
index e34315c..92c4891 100644
--- a/tests/compiler/dart2js/missing_file_test.dart
+++ b/tests/compiler/dart2js/old_frontend/missing_file_test.dart
@@ -10,7 +10,7 @@
 import 'package:async_helper/async_helper.dart';
 import "package:compiler/src/diagnostics/messages.dart";
 import 'package:expect/expect.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 const MEMORY_SOURCE_FILES = const {
   'main.dart': '''
diff --git a/tests/compiler/dart2js/mixin_language_test.dart b/tests/compiler/dart2js/old_frontend/mixin_language_test.dart
similarity index 100%
rename from tests/compiler/dart2js/mixin_language_test.dart
rename to tests/compiler/dart2js/old_frontend/mixin_language_test.dart
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/old_frontend/mock_compiler.dart
similarity index 98%
rename from tests/compiler/dart2js/mock_compiler.dart
rename to tests/compiler/dart2js/old_frontend/mock_compiler.dart
index 2f8e494..239aceb 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/old_frontend/mock_compiler.dart
@@ -42,9 +42,9 @@
     show AstDeferredLoadTask;
 
 import 'mock_libraries.dart';
-import 'diagnostic_helper.dart';
+import '../diagnostic_helper.dart';
 
-export 'diagnostic_helper.dart';
+export '../diagnostic_helper.dart';
 
 final Uri PATCH_CORE = new Uri(scheme: 'patch', path: 'core');
 
@@ -372,7 +372,7 @@
 }
 
 // TODO(herhut): Disallow warnings and errors during compilation by default.
-MockCompiler compilerFor(String code, Uri uri,
+MockCompiler mockCompilerFor(String code, Uri uri,
     {bool analyzeAll: false,
     bool analyzeOnly: false,
     Map<String, String> coreSource,
diff --git a/tests/compiler/dart2js/mock_libraries.dart b/tests/compiler/dart2js/old_frontend/mock_libraries.dart
similarity index 100%
rename from tests/compiler/dart2js/mock_libraries.dart
rename to tests/compiler/dart2js/old_frontend/mock_libraries.dart
diff --git a/tests/compiler/dart2js/no_such_method_codegen_test.dart b/tests/compiler/dart2js/old_frontend/no_such_method_codegen_test.dart
similarity index 90%
rename from tests/compiler/dart2js/no_such_method_codegen_test.dart
rename to tests/compiler/dart2js/old_frontend/no_such_method_codegen_test.dart
index b40d311..4c531f5 100644
--- a/tests/compiler/dart2js/no_such_method_codegen_test.dart
+++ b/tests/compiler/dart2js/old_frontend/no_such_method_codegen_test.dart
@@ -11,7 +11,7 @@
 // As a consequence, all operator[] had to be compiled, and due to
 // missing backend dependencies, some of them were not resolved.
 
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String TEST = '''
 main() => foo[42];
@@ -19,6 +19,6 @@
 
 main() {
   Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri);
+  var compiler = mockCompilerFor(TEST, uri);
   compiler.run(uri);
 }
diff --git a/tests/compiler/dart2js/null_is_bottom_test.dart b/tests/compiler/dart2js/old_frontend/null_is_bottom_test.dart
similarity index 100%
rename from tests/compiler/dart2js/null_is_bottom_test.dart
rename to tests/compiler/dart2js/old_frontend/null_is_bottom_test.dart
diff --git a/tests/compiler/dart2js/options_helper.dart b/tests/compiler/dart2js/old_frontend/options_helper.dart
similarity index 100%
rename from tests/compiler/dart2js/options_helper.dart
rename to tests/compiler/dart2js/old_frontend/options_helper.dart
diff --git a/tests/compiler/dart2js/override_inheritance_test.dart b/tests/compiler/dart2js/old_frontend/override_inheritance_test.dart
similarity index 99%
rename from tests/compiler/dart2js/override_inheritance_test.dart
rename to tests/compiler/dart2js/old_frontend/override_inheritance_test.dart
index 1390b50..271b498 100644
--- a/tests/compiler/dart2js/override_inheritance_test.dart
+++ b/tests/compiler/dart2js/old_frontend/override_inheritance_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:async';
 import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 import 'package:compiler/src/resolution/class_members.dart' show MembersCreator;
 
 main() {
diff --git a/tests/compiler/dart2js/package_root_test.dart b/tests/compiler/dart2js/old_frontend/package_root_test.dart
similarity index 96%
rename from tests/compiler/dart2js/package_root_test.dart
rename to tests/compiler/dart2js/old_frontend/package_root_test.dart
index 1552a81..2e60fc9 100644
--- a/tests/compiler/dart2js/package_root_test.dart
+++ b/tests/compiler/dart2js/old_frontend/package_root_test.dart
@@ -14,8 +14,8 @@
 import 'package:compiler/src/diagnostics/messages.dart' show MessageKind;
 import 'package:package_config/packages.dart';
 
-import 'memory_compiler.dart';
-import 'memory_source_file_helper.dart';
+import '../memory_compiler.dart';
+import '../memory_source_file_helper.dart';
 
 const MEMORY_SOURCE_FILES = const {
   'main.dart': '''
diff --git a/tests/compiler/dart2js/parser_helper.dart b/tests/compiler/dart2js/old_frontend/parser_helper.dart
similarity index 100%
rename from tests/compiler/dart2js/parser_helper.dart
rename to tests/compiler/dart2js/old_frontend/parser_helper.dart
diff --git a/tests/compiler/dart2js/parser_test.dart b/tests/compiler/dart2js/old_frontend/parser_test.dart
similarity index 100%
rename from tests/compiler/dart2js/parser_test.dart
rename to tests/compiler/dart2js/old_frontend/parser_test.dart
diff --git a/tests/compiler/dart2js/part_of_test.dart b/tests/compiler/dart2js/old_frontend/part_of_test.dart
similarity index 100%
rename from tests/compiler/dart2js/part_of_test.dart
rename to tests/compiler/dart2js/old_frontend/part_of_test.dart
diff --git a/tests/compiler/dart2js/partial_parser_test.dart b/tests/compiler/dart2js/old_frontend/partial_parser_test.dart
similarity index 100%
rename from tests/compiler/dart2js/partial_parser_test.dart
rename to tests/compiler/dart2js/old_frontend/partial_parser_test.dart
diff --git a/tests/compiler/dart2js/patch_test.dart b/tests/compiler/dart2js/old_frontend/patch_test.dart
similarity index 100%
rename from tests/compiler/dart2js/patch_test.dart
rename to tests/compiler/dart2js/old_frontend/patch_test.dart
diff --git a/tests/compiler/dart2js/platform_consistency_test.dart b/tests/compiler/dart2js/old_frontend/platform_consistency_test.dart
similarity index 100%
rename from tests/compiler/dart2js/platform_consistency_test.dart
rename to tests/compiler/dart2js/old_frontend/platform_consistency_test.dart
diff --git a/tests/compiler/dart2js/private_test.dart b/tests/compiler/dart2js/old_frontend/private_test.dart
similarity index 100%
rename from tests/compiler/dart2js/private_test.dart
rename to tests/compiler/dart2js/old_frontend/private_test.dart
diff --git a/tests/compiler/dart2js/proxy_test.dart b/tests/compiler/dart2js/old_frontend/proxy_test.dart
similarity index 100%
rename from tests/compiler/dart2js/proxy_test.dart
rename to tests/compiler/dart2js/old_frontend/proxy_test.dart
diff --git a/tests/compiler/dart2js/reexport_handled_test.dart b/tests/compiler/dart2js/old_frontend/reexport_handled_test.dart
similarity index 100%
rename from tests/compiler/dart2js/reexport_handled_test.dart
rename to tests/compiler/dart2js/old_frontend/reexport_handled_test.dart
diff --git a/tests/compiler/dart2js/related_types.dart b/tests/compiler/dart2js/old_frontend/related_types.dart
similarity index 99%
rename from tests/compiler/dart2js/related_types.dart
rename to tests/compiler/dart2js/old_frontend/related_types.dart
index 9ae51bc..9a64e22 100644
--- a/tests/compiler/dart2js/related_types.dart
+++ b/tests/compiler/dart2js/old_frontend/related_types.dart
@@ -18,7 +18,7 @@
 import 'package:compiler/src/universe/call_structure.dart';
 import 'package:compiler/src/universe/selector.dart';
 import 'package:compiler/src/world.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 main(List<String> arguments) async {
   if (arguments.isNotEmpty) {
diff --git a/tests/compiler/dart2js/related_types_test.dart b/tests/compiler/dart2js/old_frontend/related_types_test.dart
similarity index 99%
rename from tests/compiler/dart2js/related_types_test.dart
rename to tests/compiler/dart2js/old_frontend/related_types_test.dart
index ecc40d0..dda4a76 100644
--- a/tests/compiler/dart2js/related_types_test.dart
+++ b/tests/compiler/dart2js/old_frontend/related_types_test.dart
@@ -11,7 +11,7 @@
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/diagnostics/messages.dart';
 import 'package:compiler/src/elements/elements.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 import 'related_types.dart';
 
diff --git a/tests/compiler/dart2js/resolution_test.dart b/tests/compiler/dart2js/old_frontend/resolution_test.dart
similarity index 96%
rename from tests/compiler/dart2js/resolution_test.dart
rename to tests/compiler/dart2js/old_frontend/resolution_test.dart
index 1d90607..ed0c2c9 100644
--- a/tests/compiler/dart2js/resolution_test.dart
+++ b/tests/compiler/dart2js/old_frontend/resolution_test.dart
@@ -8,7 +8,7 @@
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 import 'package:compiler/src/apiimpl.dart';
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const String NO_RUNTIME_TYPE = r"""
 import 'dart:core' as prefix;
@@ -94,7 +94,7 @@
 
 void test(String code, void check(CompilerImpl compiler)) {
   Uri uri = new Uri(scheme: 'source');
-  dynamic compiler = compilerFor(code, uri);
+  dynamic compiler = mockCompilerFor(code, uri);
   asyncTest(() => compiler.run(uri).then((_) {
         check(compiler);
       }));
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/old_frontend/resolver_test.dart
similarity index 99%
rename from tests/compiler/dart2js/resolver_test.dart
rename to tests/compiler/dart2js/old_frontend/resolver_test.dart
index bf3427d..41a7f81 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/old_frontend/resolver_test.dart
@@ -20,8 +20,8 @@
 import 'package:compiler/src/universe/use.dart';
 import 'package:compiler/src/universe/world_impact.dart';
 
-import 'compiler_helper.dart';
-import 'link_helper.dart';
+import '../compiler_helper.dart';
+import '../link_helper.dart';
 import 'parser_helper.dart';
 
 Node buildIdentifier(String name) => new Identifier(scan(name));
@@ -1165,7 +1165,7 @@
 
 Future compileScript(String source) {
   Uri uri = new Uri(scheme: 'source');
-  MockCompiler compiler = compilerFor(source, uri);
+  MockCompiler compiler = mockCompilerFor(source, uri);
   compiler.diagnosticHandler = createHandler(compiler, source);
   return compiler.run(uri).then((_) {
     return compiler;
diff --git a/tests/compiler/dart2js/scanner_offset_length_test.dart b/tests/compiler/dart2js/old_frontend/scanner_offset_length_test.dart
similarity index 100%
rename from tests/compiler/dart2js/scanner_offset_length_test.dart
rename to tests/compiler/dart2js/old_frontend/scanner_offset_length_test.dart
diff --git a/tests/compiler/dart2js/scanner_test.dart b/tests/compiler/dart2js/old_frontend/scanner_test.dart
similarity index 100%
rename from tests/compiler/dart2js/scanner_test.dart
rename to tests/compiler/dart2js/old_frontend/scanner_test.dart
diff --git a/tests/compiler/dart2js/semantic_visitor_test.dart b/tests/compiler/dart2js/old_frontend/semantic_visitor_test.dart
similarity index 99%
rename from tests/compiler/dart2js/semantic_visitor_test.dart
rename to tests/compiler/dart2js/old_frontend/semantic_visitor_test.dart
index f6720b5..f72ea16 100644
--- a/tests/compiler/dart2js/semantic_visitor_test.dart
+++ b/tests/compiler/dart2js/old_frontend/semantic_visitor_test.dart
@@ -22,7 +22,7 @@
 import 'package:compiler/src/tree/tree.dart';
 import 'package:compiler/src/universe/call_structure.dart' show CallStructure;
 import 'package:compiler/src/universe/selector.dart' show Selector;
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 
 part 'semantic_visitor_test_send_data.dart';
 part 'semantic_visitor_test_send_visitor.dart';
diff --git a/tests/compiler/dart2js/semantic_visitor_test_decl_data.dart b/tests/compiler/dart2js/old_frontend/semantic_visitor_test_decl_data.dart
similarity index 100%
rename from tests/compiler/dart2js/semantic_visitor_test_decl_data.dart
rename to tests/compiler/dart2js/old_frontend/semantic_visitor_test_decl_data.dart
diff --git a/tests/compiler/dart2js/semantic_visitor_test_decl_visitor.dart b/tests/compiler/dart2js/old_frontend/semantic_visitor_test_decl_visitor.dart
similarity index 100%
rename from tests/compiler/dart2js/semantic_visitor_test_decl_visitor.dart
rename to tests/compiler/dart2js/old_frontend/semantic_visitor_test_decl_visitor.dart
diff --git a/tests/compiler/dart2js/semantic_visitor_test_send_data.dart b/tests/compiler/dart2js/old_frontend/semantic_visitor_test_send_data.dart
similarity index 100%
rename from tests/compiler/dart2js/semantic_visitor_test_send_data.dart
rename to tests/compiler/dart2js/old_frontend/semantic_visitor_test_send_data.dart
diff --git a/tests/compiler/dart2js/semantic_visitor_test_send_visitor.dart b/tests/compiler/dart2js/old_frontend/semantic_visitor_test_send_visitor.dart
similarity index 100%
rename from tests/compiler/dart2js/semantic_visitor_test_send_visitor.dart
rename to tests/compiler/dart2js/old_frontend/semantic_visitor_test_send_visitor.dart
diff --git a/tests/compiler/dart2js/size_test.dart b/tests/compiler/dart2js/old_frontend/size_test.dart
similarity index 96%
rename from tests/compiler/dart2js/size_test.dart
rename to tests/compiler/dart2js/old_frontend/size_test.dart
index 39bc9e9..af9817a 100644
--- a/tests/compiler/dart2js/size_test.dart
+++ b/tests/compiler/dart2js/old_frontend/size_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import "compiler_helper.dart";
+import "../compiler_helper.dart";
 
 const String TEST = "main() => [];";
 
diff --git a/tests/compiler/dart2js/space_test.dart b/tests/compiler/dart2js/old_frontend/space_test.dart
similarity index 81%
rename from tests/compiler/dart2js/space_test.dart
rename to tests/compiler/dart2js/old_frontend/space_test.dart
index 9146f27..0f01fab 100644
--- a/tests/compiler/dart2js/space_test.dart
+++ b/tests/compiler/dart2js/old_frontend/space_test.dart
@@ -9,8 +9,8 @@
 main() {
   Uri currentDirectory = Uri.base;
   Uri script = currentDirectory.resolveUri(Platform.script);
-  Uri libraryRoot = script.resolve('../../../sdk/');
-  Directory.current = script.resolve("path with spaces").toFilePath();
+  Uri libraryRoot = script.resolve('../../../../sdk/');
+  Directory.current = script.resolve("../path with spaces").toFilePath();
 
   return dart2js.main([
     "--library-root=${libraryRoot.toFilePath()}",
diff --git a/tests/compiler/dart2js/tag_mapping_test.dart b/tests/compiler/dart2js/old_frontend/tag_mapping_test.dart
similarity index 97%
rename from tests/compiler/dart2js/tag_mapping_test.dart
rename to tests/compiler/dart2js/old_frontend/tag_mapping_test.dart
index 8080942..9eff042 100644
--- a/tests/compiler/dart2js/tag_mapping_test.dart
+++ b/tests/compiler/dart2js/old_frontend/tag_mapping_test.dart
@@ -6,7 +6,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 
 const MAIN_CODE = """
 import 'library.dart';
diff --git a/tests/compiler/dart2js/type_checker_test.dart b/tests/compiler/dart2js/old_frontend/type_checker_test.dart
similarity index 100%
rename from tests/compiler/dart2js/type_checker_test.dart
rename to tests/compiler/dart2js/old_frontend/type_checker_test.dart
diff --git a/tests/compiler/dart2js/type_equals_test.dart b/tests/compiler/dart2js/old_frontend/type_equals_test.dart
similarity index 98%
rename from tests/compiler/dart2js/type_equals_test.dart
rename to tests/compiler/dart2js/old_frontend/type_equals_test.dart
index 45b36a0..f36b82e 100644
--- a/tests/compiler/dart2js/type_equals_test.dart
+++ b/tests/compiler/dart2js/old_frontend/type_equals_test.dart
@@ -5,7 +5,7 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import 'package:compiler/src/elements/resolution_types.dart';
-import "compiler_helper.dart";
+import "../compiler_helper.dart";
 
 test(compiler, String name1, String name2, {bool expect}) {
   Expect.isTrue((expect != null), 'required parameter "expect" not given');
@@ -53,7 +53,7 @@
 
 void main() {
   var uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(r"""
+  var compiler = mockCompilerFor(r"""
       typedef int Typedef1<X,Y>(String s1);
       typedef void Typedef2<Z>(T t1, S s1);
 
diff --git a/tests/compiler/dart2js/type_order_test.dart b/tests/compiler/dart2js/old_frontend/type_order_test.dart
similarity index 98%
rename from tests/compiler/dart2js/type_order_test.dart
rename to tests/compiler/dart2js/old_frontend/type_order_test.dart
index 91b688b..be592dc 100644
--- a/tests/compiler/dart2js/type_order_test.dart
+++ b/tests/compiler/dart2js/old_frontend/type_order_test.dart
@@ -6,7 +6,7 @@
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import 'type_test_helper.dart';
+import '../type_test_helper.dart';
 import 'package:compiler/src/elements/resolution_types.dart';
 import "package:compiler/src/elements/elements.dart"
     show ClassElement, TypedefElement;
diff --git a/tests/compiler/dart2js/type_promotion_test.dart b/tests/compiler/dart2js/old_frontend/type_promotion_test.dart
similarity index 100%
rename from tests/compiler/dart2js/type_promotion_test.dart
rename to tests/compiler/dart2js/old_frontend/type_promotion_test.dart
diff --git a/tests/compiler/dart2js/type_variable_bound_test.dart b/tests/compiler/dart2js/old_frontend/type_variable_bound_test.dart
similarity index 97%
rename from tests/compiler/dart2js/type_variable_bound_test.dart
rename to tests/compiler/dart2js/old_frontend/type_variable_bound_test.dart
index c5d25f6..e01e18e 100644
--- a/tests/compiler/dart2js/type_variable_bound_test.dart
+++ b/tests/compiler/dart2js/old_frontend/type_variable_bound_test.dart
@@ -4,13 +4,13 @@
 
 import 'dart:async';
 import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
+import '../compiler_helper.dart';
 import "package:expect/expect.dart";
 
 Future compile(String source) {
   Uri uri = Uri.parse('test:code');
-  var compiler =
-      compilerFor(source, uri, analyzeOnly: true, enableTypeAssertions: true);
+  var compiler = mockCompilerFor(source, uri,
+      analyzeOnly: true, enableTypeAssertions: true);
   compiler.diagnosticHandler = createHandler(compiler, source);
   return compiler.run(uri).then((_) {
     return compiler;
diff --git a/tests/compiler/dart2js/type_variable_occurrence_test.dart b/tests/compiler/dart2js/old_frontend/type_variable_occurrence_test.dart
similarity index 98%
rename from tests/compiler/dart2js/type_variable_occurrence_test.dart
rename to tests/compiler/dart2js/old_frontend/type_variable_occurrence_test.dart
index 11b73b2..a85c307 100644
--- a/tests/compiler/dart2js/type_variable_occurrence_test.dart
+++ b/tests/compiler/dart2js/old_frontend/type_variable_occurrence_test.dart
@@ -10,7 +10,7 @@
 import 'package:compiler/src/elements/types.dart';
 import 'package:expect/expect.dart';
 
-import 'type_test_helper.dart';
+import '../type_test_helper.dart';
 
 void main() {
   testTypeVariableOccurrence();
diff --git a/tests/compiler/dart2js/unparser2_test.dart b/tests/compiler/dart2js/old_frontend/unparser2_test.dart
similarity index 100%
rename from tests/compiler/dart2js/unparser2_test.dart
rename to tests/compiler/dart2js/old_frontend/unparser2_test.dart
diff --git a/tests/compiler/dart2js/unparser_test.dart b/tests/compiler/dart2js/old_frontend/unparser_test.dart
similarity index 100%
rename from tests/compiler/dart2js/unparser_test.dart
rename to tests/compiler/dart2js/old_frontend/unparser_test.dart
diff --git a/tests/compiler/dart2js/warnings_checker.dart b/tests/compiler/dart2js/old_frontend/warnings_checker.dart
similarity index 98%
rename from tests/compiler/dart2js/warnings_checker.dart
rename to tests/compiler/dart2js/old_frontend/warnings_checker.dart
index 9e98299..b974781 100644
--- a/tests/compiler/dart2js/warnings_checker.dart
+++ b/tests/compiler/dart2js/old_frontend/warnings_checker.dart
@@ -9,7 +9,7 @@
 import 'dart:io';
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import 'memory_compiler.dart';
+import '../memory_compiler.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/filenames.dart';
 import 'package:compiler/src/io/source_file.dart';
diff --git a/tests/compiler/dart2js/output_type_test.dart b/tests/compiler/dart2js/output_type_test.dart
index 915096e..85338dd 100644
--- a/tests/compiler/dart2js/output_type_test.dart
+++ b/tests/compiler/dart2js/output_type_test.dart
@@ -37,9 +37,12 @@
 CompileFunc oldCompileFunc;
 
 Future<Null> test(List<String> arguments, List<String> expectedOutput,
-    {List<String> groupOutputs: const <String>[]}) async {
+    {List<String> groupOutputs: const <String>[], bool useKernel}) async {
   List<String> options = new List<String>.from(arguments)
-    ..add("--library-root=${Platform.script.resolve('../../../sdk/')}");
+    ..add("--library-root=${Uri.base.resolve('sdk/')}");
+  if (useKernel) {
+    options.add(Flags.useKernel);
+  }
   print('--------------------------------------------------------------------');
   print('dart2js ${options.join(' ')}');
   TestRandomAccessFileOutputProvider outputProvider;
@@ -64,13 +67,15 @@
     Expect.notEquals(0, countBefore - outputs.length,
         'Expected output group ${outputGroup}');
   }
-  Expect.setEquals(expectedOutput, outputs);
+  Expect.setEquals(expectedOutput, outputs,
+      "Output mismatch. Expected $expectedOutput, actual $outputs.");
 }
 
 main() {
   enableWriteString = false;
   oldCompileFunc = compileFunc;
-  asyncTest(() async {
+
+  runTests({bool useKernel}) async {
     PRINT_GRAPH = true;
     TRACE_FILTER_PATTERN_FOR_TEST = 'x';
     await test([
@@ -86,27 +91,48 @@
       'dart.cfg', // From TRACE_FILTER_PATTERN_FOR_TEST
     ], groupOutputs: [
       '.dot', // From PRINT_GRAPH
-    ]);
+    ], useKernel: useKernel);
+
     PRINT_GRAPH = false;
     TRACE_FILTER_PATTERN_FOR_TEST = null;
-    await test([
-      'tests/compiler/dart2js/data/deferred_helper.dart',
-      Flags.useContentSecurityPolicy,
-      Flags.useMultiSourceInfo,
-    ], [
+    List<String> additionOptionals = <String>[];
+    List<String> expectedOutput = <String>[
       'out.js',
       'out.js.map',
-      'out.js.map.v2',
       'out.js_1.part.js',
       'out.js_1.part.js.map',
-      'out.js_1.part.js.map.v2',
-    ]);
-    await test([
-      'tests/compiler/dart2js/data/deferred_helper.dart',
-      '--out=custom.data',
-      '--resolve-only',
-    ], [
-      'custom.data',
-    ]);
+    ];
+    if (!useKernel) {
+      // Option --use-multi-source-info is only supported for the old frontend.
+      expectedOutput.add('out.js.map.v2');
+      expectedOutput.add('out.js_1.part.js.map.v2');
+      additionOptionals.add(Flags.useMultiSourceInfo);
+    }
+
+    await test(
+        [
+          'tests/compiler/dart2js/data/deferred_helper.dart',
+          Flags.useContentSecurityPolicy,
+        ]..addAll(additionOptionals),
+        expectedOutput,
+        useKernel: useKernel);
+
+    if (!useKernel) {
+      // Option --resolve-only is only supported for the old frontend.
+      await test([
+        'tests/compiler/dart2js/data/deferred_helper.dart',
+        '--out=custom.data',
+        '--resolve-only',
+      ], [
+        'custom.data',
+      ], useKernel: useKernel);
+    }
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
   });
 }
diff --git a/tests/compiler/dart2js/parameter_phi_elimination_test.dart b/tests/compiler/dart2js/parameter_phi_elimination_test.dart
deleted file mode 100644
index a60d874..0000000
--- a/tests/compiler/dart2js/parameter_phi_elimination_test.dart
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Regression test. Failed due to trying to detach an HLocal twice.
-
-// VMOptions=--enable_asserts
-
-import 'compiler_helper.dart';
-
-const String SOURCE = r"""
-bool baz(int a, int b) {
-  while (a == b || a < b) {
-    a = a + b;
-  }
-  return a == b;
-}
-""";
-
-main() {
-  compile(SOURCE, entry: "baz");
-}
diff --git a/tests/compiler/dart2js/pretty_parameter_test.dart b/tests/compiler/dart2js/pretty_parameter_test.dart
deleted file mode 100644
index e075e68..0000000
--- a/tests/compiler/dart2js/pretty_parameter_test.dart
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-// Test that parameters keep their names in the output.
-
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String FOO = r"""
-void foo(var a, var b) {
-}
-""";
-
-const String BAR = r"""
-void bar(var eval, var $eval) {
-}
-""";
-
-const String PARAMETER_AND_TEMP = r"""
-void bar(var t0, var b) {
-  {
-    var t0 = 2;
-    if (b) {
-      bar(1, 2);
-      t0 = 4;
-    } else {
-      t0 = 3;
-    }
-    print(t0);
-  }
-  print(t0);
-}
-""";
-
-const String NO_LOCAL = r"""
-foo(bar, baz) {
-  if (bar) {
-    baz = 2;
-  } else {
-    baz = 3;
-  }
-  return baz;
-}
-""";
-
-const String MULTIPLE_PHIS_ONE_LOCAL = r"""
-foo(param1, param2, param3) {
-  var a = 2;
-  if (param1) {
-    if (param2) {
-      if (param3) {
-        a = 42;
-      }
-      print(a);
-    }
-    print(a);
-  }
-  print(a);
-}
-""";
-
-const String PARAMETER_INIT = r"""
-int foo(var start, bool test) {
-  var result = start;
-  if (test) {
-    foo(1, 2);
-    result = 42;
-  }
-  print(result);
-}
-""";
-
-main() {
-  asyncTest(() => Future.wait([
-        compile(FOO, entry: 'foo', check: (String generated) {
-          Expect.isTrue(generated.contains(r"function(a, b) {"));
-        }),
-        compile(BAR, entry: 'bar', check: (String generated) {
-          Expect.isTrue(generated.contains(r"function($eval, $$eval) {"));
-        }),
-        compile(PARAMETER_AND_TEMP, entry: 'bar', check: (String generated) {
-          Expect.isTrue(generated.contains(r"print(t00)"));
-          // Check that the second 't0' got another name.
-          Expect.isTrue(generated.contains(r"print(t01)"));
-        }),
-        compile(MULTIPLE_PHIS_ONE_LOCAL, entry: 'foo',
-            check: (String generated) {
-          Expect.isTrue(generated.contains("var a;"));
-          // Check that there is only one var declaration.
-          checkNumberOfMatches(
-              new RegExp("var").allMatches(generated).iterator, 1);
-        }),
-        compile(NO_LOCAL, entry: 'foo', check: (String generated) {
-          Expect.isFalse(generated.contains('var'));
-        }),
-        compile(PARAMETER_INIT, entry: 'foo', check: (String generated) {
-          // Check that there is only one var declaration.
-          checkNumberOfMatches(
-              new RegExp("var").allMatches(generated).iterator, 1);
-        }),
-      ]));
-}
diff --git a/tests/compiler/dart2js/quarantined/http_test.dart b/tests/compiler/dart2js/quarantined/http_test.dart
index d28805f..309fc5f 100644
--- a/tests/compiler/dart2js/quarantined/http_test.dart
+++ b/tests/compiler/dart2js/quarantined/http_test.dart
@@ -15,7 +15,7 @@
 import 'package:expect/expect.dart';
 import 'package:path/path.dart' as path;
 
-import '../launch_helper.dart' show launchDart2Js;
+import '../end_to_end/launch_helper.dart' show launchDart2Js;
 
 Uri pathOfData = Platform.script.resolve('http_launch_data/');
 Directory tempDir;
diff --git a/tests/compiler/dart2js/receiver_type_test.dart b/tests/compiler/dart2js/receiver_type_test.dart
index aeb6e81..c408182 100644
--- a/tests/compiler/dart2js/receiver_type_test.dart
+++ b/tests/compiler/dart2js/receiver_type_test.dart
@@ -13,7 +13,9 @@
 
 main() {
   asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
     await runTest(CompileMode.memory);
+    print('--test from kernel------------------------------------------------');
     await runTest(CompileMode.kernel);
   });
 }
diff --git a/tests/compiler/dart2js/redundant_phi_eliminator_test.dart b/tests/compiler/dart2js/redundant_phi_eliminator_test.dart
deleted file mode 100644
index da81d94..0000000
--- a/tests/compiler/dart2js/redundant_phi_eliminator_test.dart
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-void foo(bar) {
-  var toBeRemoved = 1;
-  if (bar) {
-  } else {
-  }
-  print(toBeRemoved);
-}
-""";
-
-const String TEST_TWO = r"""
-void foo() {
-  var temp = 0;
-  var toBeRemoved = temp;
-  for (var i = 0; i == 0; i = i + 1) {
-    toBeRemoved = temp;
-  }
-  print(toBeRemoved);
-}
-""";
-
-main() {
-  asyncTest(() => Future.wait([
-        compile(TEST_ONE, entry: 'foo', check: (String generated) {
-          RegExp regexp = new RegExp("toBeRemoved");
-          Expect.isTrue(!regexp.hasMatch(generated));
-        }),
-        compile(TEST_TWO, entry: 'foo', check: (String generated) {
-          RegExp regexp = new RegExp("toBeRemoved");
-          Expect.isTrue(!regexp.hasMatch(generated));
-          regexp = new RegExp("temp");
-          Expect.isTrue(!regexp.hasMatch(generated));
-        }),
-      ]));
-}
diff --git a/tests/compiler/dart2js/regress_10231_test.dart b/tests/compiler/dart2js/regress_10231_test.dart
deleted file mode 100644
index 9031931..0000000
--- a/tests/compiler/dart2js/regress_10231_test.dart
+++ /dev/null
@@ -1,34 +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.
-
-// Regression test for http://dartbug.com/10231.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'codegen_helper.dart';
-
-void main() {
-  asyncTest(() => generate(SOURCE).then((result) {
-        var code = result['test'];
-        Expect.isNotNull(code);
-        Expect.equals(0, new RegExp('add').allMatches(code).length);
-        Expect.equals(3, new RegExp('\\+').allMatches(code).length);
-      }));
-}
-
-const String SOURCE = """
-test(a, b, c, d) {
-  if (a is !num) throw 'a not num';
-  if (b is !num) throw 'b not num';
-  if (c is !num) throw 'c not num';
-  if (d is !num) throw 'd not num';
-  return a + b + c + d;
-}
-
-main() {
-  test(1, 2, 3, 4);
-  test('x', 'y', 'z', 'w');
-  test([], {}, [], {});
-}
-""";
diff --git a/tests/compiler/dart2js/side_effect_tdiv_regression_test.dart b/tests/compiler/dart2js/side_effect_tdiv_regression_test.dart
deleted file mode 100644
index 8db68c8..0000000
--- a/tests/compiler/dart2js/side_effect_tdiv_regression_test.dart
+++ /dev/null
@@ -1,29 +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 'compiler_helper.dart';
-
-const String TEST = r'''
-class A {
-  var field = 42;
-}
-main() {
-  var a = new A();
-  var b = [42, -1];
-  // Force a setter on [field].
-  if (false) a.field = 12;
-  var c = a.field;
-  print(b[0] ~/ b[1]);
-  return c + a.field;
-}
-''';
-
-void main() {
-  asyncTest(() => compileAll(TEST).then((generated) {
-        Expect.isTrue(generated.contains('return c + c;'));
-      }));
-}
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart
index ef9957d..70a70c1 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart
@@ -315,26 +315,31 @@
     if (options.contains(Flags.disableInlining)) {
       if (verbose) print('Inlining disabled');
     }
-    api.CompilerImpl compiler = await compilerFor(
+    CompilationResult result = await runCompiler(
+        entryPoint: inputUri,
         outputProvider: outputProvider,
         // TODO(johnniwinther): Use [verbose] to avoid showing diagnostics.
         options: ['--out=$targetUri', '--source-map=$sourceMapFileUri']
-          ..addAll(options));
-
-    JavaScriptBackend backend = compiler.backend;
-    dynamic handler = compiler.handler;
-    SourceFileProvider sourceFileProvider = handler.provider;
-    sourceFileManager =
-        new ProviderSourceFileManager(sourceFileProvider, outputProvider);
-    RecordingSourceInformationStrategy strategy =
-        new RecordingSourceInformationStrategy(
-            backend.sourceInformationStrategy);
-    backend.sourceInformationStrategy = strategy;
-    await compiler.run(inputUri);
-    if (compiler.compilationFailed) {
+          ..addAll(options),
+        beforeRun: (compiler) {
+          JavaScriptBackend backend = compiler.backend;
+          dynamic handler = compiler.handler;
+          SourceFileProvider sourceFileProvider = handler.provider;
+          sourceFileManager =
+              new ProviderSourceFileManager(sourceFileProvider, outputProvider);
+          RecordingSourceInformationStrategy strategy =
+              new RecordingSourceInformationStrategy(
+                  backend.sourceInformationStrategy);
+          backend.sourceInformationStrategy = strategy;
+        });
+    if (!result.isSuccess) {
       throw "Compilation failed.";
     }
 
+    api.CompilerImpl compiler = result.compiler;
+    JavaScriptBackend backend = compiler.backend;
+    RecordingSourceInformationStrategy strategy =
+        backend.sourceInformationStrategy;
     SourceMapInfo mainSourceMapInfo;
     Map<MemberEntity, SourceMapInfo> elementSourceMapInfos =
         <MemberEntity, SourceMapInfo>{};
@@ -509,7 +514,8 @@
           .trim();
     }
 
-    void addLocation(SourceLocation sourceLocation, String jsCode) {
+    void addLocation(
+        SourceLocation sourceLocation, String jsCode, int targetOffset) {
       if (sourceLocation == null) {
         if (expectInfo) {
           SourceInformation sourceInformation = node.sourceInformation;
@@ -519,23 +525,24 @@
             sourceLocation = sourceInformation.sourceLocations.first;
             dartCode = dartCodeFromSourceLocation(sourceLocation);
           }
-          codePoints.add(new CodePoint(kind, jsCode, sourceLocation, dartCode,
+          codePoints.add(new CodePoint(
+              kind, jsCode, targetOffset, sourceLocation, dartCode,
               isMissing: true));
         }
       } else {
-        codePoints.add(new CodePoint(kind, jsCode, sourceLocation,
+        codePoints.add(new CodePoint(kind, jsCode, targetOffset, sourceLocation,
             dartCodeFromSourceLocation(sourceLocation)));
       }
     }
 
     Map<int, List<SourceLocation>> locationMap = nodeMap[node];
     if (locationMap == null) {
-      addLocation(null, nodeToString(node));
+      addLocation(null, nodeToString(node), null);
     } else {
       locationMap.forEach((int targetOffset, List<SourceLocation> locations) {
         String jsCode = nodeToString(node);
         for (SourceLocation location in locations) {
-          addLocation(location, jsCode);
+          addLocation(location, jsCode, targetOffset);
         }
       });
     }
@@ -546,11 +553,13 @@
 class CodePoint {
   final StepKind kind;
   final String jsCode;
+  final int targetOffset;
   final SourceLocation sourceLocation;
   final String dartCode;
   final bool isMissing;
 
-  CodePoint(this.kind, this.jsCode, this.sourceLocation, this.dartCode,
+  CodePoint(this.kind, this.jsCode, this.targetOffset, this.sourceLocation,
+      this.dartCode,
       {this.isMissing: false});
 
   String toString() {
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_html_helper.dart b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_html_helper.dart
index 10259db..e4b8c95 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_html_helper.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_html_helper.dart
@@ -623,7 +623,7 @@
       buffer.write('<tr>');
     }
     buffer.write('<td>${codePoint.kind}</td>');
-    buffer.write('<td class="code">${jsCode}</td>');
+    buffer.write('<td class="code">${codePoint.targetOffset}:${jsCode}</td>');
     if (codePoint.sourceLocation == null) {
       //buffer.write('<td></td>');
     } else {
diff --git a/tests/compiler/dart2js/location_collector_test.dart b/tests/compiler/dart2js/sourcemaps/location_collector_test.dart
similarity index 98%
rename from tests/compiler/dart2js/location_collector_test.dart
rename to tests/compiler/dart2js/sourcemaps/location_collector_test.dart
index d34f636..f044fba 100644
--- a/tests/compiler/dart2js/location_collector_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/location_collector_test.dart
@@ -9,7 +9,7 @@
 import 'package:expect/expect.dart';
 import 'package:kernel/ast.dart' show Location;
 
-import 'output_collector.dart';
+import '../output_collector.dart';
 
 test(List events, Map<int, List<int>> expectedPositions) {
   BufferedOutputSink sink = new BufferedOutputSink();
diff --git a/tests/compiler/dart2js/sourcemaps/source_mapping2_test.dart b/tests/compiler/dart2js/sourcemaps/source_mapping2_test.dart
index 4076263..bd74cbe 100644
--- a/tests/compiler/dart2js/sourcemaps/source_mapping2_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/source_mapping2_test.dart
@@ -12,9 +12,9 @@
 import 'package:compiler/src/js_emitter/full_emitter/emitter.dart' as full
     show Emitter;
 
-import '../mock_compiler.dart';
+import '../old_frontend/mock_compiler.dart';
 
-Future<CodeBuffer> compileAll(SourceFile sourceFile) {
+Future<CodeOutput> compileAll(SourceFile sourceFile) {
   MockCompiler compiler = new MockCompiler.internal();
   Uri uri = new Uri(path: sourceFile.filename);
   compiler.sourceFiles[uri.toString()] = sourceFile;
@@ -23,8 +23,6 @@
     // TODO(floitsch): the outputBuffers are only accessible in the full
     // emitter.
     full.Emitter fullEmitter = backend.emitter.emitter;
-    // CodeOutput isn't assignable to CodeBuffer.
-    // ignore: RETURN_OF_INVALID_TYPE_FROM_CLOSURE
     return fullEmitter
         .outputBuffers[compiler.backend.outputUnitData.mainOutputUnit];
   });
diff --git a/tests/compiler/dart2js/sourcemaps/stepping/print.dart b/tests/compiler/dart2js/sourcemaps/stepping/print.dart
new file mode 100644
index 0000000..934bbc9
--- /dev/null
+++ b/tests/compiler/dart2js/sourcemaps/stepping/print.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  /*bl*/
+  /*s:1*/ print("Hello, World!");
+/*s:2*/
+}
diff --git a/tests/compiler/dart2js/sourcemaps/stepping/print_class_fields.dart b/tests/compiler/dart2js/sourcemaps/stepping/print_class_fields.dart
new file mode 100644
index 0000000..dec796a
--- /dev/null
+++ b/tests/compiler/dart2js/sourcemaps/stepping/print_class_fields.dart
@@ -0,0 +1,33 @@
+// 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.
+
+/*Debugger:stepOver*/
+main() {
+  /*bl*/
+  Foo foo = new /*s:1*/ Foo(1, 2);
+  /*s:2*/ print(foo.x);
+  /*s:3*/ print(foo.y);
+  /*s:4*/ print(foo.z);
+
+  foo = new /*s:5*/ Foo.named();
+  /*s:6*/ print(foo.x);
+  /*s:7*/ print(foo.y);
+  /*s:8*/ print(foo.z);
+}
+
+class Foo {
+  var x, y, z;
+
+  Foo(a, b)
+      : this.x = a,
+        this.y = b {
+    z = a + b;
+  }
+
+  Foo.named()
+      : this.x = 42,
+        this.y = 88 {
+    z = 28;
+  }
+}
diff --git a/tests/compiler/dart2js/sourcemaps/stepping/print_top_level_invoke.dart b/tests/compiler/dart2js/sourcemaps/stepping/print_top_level_invoke.dart
new file mode 100644
index 0000000..147fa73
--- /dev/null
+++ b/tests/compiler/dart2js/sourcemaps/stepping/print_top_level_invoke.dart
@@ -0,0 +1,12 @@
+// 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.
+
+main() {
+  print(/*bc:1*/ foo());
+}
+
+foo() {
+  /*s:2*/ return "foo!";
+/*s:3*/
+}
diff --git a/tests/compiler/dart2js/sourcemaps/stepping/top_level_invoke.dart b/tests/compiler/dart2js/sourcemaps/stepping/top_level_invoke.dart
new file mode 100644
index 0000000..7108d8e
--- /dev/null
+++ b/tests/compiler/dart2js/sourcemaps/stepping/top_level_invoke.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  /*bl*/
+  /*s:1*/ foo();
+/*s:4*/
+}
+
+foo() {
+  /*s:2*/ print("hello");
+/*s:3*/
+}
diff --git a/tests/compiler/dart2js/sourcemaps/stepping_test.dart b/tests/compiler/dart2js/sourcemaps/stepping_test.dart
new file mode 100644
index 0000000..a0bf75e
--- /dev/null
+++ b/tests/compiler/dart2js/sourcemaps/stepping_test.dart
@@ -0,0 +1,96 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:args/args.dart';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/compiler_new.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/dart2js.dart' as entry;
+import 'package:expect/expect.dart';
+import 'package:sourcemap_testing/src/annotated_code_helper.dart';
+import 'package:sourcemap_testing/src/stepping_helper.dart';
+
+void main(List<String> args) {
+  ArgParser argParser = new ArgParser(allowTrailingOptions: true);
+  argParser.addFlag('debug', abbr: 'd', defaultsTo: false);
+  argParser.addFlag('verbose', abbr: 'v', defaultsTo: false);
+  argParser.addFlag('continued', abbr: 'c', defaultsTo: false);
+  ArgResults argResults = argParser.parse(args);
+  Directory dataDir =
+      new Directory.fromUri(Platform.script.resolve('stepping'));
+  asyncTest(() async {
+    bool continuing = false;
+    await for (FileSystemEntity entity in dataDir.list()) {
+      String name = entity.uri.pathSegments.last;
+      if (argResults.rest.isNotEmpty &&
+          !argResults.rest.contains(name) &&
+          !continuing) {
+        continue;
+      }
+      print('----------------------------------------------------------------');
+      print('Checking ${entity.uri}');
+      print('----------------------------------------------------------------');
+      String annotatedCode = await new File.fromUri(entity.uri).readAsString();
+      await testAnnotatedCode(annotatedCode,
+          verbose: argResults['verbose'], debug: argResults['debug']);
+      if (argResults['continued']) {
+        continuing = true;
+      }
+    }
+  });
+}
+
+const String astMarker = 'ast.';
+const String kernelMarker = 'kernel.';
+
+Future testAnnotatedCode(String code,
+    {bool debug: false, bool verbose: false}) async {
+  AnnotatedCode annotatedCode =
+      new AnnotatedCode.fromText(code, commentStart, commentEnd);
+  print(annotatedCode.sourceCode);
+  Map<String, AnnotatedCode> split =
+      splitByPrefixes(annotatedCode, [astMarker, kernelMarker]);
+  print('---from ast---------------------------------------------------------');
+  await runTest(split[astMarker], astMarker, debug: debug, verbose: verbose);
+  print('---from kernel------------------------------------------------------');
+  await runTest(split[kernelMarker], kernelMarker,
+      debug: debug, verbose: verbose);
+}
+
+Future runTest(AnnotatedCode annotatedCode, String config,
+    {bool debug: false,
+    bool verbose: false,
+    List<String> options: const <String>[]}) async {
+  Directory dir = Directory.systemTemp.createTempSync('stepping_test');
+  String path = dir.path;
+  String inputFile = '$path/test.dart';
+  new File(inputFile).writeAsStringSync(annotatedCode.sourceCode);
+  String outputFile = '$path/js.js';
+  List<String> arguments = <String>[
+    '--out=$outputFile',
+    inputFile,
+    Flags.disableInlining,
+  ];
+  if (config == kernelMarker) {
+    arguments.add(Flags.useKernel);
+  } else {
+    arguments.add(Flags.useNewSourceInfo);
+  }
+  CompilationResult compilationResult = await entry.internalMain(arguments);
+  Expect.isTrue(compilationResult.isSuccess);
+  List<String> scriptD8Command = [
+    'sdk/lib/_internal/js_runtime/lib/preambles/d8.js',
+    outputFile
+  ];
+  ProcessResult result = runD8AndStep(dir.path, annotatedCode, scriptD8Command);
+  List<String> d8output = result.stdout.split("\n");
+  if (verbose) {
+    d8output.forEach(print);
+  }
+  checkD8Steps(dir.path, d8output, annotatedCode, debug: debug);
+  dir.deleteSync(recursive: true);
+}
diff --git a/tests/compiler/dart2js/ssa_phi_codegen_test.dart b/tests/compiler/dart2js/ssa_phi_codegen_test.dart
deleted file mode 100644
index 57ee1b0..0000000
--- a/tests/compiler/dart2js/ssa_phi_codegen_test.dart
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-// Test that parameters keep their names in the output.
-
-import 'dart:async';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-void foo(bar) {
-  var a = 1;
-  if (bar) {
-    a = 2;
-  } else {
-    a = 3;
-  }
-  print(a);
-  print(a);
-}
-""";
-
-const String TEST_TWO = r"""
-void main() {
-  var t = 0;
-  for (var i = 0; i == 0; i = i + 1) {
-    t = t + 10;
-  }
-  print(t);
-}
-""";
-
-const String TEST_THREE = r"""
-foo(b, c, d) {
-  var val = 42;
-  if (b) {
-    c = c && d;
-    if (c) {
-      val = 43;
-    }
-  }
-  return val;
-}
-""";
-
-const String TEST_FOUR = r"""
-foo() {
-  var a = true;
-  var b = false;
-  for (var i = 0; a; i = i + 1) {
-    if (i == 9) a = false;
-    for (var j = 0; b; j = j + 1) {
-      if (j == 9) b = false;
-    }
-  }
-  print(a);
-  print(b);
-}
-""";
-
-const String TEST_FIVE = r"""
-void main() {
-  var hash = 0;
-  for (var i = 0; i == 0; i = i + 1) {
-    hash = hash + 10;
-    hash = hash + 42;
-  }
-  print(t);
-}
-""";
-
-main() {
-  asyncTest(() => Future.wait([
-        compileAndMatchFuzzy(TEST_ONE, 'foo', "var x = x === true \\? 2 : 3;"),
-        compileAndMatchFuzzy(TEST_ONE, 'foo', "print\\(x\\);"),
-
-        compileAndMatchFuzzy(TEST_TWO, 'main', "x \\+= 10"),
-        compileAndMatchFuzzy(TEST_TWO, 'main', "\\+\\+x"),
-
-        // Check that we don't have 'd = d' (using regexp back references).
-        compileAndDoNotMatchFuzzy(TEST_THREE, 'foo', '(x) = \1'),
-        compileAndMatchFuzzy(TEST_THREE, 'foo', 'return x'),
-        // Check that a store just after the declaration of the local
-        // only generates one instruction.
-        compileAndMatchFuzzy(TEST_THREE, 'foo', 'x = 42'),
-
-        compileAndDoNotMatchFuzzy(TEST_FOUR, 'foo', '(x) = \1;'),
-
-        compileAndDoNotMatch(TEST_FIVE, 'main', new RegExp('hash0')),
-      ]));
-}
diff --git a/tests/compiler/dart2js/static_closure_test.dart b/tests/compiler/dart2js/static_closure_test.dart
deleted file mode 100644
index f242806..0000000
--- a/tests/compiler/dart2js/static_closure_test.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Test that static functions are closurized as expected.
-
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
-
-main() {
-  asyncTest(() => compileAll(r'''main() { print(main); }''').then((code) {
-        // At some point, we will have to closurize global functions
-        // differently, at which point this test will break. Then it is time
-        // to implement a way to call a Dart closure from JS foreign
-        // functions.
-
-        // If this test fail, please take a look at the use of
-        // toStringWrapper in captureStackTrace in js_helper.dart.
-        Expect.isTrue(
-            code.contains(
-                new RegExp(r'print\([$A-Z]+\.lib___main\$closure\(\)\);')),
-            code);
-      }));
-}
diff --git a/tests/compiler/dart2js/strength_eq_test.dart b/tests/compiler/dart2js/strength_eq_test.dart
deleted file mode 100644
index ffc082e..0000000
--- a/tests/compiler/dart2js/strength_eq_test.dart
+++ /dev/null
@@ -1,31 +0,0 @@
-// 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.
-// Test constant folding on numbers.
-
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String CODE = """
-class A {
-  var link;
-}
-int foo(x) {
-  if (new DateTime.now().millisecondsSinceEpoch == 42) return null;
-  var a = new A();
-  if (new DateTime.now().millisecondsSinceEpoch == 42) return a;
-  a.link = a;
-  return a;
-}
-void main() {
-  var x = foo(0);
-  return x == x.link;
-}
-""";
-
-main() {
-  // The `==` is strengthened to a HIdentity instruction.  The HIdentity follows
-  // `x.link`, so x cannot be `null`.
-  var compare = new RegExp(r'x === x\.get\$link\(\)');
-  asyncTest(() => compileAndMatch(CODE, 'main', compare));
-}
diff --git a/tests/compiler/dart2js/string_add_test.dart b/tests/compiler/dart2js/string_add_test.dart
deleted file mode 100644
index 0a045c7..0000000
--- a/tests/compiler/dart2js/string_add_test.dart
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
-
-main() {
-  asyncTest(
-      () => compileAll(r'''main() { return "foo" + "bar"; }''').then((code) {
-            Expect.isTrue(!code.contains(r'$add'));
-          }));
-}
diff --git a/tests/compiler/dart2js/string_escapes_test.dart b/tests/compiler/dart2js/string_escapes_test.dart
deleted file mode 100644
index b792e7d..0000000
--- a/tests/compiler/dart2js/string_escapes_test.dart
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-import 'compiler_helper.dart';
-
-// Test that the compiler handles string literals containing line terminators.
-
-Future<String> compileExpression(String expression) {
-  var source = "foo() { return $expression; }";
-  return compile(source, entry: "foo");
-}
-
-main() {
-  asyncTest(() => Future.wait([
-        compileExpression("''' \n\r\u2028\u2029'''").then((String generated) {
-          Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
-              generated.contains(r"'\r\u2028\u2029'"));
-        }),
-        compileExpression("r''' \n\r\u2028\u2029'''").then((String generated) {
-          Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
-              generated.contains(r"'\r\u2028\u2029'"));
-        }),
-        compileExpression("r''' \r\n\u2028\u2029'''").then((String generated) {
-          Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
-              generated.contains(r"'\u2028\u2029'"));
-        }),
-        compileExpression("r''' \r\u2028\u2029'''").then((String generated) {
-          Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
-              generated.contains(r"'\u2028\u2029'"));
-        }),
-        compileExpression("r''' \n\u2028\u2029'''").then((String generated) {
-          Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
-              generated.contains(r"'\u2028\u2029'"));
-        }),
-        compileExpression("r'''\t\t      \t\t  \t\t  \t \t \n\r\u2028\u2029'''")
-            .then((String generated) {
-          Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
-              generated.contains(r"'\r\u2028\u2029'"));
-        }),
-        compileExpression(
-                "r'''\\\t\\\t \\   \\  \t\\\t  \t \\\n\r\u2028\u2029'''")
-            .then((String generated) {
-          Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
-              generated.contains(r"'\r\u2028\u2029'"));
-        }),
-        compileExpression(
-                "r'''\t\t      \t\t  \t\t  \t \t \\\n\r\u2028\u2029'''")
-            .then((String generated) {
-          Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
-              generated.contains(r"'\r\u2028\u2029'"));
-        }),
-        compileExpression(
-                "r'''\\\t\\\t \\   \\  \t\\\t   \\\r\n\u2028\u2029'''")
-            .then((String generated) {
-          Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
-              generated.contains(r"'\u2028\u2029'"));
-        }),
-        compileExpression("r'''\\\t\\\t \\   \\  \t\\\t   \\\r\u2028\u2029'''")
-            .then((String generated) {
-          Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
-              generated.contains(r"'\u2028\u2029'"));
-        }),
-        compileExpression("'\u2028\u2029'").then((String generated) {
-          Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
-              generated.contains(r"'\u2028\u2029'"));
-        }),
-      ]));
-}
diff --git a/tests/compiler/dart2js/string_interpolation_test.dart b/tests/compiler/dart2js/string_interpolation_test.dart
deleted file mode 100644
index ae49b85..0000000
--- a/tests/compiler/dart2js/string_interpolation_test.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
-
-main() {
-  asyncTest(() =>
-      compileAll(r'''main() { return "${2}${true}${'a'}${3.14}"; }''')
-          .then((code) {
-        Expect.isTrue(code.contains(r'2truea3.14'));
-      }));
-
-  asyncTest(() =>
-      compileAll(r'''main() { return "foo ${new Object()}"; }''').then((code) {
-        Expect.isFalse(code.contains(r'$add'));
-      }));
-}
diff --git a/tests/compiler/dart2js/subtype_test.dart b/tests/compiler/dart2js/subtype_test.dart
index 7f0c366..719a484 100644
--- a/tests/compiler/dart2js/subtype_test.dart
+++ b/tests/compiler/dart2js/subtype_test.dart
@@ -14,7 +14,9 @@
 
 void main() {
   asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
     await runTests(CompileMode.memory);
+    print('--test from kernel------------------------------------------------');
     await runTests(CompileMode.kernel);
   });
 }
diff --git a/tests/compiler/dart2js/subtypeset_test.dart b/tests/compiler/dart2js/subtypeset_test.dart
index 780d0ca..9a43016 100644
--- a/tests/compiler/dart2js/subtypeset_test.dart
+++ b/tests/compiler/dart2js/subtypeset_test.dart
@@ -9,12 +9,21 @@
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import 'type_test_helper.dart';
-import 'package:compiler/src/elements/elements.dart' show ClassElement;
+import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/universe/class_set.dart';
 import 'package:compiler/src/world.dart';
 
 void main() {
-  asyncTest(() => TypeEnvironment.create(r"""
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(CompileMode.memory);
+    print('--test from kernel------------------------------------------------');
+    await runTests(CompileMode.kernel);
+  });
+}
+
+runTests(CompileMode compileMode) async {
+  var env = await TypeEnvironment.create(r"""
       ///        A
       ///       / \
       ///      B   C
@@ -34,45 +43,44 @@
       class I implements H {}
       """, mainSource: r"""
       main() {
-        new A();
+        new A().call;
         new C();
         new D();
         new E();
         new F();
         new G();
       }
-      """, compileMode: CompileMode.memory).then((env) {
-        ClosedWorld world = env.closedWorld;
+      """, compileMode: compileMode);
+  ClosedWorld world = env.closedWorld;
 
-        ClassElement A = env.getElement("A");
-        ClassElement B = env.getElement("B");
-        ClassElement C = env.getElement("C");
-        ClassElement D = env.getElement("D");
-        ClassElement E = env.getElement("E");
-        ClassElement F = env.getElement("F");
-        ClassElement G = env.getElement("G");
-        ClassElement H = env.getElement("H");
-        ClassElement I = env.getElement("I");
+  ClassEntity A = env.getElement("A");
+  ClassEntity B = env.getElement("B");
+  ClassEntity C = env.getElement("C");
+  ClassEntity D = env.getElement("D");
+  ClassEntity E = env.getElement("E");
+  ClassEntity F = env.getElement("F");
+  ClassEntity G = env.getElement("G");
+  ClassEntity H = env.getElement("H");
+  ClassEntity I = env.getElement("I");
 
-        void checkClass(ClassElement cls, List<ClassElement> subtypes) {
-          ClassSet node = world.getClassSet(cls);
-          print('$cls:\n${node}');
-          Expect.listEquals(
-              subtypes,
-              node.subtypes().toList(),
-              "Unexpected subtypes of ${cls.name}:\n"
-              "Expected: $subtypes\n"
-              "Found   : ${node.subtypes().toList()}");
-        }
+  void checkClass(ClassEntity cls, List<ClassEntity> subtypes) {
+    ClassSet node = world.getClassSet(cls);
+    print('$cls:\n${node}');
+    Expect.setEquals(
+        subtypes,
+        node.subtypes().toList(),
+        "Unexpected subtypes of ${cls.name}:\n"
+        "Expected: $subtypes\n"
+        "Found   : ${node.subtypes().toList()}");
+  }
 
-        checkClass(A, [A, C, E, F, G, B, D, H, I]);
-        checkClass(B, [B, D, E]);
-        checkClass(C, [C, E, F, G, H, B, D, I]);
-        checkClass(D, [D]);
-        checkClass(E, [E]);
-        checkClass(F, [F]);
-        checkClass(G, [G]);
-        checkClass(H, [H, I]);
-        checkClass(I, [I]);
-      }));
+  checkClass(A, [A, C, E, F, G, B, D, H, I]);
+  checkClass(B, [B, D, E]);
+  checkClass(C, [C, E, F, G, H, B, D, I]);
+  checkClass(D, [D]);
+  checkClass(E, [E]);
+  checkClass(F, [F]);
+  checkClass(G, [G]);
+  checkClass(H, [H, I]);
+  checkClass(I, [I]);
 }
diff --git a/tests/compiler/dart2js/top_level_closure_tree_shake_test.dart b/tests/compiler/dart2js/top_level_closure_tree_shake_test.dart
deleted file mode 100644
index 158a1bc..0000000
--- a/tests/compiler/dart2js/top_level_closure_tree_shake_test.dart
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-main() {
-  var f = use;
-  if (false) {
-    // This statement and the use of 'foo' should be optimized away, causing
-    // 'foo' to be absent from the final code.
-    f(foo);
-  }
-  f(bar);
-}
-
-foo() => 'Tarantula!';
-bar() => 'Coelacanth!';
-
-use(x) {
-  print(x());
-}
-""";
-
-main() {
-  asyncTest(() => Future.wait([
-        compileAll(TEST_ONE).then((String generated) {
-          Expect.isFalse(
-              generated.contains('Tarantula!'), "failed to remove 'foo'");
-          Expect.isTrue(generated.contains('Coelacanth!'));
-        }),
-      ]));
-}
diff --git a/tests/compiler/dart2js/tree_shaking_test.dart b/tests/compiler/dart2js/tree_shaking_test.dart
deleted file mode 100644
index ceec29c..0000000
--- a/tests/compiler/dart2js/tree_shaking_test.dart
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
-
-const String TEST = r"""
-class A {
-  foo() => bar();
-  bar() => 42;
-}
-class B extends A {
-  bar() => 54;
-}
-class C implements A {
-  bar() => 68;
-}
-main() {
-  new A();
-  new B();
-  new C();
-  new A().foo();
-}
-""";
-
-void main() {
-  asyncTest(() => compileAll(TEST).then((generated) {
-        Expect.isTrue(generated.contains('return 42'));
-        Expect.isTrue(generated.contains('return 54'));
-        Expect.isFalse(generated.contains('return 68'));
-      }));
-}
diff --git a/tests/compiler/dart2js/trust_type_annotations2_test.dart b/tests/compiler/dart2js/trust_type_annotations2_test.dart
deleted file mode 100644
index 71ad9ca..0000000
--- a/tests/compiler/dart2js/trust_type_annotations2_test.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-// 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:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'memory_compiler.dart';
-
-const MEMORY_SOURCE_FILES = const {
-  'main.dart': '''
-
-foo(int x, int y) {
-  return x + y;
-}
-
-main (x, y) {
-  if (x != null) {
-    if (y != null) {
-      return foo(x, y);
-    }
-  }
-}
-''',
-};
-
-main() {
-  asyncTest(() async {
-    var result = await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        options: ['--trust-type-annotations']);
-    var compiler = result.compiler;
-    var element = compiler.frontendStrategy.elementEnvironment.mainFunction;
-    var code = compiler.backend.getGeneratedCode(element);
-    Expect.isTrue(code.contains('+'), code);
-  });
-}
diff --git a/tests/compiler/dart2js/trust_type_annotations_test.dart b/tests/compiler/dart2js/trust_type_annotations_test.dart
deleted file mode 100644
index a804f0e..0000000
--- a/tests/compiler/dart2js/trust_type_annotations_test.dart
+++ /dev/null
@@ -1,80 +0,0 @@
-// 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:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'compiler_helper.dart';
-
-const String TEST = """
-class A {
-  int aField;
-
-  A(this.aField);
-
-  // Test return type annotation.
-  int foo(a) => a;
-  // Test parameter type annotation.
-  faa (int a) => a;
-  // Test annotations on locals.
-  baz(x) {
-    int y = x;
-    return y;
-  }
-  // Test tear-off closure type annotations.
-  int bar(x) => x;
-  int tear(x) {
-    var torn = bar;
-    // Have torn escape through closure to disable tracing.
-    var fail = (() => torn)();
-    return fail(x);
-  }
-}
-
-main () {
-  var a = new A("42");
-  print(a.aField);
-  print(a.foo("42"));
-  print(a.foo(42));
-  print(a.faa("42"));
-  print(a.faa(42));
-  print(a.baz("42"));
-  print(a.baz(42));
-  // Test trusting types of tear off closures.
-  print(a.tear("42"));
-  print(a.tear(42));
-}
-""";
-
-void main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(TEST, uri, trustTypeAnnotations: true);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var typesInferrer = compiler.globalInference.typesInferrerInternal;
-        var closedWorld = typesInferrer.closedWorld;
-
-        ClassElement classA = findElement(compiler, "A");
-
-        checkReturn(String name, TypeMask type) {
-          MemberElement element = classA.lookupMember(name);
-          var mask = typesInferrer.getReturnTypeOfMember(element);
-          Expect.isTrue(type.containsMask(mask, closedWorld));
-        }
-
-        checkType(String name, type) {
-          MemberElement element = classA.lookupMember(name);
-          Expect.isTrue(type.containsMask(
-              typesInferrer.getTypeOfMember(element), closedWorld));
-        }
-
-        var intMask = new TypeMask.subtype(
-            closedWorld.commonElements.intClass, closedWorld);
-
-        checkReturn('foo', intMask);
-        checkReturn('faa', intMask);
-        checkType('aField', intMask);
-        checkReturn('bar', intMask);
-        checkReturn('baz', intMask);
-        checkReturn('tear', intMask);
-      }));
-}
diff --git a/tests/compiler/dart2js/type_guard_unuser_test.dart b/tests/compiler/dart2js/type_guard_unuser_test.dart
deleted file mode 100644
index e2e100e..0000000
--- a/tests/compiler/dart2js/type_guard_unuser_test.dart
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-foo(a) {
-  int b = foo(true);
-  if (a) b = foo(2);
-  return b;
-}
-""";
-
-const String TEST_TWO = r"""
-bar(a) {}
-foo(d) {
-  int a = 1;
-  int c = foo(1);
-  if (true) {}
-  return a + c;
-}
-""";
-
-const String TEST_THREE = r"""
-foo(int a, int b) {
-  return 0 + a + b;
-}
-""";
-
-const String TEST_THREE_WITH_BAILOUT = r"""
-foo(int a, int b) {
-  var t;
-  for (int i = 0; i < 1; i++) {
-    t = 0 + a + b;
-  }
-  return t;
-}
-""";
-
-main() {
-  asyncTest(() => Future.wait([
-        compile(TEST_ONE, entry: 'foo', check: (String generated) {
-          RegExp regexp = new RegExp(getIntTypeCheck(anyIdentifier));
-          Iterator<Match> matches = regexp.allMatches(generated).iterator;
-          checkNumberOfMatches(matches, 0);
-          Expect.isTrue(generated.contains(
-              new RegExp(r'return a === true \? [$A-Z]+\.foo\(2\) : b;')));
-        }),
-        compile(TEST_TWO, entry: 'foo', check: (String generated) {
-          RegExp regexp = new RegExp("foo\\(1\\)");
-          Iterator<Match> matches = regexp.allMatches(generated).iterator;
-          checkNumberOfMatches(matches, 1);
-        }),
-        compile(TEST_THREE, entry: 'foo', check: (String generated) {
-          RegExp regexp = new RegExp(getNumberTypeCheck('a'));
-          Expect.isTrue(regexp.hasMatch(generated));
-          regexp = new RegExp(getNumberTypeCheck('b'));
-          Expect.isTrue(regexp.hasMatch(generated));
-        }),
-        compile(TEST_THREE_WITH_BAILOUT, entry: 'foo',
-            check: (String generated) {
-          RegExp regexp = new RegExp(getNumberTypeCheck('a'));
-          Expect.isTrue(regexp.hasMatch(generated));
-          regexp = new RegExp(getNumberTypeCheck('b'));
-          Expect.isTrue(regexp.hasMatch(generated));
-        })
-      ]));
-}
diff --git a/tests/compiler/dart2js/type_inference2_test.dart b/tests/compiler/dart2js/type_inference2_test.dart
deleted file mode 100644
index 5e5f224..0000000
--- a/tests/compiler/dart2js/type_inference2_test.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-sum(param0, param1) {
-  var sum = 0;
-  for (var i = param0; i < param1; i += 1) sum = sum + i;
-  return sum;
-}
-""";
-
-main() {
-  asyncTest(() => compileAndMatchFuzzy(TEST_ONE, 'sum', r"\+\+x"));
-}
diff --git a/tests/compiler/dart2js/type_inference3_test.dart b/tests/compiler/dart2js/type_inference3_test.dart
deleted file mode 100644
index 87b1585..0000000
--- a/tests/compiler/dart2js/type_inference3_test.dart
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-sum(param0, param1) {
-  var sum = 0;
-  for (var i = param0; i < param1; i += 1) sum = sum + i;
-  return sum;
-}
-""";
-
-main() {
-  asyncTest(() => compile(TEST_ONE, entry: 'sum', check: (String generated) {
-        RegExp regexp = new RegExp(getNumberTypeCheck('(param1|b)'));
-        Expect.isTrue(regexp.hasMatch(generated));
-      }));
-}
diff --git a/tests/compiler/dart2js/type_inference4_test.dart b/tests/compiler/dart2js/type_inference4_test.dart
deleted file mode 100644
index 48cb603..0000000
--- a/tests/compiler/dart2js/type_inference4_test.dart
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-foo(j) {
-  var array = [1, 2, 3];
-  if (j < 0) j = 0;
-  for (var i = j; i < 3; i++) {
-    array[i];
-  }
-}
-""";
-
-main() {
-  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
-        // Test for absence of an illegal argument exception. This means that the
-        // arguments are known to be integers.
-        Expect.isFalse(generated.contains('iae'));
-        // Also make sure that we are not just in bailout mode without speculative
-        // types by grepping for the integer-bailout check on argument j.
-        RegExp regexp = new RegExp(getIntTypeCheck('[aji]'));
-        Expect.isTrue(regexp.hasMatch(generated));
-      }));
-}
diff --git a/tests/compiler/dart2js/type_inference5_test.dart b/tests/compiler/dart2js/type_inference5_test.dart
deleted file mode 100644
index 7d6ef4c..0000000
--- a/tests/compiler/dart2js/type_inference5_test.dart
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-foo(j) {
-  var a = [1, 2, 3];
-  for (var i = j; i < 3; i++) {
-    a[i];
-  }
-}
-""";
-
-main() {
-  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
-        // Test for absence of an illegal argument exception. This means that the
-        // arguments are known to be integers.
-        Expect.isFalse(generated.contains('iae'));
-        // Also make sure that we are not just in bailout mode without speculative
-        // types by grepping for the integer-bailout check on argument j.
-        var argname = new RegExp(r'function(?: [a-z]+)?\(([a-zA-Z0-9_]+)\)')
-            .firstMatch(generated)[1];
-        print(argname);
-        RegExp regexp = new RegExp(getIntTypeCheck("(i|$argname)"));
-        Expect.isTrue(regexp.hasMatch(generated));
-      }));
-}
diff --git a/tests/compiler/dart2js/type_mask_disjoint_test.dart b/tests/compiler/dart2js/type_mask_disjoint_test.dart
deleted file mode 100644
index 18e36f9..0000000
--- a/tests/compiler/dart2js/type_mask_disjoint_test.dart
+++ /dev/null
@@ -1,185 +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:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-import 'package:compiler/src/types/types.dart';
-
-import 'compiler_helper.dart';
-
-const String CODE = """
-class A {}
-class B extends A {}
-class C extends A {}
-
-class D implements A {}
-
-class E {}
-class F extends E {}
-class G implements E {}
-
-class H {}
-class I implements H {}
-class J extends D implements I {}
-
-class K {}
-class M extends K with A {}
-
-class N extends H with I {}
-
-main() {
-  print([new A(), new B(), new C(), new D(), new E(), new F(), new G(),
-      new H(), new I(), new J(), new K(), new M(), new N()]);
-}
-""";
-
-Uri uri = new Uri(scheme: 'source');
-var compiler = compilerFor(CODE, uri);
-dynamic world = compiler.resolutionWorldBuilder.closedWorldForTesting;
-
-main() {
-  asyncTest(() => compiler.run(uri).then((_) {
-        // Empty
-        check(' ! ', ' ! '); // both non-null
-        check(' ! ', '   '); // one non-null
-        check('   ', ' ! '); // one non-null
-        check('   ', '   ', areDisjoint: false); // null is common
-
-        // Exact
-        check('A!=', 'A!=', areDisjoint: false);
-        check('A!=', 'B!=');
-        check('A!=', 'E!=');
-        check('A =', 'E =', areDisjoint: false); // null is common
-        check('M!=', 'K!=');
-        check('M!=', 'A!=');
-
-        // Exact with subclass
-        check('A!=', 'A!<', areDisjoint: false);
-        check('B!=', 'A!<', areDisjoint: false);
-        check('A!=', 'B!<');
-        check('A!=', 'E!<');
-        check('A =', 'E!<');
-        check('A =', 'E <', areDisjoint: false);
-        check('M!=', 'K!<', areDisjoint: false);
-        check('M!=', 'A!<');
-
-        // Exact with subtype
-        check('A!=', 'A!*', areDisjoint: false);
-        check('B!=', 'A!*', areDisjoint: false);
-        check('A!=', 'B!*');
-        check('A!=', 'E!*');
-        check('A!=', 'I!*');
-        check('J!=', 'H!*', areDisjoint: false);
-        check('M!=', 'K!*', areDisjoint: false);
-        check('M!=', 'A!*', areDisjoint: false);
-
-        // Subclass with subclass
-        check('A!<', 'A!<', areDisjoint: false);
-        check('A!<', 'B!<', areDisjoint: false);
-        check('A!<', 'E!<');
-        check('A!<', 'H!<');
-        check('D!<', 'I!<');
-        check('H!<', 'I!*', areDisjoint: false);
-
-        // Subclass with subtype
-        check('A!<', 'A!*', areDisjoint: false);
-        check('A!<', 'B!*', areDisjoint: false);
-        check('A!<', 'E!*');
-        check('A!<', 'H!*');
-        check('D!<', 'I!*', areDisjoint: false);
-
-        // Subtype with subtype
-        check('A!*', 'A!*', areDisjoint: false);
-        check('A!*', 'B!*', areDisjoint: false);
-        check('A!*', 'E!*');
-        check('A!*', 'H!*', areDisjoint: false);
-        check('D!*', 'I!*', areDisjoint: false);
-
-        // Unions!
-        checkUnions(['B!=', 'C!='], ['A!=']);
-        checkUnions(['B!=', 'C!='], ['A =']);
-        checkUnions(['B!=', 'C ='], ['A ='], areDisjoint: false);
-
-        checkUnions(['B!=', 'C!='], ['A!<'], areDisjoint: false);
-        checkUnions(['B!=', 'C!='], ['B!='], areDisjoint: false);
-        checkUnions(['A!<', 'E!<'], ['C!='], areDisjoint: false);
-        checkUnions(['A!<', 'E!<'], ['F!='], areDisjoint: false);
-
-        checkUnions(['A!=', 'E!='], ['C!=', 'F!=']);
-        checkUnions(['A!=', 'E!='], ['A!=', 'F!='], areDisjoint: false);
-        checkUnions(['B!=', 'E!='], ['A!<', 'F!='], areDisjoint: false);
-        checkUnions(['A!<', 'E!<'], ['C!=', 'F!='], areDisjoint: false);
-        checkUnions(['A!=', 'E!='], ['C!=', 'F!=']);
-      }));
-}
-
-/// Checks the expectation of `isDisjoint` for two mask. Also checks that the
-/// result is consistent with an equivalent (but slower) implementation based on
-/// intersection.
-checkMask(TypeMask m1, TypeMask m2, {areDisjoint: false}) {
-  print('masks: $m1 $m2');
-  Expect.equals(areDisjoint, m1.isDisjoint(m2, world));
-  Expect.equals(areDisjoint, m2.isDisjoint(m1, world));
-  var i1 = m1.intersection(m2, world);
-  Expect.equals(areDisjoint, i1.isEmpty && !i1.isNullable);
-  var i2 = m2.intersection(m1, world);
-  Expect.equals(areDisjoint, i2.isEmpty && !i2.isNullable);
-}
-
-/// Checks the expectation of `isDisjoint` for two mask descriptors (see
-/// [maskOf] for details).
-check(String typeMaskDescriptor1, String typeMaskDescriptor2,
-    {areDisjoint: true}) {
-  print('[$typeMaskDescriptor1] & [$typeMaskDescriptor2]');
-  checkMask(maskOf(typeMaskDescriptor1), maskOf(typeMaskDescriptor2),
-      areDisjoint: areDisjoint);
-}
-
-checkUnions(List<String> descriptors1, List<String> descriptors2,
-    {areDisjoint: true}) {
-  print('[$descriptors1] & [$descriptors2]');
-  var m1 = new TypeMask.unionOf(descriptors1.map(maskOf).toList(), world);
-  var m2 = new TypeMask.unionOf(descriptors2.map(maskOf).toList(), world);
-  checkMask(m1, m2, areDisjoint: areDisjoint);
-}
-
-Map _maskCache = {};
-Map _elementCache = {};
-
-/// Parses a descriptor of a flat mask. A descriptor is of the form "AXY" where:
-///   A: either a type T or " " (base class or empty)
-///   X: can be either ! or " " (nullable/nonnullable)
-///   Y: can be either " " (no flag), = (exact), < (subclass), * (subtype)
-///
-/// Examples:
-///   "-! " - empty, non-null
-///   "-  " - null
-///   "Type!=" - non-null exact Type
-///   "Type =" - nullable exact Type
-///   "Type!<" - non-null subclass of Type
-///   "Type!*" - non-null subtype of Type
-TypeMask maskOf(String descriptor) => _maskCache.putIfAbsent(descriptor, () {
-      Expect.isTrue(descriptor.length >= 3);
-      var type = descriptor.substring(0, descriptor.length - 2);
-      bool isNullable = descriptor[descriptor.length - 2] != '!';
-      bool isExact = descriptor[descriptor.length - 1] == '=';
-      bool isSubclass = descriptor[descriptor.length - 1] == '<';
-      bool isSubtype = descriptor[descriptor.length - 1] == '*';
-
-      if (type == " ") {
-        Expect.isFalse(isExact || isSubclass || isSubtype);
-        return isNullable ? new TypeMask.empty() : new TypeMask.nonNullEmpty();
-      }
-
-      Expect.isTrue(isExact || isSubclass || isSubtype);
-      var element = _elementCache.putIfAbsent(
-          type, () => type == " " ? null : findElement(compiler, type));
-
-      var mask = isExact
-          ? new TypeMask.nonNullExact(element, world)
-          : (isSubclass
-              ? new TypeMask.nonNullSubclass(element, world)
-              : new TypeMask.nonNullSubtype(element, world));
-      return isNullable ? mask.nullable() : mask;
-    });
diff --git a/tests/compiler/dart2js/type_mask_test.dart b/tests/compiler/dart2js/type_mask_test.dart
deleted file mode 100644
index 7da68ac..0000000
--- a/tests/compiler/dart2js/type_mask_test.dart
+++ /dev/null
@@ -1,129 +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:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-import 'package:compiler/src/types/types.dart';
-
-import 'compiler_helper.dart';
-
-const String CODE = """
-class A {}
-class B extends A {}
-class C implements A {}
-class D implements A {}
-main() {
-  print([new A(), new B(), new C(), new D()]);
-}
-""";
-
-main() {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(CODE, uri);
-  asyncTest(() => compiler.run(uri).then((_) {
-        var closedWorld = compiler.resolutionWorldBuilder.closedWorldForTesting;
-        dynamic classA = findElement(compiler, 'A');
-        dynamic classB = findElement(compiler, 'B');
-        dynamic classC = findElement(compiler, 'C');
-        dynamic classD = findElement(compiler, 'D');
-
-        var exactA = new TypeMask.nonNullExact(classA, closedWorld);
-        var exactB = new TypeMask.nonNullExact(classB, closedWorld);
-        var exactC = new TypeMask.nonNullExact(classC, closedWorld);
-        var exactD = new TypeMask.nonNullExact(classD, closedWorld);
-
-        var subclassA = new TypeMask.nonNullSubclass(classA, closedWorld);
-        var subtypeA = new TypeMask.nonNullSubtype(classA, closedWorld);
-
-        var subclassObject = new TypeMask.nonNullSubclass(
-            closedWorld.commonElements.objectClass, closedWorld);
-
-        var unionABC =
-            UnionTypeMask.unionOf([exactA, exactB, exactC], closedWorld);
-        var unionABnC = UnionTypeMask
-            .unionOf([exactA, exactB.nullable(), exactC], closedWorld);
-        var unionAB = UnionTypeMask.unionOf([exactA, exactB], closedWorld);
-        var unionSubtypeAC =
-            UnionTypeMask.unionOf([subtypeA, exactC], closedWorld);
-        var unionSubclassAC =
-            UnionTypeMask.unionOf([subclassA, exactC], closedWorld);
-        var unionBCD =
-            UnionTypeMask.unionOf([exactB, exactC, exactD], closedWorld);
-        var unionBCDn = UnionTypeMask
-            .unionOf([exactB, exactC, exactD.nullable()], closedWorld);
-
-        Expect.isFalse(unionABC.isNullable);
-        Expect.isTrue(unionABnC.isNullable);
-        Expect.isFalse(unionBCD.isNullable);
-        Expect.isTrue(unionBCDn.isNullable);
-
-        rule(a, b, c) => Expect.equals(c, a.isInMask(b, closedWorld));
-
-        rule(exactA, exactA, true);
-        rule(exactA, exactB, false);
-        rule(exactA, exactC, false);
-        rule(exactA, subclassA, true);
-        rule(exactA, subtypeA, true);
-
-        rule(exactB, exactA, false);
-        rule(exactB, exactB, true);
-        rule(exactB, exactC, false);
-        rule(exactB, subclassA, true);
-        rule(exactB, subtypeA, true);
-
-        rule(exactC, exactA, false);
-        rule(exactC, exactB, false);
-        rule(exactC, exactC, true);
-        rule(exactC, subclassA, false);
-        rule(exactC, subtypeA, true);
-
-        rule(subclassA, exactA, false);
-        rule(subclassA, exactB, false);
-        rule(subclassA, exactC, false);
-        rule(subclassA, subclassA, true);
-        rule(subclassA, subtypeA, true);
-
-        rule(subtypeA, exactA, false);
-        rule(subtypeA, exactB, false);
-        rule(subtypeA, exactC, false);
-        rule(subtypeA, subclassA, false);
-        rule(subtypeA, subtypeA, true);
-
-        rule(unionABC, unionSubtypeAC, true);
-        rule(unionSubtypeAC, unionABC, true);
-        rule(unionAB, unionSubtypeAC, true);
-        rule(unionSubtypeAC, unionAB, false);
-        rule(unionABC, unionSubclassAC, true);
-        rule(unionSubclassAC, unionABC, true);
-        rule(unionAB, unionSubclassAC, true);
-        rule(unionSubclassAC, unionAB, false);
-        rule(unionAB, subclassA, true);
-        rule(subclassA, unionAB, true);
-        rule(unionABC, subtypeA, true);
-        rule(subtypeA, unionABC, true);
-        rule(unionABC, subclassA, false);
-        rule(subclassA, unionABC, true);
-        rule(unionAB, subclassA, true);
-        rule(subclassA, unionAB, true);
-
-        rule(exactA, subclassObject, true);
-        rule(exactB, subclassObject, true);
-        rule(subclassA, subclassObject, true);
-        rule(subtypeA, subclassObject, true);
-        rule(unionABC, subclassObject, true);
-        rule(unionAB, subclassObject, true);
-        rule(unionSubtypeAC, subclassObject, true);
-        rule(unionSubclassAC, subclassObject, true);
-
-        rule(unionABnC, unionABC, false);
-        rule(unionABC, unionABnC, true);
-        rule(exactA.nullable(), unionABnC, true);
-        rule(exactA.nullable(), unionABC, false);
-        rule(exactB, unionABnC, true);
-        rule(unionBCDn, unionBCD, false);
-        rule(unionBCD, unionBCDn, true);
-        rule(exactB.nullable(), unionBCDn, true);
-        rule(exactB.nullable(), unionBCD, false);
-      }));
-}
diff --git a/tests/compiler/dart2js/type_representation_test.dart b/tests/compiler/dart2js/type_representation_test.dart
index a637ee8..9e20cbb 100644
--- a/tests/compiler/dart2js/type_representation_test.dart
+++ b/tests/compiler/dart2js/type_representation_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// TODO(johnniwinther): Port this test to be frontend agnostic.
+
 library type_representation_test;
 
 import 'package:expect/expect.dart';
@@ -58,7 +60,8 @@
         }
 
         String stringify(Expression expression) {
-          return prettyPrint(expression, env.compiler.options);
+          return prettyPrint(expression,
+              enableMinification: env.compiler.options.enableMinification);
         }
 
         void expect(ResolutionDartType type, String expectedRepresentation,
diff --git a/tests/compiler/dart2js/type_substitution_test.dart b/tests/compiler/dart2js/type_substitution_test.dart
index fcdae4c..588f310 100644
--- a/tests/compiler/dart2js/type_substitution_test.dart
+++ b/tests/compiler/dart2js/type_substitution_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// TODO(johnniwinther): Port this test to be frontend agnostic.
+
 library type_substitution_test;
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/type_test_helper.dart b/tests/compiler/dart2js/type_test_helper.dart
index 3ebebb8..7a064ab 100644
--- a/tests/compiler/dart2js/type_test_helper.dart
+++ b/tests/compiler/dart2js/type_test_helper.dart
@@ -49,6 +49,7 @@
       bool stopAfterTypeInference: false,
       String mainSource,
       bool testBackendWorld: false,
+      List<String> options: const <String>[],
       Map<String, String> fieldTypeMap: const <String, String>{}}) async {
     Uri uri;
     Compiler compiler;
@@ -75,38 +76,42 @@
           memorySourceFiles: {'main.dart': source},
           diagnosticHandler: collector,
           options: stopAfterTypeInference
-              ? [Flags.disableTypeInference]
-              : [
+              ? ([Flags.disableTypeInference]..addAll(options))
+              : ([
                   Flags.disableTypeInference,
                   Flags.analyzeAll,
                   Flags.analyzeOnly
-                ],
+                ]..addAll(options)),
           beforeRun: (Compiler compiler) {
             compiler.stopAfterTypeInference = stopAfterTypeInference;
           });
     } else {
       if (compileMode == CompileMode.mock) {
         uri = new Uri(scheme: 'source');
-        mock.MockCompiler mockCompiler = mock.compilerFor(source, uri,
+        mock.MockCompiler mockCompiler = mock.mockCompilerFor(source, uri,
             analyzeAll: !stopAfterTypeInference,
             analyzeOnly: !stopAfterTypeInference);
         mockCompiler.diagnosticHandler =
             mock.createHandler(mockCompiler, source);
         collector = mockCompiler.diagnosticCollector;
         compiler = mockCompiler;
+        compiler.stopAfterTypeInference = stopAfterTypeInference;
+        await compiler.run(uri);
       } else {
         collector = new memory.DiagnosticCollector();
         uri = Uri.parse('memory:main.dart');
-        compiler = memory.compilerFor(
+        memory.CompilationResult result = await memory.runCompiler(
             entryPoint: uri,
             memorySourceFiles: {'main.dart': source},
             diagnosticHandler: collector,
             options: stopAfterTypeInference
-                ? []
-                : [Flags.analyzeAll, Flags.analyzeOnly]);
+                ? options
+                : ([Flags.analyzeAll, Flags.analyzeOnly]..addAll(options)),
+            beforeRun: (compiler) {
+              compiler.stopAfterTypeInference = stopAfterTypeInference;
+            });
+        compiler = result.compiler;
       }
-      compiler.stopAfterTypeInference = stopAfterTypeInference;
-      await compiler.run(uri);
     }
     if (expectNoErrors || expectNoWarningsOrErrors) {
       var errors = collector.errors;
diff --git a/tests/compiler/dart2js/types_of_captured_variables_test.dart b/tests/compiler/dart2js/types_of_captured_variables_test.dart
deleted file mode 100644
index d08f543..0000000
--- a/tests/compiler/dart2js/types_of_captured_variables_test.dart
+++ /dev/null
@@ -1,53 +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 'compiler_helper.dart';
-
-const String TEST1 = r"""
-main() {
-  var a = 52;
-  var f = () => a + 87;
-  f();
-}
-""";
-
-const String TEST2 = r"""
-main() {
-  var a = 52;
-  var g = () { a = 48; };
-  var f = () => a + 87;
-  f();
-  g();
-}
-""";
-
-const String TEST3 = r"""
-main() {
-  var a = 52;
-  var g = () { a = 'foo'; };
-  var f = () => a + 87;
-  f();
-  g();
-}
-""";
-
-main() {
-  // Test that we know the type of captured, non-mutated variables.
-  asyncTest(() => compileAll(TEST1).then((generated) {
-        Expect.isTrue(generated.contains('+ 87'));
-      }));
-
-  // Test that we know the type of captured, mutated variables.
-  asyncTest(() => compileAll(TEST2).then((generated) {
-        Expect.isTrue(generated.contains('+ 87'));
-      }));
-
-  // Test that we know when types of a captured, mutated variable
-  // conflict.
-  asyncTest(() => compileAll(TEST3).then((generated) {
-        Expect.isFalse(generated.contains('+ 87'));
-      }));
-}
diff --git a/tests/compiler/dart2js/uri_retention_test.dart b/tests/compiler/dart2js/uri_retention_test.dart
index 20bbb89..dc7d70f 100644
--- a/tests/compiler/dart2js/uri_retention_test.dart
+++ b/tests/compiler/dart2js/uri_retention_test.dart
@@ -6,16 +6,18 @@
 
 import 'dart:async';
 
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
+import 'package:async_helper/async_helper.dart';
 import 'package:compiler/compiler_new.dart';
-
+import 'package:compiler/src/commandline_options.dart';
+import 'package:expect/expect.dart';
 import 'memory_compiler.dart' show runCompiler, OutputCollector;
 
-Future<String> compileSources(sources, {bool minify, bool preserveUri}) async {
+Future<String> compileSources(sources,
+    {bool minify, bool preserveUri, bool useKernel}) async {
   var options = [];
-  if (minify) options.add("--minify");
-  if (preserveUri) options.add("--preserve-uris");
+  if (minify) options.add(Flags.minify);
+  if (preserveUri) options.add(Flags.preserveUris);
+  if (useKernel) options.add(Flags.useKernel);
   OutputCollector outputCollector = new OutputCollector();
   await runCompiler(
       memorySourceFiles: sources,
@@ -24,9 +26,9 @@
   return outputCollector.getOutput('', OutputType.js);
 }
 
-Future test(sources, {bool libName, bool fileName}) {
-  return compileSources(sources, minify: false, preserveUri: false)
-      .then((output) {
+Future test(sources, {bool libName, bool fileName, bool useKernel}) {
+  return compileSources(sources,
+      minify: false, preserveUri: false, useKernel: useKernel).then((output) {
     // Unminified the sources should always contain the library name and the
     // file name.
     Expect.isTrue(output.contains("main_lib"));
@@ -45,12 +47,22 @@
 }
 
 void main() {
-  asyncTest(() {
-    return new Future.value()
-        .then(
-            (_) => test(MEMORY_SOURCE_FILES1, libName: false, fileName: false))
-        .then((_) => test(MEMORY_SOURCE_FILES2, libName: true, fileName: false))
-        .then((_) => test(MEMORY_SOURCE_FILES3, libName: true, fileName: true));
+  runTests({bool useKernel}) async {
+    await test(MEMORY_SOURCE_FILES1,
+        libName: false, fileName: false, useKernel: useKernel);
+    if (!useKernel) {
+      await test(MEMORY_SOURCE_FILES2,
+          libName: true, fileName: false, useKernel: useKernel);
+      await test(MEMORY_SOURCE_FILES3,
+          libName: true, fileName: true, useKernel: useKernel);
+    }
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
   });
 }
 
diff --git a/tests/compiler/dart2js/use_checks_test.dart b/tests/compiler/dart2js/use_checks_test.dart
deleted file mode 100644
index 830b372..0000000
--- a/tests/compiler/dart2js/use_checks_test.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// 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:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'memory_compiler.dart';
-
-const MEMORY_SOURCE_FILES = const {
-  'main.dart': '''
-main (x, y) {
-  if (x != null) {
-    if (y != null) {
-      // Forces x and y to be int-checked.
-      int a = x;
-      int b = y;
-      // Now we must be able to do a direct "+" operation in JS.
-      return x + y;
-    }
-  }
-}
-''',
-};
-
-main() {
-  asyncTest(() async {
-    var result = await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES,
-        options: ['--enable-checked-mode']);
-    var compiler = result.compiler;
-    var element = compiler.frontendStrategy.elementEnvironment.mainFunction;
-    var code = compiler.backend.getGeneratedCode(element);
-    Expect.isTrue(code.contains('+'), code);
-  });
-}
diff --git a/tests/compiler/dart2js/user_crash_test.dart b/tests/compiler/dart2js/user_crash_test.dart
index 0af3e67..8d46c4b 100644
--- a/tests/compiler/dart2js/user_crash_test.dart
+++ b/tests/compiler/dart2js/user_crash_test.dart
@@ -6,14 +6,16 @@
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 import 'package:compiler/compiler_new.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'memory_compiler.dart';
 
-final EXCEPTION = 'Crash';
+final EXCEPTION = 'Crash-marker';
 
 main() {
-  asyncTest(() async {
-    test('Empty program', await run());
-    test('Crash diagnostics', await run(diagnostics: new CrashingDiagnostics()),
+  runTests({bool useKernel}) async {
+    test('Empty program', await run(useKernel: useKernel));
+    test('Crash diagnostics',
+        await run(useKernel: useKernel, diagnostics: new CrashingDiagnostics()),
         expectedLines: [
           'Uncaught exception in diagnostic handler: $EXCEPTION',
           null /* Stack trace*/
@@ -23,9 +25,11 @@
         ]);
     test(
         'Throw in package discovery',
-        await run(packagesDiscoveryProvider: (_) {
-          throw EXCEPTION;
-        }),
+        await run(
+            useKernel: useKernel,
+            packagesDiscoveryProvider: (_) {
+              throw EXCEPTION;
+            }),
         expectedLines: [
           'Uncaught exception in package discovery: $EXCEPTION',
           null /* Stack trace*/
@@ -36,15 +40,30 @@
     test(
         'new Future.error in package discovery',
         await run(
+            useKernel: useKernel,
             packagesDiscoveryProvider: (_) => new Future.error(EXCEPTION)),
         expectedExceptions: [EXCEPTION]);
+
+    List<String> expectedLines;
+    if (useKernel) {
+      expectedLines = ['Error: Input file not found: memory:main.dart.'];
+    } else {
+      expectedLines = [
+        'Uncaught exception in input provider: $EXCEPTION',
+        null, // Stack trace
+        'memory:main.dart:\nError: $EXCEPTION' /* READ_SELF_ERROR */
+      ];
+    }
     test('Throw in input provider',
-        await run(memorySourceFiles: new CrashingMap()),
-        expectedLines: [
-          'Uncaught exception in input provider: $EXCEPTION',
-          null, // Stack trace
-          'memory:main.dart:\nError: $EXCEPTION' /* READ_SELF_ERROR */
-        ]);
+        await run(useKernel: useKernel, memorySourceFiles: new CrashingMap()),
+        expectedLines: expectedLines);
+  }
+
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
   });
 }
 
@@ -71,7 +90,8 @@
 Future<RunResult> run(
     {Map<String, String> memorySourceFiles: const {'main.dart': 'main() {}'},
     CompilerDiagnostics diagnostics,
-    PackagesDiscoveryProvider packagesDiscoveryProvider}) async {
+    PackagesDiscoveryProvider packagesDiscoveryProvider,
+    bool useKernel}) async {
   RunResult result = new RunResult();
   await runZoned(() async {
     try {
@@ -79,7 +99,8 @@
           entryPoint: Uri.parse('memory:main.dart'),
           memorySourceFiles: memorySourceFiles,
           diagnosticHandler: diagnostics,
-          packagesDiscoveryProvider: packagesDiscoveryProvider);
+          packagesDiscoveryProvider: packagesDiscoveryProvider,
+          options: useKernel ? [Flags.useKernel] : []);
     } catch (e) {
       result.exceptions.add(e);
     }
diff --git a/tests/compiler/dart2js/value_range3_test.dart b/tests/compiler/dart2js/value_range3_test.dart
deleted file mode 100644
index e0f6c5f..0000000
--- a/tests/compiler/dart2js/value_range3_test.dart
+++ /dev/null
@@ -1,33 +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.
-
-// Test that global analysis in dart2js propagates positive integers.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'memory_compiler.dart';
-
-const MEMORY_SOURCE_FILES = const {
-  'main.dart': '''
-
-var a = [42];
-
-main() {
-  var value = a[0];
-  if (value < 42) {
-    return new List(42)[value];
-  }
-}
-''',
-};
-
-main() {
-  asyncTest(() async {
-    var result = await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
-    var compiler = result.compiler;
-    var element = compiler.frontendStrategy.elementEnvironment.mainFunction;
-    var code = compiler.backend.getGeneratedCode(element);
-    Expect.isFalse(code.contains('ioore'));
-  });
-}
diff --git a/tests/compiler/dart2js/world_test.dart b/tests/compiler/dart2js/world_test.dart
index 35020cb..9719d41 100644
--- a/tests/compiler/dart2js/world_test.dart
+++ b/tests/compiler/dart2js/world_test.dart
@@ -8,22 +8,28 @@
 import 'package:async_helper/async_helper.dart';
 import 'type_test_helper.dart';
 import 'package:compiler/src/common/names.dart';
-import 'package:compiler/src/elements/elements.dart'
-    show ClassElement, LibraryElement;
+import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/universe/class_set.dart';
 import 'package:compiler/src/world.dart' show ClassQuery, ClosedWorld;
 
 void main() {
+  runTests(CompileMode compileMode) async {
+    await testClassSets(compileMode);
+    await testProperties(compileMode);
+    await testNativeClasses(compileMode);
+    await testCommonSubclasses(compileMode);
+  }
+
   asyncTest(() async {
-    await testClassSets();
-    await testProperties();
-    await testNativeClasses();
-    await testCommonSubclasses();
+    print('--test from ast---------------------------------------------------');
+    await runTests(CompileMode.memory);
+    print('--test from kernel------------------------------------------------');
+    await runTests(CompileMode.kernel);
   });
 }
 
-testClassSets() async {
+testClassSets(CompileMode compileMode) async {
   var env = await TypeEnvironment.create(r"""
       class A implements X {}
       class B {}
@@ -32,7 +38,7 @@
       class D implements A {}
       class E extends B implements A {}
       class F extends Object with A implements B {}
-      class G extends Object with A, B {}
+      class G extends Object with B, A {}
       class X {}
       """, mainSource: r"""
       import 'dart:html' as html;
@@ -47,18 +53,19 @@
         html.window;
         new html.Worker('');
       }
-      """, compileMode: CompileMode.memory);
+      """, compileMode: compileMode);
   ClosedWorld closedWorld = env.closedWorld;
+  ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
 
-  ClassElement Object_ = env.getElement("Object");
-  ClassElement A = env.getElement("A");
-  ClassElement B = env.getElement("B");
-  ClassElement C = env.getElement("C");
-  ClassElement D = env.getElement("D");
-  ClassElement E = env.getElement("E");
-  ClassElement F = env.getElement("F");
-  ClassElement G = env.getElement("G");
-  ClassElement X = env.getElement("X");
+  ClassEntity Object_ = env.getElement("Object");
+  ClassEntity A = env.getElement("A");
+  ClassEntity B = env.getElement("B");
+  ClassEntity C = env.getElement("C");
+  ClassEntity D = env.getElement("D");
+  ClassEntity E = env.getElement("E");
+  ClassEntity F = env.getElement("F");
+  ClassEntity G = env.getElement("G");
+  ClassEntity X = env.getElement("X");
 
   void checkClasses(String property, ClassEntity cls,
       Iterable<ClassEntity> foundClasses, List<ClassEntity> expectedClasses,
@@ -168,8 +175,12 @@
   testStrictSubtypes(X, [A, C, D, E, F, G]);
 
   testMixinUses(Object_, []);
-  testMixinUses(A, [F.superclass, G.superclass.superclass]);
-  testMixinUses(B, [G.superclass]);
+  testMixinUses(A, [
+    elementEnvironment.getSuperClass(F),
+    elementEnvironment.getSuperClass(G)
+  ]);
+  testMixinUses(B,
+      [elementEnvironment.getSuperClass(elementEnvironment.getSuperClass(G))]);
   testMixinUses(C, []);
   testMixinUses(D, []);
   testMixinUses(E, []);
@@ -178,7 +189,7 @@
   testMixinUses(X, []);
 }
 
-testProperties() async {
+testProperties(CompileMode compileMode) async {
   var env = await TypeEnvironment.create(r"""
       class A {}
       class A1 extends A {}
@@ -233,11 +244,11 @@
         new G3();
         new H4();
       }
-      """, compileMode: CompileMode.memory);
+      """, compileMode: compileMode);
   ClosedWorld closedWorld = env.closedWorld;
 
   check(String name, {bool hasStrictSubtype, bool hasOnlySubclasses}) {
-    ClassElement cls = env.getElement(name);
+    ClassEntity cls = env.getElement(name);
     Expect.equals(hasStrictSubtype, closedWorld.hasAnyStrictSubtype(cls),
         "Unexpected hasAnyStrictSubtype property on $cls.");
     Expect.equals(hasOnlySubclasses, closedWorld.hasOnlySubclasses(cls),
@@ -299,7 +310,7 @@
   check("H4", hasStrictSubtype: false, hasOnlySubclasses: true);
 }
 
-testNativeClasses() async {
+testNativeClasses(CompileMode compileMode) async {
   var env = await TypeEnvironment.create('',
       mainSource: r"""
       import 'dart:html' as html;
@@ -310,20 +321,23 @@
             ..getContext(''); // Creates CanvasRenderingContext2D
       }
       """,
-      compileMode: CompileMode.memory);
+      compileMode: compileMode);
   ClosedWorld closedWorld = env.closedWorld;
-  LibraryElement dart_html =
-      env.compiler.libraryLoader.lookupLibrary(Uris.dart_html);
+  ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
+  LibraryEntity dart_html = elementEnvironment.lookupLibrary(Uris.dart_html);
 
-  ClassElement clsEventTarget = dart_html.findExported('EventTarget');
-  ClassElement clsWindow = dart_html.findExported('Window');
-  ClassElement clsAbstractWorker = dart_html.findExported('AbstractWorker');
-  ClassElement clsWorker = dart_html.findExported('Worker');
-  ClassElement clsCanvasElement = dart_html.findExported('CanvasElement');
-  ClassElement clsCanvasRenderingContext =
-      dart_html.findExported('CanvasRenderingContext');
-  ClassElement clsCanvasRenderingContext2D =
-      dart_html.findExported('CanvasRenderingContext2D');
+  ClassEntity clsEventTarget =
+      elementEnvironment.lookupClass(dart_html, 'EventTarget');
+  ClassEntity clsWindow = elementEnvironment.lookupClass(dart_html, 'Window');
+  ClassEntity clsAbstractWorker =
+      elementEnvironment.lookupClass(dart_html, 'AbstractWorker');
+  ClassEntity clsWorker = elementEnvironment.lookupClass(dart_html, 'Worker');
+  ClassEntity clsCanvasElement =
+      elementEnvironment.lookupClass(dart_html, 'CanvasElement');
+  ClassEntity clsCanvasRenderingContext =
+      elementEnvironment.lookupClass(dart_html, 'CanvasRenderingContext');
+  ClassEntity clsCanvasRenderingContext2D =
+      elementEnvironment.lookupClass(dart_html, 'CanvasRenderingContext2D');
 
   List<ClassEntity> allClasses = [
     clsEventTarget,
@@ -506,7 +520,7 @@
       instantiatedSubtypeCount: 0);
 }
 
-testCommonSubclasses() async {
+testCommonSubclasses(CompileMode compileMode) async {
   var env = await TypeEnvironment.create('',
       mainSource: r"""
       class A {}
@@ -532,18 +546,18 @@
         new J();
       }
       """,
-      compileMode: CompileMode.memory);
+      compileMode: compileMode);
   ClosedWorld closedWorld = env.closedWorld;
 
-  ClassElement A = env.getElement("A");
-  ClassElement B = env.getElement("B");
-  ClassElement C = env.getElement("C");
-  ClassElement D = env.getElement("D");
-  ClassElement F = env.getElement("F");
-  ClassElement G = env.getElement("G");
-  ClassElement H = env.getElement("H");
-  ClassElement I = env.getElement("I");
-  ClassElement J = env.getElement("J");
+  ClassEntity A = env.getElement("A");
+  ClassEntity B = env.getElement("B");
+  ClassEntity C = env.getElement("C");
+  ClassEntity D = env.getElement("D");
+  ClassEntity F = env.getElement("F");
+  ClassEntity G = env.getElement("G");
+  ClassEntity H = env.getElement("H");
+  ClassEntity I = env.getElement("I");
+  ClassEntity J = env.getElement("J");
 
   void check(ClassEntity cls1, ClassQuery query1, ClassEntity cls2,
       ClassQuery query2, List<ClassEntity> expectedResult) {
diff --git a/tests/compiler/dart2js/zero_termination_test.dart b/tests/compiler/dart2js/zero_termination_test.dart
index 98690f9..f2c11cd 100644
--- a/tests/compiler/dart2js/zero_termination_test.dart
+++ b/tests/compiler/dart2js/zero_termination_test.dart
@@ -12,10 +12,11 @@
 import 'dart:convert';
 import 'dart:io';
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:expect/expect.dart';
 import 'package:path/path.dart' as path;
 
-import 'launch_helper.dart' show launchDart2Js;
+import 'end_to_end/launch_helper.dart' show launchDart2Js;
 
 Uri pathOfData = Platform.script;
 Directory tempDir;
@@ -60,20 +61,22 @@
   Expect.isFalse(stdout.contains(0));
 }
 
-Future testFile() async {
+Future testFile({bool useKernel}) async {
   String inFilePath =
       pathOfData.resolve('data/one_line_dart_program.dart').path;
   List<String> args = [inFilePath, "--out=" + outFilePath];
+  if (useKernel) args.add(Flags.useKernel);
 
   await cleanup();
   check(await launchDart2Js(args, noStdoutEncoding: true));
   await cleanup();
 }
 
-Future serverRunning(HttpServer server) async {
+Future serverRunning(HttpServer server, {bool useKernel}) async {
   int port = server.port;
   String inFilePath = "http://127.0.0.1:$port/data/one_line_dart_program.dart";
   List<String> args = [inFilePath, "--out=" + outFilePath];
+  if (useKernel) args.add(Flags.useKernel);
 
   server.listen(handleRequest);
   try {
@@ -85,25 +88,32 @@
   }
 }
 
-Future testHttp() {
+Future testHttp({bool useKernel}) {
   return HttpServer
       .bind(InternetAddress.LOOPBACK_IP_V4, 0)
-      .then((HttpServer server) => serverRunning(server));
+      .then((HttpServer server) => serverRunning(server, useKernel: useKernel));
 }
 
-runTests() async {
+runTests({bool useKernel}) async {
   tempDir = Directory.systemTemp.createTempSync('directory_test');
   outFilePath = path.join(tempDir.path, "out.js");
 
   try {
-    await testFile();
-    await testHttp();
+    await testFile(useKernel: useKernel);
+    if (!useKernel) {
+      // TODO(johnniwinther): Handle this test for kernel.
+      await testHttp(useKernel: useKernel);
+    }
   } finally {
     await tempDir.delete(recursive: true);
   }
 }
 
 main() {
-  asyncStart();
-  runTests().whenComplete(asyncEnd);
+  asyncTest(() async {
+    print('--test from ast---------------------------------------------------');
+    await runTests(useKernel: false);
+    print('--test from kernel------------------------------------------------');
+    await runTests(useKernel: true);
+  });
 }
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index 9c164b4..d77b085 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -124,6 +124,10 @@
 deferred_fail_and_retry_worker_test: SkipByDesign # Uses eval to simulate failed loading.
 js_interop_test: RuntimeError # Issue 31082
 
+[ $compiler == dart2js && $dart2js_with_kernel ]
+dummy_compiler_test: Crash # Issue 31715
+recursive_import_test: Crash # Issue 31715
+
 [ $compiler == dart2js && $dart2js_with_kernel && $fast_startup ]
 23056_test: Pass
 closure_capture2_test: RuntimeError
diff --git a/tests/compiler/dart2js_extra/dummy_compiler_test.dart b/tests/compiler/dart2js_extra/dummy_compiler_test.dart
index 126e4ee..34d1c6e 100644
--- a/tests/compiler/dart2js_extra/dummy_compiler_test.dart
+++ b/tests/compiler/dart2js_extra/dummy_compiler_test.dart
@@ -10,7 +10,7 @@
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/compiler.dart';
 
-import '../dart2js/mock_libraries.dart';
+import '../dart2js/old_frontend/mock_libraries.dart';
 
 String libProvider(Uri uri) {
   if (uri.path.endsWith(".platform")) {
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index 033f5d8..1455b3e 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -63,13 +63,6 @@
 symbol_test/02: MissingCompileTimeError
 symbol_test/03: MissingCompileTimeError
 
-[ $compiler == dartkp ]
-bit_twiddling_test/int64: CompileTimeError # Issue 31339
-integer_to_radix_string_test/01: CompileTimeError # Issue 31339
-integer_to_radix_string_test/02: CompileTimeError # Issue 31339
-integer_to_string_test/01: CompileTimeError # Issue 31339
-num_sign_test: CompileTimeError, Crash # Issue 31339
-
 [ $compiler == precompiler ]
 int_parse_radix_test: Pass, Timeout # --no_intrinsify
 integer_parsed_mul_div_vm_test: Pass, Timeout # --no_intrinsify
@@ -117,12 +110,6 @@
 int_parse_radix_test/*: Pass, Slow
 integer_parsed_mul_div_vm_test: Pass, Slow
 
-# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
-# are to be triaged.  Isolate tests are skipped on purpose due to the usage of
-# batch mode.
-[ $arch == simdbc64 && $compiler == dartk && $strong ]
-iterable_to_set_test: RuntimeError # Please triage.
-
 [ $arch == x64 && $system == windows ]
 stopwatch_test: Skip # Flaky test due to expected performance behaviour.
 
@@ -427,15 +414,11 @@
 [ $compiler == dartk && $runtime == vm && $strong ]
 apply3_test: CompileTimeError # Issue 31402 (Invocation arguments)
 bool_from_environment2_test/03: MissingCompileTimeError
-collection_removes_test: RuntimeError
 compare_to2_test: RuntimeError
-hash_set_test/01: RuntimeError
-hash_set_test/none: RuntimeError
 int_modulo_arith_test/modPow: CompileTimeError # Issue 31402 (Assert statement)
 int_modulo_arith_test/none: CompileTimeError # Issue 31402 (Assert statement)
 iterable_empty_test: RuntimeError
 iterable_fold_test/02: RuntimeError
-iterable_mapping_test/none: RuntimeError
 iterable_reduce_test/01: CompileTimeError # Issue 31533
 iterable_reduce_test/none: RuntimeError
 iterable_to_list_test/01: RuntimeError
@@ -445,9 +428,7 @@
 list_set_all_test: RuntimeError
 null_nosuchmethod_test/01: CompileTimeError # Issue 31402 (Invocation arguments)
 null_nosuchmethod_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
-set_test: RuntimeError
 splay_tree_from_iterable_test: RuntimeError
-splay_tree_test/none: RuntimeError
 string_case_test/01: RuntimeError
 string_from_environment3_test/03: MissingCompileTimeError
 string_trimlr_test/02: RuntimeError
@@ -463,27 +444,14 @@
 symbol_test/none: RuntimeError
 unicode_test: RuntimeError
 
-# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
-# are to be triaged.  Isolate tests are skipped on purpose due to the usage of
-# batch mode.
-[ $compiler == dartk && $strong && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
-bit_twiddling_test/int64: CompileTimeError # Please triage.
-integer_to_radix_string_test/02: CompileTimeError # Please triage.
-integer_to_string_test/01: CompileTimeError # Please triage.
-num_sign_test: CompileTimeError # Please triage.
-
 # ===== dartkp + dart_precompiled status lines =====
 [ $compiler == dartkp && $runtime == dart_precompiled && $strong ]
 bool_from_environment2_test/03: MissingCompileTimeError
-collection_removes_test: RuntimeError
 compare_to2_test: RuntimeError
-hash_set_test/01: RuntimeError
-hash_set_test/none: RuntimeError
 int_modulo_arith_test/modPow: CompileTimeError # Issue 31402 (Assert statement)
 int_modulo_arith_test/none: CompileTimeError # Issue 31402 (Assert statement)
 iterable_empty_test: RuntimeError
 iterable_fold_test/02: RuntimeError
-iterable_mapping_test/none: RuntimeError
 iterable_reduce_test/01: CompileTimeError # Issue 31533
 iterable_reduce_test/none: RuntimeError
 iterable_to_list_test/01: RuntimeError
@@ -494,9 +462,7 @@
 null_nosuchmethod_test/01: CompileTimeError # Issue 31402 (Invocation arguments)
 null_nosuchmethod_test/none: CompileTimeError # Issue 31402 (Invocation arguments)
 regexp/stack-overflow_test: RuntimeError
-set_test: RuntimeError
 splay_tree_from_iterable_test: RuntimeError
-splay_tree_test/none: RuntimeError
 string_case_test/01: RuntimeError
 string_from_environment3_test/03: MissingCompileTimeError
 string_trimlr_test/02: RuntimeError
@@ -686,7 +652,7 @@
 
 [ $runtime == dart_precompiled || $runtime == vm ]
 integer_parsed_arith_vm_test/01: RuntimeError # Issue 31346
-integer_parsed_arith_vm_test/02: RuntimeError # Issue 31369
+integer_parsed_arith_vm_test/02: RuntimeError # Issue 31346
 integer_parsed_div_rem_vm_test/01: RuntimeError # Issue 31346
 integer_to_radix_string_test/01: RuntimeError # Issue 31346
 string_split_test: RuntimeError # does not return List<String>
diff --git a/tests/corelib_2/integer_parsed_arith_vm_test.dart b/tests/corelib_2/integer_parsed_arith_vm_test.dart
index 7ce266c..d3e273d 100644
--- a/tests/corelib_2/integer_parsed_arith_vm_test.dart
+++ b/tests/corelib_2/integer_parsed_arith_vm_test.dart
@@ -65,9 +65,9 @@
       one, // 64 bit overflow.                      //# 01: continued
       "-0x8000000000000000"); //                    //# 01: continued
   addSubParsed( //                                  //# 02: ok
-      "0xFFFFFFFFFFFFFFFF", //                      //# 02: continued
+      minus_one, //                                 //# 02: continued
       one, // 64 bit overflow.                      //# 02: continued
-      "0"); //                                      //# 02: continued
+      zero); //                                     //# 02: continued
   addSubParsed(
       "0x8000000", // 28 bit overflow.
       "0x8000000",
@@ -81,9 +81,9 @@
       "0x80000000000000",
       "0x100000000000000");
   addSubParsed( //                                  //# 02: continued
-      "0x8000000000000000", // 64 bit overflow.     //# 02: continued
-      "0x8000000000000000", //                      //# 02: continued
-      "0"); //                                      //# 02: continued
+      "-0x8000000000000000", // 64 bit overflow.    //# 02: continued
+      "-0x8000000000000000", //                     //# 02: continued
+      zero); //                                     //# 02: continued
 
   addSubParsed("-0x123", minus_one, "-0x124");
   addSubParsed(minus_one, "-0x123", "-0x124");
diff --git a/tests/html/html.status b/tests/html/html.status
index 629256f..66809df 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -49,7 +49,6 @@
 js_typed_interop_side_cast_exp_test: Pass, RuntimeError # Roll 50 failure
 mirrors_js_typed_interop_test: Pass, Slow
 svgelement_test/PathElement: Pass, RuntimeError # Roll 50 failure
-websql_test/functional: Pass, Timeout # Roll 50 failure
 wrapping_collections_test: SkipByDesign # Testing an issue that is only relevant to Dartium
 xhr_test/xhr: Pass, RuntimeError # Roll 50 failure
 
@@ -116,7 +115,7 @@
 two_scripts_htmltest: Skip # Times out on IE.  Issue 21537
 webgl_1_test/functional: Fail # IE11 Feature support statuses - These results not yet noted in platform support annotations. All changes should be accompanied by platform support annotation changes.
 websocket_test/websocket: Fail # Issue 7875. Closed with "working as intended".
-websql_test/supported: Fail # IE11 Feature support statuses - These results not yet noted in platform support annotations. All changes should be accompanied by platform support annotation changes.
+websql_test: Fail # IE11 Feature support statuses - These results not yet noted in platform support annotations. All changes should be accompanied by platform support annotation changes.
 wheelevent_test: RuntimeError # Issue 23437
 worker_test/functional: Pass, Fail # Issues 20659.
 xhr_test/json: Fail # IE10 returns string, not JSON object
@@ -208,7 +207,7 @@
 text_event_test: Fail # Issue 17893
 touchevent_test/supported: Fail # Firefox Feature support statuses - All changes should be accompanied by platform support annotation changes.
 webgl_1_test: Pass, Fail # Issue 8219
-websql_test/supported: Fail # Firefox Feature support statuses - All changes should be accompanied by platform support annotation changes.
+websql_test: Fail # Firefox Feature support statuses - All changes should be accompanied by platform support annotation changes.
 xhr_test/xhr: Pass, Fail # Issue 11602
 
 [ $compiler == dart2js && $browser ]
diff --git a/tests/html/websql_test.dart b/tests/html/websql_test.dart
index fa882c2..3e98cc5 100644
--- a/tests/html/websql_test.dart
+++ b/tests/html/websql_test.dart
@@ -3,131 +3,126 @@
 import 'dart:async';
 import 'dart:html';
 import 'dart:web_sql';
+
 import 'package:unittest/unittest.dart';
 import 'package:unittest/html_individual_config.dart';
-
-Future<SqlTransaction> transaction(SqlDatabase db) {
-  final completer = new Completer<SqlTransaction>.sync();
-
-  db.transaction((SqlTransaction transaction) {
-    completer.complete(transaction);
-  }, (SqlError error) {
-    completer.completeError(error);
-  });
-
-  return completer.future;
-}
+import 'package:async_helper/async_helper.dart';
 
 Future<SqlResultSet> createTable(
-    SqlTransaction transaction, String tableName, String columnName) {
-  final completer = new Completer<SqlResultSet>.sync();
-
-  final sql = 'CREATE TABLE $tableName ($columnName)';
-  transaction.executeSql(sql, [], (SqlTransaction tx, SqlResultSet rs) {
-    completer.complete(rs);
-  }, (SqlTransaction tx, SqlError error) {
-    completer.completeError(error);
-  });
-
-  return completer.future;
+    SqlTransaction transaction, String tableName, String columnName) async {
+  return transaction.executeSql('CREATE TABLE $tableName ($columnName)', []);
 }
 
-Future<SqlResultSet> insert(
-    SqlTransaction transaction, String tableName, String columnName, value) {
-  final completer = new Completer<SqlResultSet>.sync();
-
+Future<SqlResultSet> insertTable(SqlTransaction transaction, String tableName,
+    String columnName, value) async {
   final sql = 'INSERT INTO $tableName ($columnName) VALUES (?)';
-  transaction.executeSql(sql, [value], (SqlTransaction tx, SqlResultSet rs) {
-    completer.complete(rs);
-  }, (SqlTransaction tx, SqlError error) {
-    completer.completeError(error);
-  });
-
-  return completer.future;
+  return transaction.executeSql(sql, [value]);
 }
 
-Future<SqlResultSet> queryTable(SqlTransaction transaction, String tableName) {
-  final completer = new Completer<SqlResultSet>.sync();
-
+Future<SqlResultSet> queryTable(
+    SqlTransaction transaction, String tableName) async {
   final sql = 'SELECT * FROM $tableName';
-  transaction.executeSql(sql, [], (SqlTransaction tx, SqlResultSet rs) {
-    completer.complete(rs);
-  }, (SqlTransaction tx, SqlError error) {
-    completer.completeError(error);
-  });
-
-  return completer.future;
+  return transaction.executeSql(sql, []);
 }
 
 Future<SqlResultSet> dropTable(SqlTransaction transaction, String tableName,
-    [bool ignoreFailure = false]) {
-  final completer = new Completer<SqlResultSet>.sync();
-
-  final sql = 'DROP TABLE $tableName';
-  transaction.executeSql(sql, [], (SqlTransaction tx, SqlResultSet rs) {
-    completer.complete(rs);
-  }, (SqlTransaction tx, SqlError error) {
-    if (ignoreFailure) {
-      completer.complete(null);
-    } else {
-      completer.completeError(error);
-    }
-  });
-
-  return completer.future;
+    [bool ignoreFailure = false]) async {
+  try {
+    var result = await transaction.executeSql('DROP TABLE $tableName', []);
+    return result;
+  } catch (error) {
+    if (!ignoreFailure) throw error;
+  }
 }
 
-main() {
+final tableName = 'test_table';
+final columnName = 'test_data';
+
+SqlDatabase db;
+SqlTransaction tx;
+
+Future setup() async {
+  if (SqlDatabase.supported) {
+    db = await window.openDatabase('test_db', '1.0', 'test_db', 1024 * 1024);
+    expect(db, isNotNull, reason: 'Unable to open database');
+
+    tx = await db.transaction_future();
+    expect(tx, isNotNull, reason: "Transaction not ready");
+  }
+}
+
+main() async {
   useHtmlIndividualConfiguration();
 
-  group('supported', () {
+  await setup();
+
+  group('Database', () {
     test('supported', () {
       expect(SqlDatabase.supported, true);
     });
   });
 
-  group('functional', () {
-    test('unsupported throws', () {
-      var expectation = SqlDatabase.supported ? returnsNormally : throws;
-      expect(() {
-        window.openDatabase('test_db', '1.0', 'test_db', 1024 * 1024);
-      }, expectation);
-    });
-    test('Web Database', () {
-      // Skip if not supported.
-      if (!SqlDatabase.supported) {
-        return new Future.value();
+  group('Database', () {
+    test('Open/Transaction', () async {
+      if (!SqlDatabase.supported) return;
+
+      expect(tx, isNotNull, reason: "Transaction not ready");
+
+      // Should not succeed table doesn't exist to be dropped.
+      try {
+        await dropTable(tx, tableName);
+        expect(false, true, reason: "dropTable should fail");
+      } catch (error) {
+        expect(error.message,
+            "could not prepare statement (1 no such table: test_table)");
       }
+    });
 
-      final tableName = 'test_table';
-      final columnName = 'test_data';
+    test('create', () async {
+      if (!SqlDatabase.supported) return;
 
-      final db = window.openDatabase('test_db', '1.0', 'test_db', 1024 * 1024);
+      expect(tx, isNotNull, reason: "Transaction not ready");
+      try {
+        SqlResultSet createResult =
+            await createTable(tx, tableName, columnName);
+        expect(createResult.insertId, 0);
+      } catch (error) {
+        expect(false, true, reason: "createTable failed - ${error.message}");
+      }
+    });
 
-      expect(db, isNotNull, reason: 'Unable to open database');
+    test('insert', () async {
+      if (!SqlDatabase.supported) return;
 
-      var tx;
-      return transaction(db).then((transaction) {
-        tx = transaction;
-      }).then((_) {
-        // Attempt to clear out any tables which may be lurking from previous
-        // runs.
-        return dropTable(tx, tableName, true);
-      }).then((_) {
-        return createTable(tx, tableName, columnName);
-      }).then((_) {
-        return insert(tx, tableName, columnName, 'Some text data');
-      }).then((_) {
-        return queryTable(tx, tableName);
-      }).then((resultSet) {
-        expect(resultSet.rows.length, 1);
-        var row = resultSet.rows.item(0);
-        expect(row.containsKey(columnName), isTrue);
-        expect(row[columnName], 'Some text data');
-        expect(resultSet.rows[0], row);
-      }).then((_) {
-        return dropTable(tx, tableName);
-      });
+      expect(tx, isNotNull, reason: "Transaction not ready");
+      try {
+        SqlResultSet insertResult =
+            await insertTable(tx, tableName, columnName, 'Some text data');
+        expect(insertResult.insertId, 1);
+        expect(insertResult.rowsAffected, 1);
+      } catch (error) {
+        expect(false, true, reason: "insert failed - ${error.message}");
+      }
+    });
+
+    test('query', () async {
+      if (!SqlDatabase.supported) return;
+
+      expect(tx, isNotNull, reason: "Transaction not ready");
+      try {
+        SqlResultSet queryResult = await queryTable(tx, tableName);
+        expect(queryResult.rows.length, 1);
+        expect(queryResult.rows[0]['test_data'], "Some text data");
+      } catch (error) {
+        expect(false, true, reason: "queryTable failed - ${error.message}");
+      }
+    });
+
+    test('cleanup', () async {
+      if (!SqlDatabase.supported) return;
+
+      expect(tx, isNotNull, reason: "Transaction not ready");
+      await dropTable(tx, tableName, true);
     });
   });
 }
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index dce3ec3..b6b3e96 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -391,9 +391,9 @@
 regress_17382_test: RuntimeError
 regress_20394_test/01: MissingCompileTimeError
 regress_22936_test/01: RuntimeError
-regress_22976_test/01: CompileTimeError
-regress_22976_test/02: CompileTimeError
-regress_22976_test/none: CompileTimeError
+regress_22976_test/01: Pass # Incorrectly pass, we are ignoring an error due to #31118
+regress_22976_test/02: Pass # Incorrectly pass, we are ignoring an error due to #31118
+regress_22976_test/none: Pass # Incorrectly pass, we are ignoring an error due to #31118
 regress_24283_test: RuntimeError
 regress_26133_test: RuntimeError # Issue 26429
 regress_27572_test: RuntimeError
@@ -775,9 +775,9 @@
 regress_17382_test: RuntimeError
 regress_20394_test/01: MissingCompileTimeError
 regress_22936_test/01: RuntimeError
-regress_22976_test/01: CompileTimeError
-regress_22976_test/02: CompileTimeError
-regress_22976_test/none: CompileTimeError
+regress_22976_test/01: Pass # Incorrectly pass, we are ignoring an error due to #31118
+regress_22976_test/02: Pass # Incorrectly pass, we are ignoring an error due to #31118
+regress_22976_test/none: Pass # Incorrectly pass, we are ignoring an error due to #31118
 regress_24283_test: RuntimeError
 regress_27572_test: RuntimeError
 regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
@@ -1093,9 +1093,9 @@
 regress_17382_test: RuntimeError
 regress_20394_test/01: MissingCompileTimeError
 regress_22936_test/01: RuntimeError
-regress_22976_test/01: CompileTimeError
-regress_22976_test/02: CompileTimeError
-regress_22976_test/none: CompileTimeError
+regress_22976_test/01: Pass # Incorrectly pass, we are ignoring an error due to #31118
+regress_22976_test/02: Pass # Incorrectly pass, we are ignoring an error due to #31118
+regress_22976_test/none: Pass # Incorrectly pass, we are ignoring an error due to #31118
 regress_24283_test: RuntimeError
 regress_27572_test: RuntimeError
 regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
@@ -1431,9 +1431,9 @@
 regress_20394_test/01: MissingCompileTimeError
 regress_21795_test: RuntimeError
 regress_22936_test/01: RuntimeError
-regress_22976_test/01: CompileTimeError
-regress_22976_test/02: CompileTimeError
-regress_22976_test/none: CompileTimeError
+regress_22976_test/01: Pass # Incorrectly pass, we are ignoring an error due to #31118
+regress_22976_test/02: Pass # Incorrectly pass, we are ignoring an error due to #31118
+regress_22976_test/none: Pass # Incorrectly pass, we are ignoring an error due to #31118
 regress_24283_test: RuntimeError
 regress_27572_test: RuntimeError
 regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
diff --git a/tests/language_2/async_no_suspend/README.md b/tests/language_2/async_no_suspend/README.md
new file mode 100644
index 0000000..a4dd590
--- /dev/null
+++ b/tests/language_2/async_no_suspend/README.md
@@ -0,0 +1,7 @@
+# Feature tests for starting async methods without suspending
+
+This directory was created in order to hold tests pertaining to the Dart
+feature which makes methods marked as `async` start executing the body
+immediately, rather than returning a `Future` and suspending. For more
+details, please check the
+[language specification update](https://github.com/dart-lang/sdk/commit/2170830a9e41fa5b4067fde7bd44b76f5128c502).
diff --git a/tests/language_2/fixed_size_int/README.md b/tests/language_2/fixed_size_int/README.md
new file mode 100644
index 0000000..a2ddb7c
--- /dev/null
+++ b/tests/language_2/fixed_size_int/README.md
@@ -0,0 +1,7 @@
+# Feature tests for fixed size integers
+
+This directory was created in order to hold tests pertaining to the Dart
+feature which changes the `int` type to have a fixed-size representation
+(as opposed to implicitly transitioning into an arbitrary bigint
+representation when needed). For more details, please check the
+[informal specification](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/int64.md).
diff --git a/tests/language_2/generalized_void_usage_test.dart b/tests/language_2/generalized_void_usage_test.dart
new file mode 100644
index 0000000..262e40a
--- /dev/null
+++ b/tests/language_2/generalized_void_usage_test.dart
@@ -0,0 +1,37 @@
+// 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.
+
+// Dart test for static checks on situations where expressions of type void
+// can be used. The point is simply that there are no compile-time errors.
+
+// We need expressions of type `void`; `void x` would do, but using
+// `void get x` will work with tools that do not yet handle `void x`.
+void get x => null;
+
+void use(dynamic x) {}
+
+main() {
+  // In an expressionStatement `e;`, e may have type void.
+  x;
+
+  // In the initialization and increment expressions of a for-loop,
+  // `for (e1; e2; e3) {..}`, `e1` and `e3` may have type void.
+  for (x;; x) {
+    break;
+  }
+
+  // In a typeCast `e as T`, `e` may have type void.
+  var y = x as Object;
+
+  // In a parenthesized expression `(e)`, `e` may have type void.
+  (x);
+
+  // In a return statement `return e;`, when the return type of the
+  // innermost enclosing function is the type void, e may have type void.
+  void f() => x;
+
+  void g() {
+    return x;
+  }
+}
diff --git a/tests/language_2/generic_method_types_test.dart b/tests/language_2/generic_method_types_test.dart
index d618012..8fc355c 100644
--- a/tests/language_2/generic_method_types_test.dart
+++ b/tests/language_2/generic_method_types_test.dart
@@ -32,9 +32,9 @@
 test2() {
   var val = new Class<String>();
   Expect.isTrue(val.convert2 is Convert2);
-  Expect.isFalse(val.convert2 is Convert1);
+  Expect.isTrue(val.convert2 is Convert1);
   Expect.isTrue(val.convert2 is Convert2<String>);
-  Expect.isFalse(val.convert2 is Convert2<int>);
+  Expect.isTrue(val.convert2 is Convert2<int>);
   Expect.isFalse(val.convert2 is Convert1<String>);
   Expect.isFalse(val.convert2 is Other);
 }
diff --git a/tests/language_2/implicit_creation/README.md b/tests/language_2/implicit_creation/README.md
new file mode 100644
index 0000000..c6c3857e
--- /dev/null
+++ b/tests/language_2/implicit_creation/README.md
@@ -0,0 +1,10 @@
+# Feature tests for optional const and optional new
+
+This directory was created in order to hold tests pertaining to the
+Dart feature that allows the `new` and `const` keywords on instance
+creation expressions and composite literals (maps and lists) to be
+omitted. For more details, please check the feature specifications
+on
+[optional const](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/optional-const.md)
+and on
+[optional new](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/optional-new.md).
\ No newline at end of file
diff --git a/tests/language_2/initializer_assert/README.md b/tests/language_2/initializer_assert/README.md
new file mode 100644
index 0000000..44d18b3
--- /dev/null
+++ b/tests/language_2/initializer_assert/README.md
@@ -0,0 +1,7 @@
+# Feature tests for assert in initializer lists
+
+This directory was created in order to hold tests pertaining to the Dart
+feature which allows an assertion (`assert(...)`) to occur in the
+initializer list of a constructor, including `const` constructors.  For
+more details, please check the
+[language specification update](https://github.com/dart-lang/sdk/commit/609d26a2274ccde0f74725f4df7e081ebc8ea020).
diff --git a/tests/language_2/instantiate_to_bound/README.md b/tests/language_2/instantiate_to_bound/README.md
new file mode 100644
index 0000000..0c24c51
--- /dev/null
+++ b/tests/language_2/instantiate_to_bound/README.md
@@ -0,0 +1,12 @@
+# Feature tests for instantiation to bounds, and super-bounded types
+
+This directory was created in order to hold tests pertaining to the
+Dart feature _instantiate to bound_, which provides inference of
+default values for omitted type arguments. In order to handle
+F-bounded type parameters without introducing infinite types, this
+feature relies on another feature, _super-bounded types_, which is
+therefore also in focus for tests in this directory. For more details,
+please check the feature specifications on
+[super-bounded types](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/super-bounded-types.md)
+and on
+[instantiate to bound](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/instantiate-to-bound.md).
\ No newline at end of file
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index 634f34c..ec5c30a 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -414,6 +414,7 @@
 method_override6_test/none: Pass
 method_override7_test/03: MissingCompileTimeError
 method_override8_test/03: MissingCompileTimeError
+method_override_test: RuntimeError
 mixin_illegal_constructor_test/13: MissingCompileTimeError
 mixin_illegal_constructor_test/14: MissingCompileTimeError
 mixin_illegal_constructor_test/15: MissingCompileTimeError
@@ -1093,6 +1094,7 @@
 call_function_apply_test: RuntimeError
 canonical_const2_test: RuntimeError
 check_member_static_test/02: MissingCompileTimeError
+checked_method_error_order_test: RuntimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
 closure_invoked_through_interface_target_field_test: MissingCompileTimeError
@@ -1189,11 +1191,9 @@
 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).
-covariance_setter_test/none: Crash # NoSuchMethodError: The method 'hasSubclass' was called on null.
 covariance_type_parameter_test/01: Crash # NoSuchMethodError: The method 'hasSubclass' was called on null.
 covariance_type_parameter_test/02: Crash # NoSuchMethodError: The method 'hasSubclass' was called on null.
 covariance_type_parameter_test/03: Crash # NoSuchMethodError: The method 'hasSubclass' was called on null.
-covariance_type_parameter_test/none: Crash # NoSuchMethodError: The method 'hasSubclass' was called on null.
 covariant_override/runtime_check_test: RuntimeError
 covariant_subtyping_test: Crash # Unsupported operation: Unsupported type parameter type node E.
 cyclic_constructor_test/01: Crash # Stack Overflow
@@ -1353,7 +1353,7 @@
 mixin_mixin_bound2_test: RuntimeError
 mixin_mixin_bound_test: RuntimeError
 mixin_mixin_test: RuntimeError
-mixin_mixin_type_arguments_test: Crash # NoSuchMethodError: The method 'hasSubclass' was called on null.
+mixin_mixin_type_arguments_test: RuntimeError
 mixin_of_mixin_test/none: CompileTimeError
 mixin_super_2_test/none: CompileTimeError
 mixin_super_constructor_named_test/01: MissingCompileTimeError
@@ -1425,9 +1425,9 @@
 redirecting_factory_long_test: RuntimeError
 redirecting_factory_reflection_test: RuntimeError
 regress_20394_test/01: MissingCompileTimeError
-regress_22976_test/01: CompileTimeError
-regress_22976_test/02: CompileTimeError
-regress_22976_test/none: CompileTimeError
+regress_22976_test/01: RuntimeError
+regress_22976_test/02: Pass # Incorrectly pass, we are ignoring an error due to #31118
+regress_22976_test/none: Pass # Incorrectly pass, we are ignoring an error due to #31118
 regress_24283_test: RuntimeError
 regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
 regress_28217_test/01: MissingCompileTimeError
@@ -1636,7 +1636,6 @@
 type_inference_inconsistent_inheritance_test: MissingCompileTimeError
 
 [ $compiler == dart2js && $dart2js_with_kernel && $fast_startup ]
-arithmetic_canonicalization_test: RuntimeError
 assertion_initializer_const_error2_test/none: CompileTimeError
 assertion_initializer_const_function_test/01: MissingCompileTimeError
 assertion_initializer_test: CompileTimeError
@@ -1759,6 +1758,7 @@
 covariant_subtyping_unsafe_call2_test: RuntimeError
 covariant_subtyping_unsafe_call3_test: RuntimeError
 cyclic_constructor_test/01: Crash # Stack Overflow
+deferred_call_empty_before_load_test: RuntimeError
 deferred_closurize_load_library_test: RuntimeError
 deferred_constraints_constants_test/default_argument2: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred_constraints_constants_test/none: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
@@ -1806,6 +1806,9 @@
 field_override4_test/02: MissingCompileTimeError
 final_attempt_reinitialization_test/01: MissingCompileTimeError
 final_attempt_reinitialization_test/02: MissingCompileTimeError
+full_stacktrace1_test: RuntimeError
+full_stacktrace2_test: RuntimeError
+full_stacktrace3_test: RuntimeError
 function_subtype_bound_closure3_test: RuntimeError
 function_subtype_bound_closure4_test: RuntimeError
 function_subtype_bound_closure7_test: RuntimeError
@@ -1836,10 +1839,7 @@
 generalized_void_syntax_test: CompileTimeError
 generic_closure_test/01: RuntimeError
 generic_closure_test/none: RuntimeError
-generic_field_mixin4_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(M.T) in () for j:constructor(C3.).
-generic_field_mixin5_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(M.T) in () for j:constructor(C3.).
 generic_field_mixin6_test/none: RuntimeError
-generic_field_mixin_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(M.T) in () for j:constructor(C3.).
 generic_function_bounds_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_function_dcall_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_function_typedef_test/01: RuntimeError
@@ -2023,9 +2023,9 @@
 redirecting_factory_long_test: RuntimeError
 redirecting_factory_reflection_test: RuntimeError
 regress_20394_test/01: MissingCompileTimeError
-regress_22976_test/01: CompileTimeError
-regress_22976_test/02: CompileTimeError
-regress_22976_test/none: CompileTimeError
+regress_22976_test/01: Pass # Incorrectly pass, we are ignoring an error due to #31118
+regress_22976_test/02: Pass # Incorrectly pass, we are ignoring an error due to #31118
+regress_22976_test/none: Pass # Incorrectly pass, we are ignoring an error due to #31118
 regress_24283_test: RuntimeError
 regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
 regress_28217_test/01: MissingCompileTimeError
@@ -2038,6 +2038,9 @@
 setter_override_test/00: MissingCompileTimeError
 setter_override_test/03: MissingCompileTimeError
 stacktrace_demangle_ctors_test: RuntimeError # Issue 12698
+stacktrace_rethrow_error_test/none: RuntimeError
+stacktrace_rethrow_error_test/withtraceparameter: RuntimeError
+stacktrace_rethrow_nonerror_test: RuntimeError
 stacktrace_test: RuntimeError # Issue 12698
 super_call4_test: Crash # NoSuchMethodError: The getter 'thisLocal' was called on null.
 switch_bad_case_test/01: MissingCompileTimeError
@@ -2450,9 +2453,9 @@
 redirecting_factory_long_test: RuntimeError
 redirecting_factory_reflection_test: RuntimeError
 regress_20394_test/01: MissingCompileTimeError
-regress_22976_test/01: CompileTimeError
-regress_22976_test/02: CompileTimeError
-regress_22976_test/none: CompileTimeError
+regress_22976_test/01: Pass # Incorrectly pass, we are ignoring an error due to #31118
+regress_22976_test/02: Pass # Incorrectly pass, we are ignoring an error due to #31118
+regress_22976_test/none: Pass # Incorrectly pass, we are ignoring an error due to #31118
 regress_23408_test: Crash # Assertion failure: Missing scope info for j:method(_loadLibraryWrapper).
 regress_24283_test: RuntimeError
 regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
@@ -2871,9 +2874,9 @@
 redirecting_factory_reflection_test: RuntimeError
 regress_20394_test/01: MissingCompileTimeError
 regress_21795_test: RuntimeError
-regress_22976_test/01: CompileTimeError
-regress_22976_test/02: CompileTimeError
-regress_22976_test/none: CompileTimeError
+regress_22976_test/01: Pass # Incorrectly pass, we are ignoring an error due to #31118
+regress_22976_test/02: Pass # Incorrectly pass, we are ignoring an error due to #31118
+regress_22976_test/none: Pass # Incorrectly pass, we are ignoring an error due to #31118
 regress_23408_test: Crash # NoSuchMethodError: The getter 'closureClassEntity' was called on null.
 regress_24283_test: RuntimeError, OK # Requires 64 bit numbers.
 regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index f86090e..8845ee6 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -712,7 +712,6 @@
 first_class_types_test: RuntimeError, OK # Strong mode reifies inferred type argument.
 forwarding_stub_tearoff_generic_test: RuntimeError
 fuzzy_arrows_test/03: RuntimeError # Issue 29630
-generic_method_types_test/02: RuntimeError
 getter_closure_execution_order_test: RuntimeError # Issue 29920
 implicit_downcast_during_compound_assignment_test: RuntimeError
 implicit_downcast_during_indexed_compound_assignment_test: RuntimeError
@@ -789,13 +788,11 @@
 generic_closure_test/01: RuntimeError # ReferenceError: TToT is not defined
 generic_closure_test/none: RuntimeError # ReferenceError: TToT is not defined
 generic_list_checked_test: RuntimeError # Expect.throws fails: Did not throw
-generic_method_types_test/02: RuntimeError
 generic_methods_unused_parameter_test: RuntimeError # Expect.isTrue(false) fails.
 generic_test: RuntimeError # ReferenceError: BOfT is not defined
 library_env_test/has_io_support: RuntimeError # Unsupported operation: bool.fromEnvironment can only be used as a const constructor
 library_env_test/has_mirror_support: RuntimeError # Unsupported operation: bool.fromEnvironment can only be used as a const constructor
 library_env_test/has_no_html_support: RuntimeError # Unsupported operation: bool.fromEnvironment can only be used as a const constructor
-method_override_test: RuntimeError # Expect.isTrue(false) fails.
 mixin_bound_test: RuntimeError
 mixin_extends_field_test: RuntimeError # Expect.equals(expected: <M1-bar>, actual: <null>) fails.
 mixin_field_test: RuntimeError # NoSuchMethodError: method not found: 'bar'
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index fbe1059..f6b4071 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -12,14 +12,9 @@
 # ===== Skip dartk and darkp in !$strong mode ====
 
 [ $compiler == dartkp ]
-bit_operations_test: CompileTimeError # Issue 31339
 generic_no_such_method_dispatcher_test: RuntimeError # Issue 31424
-identical_closure2_test: CompileTimeError # Issue 31339
-mint_arithmetic_test: CompileTimeError # Issue 31339
 mock_writable_final_field_test: RuntimeError # Issue 31424
 no_such_method_subtype_test: RuntimeError # Issue 31424
-vm/unaligned_integer_access_literal_index_test: CompileTimeError # Issue 31339
-vm/unaligned_integer_access_register_index_test: CompileTimeError # Issue 31339
 
 [ $compiler == dartk && $mode == debug && $runtime == vm && $strong ]
 bad_named_parameters_test/01: Crash # Issue(http://dartbug.com/31630)
@@ -648,10 +643,8 @@
 generic_function_type_as_type_argument_test/02: MissingCompileTimeError, OK # No type inference
 generic_function_typedef2_test/04: MissingCompileTimeError
 generic_instanceof2_test: RuntimeError
-generic_instanceof_test: RuntimeError
 generic_is_check_test: RuntimeError
 generic_list_checked_test: CompileTimeError # Issue 31402 (Variable declaration)
-generic_method_types_test/02: RuntimeError
 generic_methods_bounds_test/01: MissingCompileTimeError
 generic_methods_overriding_test/01: MissingCompileTimeError
 generic_methods_overriding_test/03: MissingCompileTimeError
@@ -687,7 +680,6 @@
 initializing_formal_final_test: MissingCompileTimeError
 initializing_formal_type_annotation_test/01: MissingCompileTimeError
 initializing_formal_type_annotation_test/02: MissingCompileTimeError
-instanceof2_test: RuntimeError
 instantiate_tearoff_after_contravariance_check_test: CompileTimeError
 instantiate_tearoff_of_call_test: CompileTimeError
 instantiate_tearoff_test: CompileTimeError
@@ -803,7 +795,6 @@
 malformed_test/23: MissingCompileTimeError
 malformed_test/24: MissingCompileTimeError
 malformed_type_test: MissingCompileTimeError
-many_generic_instanceof_test: RuntimeError
 map_literal3_test/01: MissingCompileTimeError
 map_literal3_test/02: MissingCompileTimeError
 map_literal3_test/03: MissingCompileTimeError
@@ -826,7 +817,6 @@
 method_override6_test/03: MissingCompileTimeError
 method_override7_test/03: MissingCompileTimeError
 method_override8_test/03: MissingCompileTimeError
-method_override_test: RuntimeError
 mixin_illegal_constructor_test/13: MissingCompileTimeError
 mixin_illegal_constructor_test/14: MissingCompileTimeError
 mixin_illegal_constructor_test/15: MissingCompileTimeError
@@ -1197,9 +1187,6 @@
 # are to be triaged.  Isolate tests are skipped on purpose due to the usage of
 # batch mode.
 [ $compiler == dartk && $strong && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
-bit_operations_test/03: CompileTimeError # Please triage.
-bit_operations_test/04: CompileTimeError # Please triage.
-bit_operations_test/none: CompileTimeError # Please triage.
 class_cycle_test/02: MissingCompileTimeError # Please triage.
 class_cycle_test/03: MissingCompileTimeError # Please triage.
 duplicate_implements_test/01: MissingCompileTimeError # Please triage.
@@ -1207,15 +1194,13 @@
 duplicate_implements_test/03: MissingCompileTimeError # Please triage.
 duplicate_implements_test/04: MissingCompileTimeError # Please triage.
 generic_methods_generic_function_result_test/01: MissingCompileTimeError # Please triage.
-identical_closure2_test: CompileTimeError # Please triage.
+int64_literal_test/03: Pass
+int64_literal_test/30: Pass
 issue23244_test: RuntimeError # Please triage.
 least_upper_bound_expansive_test/none: RuntimeError # Please triage.
-mint_arithmetic_test: CompileTimeError # Please triage.
 mixin_black_listed_test/02: MissingCompileTimeError # Please triage.
 null_test/02: MissingCompileTimeError # Please triage.
 null_test/03: MissingCompileTimeError # Please triage.
-vm/unaligned_integer_access_literal_index_test: CompileTimeError # Please triage.
-vm/unaligned_integer_access_register_index_test: CompileTimeError # Please triage.
 
 [ $compiler == dartk && !$strong ]
 *: SkipByDesign # language_2 is only supported in strong mode.
@@ -1887,11 +1872,9 @@
 generic_function_typedef_test/01: Pass
 generic_function_typedef_test/01: RuntimeError
 generic_instanceof2_test: RuntimeError
-generic_instanceof_test: RuntimeError
 generic_is_check_test: RuntimeError
 generic_list_checked_test: RuntimeError
 generic_list_checked_test: CompileTimeError # Issue 31402 (Variable declaration)
-generic_method_types_test/02: RuntimeError
 generic_methods_bounds_test/01: Crash
 generic_methods_bounds_test/01: MissingCompileTimeError
 generic_methods_generic_function_result_test/01: MissingCompileTimeError
@@ -1961,7 +1944,6 @@
 initializing_formal_type_annotation_test/01: MissingCompileTimeError
 initializing_formal_type_annotation_test/02: MissingCompileTimeError
 instance_creation_in_function_annotation_test: SkipByDesign
-instanceof2_test: RuntimeError
 instanceof4_test/01: RuntimeError
 instanceof4_test/01: Pass
 instanceof4_test/none: Pass
@@ -1969,8 +1951,6 @@
 instantiate_tearoff_after_contravariance_check_test: CompileTimeError
 instantiate_tearoff_of_call_test: CompileTimeError
 instantiate_tearoff_test: CompileTimeError
-int64_literal_test/03: MissingCompileTimeError # http://dartbug.com/31479
-int64_literal_test/30: MissingCompileTimeError # http://dartbug.com/31479
 interface_test/00: MissingCompileTimeError
 invocation_mirror2_test: SkipByDesign
 invocation_mirror_invoke_on2_test: SkipByDesign
@@ -2087,7 +2067,6 @@
 malformed_test/23: MissingCompileTimeError
 malformed_test/24: MissingCompileTimeError
 malformed_type_test: MissingCompileTimeError
-many_generic_instanceof_test: RuntimeError
 many_overridden_no_such_method_test: SkipByDesign
 map_literal3_test/01: MissingCompileTimeError
 map_literal3_test/02: MissingCompileTimeError
@@ -2123,7 +2102,6 @@
 method_override6_test/none: Pass
 method_override7_test/03: MissingCompileTimeError
 method_override8_test/03: MissingCompileTimeError
-method_override_test: RuntimeError
 mixin_black_listed_test/02: MissingCompileTimeError
 mixin_illegal_constructor_test/13: MissingCompileTimeError
 mixin_illegal_constructor_test/14: MissingCompileTimeError
diff --git a/tests/language_2/language_2_precompiled.status b/tests/language_2/language_2_precompiled.status
index 9cb5e23..117ba9f 100644
--- a/tests/language_2/language_2_precompiled.status
+++ b/tests/language_2/language_2_precompiled.status
@@ -390,6 +390,7 @@
 generic_function_typedef_test/01: RuntimeError
 generic_instanceof_test: RuntimeError
 generic_list_checked_test: RuntimeError
+generic_method_types_test/02: RuntimeError, OK # No support for covariant tear-off in VM.
 generic_methods_bounds_test/01: MissingCompileTimeError
 generic_methods_bounds_test/02: MissingRuntimeError
 generic_methods_dynamic_test/01: MissingCompileTimeError
@@ -608,6 +609,7 @@
 method_override6_test/none: Pass
 method_override7_test/03: MissingCompileTimeError
 method_override8_test/03: MissingCompileTimeError
+method_override_test: RuntimeError, OK # No support for covariant tear-off in VM.
 mixin_illegal_constructor_test/13: MissingCompileTimeError
 mixin_illegal_constructor_test/14: MissingCompileTimeError
 mixin_illegal_constructor_test/15: MissingCompileTimeError
diff --git a/tests/language_2/language_2_vm.status b/tests/language_2/language_2_vm.status
index ec44f5d..8795fa1 100644
--- a/tests/language_2/language_2_vm.status
+++ b/tests/language_2/language_2_vm.status
@@ -395,6 +395,7 @@
 generic_function_type_as_type_argument_test/02: MissingCompileTimeError, OK # No type inference
 generic_function_typedef2_test/04: MissingCompileTimeError
 generic_instanceof_test: RuntimeError
+generic_method_types_test/02: RuntimeError, OK # No support for covariant tear-off in VM.
 generic_methods_bounds_test/01: MissingCompileTimeError
 generic_methods_dynamic_test/01: MissingCompileTimeError
 generic_methods_dynamic_test/03: MissingCompileTimeError
@@ -589,6 +590,7 @@
 method_override6_test/03: MissingCompileTimeError
 method_override7_test/03: MissingCompileTimeError
 method_override8_test/03: MissingCompileTimeError
+method_override_test: RuntimeError, OK # No support for covariant tear-off in VM.
 mixin_illegal_constructor_test/13: MissingCompileTimeError
 mixin_illegal_constructor_test/14: MissingCompileTimeError
 mixin_illegal_constructor_test/15: MissingCompileTimeError
diff --git a/tests/language_2/method_override_test.dart b/tests/language_2/method_override_test.dart
index c5428d3..fe3b686 100644
--- a/tests/language_2/method_override_test.dart
+++ b/tests/language_2/method_override_test.dart
@@ -19,8 +19,8 @@
 
     Expect.isTrue(remove is RemoveFunctionType);
     Expect.isTrue(remove is RemoveFunctionType<int, int>);
-    Expect.isTrue(remove is! RemoveFunctionType<String, int>);
-    Expect.isTrue(remove is! RemoveFunctionType<MapBase<int, int>, int>);
+    Expect.isTrue(remove is RemoveFunctionType<String, int>);
+    Expect.isTrue(remove is RemoveFunctionType<MapBase<int, int>, int>);
   }
 }
 
diff --git a/tests/language_2/nosuchmethod_forwarding/README.md b/tests/language_2/nosuchmethod_forwarding/README.md
new file mode 100644
index 0000000..15cf2d2
--- /dev/null
+++ b/tests/language_2/nosuchmethod_forwarding/README.md
@@ -0,0 +1,8 @@
+# Feature tests for noSuchMethod forwarding
+
+This directory was created in order to hold tests pertaining to the
+Dart feature which causes forwarding methods to be generated
+implicitly for all method signatures in the interface of a class that
+declares a non-trivial `noSuchMethod`. For more details, please check
+the
+[feature specification](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/nosuchmethod-forwarding.md).
\ No newline at end of file
diff --git a/tests/language_2/subtyping_dynamic/README.md b/tests/language_2/subtyping_dynamic/README.md
new file mode 100644
index 0000000..24c6b0d
--- /dev/null
+++ b/tests/language_2/subtyping_dynamic/README.md
@@ -0,0 +1,4 @@
+# Feature tests for the dynamic semantics of subtyping
+
+This directory was created in order to hold tests pertaining to the
+dynamic behavior of Dart programs where it involves subtyping.
diff --git a/tests/language_2/subtyping_static/README.md b/tests/language_2/subtyping_static/README.md
new file mode 100644
index 0000000..c634811
--- /dev/null
+++ b/tests/language_2/subtyping_static/README.md
@@ -0,0 +1,4 @@
+# Feature tests for static analysis involving subtyping
+
+This directory was created in order to hold tests pertaining to the
+static analysis of Dart where it involves subtyping.
diff --git a/tests/language_2/vm/type_vm_test.dart b/tests/language_2/vm/type_vm_test.dart
index a5aa778..cd3059f 100644
--- a/tests/language_2/vm/type_vm_test.dart
+++ b/tests/language_2/vm/type_vm_test.dart
@@ -127,7 +127,7 @@
     {
       var a = new List(5);
       List a0 = a;
-      List<Object> ao = a;  //# 29: runtime error
+      List<Object> ao = a;  // No error.
       List<int> ai = a;  //# 30: runtime error
       List<num> an = a;  //# 31: runtime error
       List<String> as = a;  //# 32: runtime error
diff --git a/tests/language_2/void/README.md b/tests/language_2/void/README.md
new file mode 100644
index 0000000..d2a17c9
--- /dev/null
+++ b/tests/language_2/void/README.md
@@ -0,0 +1,10 @@
+# Feature tests for void
+
+This directory was created in order to hold tests pertaining to the
+Dart feature temporarily known as _generalized void_. This feature
+allows the type `void` to occur in many locations where it was
+previously a compile-time error, and it is intended to allow
+developers to express the intent that the value of certain expressions
+is of no interest, and help them to avoid using such values. For more
+details, please check the
+[feature specification](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/generalized-void.md).
\ No newline at end of file
diff --git a/tests/lib_2/html/websql_test.dart b/tests/lib_2/html/websql_test.dart
index a066ea5..728b0fd 100644
--- a/tests/lib_2/html/websql_test.dart
+++ b/tests/lib_2/html/websql_test.dart
@@ -5,127 +5,124 @@
 import 'dart:web_sql';
 
 import 'package:unittest/unittest.dart';
-
-Future<SqlTransaction> transaction(SqlDatabase db) {
-  final completer = new Completer<SqlTransaction>.sync();
-
-  db.transaction((SqlTransaction transaction) {
-    completer.complete(transaction);
-  }, (SqlError error) {
-    completer.completeError(error);
-  });
-
-  return completer.future;
-}
+import 'package:unittest/html_config.dart';
+import 'package:async_helper/async_helper.dart';
 
 Future<SqlResultSet> createTable(
-    SqlTransaction transaction, String tableName, String columnName) {
-  final completer = new Completer<SqlResultSet>.sync();
-
-  final sql = 'CREATE TABLE $tableName ($columnName)';
-  transaction.executeSql(sql, [], (SqlTransaction tx, SqlResultSet rs) {
-    completer.complete(rs);
-  }, (SqlTransaction tx, SqlError error) {
-    completer.completeError(error);
-  });
-
-  return completer.future;
+    SqlTransaction transaction, String tableName, String columnName) async {
+  return transaction.executeSql('CREATE TABLE $tableName ($columnName)', []);
 }
 
-Future<SqlResultSet> insert(
-    SqlTransaction transaction, String tableName, String columnName, value) {
-  final completer = new Completer<SqlResultSet>.sync();
-
+Future<SqlResultSet> insertTable(SqlTransaction transaction, String tableName,
+    String columnName, value) async {
   final sql = 'INSERT INTO $tableName ($columnName) VALUES (?)';
-  transaction.executeSql(sql, [value], (SqlTransaction tx, SqlResultSet rs) {
-    completer.complete(rs);
-  }, (SqlTransaction tx, SqlError error) {
-    completer.completeError(error);
-  });
-
-  return completer.future;
+  return transaction.executeSql(sql, [value]);
 }
 
-Future<SqlResultSet> queryTable(SqlTransaction transaction, String tableName) {
-  final completer = new Completer<SqlResultSet>.sync();
-
+Future<SqlResultSet> queryTable(
+    SqlTransaction transaction, String tableName) async {
   final sql = 'SELECT * FROM $tableName';
-  transaction.executeSql(sql, [], (SqlTransaction tx, SqlResultSet rs) {
-    completer.complete(rs);
-  }, (SqlTransaction tx, SqlError error) {
-    completer.completeError(error);
-  });
-
-  return completer.future;
+  return transaction.executeSql(sql, []);
 }
 
 Future<SqlResultSet> dropTable(SqlTransaction transaction, String tableName,
-    [bool ignoreFailure = false]) {
-  final completer = new Completer<SqlResultSet>.sync();
-
-  final sql = 'DROP TABLE $tableName';
-  transaction.executeSql(sql, [], (SqlTransaction tx, SqlResultSet rs) {
-    completer.complete(rs);
-  }, (SqlTransaction tx, SqlError error) {
-    if (ignoreFailure) {
-      completer.complete(null);
-    } else {
-      completer.completeError(error);
-    }
-  });
-
-  return completer.future;
+    [bool ignoreFailure = false]) async {
+  try {
+    var result = await transaction.executeSql('DROP TABLE $tableName', []);
+    return result;
+  } catch (error) {
+    if (!ignoreFailure) throw error;
+  }
 }
 
-main() {
-  group('supported', () {
+final tableName = 'test_table';
+final columnName = 'test_data';
+
+SqlDatabase db;
+SqlTransaction tx;
+
+Future setup() async {
+  if (SqlDatabase.supported) {
+    db = await window.openDatabase('test_db', '1.0', 'test_db', 1024 * 1024);
+    expect(db, isNotNull, reason: 'Unable to open database');
+
+    tx = await db.transaction_future();
+    expect(tx, isNotNull, reason: "Transaction not ready");
+  }
+}
+
+main() async {
+  useHtmlConfiguration();
+
+  await setup();
+
+  group('Database', () {
     test('supported', () {
       expect(SqlDatabase.supported, true);
     });
   });
 
-  group('functional', () {
-    test('unsupported throws', () {
-      var expectation = SqlDatabase.supported ? returnsNormally : throws;
-      expect(() {
-        window.openDatabase('test_db', '1.0', 'test_db', 1024 * 1024);
-      }, expectation);
-    });
-    test('Web Database', () {
-      // Skip if not supported.
-      if (!SqlDatabase.supported) {
-        return new Future.value();
+  group('Database', () {
+    test('Open/Transaction', () async {
+      if (!SqlDatabase.supported) return;
+
+      expect(tx, isNotNull, reason: "Transaction not ready");
+
+      // Should not succeed table doesn't exist to be dropped.
+      try {
+        await dropTable(tx, tableName);
+        expect(false, true, reason: "dropTable should fail");
+      } catch (error) {
+        expect(error.message,
+            "could not prepare statement (1 no such table: test_table)");
       }
+    });
 
-      final tableName = 'test_table';
-      final columnName = 'test_data';
+    test('create', () async {
+      if (!SqlDatabase.supported) return;
 
-      final db = window.openDatabase('test_db', '1.0', 'test_db', 1024 * 1024);
+      expect(tx, isNotNull, reason: "Transaction not ready");
+      try {
+        SqlResultSet createResult =
+            await createTable(tx, tableName, columnName);
+        expect(createResult.insertId, 0);
+      } catch (error) {
+        expect(false, true, reason: "createTable failed - ${error.message}");
+      }
+    });
 
-      expect(db, isNotNull, reason: 'Unable to open database');
+    test('insert', () async {
+      if (!SqlDatabase.supported) return;
 
-      var tx;
-      return transaction(db).then((transaction) {
-        tx = transaction;
-      }).then((_) {
-        // Attempt to clear out any tables which may be lurking from previous
-        // runs.
-        return dropTable(tx, tableName, true);
-      }).then((_) {
-        return createTable(tx, tableName, columnName);
-      }).then((_) {
-        return insert(tx, tableName, columnName, 'Some text data');
-      }).then((_) {
-        return queryTable(tx, tableName);
-      }).then((resultSet) {
-        expect(resultSet.rows.length, 1);
-        var row = resultSet.rows.item(0);
-        expect(row.containsKey(columnName), isTrue);
-        expect(row[columnName], 'Some text data');
-        expect(resultSet.rows[0], row);
-      }).then((_) {
-        return dropTable(tx, tableName);
-      });
+      expect(tx, isNotNull, reason: "Transaction not ready");
+      try {
+        SqlResultSet insertResult =
+            await insertTable(tx, tableName, columnName, 'Some text data');
+        expect(insertResult.insertId, 1);
+        expect(insertResult.rowsAffected, 1);
+      } catch (error) {
+        expect(false, true, reason: "insert failed - ${error.message}");
+      }
+    });
+
+    test('query', () async {
+      if (!SqlDatabase.supported) return;
+
+      expect(tx, isNotNull, reason: "Transaction not ready");
+      try {
+        SqlResultSet queryResult = await queryTable(tx, tableName);
+        expect(queryResult.rows.length, 1);
+        expect(queryResult.rows[0]['test_data'], "Some text data");
+      } catch (error) {
+        expect(false, true, reason: "queryTable failed - ${error.message}");
+      }
+    });
+
+    test('cleanup', () async {
+      if (!SqlDatabase.supported) return;
+
+      expect(tx, isNotNull, reason: "Transaction not ready");
+      await dropTable(tx, tableName, true);
     });
   });
 }
diff --git a/tests/lib_2/lib_2_dart2js.status b/tests/lib_2/lib_2_dart2js.status
index 8b36efd..4125ad3 100644
--- a/tests/lib_2/lib_2_dart2js.status
+++ b/tests/lib_2/lib_2_dart2js.status
@@ -29,7 +29,6 @@
 html/js_typed_interop_side_cast_exp_test: Pass, RuntimeError # Roll 50 failure
 html/mirrors_js_typed_interop_test: Pass, Slow
 html/svgelement_test/PathElement: Pass, RuntimeError # Roll 50 failure
-html/websql_test: Pass, Timeout # Roll 50 failure
 html/wrapping_collections_test: SkipByDesign # Testing an issue that is only relevant to Dartium
 html/xhr_test/xhr: Pass, RuntimeError # Roll 50 failure
 isolate/browser/issue_12474_test: CompileTimeError # Issue 22529
diff --git a/tests/lib_2/lib_2_dartdevc.status b/tests/lib_2/lib_2_dartdevc.status
index 9ad5f8f..e1fbe36 100644
--- a/tests/lib_2/lib_2_dartdevc.status
+++ b/tests/lib_2/lib_2_dartdevc.status
@@ -29,7 +29,6 @@
 html/scripts_htmltest: Skip # Issue 29919
 html/transferables_test: CompileTimeError # Issue 30975
 html/two_scripts_htmltest: Skip # Issue 29919
-html/websql_test: Pass, RuntimeError # Issue 31036
 isolate/*: SkipByDesign # No support for dart:isolate in dart4web (http://dartbug.com/30538)
 js/null_test: RuntimeError # Issue 30652
 math/double_pow_test: RuntimeError # Issue 29922
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index 1ca7690..7b6db9d 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -10,9 +10,6 @@
 # missing a section you need, please reach out to sigmund@ to see the best way
 # to add them.
 
-[ $compiler == dartkp ]
-typed_data/int32x4_arithmetic_test/int64: CompileTimeError # Issue 31339
-
 [ $arch == x64 && $compiler == dartk && $mode == debug && $runtime == vm && $strong ]
 mirrors/invocation_fuzz_test: Skip # Because it times out, issue 29439.
 mirrors/variable_is_const_test/01: Crash
@@ -29,7 +26,6 @@
 mirrors/variable_is_const_test/01: Crash # Please triage.
 
 [ $compiler == dartk && $runtime == vm && $checked && $strong ]
-mirrors/invocation_fuzz_test/smi: Crash
 mirrors/redirecting_factory_different_type_test/01: Crash # Issue 28424
 mirrors/redirecting_factory_different_type_test/none: Crash # Issue 28424
 mirrors/reflected_type_generics_test/02: Pass
@@ -127,7 +123,6 @@
 mirrors/empty_test: RuntimeError
 mirrors/enum_test: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/equality_test: RuntimeError
-mirrors/fake_function_without_call_test: RuntimeError
 mirrors/function_type_mirror_test: RuntimeError
 mirrors/generic_bounded_by_type_parameter_test/02: MissingCompileTimeError
 mirrors/generic_bounded_test/01: MissingCompileTimeError
@@ -154,7 +149,6 @@
 mirrors/invocation_fuzz_test/emptyarray: Crash
 mirrors/invocation_fuzz_test/false: Crash
 mirrors/invocation_fuzz_test/none: Crash
-mirrors/invocation_fuzz_test/smi: RuntimeError
 mirrors/invocation_fuzz_test/string: Crash
 mirrors/invoke_private_test: RuntimeError
 mirrors/invoke_private_wrong_library_test: RuntimeError
@@ -287,13 +281,7 @@
 async/timer_isActive_test: RuntimeError
 async/timer_repeat_test: RuntimeError
 async/zone_run_unary_test: RuntimeError
-convert/chunked_conversion_json_decode1_test: RuntimeError
-convert/json_chunk_test: RuntimeError
-convert/json_test: RuntimeError
 convert/json_toEncodable_reviver_test: CompileTimeError
-convert/json_utf8_chunk_test: RuntimeError
-convert/streamed_conversion_json_encode1_test: RuntimeError
-convert/streamed_conversion_json_utf8_encode_test: RuntimeError
 isolate/count_test: Timeout
 isolate/cross_isolate_message_test: RuntimeError
 isolate/illegal_msg_function_test: RuntimeError
@@ -334,7 +322,6 @@
 mirrors/closures_test: RuntimeError
 mirrors/constructors_test: RuntimeError
 mirrors/fake_function_with_call_test: RuntimeError
-mirrors/function_apply_test: RuntimeError
 mirrors/generic_bounded_by_type_parameter_test/none: RuntimeError
 mirrors/generic_bounded_test/none: RuntimeError
 mirrors/generic_class_declaration_test: RuntimeError
@@ -355,9 +342,7 @@
 mirrors/instance_members_with_override_test: RuntimeError
 mirrors/instantiate_abstract_class_test: RuntimeError
 mirrors/intercepted_class_test: RuntimeError
-mirrors/invocation_fuzz_test/smi: Pass
 mirrors/invoke_closurization2_test: RuntimeError
-mirrors/invoke_named_test/none: RuntimeError
 mirrors/library_declarations_test/01: RuntimeError
 mirrors/library_imports_bad_metadata_test/none: RuntimeError
 mirrors/metadata_const_map_test: Crash
@@ -375,7 +360,6 @@
 mirrors/reflected_type_test/02: MissingCompileTimeError
 mirrors/reflected_type_test/03: MissingCompileTimeError
 mirrors/regress_16321_test/none: Crash
-mirrors/regress_19731_test: RuntimeError
 mirrors/return_type_test: RuntimeError
 mirrors/top_level_accessors_test/01: MissingCompileTimeError
 mirrors/type_argument_is_type_variable_test: RuntimeError
@@ -384,19 +368,18 @@
 typed_data/int32x4_static_test/01: MissingCompileTimeError
 typed_data/int32x4_static_test/02: MissingCompileTimeError
 
-# Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
+# Enabling of dartk for sim{arm,arm64,dbc64} revealed these test failures, which
 # are to be triaged.  Isolate tests are skipped on purpose due to the usage of
 # batch mode.
 [ $compiler == dartk && $strong && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
 isolate/*: Skip
-mirrors/invocation_fuzz_test/emptyarray: CompileTimeError # Please triage.
-mirrors/invocation_fuzz_test/false: CompileTimeError # Please triage.
+mirrors/invocation_fuzz_test/emptyarray: CompileTimeError, Pass # Please triage.
+mirrors/invocation_fuzz_test/false: CompileTimeError, Pass # Please triage.
 mirrors/invocation_fuzz_test/none: CompileTimeError # Please triage.
-mirrors/invocation_fuzz_test/smi: CompileTimeError # Please triage.
-mirrors/invocation_fuzz_test/string: CompileTimeError # Please triage.
+mirrors/invocation_fuzz_test/smi: CompileTimeError, DartkCrash, Crash, Pass # Please triage.
+mirrors/invocation_fuzz_test/string: CompileTimeError, Pass # Please triage.
 mirrors/library_uri_io_test: CompileTimeError # Please triage.
 mirrors/spawn_function_root_library_test: Skip
-typed_data/int32x4_arithmetic_test/int64: CompileTimeError # Please triage.
 
 # ===== Skip dartk and darkp in !$strong mode ====
 [ $compiler == dartk && !$strong ]
@@ -446,13 +429,7 @@
 async/timer_repeat_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/timer_test: CompileTimeError # Issue 31402 (Invocation arguments)
 async/zone_run_unary_test: CompileTimeError # Issue 31537
-convert/chunked_conversion_json_decode1_test: RuntimeError
-convert/json_chunk_test: RuntimeError
-convert/json_test: RuntimeError
 convert/json_toEncodable_reviver_test: CompileTimeError
-convert/json_utf8_chunk_test: RuntimeError
-convert/streamed_conversion_json_encode1_test: RuntimeError
-convert/streamed_conversion_json_utf8_encode_test: RuntimeError
 html/*: SkipByDesign # dart:html not supported on VM.
 isolate/compile_time_error_test/01: Crash
 isolate/compile_time_error_test/01: MissingCompileTimeError
diff --git a/tests/standalone_2/constant_left_shift_test.dart b/tests/standalone_2/constant_left_shift_test.dart
index c3072c1..5f87650 100644
--- a/tests/standalone_2/constant_left_shift_test.dart
+++ b/tests/standalone_2/constant_left_shift_test.dart
@@ -38,7 +38,7 @@
   Expect.equals(2305843009213693952, shiftLeft1(61));
   // Deoptimize on 64 bits.
   Expect.equals(4611686018427387904, shiftLeft1(62));
-  Expect.equals(9223372036854775808, shiftLeft1(63));
+  Expect.equals(-9223372036854775808, shiftLeft1(63));
 
   Expect.equals(8448, shiftLeft8448(0));
   Expect.equals(1081344, shiftLeft8448(7));
diff --git a/tests/standalone_2/int_array_test.dart b/tests/standalone_2/int_array_test.dart
index f4a3c62..30d326a 100644
--- a/tests/standalone_2/int_array_test.dart
+++ b/tests/standalone_2/int_array_test.dart
@@ -115,7 +115,7 @@
   intArray[0] = 4611686018427387903; // SmiMax
   intArray[1] = -1; // 0xFFFFFFFFFFFFFFFF : 18446744073709551615
   intArray[2] = 4611686018427387904; // SmiMax+1
-  intArray[3] = 9223372036854775808;
+  intArray[3] = -9223372036854775808;
   var x = intArray[0];
   var y = intArray[1];
   var z = intArray[2];
@@ -123,7 +123,7 @@
   Expect.equals(4611686018427387903, x);
   Expect.equals(-1, y);
   Expect.equals(4611686018427387904, z);
-  Expect.equals(9223372036854775808, w);
+  Expect.equals(-9223372036854775808, w);
 }
 
 main() {
diff --git a/tests/standalone_2/medium_integer_test.dart b/tests/standalone_2/medium_integer_test.dart
index 26a62b0..28532f9 100644
--- a/tests/standalone_2/medium_integer_test.dart
+++ b/tests/standalone_2/medium_integer_test.dart
@@ -28,7 +28,7 @@
     Expect.equals(1234567890123456791, a + b);
     Expect.equals(1234567890123456791, b + a);
     a = 9223372036854775807;
-    Expect.equals(9223372036854775808, a + 1);
+    Expect.equals(-9223372036854775808, a + 1);
 
     // Mint and Mint.
     a = 100000000000000001;
diff --git a/tests/standalone_2/standalone_2.status b/tests/standalone_2/standalone_2.status
index a28eedf..678a688 100644
--- a/tests/standalone_2/standalone_2.status
+++ b/tests/standalone_2/standalone_2.status
@@ -58,9 +58,6 @@
 [ !$strong ]
 float_array_static_test: MissingCompileTimeError
 
-[ $arch == simdbc64 && $strong && ($compiler == dartk || $compiler == dartkp) ]
-io/*: Skip # Issue 31695
-
 [ $builder_tag == swarming && $system == macos ]
 io/*: Skip # Issue 30618
 
@@ -107,7 +104,6 @@
 io/http_redirect_test: RuntimeError
 io/http_reuse_server_port_test: RuntimeError
 io/http_server_response_test: RuntimeError
-io/http_session_test: RuntimeError
 io/regress_10026_test: RuntimeError
 io/skipping_dart2js_compilations_test: CompileTimeError
 io/socket_upgrade_to_secure_test: RuntimeError
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index 7ac601f..e854872 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -10,11 +10,6 @@
 # missing a section you need, please reach out to sigmund@ to see the best way
 # to add them.
 
-[ $compiler == dartkp ]
-bytedata_test: CompileTimeError # Issue 31339
-typed_array_int64_uint64_test: CompileTimeError, Crash # Issue 31339
-typed_data_view_test: CompileTimeError # Issue 31339
-
 [ $compiler == dartk && $mode == debug && $runtime == vm && $strong ]
 io/file_lock_test: Slow, Pass
 io/raw_socket_test: Crash
@@ -47,7 +42,22 @@
 # are to be triaged.  Isolate tests are skipped on purpose due to the usage of
 # batch mode.
 [ $compiler == dartk && $strong && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
-bytedata_test: CompileTimeError # Please triage.
+io/directory_list_sync_test: Timeout, Pass # Please triage.
+io/echo_server_stream_test: Skip # Uses isolates which don't work in batch mode.
+io/file_blocking_lock_test: Pass, Crash # Please triage.
+io/file_lock_test: RuntimeError # Please triage.
+io/http_advanced_test: Skip # Uses isolates which don't work in batch mode.
+io/http_basic_test: Skip # Uses isolates which don't work in batch mode.
+io/http_read_test: Skip # Uses isolates which don't work in batch mode.
+io/pipe_server_test: Skip # Uses isolates which don't work in batch mode.
+io/platform_test: Skip # Uses isolates which don't work in batch mode.
+io/raw_synchronous_socket_test: Skip # Uses isolates which don't work in batch mode.
+io/socket_close_test: Skip # Uses isolates which don't work in batch mode.
+io/socket_finalizer_test: Skip # Uses isolates which don't work in batch mode.
+io/socket_many_connections_test: Skip # Uses isolates which don't work in batch mode.
+io/stdio_socket_finalizer_test: Skip # Uses isolates which don't work in batch mode.
+io/test_extension_fail_test: RuntimeError # Please traige.
+io/test_extension_test: RuntimeError # Please traige.
 map_insert_remove_oom_test: Pass # Please triage.
 package/scenarios/invalid/invalid_utf8_test: Pass # Please triage.
 package/scenarios/invalid/non_existent_packages_file_test: Pass # Please triage.
@@ -57,10 +67,9 @@
 regress_26031_test: RuntimeError # Please triage.
 regress_28854_1_test: RuntimeError # Please triage.
 regress_28854_2_test: RuntimeError # Please triage.
-typed_array_int64_uint64_test: CompileTimeError # Please triage.
+typed_array_int64_uint64_test: RuntimeError # Please triage.
 typed_array_test: RuntimeError # Please triage.
 typed_data_isolate_test: RuntimeError # Please triage.
-typed_data_view_test: CompileTimeError # Please triage.
 
 # ===== Skip dartk and darkp in !$strong mode ====
 [ $compiler == dartk && !$strong ]
diff --git a/tools/VERSION b/tools/VERSION
index e0fa1c0..18ad238 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 0
 PATCH 0
-PRERELEASE 14
+PRERELEASE 15
 PRERELEASE_PATCH 0
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index 10647b0..9a793a1 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -672,12 +672,51 @@
     callback_info = GetCallbackInfo(
         self._database.GetInterface(info.callback_args[0].type_id))
 
+    # If more than one callback then the second argument is the error callback.
+    # Some error callbacks have 2 args (e.g., executeSql) where the second arg
+    # is the error - this is the argument we want.
+    error_callback = ""
+    if len(info.callback_args) > 1:
+      error_callback_info = GetCallbackInfo(
+            self._database.GetInterface(info.callback_args[1].type_id))
+      error_callbackNames = []
+      for paramInfo in error_callback_info.param_infos:
+          error_callbackNames.append(paramInfo.name)
+      errorCallbackVariables = ", ".join(error_callbackNames)
+      errorName = error_callback_info.param_infos[-1].name
+      error_callback = (',\n        %s(%s) { completer.completeError(%s); }' %
+                        (('%s : ' % info.callback_args[1].name
+                          if info.requires_named_arguments and
+                             info.callback_args[1].is_optional else ''),
+                         errorCallbackVariables, errorName))
+
     extensions = GetDDC_Extension(self._interface, info.declared_name)
     if extensions:
       ddc_extensions = "\n".join(extensions);
     else:
       ddc_extensions = ''
 
+    # Some callbacks have more than one parameters.  If so use all of
+    # those parameters.  However, if more than one argument use the
+    # type of the last argument to be returned e.g., executeSql the callback
+    # is (transaction, resultSet) and only the resultSet is returned SqlResultSet.
+    callbackArgsLen = len(callback_info.param_infos)
+    future_generic = ''
+    callbackVariables = ''
+    completerVariable = ''
+    if callbackArgsLen == 1:
+      callbackVariables = 'value'
+      completerVariable = callbackVariables
+      if callback_info.param_infos[0].type_id:
+        future_generic = '<%s>' % self._DartType(callback_info.param_infos[0].type_id)
+    elif callbackArgsLen > 1:
+      callbackNames = []
+      for paramInfo in callback_info.param_infos:
+        callbackNames.append(paramInfo.name)
+      callbackVariables = ",".join(callbackNames)
+      completerVariable = callbackNames[-1]
+      future_generic = '<%s>' % self._DartType(callback_info.param_infos[-1].type_id)
+
     param_list = info.ParametersAsArgumentList()
     metadata = ''
     if '_RenamingAnnotation' in dir(self):
@@ -690,7 +729,7 @@
         '    $ORIGINAL_FUNCTION($PARAMS_LIST\n'
         '        $NAMED_PARAM($VARIABLE_NAME) { '
         '$DDC_EXTENSION\n'
-        'completer.complete($VARIABLE_NAME); }'
+        'completer.complete($COMPLETER_NAME); }'
         '$ERROR_CALLBACK);\n'
         '    return completer.future;\n'
         '  }\n',
@@ -704,17 +743,12 @@
         NAMED_PARAM=('%s : ' % info.callback_args[0].name
             if info.requires_named_arguments and
               info.callback_args[0].is_optional else ''),
-        VARIABLE_NAME= '' if len(callback_info.param_infos) == 0 else 'value',
+        VARIABLE_NAME=callbackVariables,
+        COMPLETER_NAME=completerVariable,
         DDC_EXTENSION=ddc_extensions,
-        ERROR_CALLBACK=('' if len(info.callback_args) == 1 else
-            (',\n        %s(error) { completer.completeError(error); }' %
-            ('%s : ' % info.callback_args[1].name
-            if info.requires_named_arguments and
-                info.callback_args[1].is_optional else ''))),
-        FUTURE_GENERIC = ('' if len(callback_info.param_infos) == 0 or
-            not callback_info.param_infos[0].type_id else
-            '<%s>' % self._DartType(callback_info.param_infos[0].type_id)),
-        ORIGINAL_FUNCTION = html_name)
+        ERROR_CALLBACK=error_callback,
+        FUTURE_GENERIC=future_generic,
+        ORIGINAL_FUNCTION=html_name)
 
   def EmitHelpers(self, base_class):
     if not self._members_emitter:
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index ad6b9b2..43cec32 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -190,6 +190,7 @@
   'Notification.requestPermission',
   'RTCPeerConnection.setLocalDescription',
   'RTCPeerConnection.setRemoteDescription',
+  'SQLTransaction.executeSql',
   'StorageInfo.requestQuota',
   'StorageQuota.requestQuota',
   'Window.webkitRequestFileSystem',
@@ -213,6 +214,12 @@
           'applyExtension(\'Blob\', value);'
       ]
   },
+  'SQLTransaction': {
+      'executeSql': [
+          'applyExtension(\'SQLResultSet\', resultSet);'
+          'applyExtension(\'SQLResultSetRowList\', resultSet.rows);'
+      ],
+  },
   'Window': {
       'webkitRequestFileSystem':[
           'applyExtension(\'DOMFileSystem\', value);',
@@ -447,12 +454,13 @@
   'Window.getComputedStyle',
   'Window.clearInterval',
   'Window.clearTimeout',
+  'Window.openDatabase',
   # TODO(tll): These have been converted from int to double in Chrome 39 for
   #            subpixel precision.  Special case for backward compatibility.
-  'Window.scrollX',
-  'Window.scrollY',
   'Window.pageXOffset',
   'Window.pageYOffset',
+  'Window.scrollX',
+  'Window.scrollY',
 
   'WindowTimers.clearInterval',
   'WindowTimers.clearTimeout',
diff --git a/tools/dom/templates/html/dart2js/web_sql_dart2js.darttemplate b/tools/dom/templates/html/dart2js/web_sql_dart2js.darttemplate
index 164e713..85a580b 100644
--- a/tools/dom/templates/html/dart2js/web_sql_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/web_sql_dart2js.darttemplate
@@ -19,8 +19,8 @@
 import 'dart:_internal' show FixedLengthListMixin;
 import 'dart:html';
 import 'dart:html_common';
-import 'dart:_js_helper' show convertDartClosureToJS, Creates, JSName, Native,
-    JavaScriptIndexingBehavior;
+import 'dart:_js_helper' show applyExtension, convertDartClosureToJS, Creates,
+    JSName, Native, JavaScriptIndexingBehavior;
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show Interceptor;
 
diff --git a/tools/dom/templates/html/impl/impl_Database.darttemplate b/tools/dom/templates/html/impl/impl_Database.darttemplate
new file mode 100644
index 0000000..ef5d8bd
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_Database.darttemplate
@@ -0,0 +1,25 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of $LIBRARYNAME;
+
+@DocsEditable()
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
+$!MEMBERS
+
+  @JSName('transaction')
+  @DomName('Database.transaction')
+  @DocsEditable()
+  Future<SqlTransaction> transaction_future() {
+    var completer = new Completer<SqlTransaction>();
+    transaction((value) {
+      applyExtension('SQLTransaction', value);
+      completer.complete(value);
+    }, (error) {
+      completer.completeError(error);
+    });
+    return completer.future;
+  }
+
+}
diff --git a/tools/dom/templates/html/impl/impl_Window.darttemplate b/tools/dom/templates/html/impl/impl_Window.darttemplate
index d01250e..9da90cd 100644
--- a/tools/dom/templates/html/impl/impl_Window.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Window.darttemplate
@@ -227,6 +227,28 @@
     _moveTo(p.x, p.y);
   }
 
+  @JSName('openDatabase')
+  @DomName('Window.openDatabase')
+  @DocsEditable()
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental()
+  @Creates('SqlDatabase')
+  SqlDatabase openDatabase(
+      String name, String version, String displayName, int estimatedSize,
+      [DatabaseCallback creationCallback]) {
+    var db;
+    if (creationCallback == null)
+      db = _openDatabase(name, version, displayName, estimatedSize);
+    else
+      db = _openDatabase(
+        name, version, displayName, estimatedSize, creationCallback);
+
+    applyExtension('Database', db);
+
+    return db;
+  }
+
   @DomName('Window.pageXOffset')
   @DocsEditable()
   int get pageXOffset => JS('num', '#.pageXOffset', this).round();
diff --git a/tools/infra/config/cq.cfg b/tools/infra/config/cq.cfg
index da718ee..6976275 100644
--- a/tools/infra/config/cq.cfg
+++ b/tools/infra/config/cq.cfg
@@ -10,6 +10,7 @@
   gerrit_cq_ability {
      committer_list: "project-dart-committers"
      dry_run_access_list: "project-dart-tryjob-access"
+     allow_submit_with_open_deps: true
   }
   sign_cla {}
   tree_status {
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index be504f66..73470e5 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -1044,6 +1044,13 @@
     ];
     args.add(arguments.where((name) => name.endsWith('.dart')).single);
 
+    if (_isStrong) {
+      // Pass environment variable to the gen_kernel script as
+      // arguments are not passed if gen_kernel runs in batch mode.
+      environmentOverrides = new Map.from(environmentOverrides);
+      environmentOverrides['DART_VM_FLAGS'] = '--limit-ints-to-64-bits';
+    }
+
     return Command.vmKernelCompilation(dillFile, true, bootstrapDependencies(),
         genKernel, args, environmentOverrides);
   }
diff --git a/tools/testing/dart/utils.dart b/tools/testing/dart/utils.dart
index 0043d80..b2ca746 100644
--- a/tools/testing/dart/utils.dart
+++ b/tools/testing/dart/utils.dart
@@ -438,7 +438,9 @@
 
   static void deleteTempSnapshotDirectory(Configuration configuration) {
     if (configuration.compiler == Compiler.appJit ||
-        configuration.compiler == Compiler.precompiler) {
+        configuration.compiler == Compiler.precompiler ||
+        configuration.compiler == Compiler.dartk ||
+        configuration.compiler == Compiler.dartkp) {
       var checked = configuration.isChecked ? '-checked' : '';
       var strong = configuration.isStrong ? '-strong' : '';
       var minified = configuration.isMinified ? '-minified' : '';
@@ -448,7 +450,9 @@
           "$checked$strong$minified$csp$sdk";
       var generatedPath =
           configuration.buildDirectory + "/generated_compilations/$dirName";
-      TestUtils.deleteDirectory(generatedPath);
+      if (FileSystemEntity.isDirectorySync(generatedPath)) {
+        TestUtils.deleteDirectory(generatedPath);
+      }
     }
   }
 
diff --git a/utils/front_end/BUILD.gn b/utils/bazel/BUILD.gn
similarity index 73%
rename from utils/front_end/BUILD.gn
rename to utils/bazel/BUILD.gn
index 29b2df4..79a0a7e 100644
--- a/utils/front_end/BUILD.gn
+++ b/utils/bazel/BUILD.gn
@@ -4,7 +4,7 @@
 
 import("../application_snapshot.gni")
 
-application_snapshot("front_end_worker") {
-  main_dart = "../../pkg/front_end/tool/bazel/worker.dart"
+application_snapshot("kernel_summary_worker") {
+  main_dart = "kernel_summary_worker.dart"
   training_args = [ "--help" ]
 }
diff --git a/pkg/front_end/tool/bazel/worker.dart b/utils/bazel/kernel_summary_worker.dart
similarity index 68%
rename from pkg/front_end/tool/bazel/worker.dart
rename to utils/bazel/kernel_summary_worker.dart
index cd19f9f..7935027 100644
--- a/pkg/front_end/tool/bazel/worker.dart
+++ b/utils/bazel/kernel_summary_worker.dart
@@ -1,16 +1,21 @@
 // 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.
+
+/// A tool that invokes the CFE to compute kernel summary files.
+///
+/// This script can be used as a command-line command or a persistent server.
+/// The server is implemented using the bazel worker protocol, so it can be used
+/// within bazel as is. Other tools (like pub-build and package-build) also
+/// use this persistent worker via the same protocol.
+
 import 'dart:async';
 import 'dart:io';
 
 import 'package:args/args.dart';
 import 'package:bazel_worker/bazel_worker.dart';
-import 'package:front_end/src/api_prototype/front_end.dart'
-    hide FileSystemException;
-import 'package:front_end/src/fasta/command_line_reporting.dart';
+import 'package:front_end/src/api_unstable/summary_worker.dart' as fe;
 import 'package:front_end/src/multi_root_file_system.dart';
-import 'package:front_end/src/api_prototype/physical_file_system.dart';
 import 'package:kernel/target/targets.dart';
 
 main(List<String> args) async {
@@ -80,6 +85,7 @@
   ..addOption('dart-sdk-summary')
   ..addOption('input-summary', allowMultiple: true)
   ..addOption('multi-root', allowMultiple: true)
+  ..addOption('multi-root-scheme', defaultsTo: 'org-dartlang-multi-root')
   ..addOption('packages-file')
   ..addOption('source', allowMultiple: true)
   ..addOption('output');
@@ -105,45 +111,41 @@
   // Bazel creates an overlay file system where some files may be located in the
   // source tree, some in a gendir, and some in a bindir. The multi-root file
   // system hides this from the front end.
-  var fileSystem = new MultiRootFileSystem(
-      'org-dartlang-multi-root',
-      parsedArgs['multi-root'].map(Uri.parse).toList(),
-      PhysicalFileSystem.instance);
-  var options = new CompilerOptions()
-    ..packagesFileUri = Uri.parse(parsedArgs['packages-file'])
-    ..inputSummaries = parsedArgs['input-summary'].map(Uri.parse).toList()
-    ..sdkSummary = Uri.parse(parsedArgs['dart-sdk-summary'])
-    ..fileSystem = fileSystem
-    ..target = new NoneTarget(new TargetFlags());
+  var multiRoots = parsedArgs['multi-root'].map(Uri.base.resolve).toList();
+  if (multiRoots.isEmpty) multiRoots.add(Uri.base);
+  var fileSystem = new MultiRootFileSystem(parsedArgs['multi-root-scheme'],
+      multiRoots, fe.PhysicalFileSystem.instance);
 
-  options.onError = (CompilationMessage error) {
-    var message = new StringBuffer()
-      ..write(severityName(error.severity, capitalized: true))
-      ..write(': ');
-    if (error.span != null) {
-      message.writeln(error.span.message(error.message));
-    } else {
-      message.writeln(error.message);
-    }
-    if (error.tip != null) {
-      message.writeln(error.tip);
-    }
+  var state = await fe.initializeCompiler(
+      // TODO(sigmund): pass an old state once we can make use of it.
+      null,
+      Uri.base.resolve(parsedArgs['dart-sdk-summary']),
+      Uri.base.resolve(parsedArgs['packages-file']),
+      parsedArgs['input-summary'].map(Uri.base.resolve).toList(),
+      new NoneTarget(new TargetFlags()),
+      fileSystem);
+
+  void onProblem(problem, severity, String formatted, line, column) {
     if (outputBuffer != null) {
-      outputBuffer.writeln(message);
+      outputBuffer.writeln(formatted);
     } else {
-      print(message);
+      stderr.writeln(formatted);
     }
-    if (error.severity != Severity.nit) {
+    if (severity != fe.Severity.nit) {
       succeeded = false;
     }
-  };
+  }
 
   var sources = parsedArgs['source'].map(Uri.parse).toList();
-  var program = await summaryFor(sources, options);
+  var summary = await fe.compile(state, sources, onProblem);
 
-  var outputFile = new File(parsedArgs['output']);
-  outputFile.createSync(recursive: true);
-  outputFile.writeAsBytesSync(program);
+  if (summary != null) {
+    var outputFile = new File(parsedArgs['output']);
+    outputFile.createSync(recursive: true);
+    outputFile.writeAsBytesSync(summary);
+  } else {
+    assert(!succeeded);
+  }
 
   return succeeded;
 }
diff --git a/utils/dartanalyzer/BUILD.gn b/utils/dartanalyzer/BUILD.gn
index b04d186..147a7bc 100644
--- a/utils/dartanalyzer/BUILD.gn
+++ b/utils/dartanalyzer/BUILD.gn
@@ -3,6 +3,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 import("../../build/compiled_action.gni")
+import("../../build/prebuilt_dart_sdk.gni")
 import("../application_snapshot.gni")
 
 group("dartanalyzer") {
@@ -47,8 +48,27 @@
   assert(defined(invoker.type), "Must specify the summary type")
   type = invoker.type
   assert(type == "spec" || type == "strong")
-  compiled_action(target_name) {
-    tool = "../../runtime/bin:dart"
+  action(target_name) {
+
+    if (!prebuilt_dart_exe_works) {
+      deps = [ "../../runtime/bin:dart_bootstrap($dart_host_toolchain)" ]
+    }
+
+    script = "../../tools/run_dart.py"
+
+    args = []
+    if (!prebuilt_dart_exe_works) {
+      dart_out_dir = get_label_info(
+              "../../runtime/bin:dart_bootstrap($dart_host_toolchain)",
+              "root_out_dir")
+      dart_bootstrap =
+          rebase_path("$dart_out_dir/dart_bootstrap$executable_suffix")
+      args += [
+        "--dart",
+        dart_bootstrap,
+      ]
+    }
+
     inputs = sdk_lib_files + analyzer_files
 
     output = "$root_gen_dir/$type.sum"
@@ -60,7 +80,8 @@
     build_sdk_summaries =
         rebase_path("../../pkg/analyzer/tool/summary/build_sdk_summaries.dart")
 
-    args = [
+    args += [
+      "--quiet",
       "--packages=$dot_packages",
       build_sdk_summaries,
       "build-$type",
