Version 2.0.0-dev.52.0

Merge commit '5087ffa48143196b3daa43c8f58c561b0a38a1e3' into dev
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 710c9a7..9d3a3cd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,20 @@
+## 2.0.0-dev.52.0
+
+### Tool Changes
+
+#### Dart Dev Compiler
+
+* Failed `as` casts on `Iterable<T>`, `Map<T>`, `Future<T>`, and `Stream<T>`
+  are no longer ignored. These failures were ignored to make it easier to
+  migrate Dart 1 code to strong mode, but ignoring them is a hole in the type
+  system. This closes part of that hole. (We still need to stop ignoring
+  "as" cast failures on function types, and implicit cast failures on the above
+  types and function types.)
+
+* `async` functions now start synchronously by default.  Build tools
+  (e.g., build_runner) may override the default and/or allow
+  developers to configure.
+
 ## 2.0.0-dev.51.0
 
 ### Tool Changes
diff --git a/DEPS b/DEPS
index b6218f0..15caef2 100644
--- a/DEPS
+++ b/DEPS
@@ -81,7 +81,7 @@
   #     minutes later.
   #
   # For more details, see https://github.com/dart-lang/sdk/issues/30164
-  "dart_style_tag": "@1.0.11",  # Please see the note above before updating.
+  "dart_style_tag": "@1.0.12",  # Please see the note above before updating.
 
   "dartdoc_tag" : "@v0.18.1",
   "fixnum_tag": "@0.10.5",
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
index 76d0115..9d52193 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
@@ -37,6 +37,7 @@
   CorrectionUtils utils;
 
   ClassElement classBuildContext;
+  ClassElement classKey;
   ClassElement classStatefulWidget;
   ClassElement classStatelessWidget;
   ClassElement classWidget;
@@ -96,8 +97,8 @@
     _enclosingUnitMember = (_expression ?? _method).getAncestor(
         (n) => n is CompilationUnitMember && n.parent is CompilationUnit);
 
-    result.addStatus(await _initializeParameters());
     result.addStatus(await _initializeClasses());
+    result.addStatus(await _initializeParameters());
 
     return result;
   }
@@ -200,6 +201,7 @@
     }
 
     classBuildContext = await getClass('BuildContext');
+    classKey = await getClass('Key');
     classStatelessWidget = await getClass('StatelessWidget');
     classStatefulWidget = await getClass('StatefulWidget');
     classWidget = await getClass('Widget');
@@ -229,6 +231,10 @@
     // We added fields, now add the method parameters.
     if (_method != null) {
       for (var parameter in _method.parameters.parameters) {
+        if (parameter is DefaultFormalParameter) {
+          DefaultFormalParameter defaultFormalParameter = parameter;
+          parameter = defaultFormalParameter.parameter;
+        }
         if (parameter is NormalFormalParameter) {
           _parameters.add(new _Parameter(
               parameter.identifier.name, parameter.element.type,
@@ -237,6 +243,18 @@
       }
     }
 
+    RefactoringStatus status = collector.status;
+
+    // If there is an existing parameter "key" warn the user.
+    // We could rename it, but that would require renaming references to it.
+    // It is probably pretty rare, and the user can always rename before.
+    for (var parameter in _parameters) {
+      if (parameter.name == 'key') {
+        status.addError(
+            "The parameter 'key' will conflict with the widget 'key'.");
+      }
+    }
+
     return collector.status;
   }
 
@@ -254,29 +272,31 @@
     var collector = new _MethodInvocationsCollector(_method.element);
     _enclosingClassNode.accept(collector);
     for (var invocation in collector.invocations) {
-      builder.addReplacement(
-        range.startEnd(invocation, invocation.argumentList.leftParenthesis),
-        (builder) {
-          builder.write('new $name(');
+      List<Expression> arguments = invocation.argumentList.arguments;
+      builder.addReplacement(range.node(invocation), (builder) {
+        builder.write('new $name(');
 
-          // Insert field references.
-          for (var parameter in _parameters) {
-            if (parameter.isMethodParameter) {
-              break;
-            }
-            if (parameter != _parameters.first) {
-              builder.write(', ');
-            }
-            builder.write(parameter.name);
-          }
-
-          // Separate references to fields and method arguments.
-          if (_parameters.isNotEmpty &&
-              invocation.argumentList.arguments.isNotEmpty) {
+        // Insert field references (as named arguments).
+        // Ensure that invocation arguments are named.
+        int argumentIndex = 0;
+        for (var parameter in _parameters) {
+          if (parameter != _parameters.first) {
             builder.write(', ');
           }
-        },
-      );
+          builder.write(parameter.name);
+          builder.write(': ');
+          if (parameter.isMethodParameter) {
+            Expression argument = arguments[argumentIndex++];
+            if (argument is NamedExpression) {
+              argument = (argument as NamedExpression).expression;
+            }
+            builder.write(utils.getNodeText(argument));
+          } else {
+            builder.write(parameter.name);
+          }
+        }
+        builder.write(')');
+      });
     }
   }
 
@@ -289,8 +309,8 @@
         name,
         superclass: classStatelessWidget.type,
         membersWriter: () {
+          // Add the fields for the parameters.
           if (_parameters.isNotEmpty) {
-            // Add the fields for the parameters.
             for (var parameter in _parameters) {
               builder.write('  ');
               builder.writeFieldDeclaration(parameter.name,
@@ -298,15 +318,34 @@
               builder.writeln();
             }
             builder.writeln();
-
-            // Add the constructor.
-            builder.write('  ');
-            builder.writeConstructorDeclaration(name,
-                fieldNames: _parameters.map((e) => e.name).toList());
-            builder.writeln();
-            builder.writeln();
           }
 
+          // Add the constructor.
+          builder.write('  ');
+          builder.writeConstructorDeclaration(
+            name,
+            parameterWriter: () {
+              builder.write('{');
+
+              // Add the required `key` parameter.
+              builder.writeParameter('key', type: classKey.type);
+
+              // Add parameters for fields, local, and method parameters.
+              for (int i = 0; i < _parameters.length; i++) {
+                builder.write(', ');
+                builder.write('this.');
+                builder.write(_parameters[i].name);
+              }
+
+              builder.write('}');
+            },
+            initializerWriter: () {
+              builder.write('super(key: key)');
+            },
+          );
+          builder.writeln();
+          builder.writeln();
+
           // Widget build(BuildContext context) { ... }
           builder.writeln('  @override');
           builder.write('  ');
@@ -352,6 +391,8 @@
         builder.write(', ');
       }
       builder.write(parameter.name);
+      builder.write(': ');
+      builder.write(parameter.name);
     }
 
     builder.write(')');
@@ -381,7 +422,7 @@
   /// Whether the parameter is a parameter of the method being extracted.
   final bool isMethodParameter;
 
-  _Parameter(this.name, this.type, {this.isMethodParameter = false});
+  _Parameter(this.name, this.type, {this.isMethodParameter: false});
 }
 
 class _ParametersCollector extends RecursiveAstVisitor<void> {
diff --git a/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart b/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
index 3355620..4e8323b 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
@@ -130,6 +130,8 @@
 }
 
 class Test extends StatelessWidget {
+  Test({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     return new Column(
@@ -178,6 +180,8 @@
 }
 
 class Test extends StatelessWidget {
+  Test({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     return new Text('AAA');
@@ -211,6 +215,8 @@
 }
 
 class Test extends StatelessWidget {
+  Test({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     return new Container();
@@ -248,6 +254,8 @@
 }
 
 class Test extends StatelessWidget {
+  Test({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     return new Text('AAA');
@@ -345,14 +353,14 @@
 
   @override
   Widget build(BuildContext context) {
-    return new Test(c);
+    return new Test(c: c);
   }
 }
 
 class Test extends StatelessWidget {
   final C c;
 
-  Test(this.c);
+  Test({Key key, this.c}) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
@@ -400,6 +408,8 @@
 }
 
 class Test extends StatelessWidget {
+  Test({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     var a = new Text('AAA');
@@ -453,8 +463,8 @@
     int bar = 1;
     return new Row(
       children: <Widget>[
-        new Test(foo, 'aaa', bar),
-        new Test(foo, 'bbb', 2),
+        new Test(foo: foo, p1: 'aaa', p2: bar),
+        new Test(foo: foo, p1: 'bbb', p2: 2),
       ],
     );
   }
@@ -465,7 +475,74 @@
   final String p1;
   final int p2;
 
-  Test(this.foo, this.p1, this.p2);
+  Test({Key key, this.foo, this.p1, this.p2}) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    var a = new Text('$foo $p1');
+    var b = new Text('$p2');
+    return new Column(
+      children: <Widget>[a, b],
+    );
+  }
+}
+''');
+  }
+
+  test_method_parameters_named() async {
+    addFlutterPackage();
+    await indexTestUnit(r'''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  String foo;
+
+  @override
+  Widget build(BuildContext context) {
+    int bar = 1;
+    return new Row(
+      children: <Widget>[
+        createColumn(p1: 'aaa', p2: bar),
+        createColumn(p1: 'bbb', p2: 2),
+      ],
+    );
+  }
+  
+  Widget createColumn({String p1, int p2}) {
+    var a = new Text('$foo $p1');
+    var b = new Text('$p2');
+    return new Column(
+      children: <Widget>[a, b],
+    );
+  }
+}
+''');
+    _createRefactoringForStringOffset('createColumn({String');
+
+    await _assertSuccessfulRefactoring(r'''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  String foo;
+
+  @override
+  Widget build(BuildContext context) {
+    int bar = 1;
+    return new Row(
+      children: <Widget>[
+        new Test(foo: foo, p1: 'aaa', p2: bar),
+        new Test(foo: foo, p1: 'bbb', p2: 2),
+      ],
+    );
+  }
+}
+
+class Test extends StatelessWidget {
+  final String foo;
+  final String p1;
+  final int p2;
+
+  Test({Key key, this.foo, this.p1, this.p2}) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
@@ -503,14 +580,14 @@
 
   @override
   Widget build(BuildContext context) {
-    return new Test(field);
+    return new Test(field: field);
   }
 }
 
 class Test extends StatelessWidget {
   final String field;
 
-  Test(this.field);
+  Test({Key key, this.field}) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
@@ -552,14 +629,14 @@
 
   @override
   Widget build(BuildContext context) {
-    return new Test(c);
+    return new Test(c: c);
   }
 }
 
 class Test extends StatelessWidget {
   final C c;
 
-  Test(this.c);
+  Test({Key key, this.c}) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
@@ -598,6 +675,8 @@
 }
 
 class Test extends StatelessWidget {
+  Test({Key key}) : super(key: key);
+
   @override
   Widget build(BuildContext context) {
     return new Text(field);
@@ -695,14 +774,14 @@
 
   @override
   Widget build(BuildContext context) {
-    return new Test(c);
+    return new Test(c: c);
   }
 }
 
 class Test extends StatelessWidget {
   final C c;
 
-  Test(this.c);
+  Test({Key key, this.c}) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
@@ -717,6 +796,25 @@
 ''');
   }
 
+  test_parameters_key() async {
+    addFlutterPackage();
+    await indexTestUnit(r'''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  @override
+  Widget build(BuildContext context) {
+    String key;
+    return new Text('$key $key');
+  }
+}
+''');
+    _createRefactoringForStringOffset('new Text');
+
+    RefactoringStatus status = await refactoring.checkAllConditions();
+    assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR);
+  }
+
   test_parameters_local_read_enclosingScope() async {
     addFlutterPackage();
     await indexTestUnit(r'''
@@ -739,14 +837,14 @@
   @override
   Widget build(BuildContext context) {
     String local;
-    return new Test(local);
+    return new Test(local: local);
   }
 }
 
 class Test extends StatelessWidget {
   final String local;
 
-  Test(this.local);
+  Test({Key key, this.local}) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
@@ -811,7 +909,7 @@
   @override
   Widget build(BuildContext context) {
     String local;
-    return new Test(field, local);
+    return new Test(field: field, local: local);
   }
 }
 
@@ -819,7 +917,7 @@
   final String field;
   final String local;
 
-  Test(this.field, this.local);
+  Test({Key key, this.field, this.local}) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 9aff4bc..d25a9bb 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,3 +1,53 @@
+## 0.31.2-alpha.2
+
+* Refactoring to make element model logic sharable with
+  linker. (#32525, #32674)
+* Gracefully handle an invalid packages file. (#32560)
+* Fix silent inconsistency in top level inference. (#32394)
+* Fix test to determine whether a library is in the SDK. (#32707)
+* Fix for type inference from instance creation arguments.
+* Make GenericFunctionTypeElementForLink implement
+  GenericFunctionTypeElementImpl (#32708)
+* Check for missing required libraries dart:core and dart:async. (#32686)
+* Add callable object support. (#32156, #32157, #32426)
+* Avoid putting libraries of all analyzed units in the current
+  session. (too expensive)
+* Deprecate the option to enable using a URI in a part-of directive.
+* Support implicit call() invocation in top-level inference. (#32740)
+* Don't emit errors for lint rule names.
+* Allow empty flutter: sections in pubspec files.
+* Remove the special casing of 'packages' files from the analyzer and analysis
+  server.
+* Initial implementation of API to build analysis contexts (replacing
+  ContextLocator.locateContexts).
+* Fix regression in Analyzer callable function support. (#32769)
+* Several performance enhancements, including:
+  * Add a shared cache of FileState contents (making flutter repo analysis
+    ~12% faster).
+  * Replace SourceFactory.resolveUri() with resolveRelativeUri() in
+    resynthesizer.  (10% faster flutter repo analysis)
+  * Optimize computing exported namespaces in FileState.
+  * Optimize computing exported namespaces in prelinker. (8% faster
+    flutter repo analysis)
+  * Add NodeLintRule and UnitLintRule that replace AstVisitor in lints.
+    (6% faster flutter repo analysis)
+* Remove fuzzy arrow support from analyzer. (#31637)
+* More fixes for running the analyzer with Dart 2.
+* Add isXYZ accessors to ParameterElementForLink_VariableSetter. (#32896)
+* Demote IMPORT_DUPLICATED_LIBRARY_NAMED to a warning.
+* Deprecated/removed some unused classes and libraries from the public API.
+* Instantiate bounds to bounds.
+* Use package:path instead of AbsolutePathContext.
+* Check that argument is assignable to parameter in call() (#27098)
+* preview-dart-2 is now the default for the command line analyzer, also
+  implying strong.  Use --no-strong and --no-preview-dart-2 to handle
+  Dart 1 code.
+* Export SyntheticBeginToken and SyntheticToken from the analyzer for
+  angular_analyzer_plugin.
+* Improve error messages for annotations involving undefined names (#27788)
+* Add support for getting parse results synchronously.
+* Change linter subscriptions from functions to AstVisitor(s).
+
 ## 0.31.2-alpha.1
 
 * Don't expect type arguments for class type parameters of static methods.
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 1444d1b..9e72153 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.31.2-alpha.1
+version: 0.31.2-alpha.2
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
@@ -11,10 +11,10 @@
   collection: ^1.10.1
   convert: ^2.0.0
   crypto: '>=1.1.1 <3.0.0'
-  front_end: 0.1.0-alpha.11
+  front_end: 0.1.0-alpha.12
   glob: ^1.0.3
   html: '>=0.12.0 <1.14.0'
-  kernel: 0.3.0-alpha.11
+  kernel: 0.3.0-alpha.12
   meta: ^1.0.2
   package_config: '>=0.1.5 <2.0.0'
   path: '>=0.9.0 <2.0.0'
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
index 52cf298..e04d1b4 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
@@ -76,6 +76,15 @@
                 ParserErrorCode.EXPECTED_STRING_LITERAL
               ],
               "import 'a.dart' if (b) '';"),
+          new TestDescriptor(
+              'ifCondition',
+              "import 'a.dart' as",
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              "import 'a.dart' as _s_;",
+              failing: ['functionNonVoid', 'getter']),
         ],
         PartialCodeTest.prePartSuffixes);
   }
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
index 9759e18..19623cc 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
@@ -134,10 +134,13 @@
   @override
   void writeConstructorDeclaration(String className,
       {ArgumentList argumentList,
+      void bodyWriter(),
       SimpleIdentifier constructorName,
       String constructorNameGroupName,
       List<String> fieldNames,
-      bool isConst: false}) {
+      void initializerWriter(),
+      bool isConst: false,
+      void parameterWriter()}) {
     if (isConst) {
       write(Keyword.CONST.lexeme);
       write(' ');
@@ -152,7 +155,9 @@
       }
     }
     write('(');
-    if (argumentList != null) {
+    if (parameterWriter != null) {
+      parameterWriter();
+    } else if (argumentList != null) {
       writeParametersMatchingArguments(argumentList);
     } else if (fieldNames != null) {
       for (int i = 0; i < fieldNames.length; i++) {
@@ -163,7 +168,18 @@
         write(fieldNames[i]);
       }
     }
-    write(');');
+    write(')');
+
+    if (initializerWriter != null) {
+      write(' : ');
+      initializerWriter();
+    }
+
+    if (bodyWriter != null) {
+      bodyWriter();
+    } else {
+      write(';');
+    }
   }
 
   @override
diff --git a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
index c1165a1..86545f0 100644
--- a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
@@ -66,18 +66,26 @@
    * as being a `const` constructor. If a [constructorName] is provided, then
    * the constructor will have the given name. If both a constructor name and a
    * [constructorNameGroupName] is provided, then the name of the constructor
-   * will be included in the linked edit group with that name. If an
+   * will be included in the linked edit group with that name. If a
+   * [parameterWriter] is provided then it is used to write the constructor
+   * parameters (enclosing parenthesis are written for you). Otherwise, if an
    * [argumentList] is provided then the constructor will have parameters that
    * match the given arguments. If no argument list is given, but a list of
    * [fieldNames] is provided, then field formal parameters will be created for
-   * each of the field names.
+   * each of the field names. If an [initializerWriter] is provided then it is
+   * used to write the constructor initializers (the ` : ` prefix is written
+   * for you). If a [bodyWriter] is provided then it is used to write the
+   * constructor body, otherwise an empty body is written.
    */
   void writeConstructorDeclaration(String className,
       {ArgumentList argumentList,
+      void bodyWriter(),
       SimpleIdentifier constructorName,
       String constructorNameGroupName,
       List<String> fieldNames,
-      bool isConst: false});
+      void initializerWriter(),
+      bool isConst: false,
+      void parameterWriter()});
 
   /**
    * Write the code for a declaration of a field with the given [name]. If an
diff --git a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
index a849278..fdb1008 100644
--- a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
@@ -470,6 +470,73 @@
     expect(group.positions, hasLength(1));
   }
 
+  test_writeConstructorDeclaration_bodyWriter() async {
+    String path = provider.convertPath('/test.dart');
+    addSource(path, 'class C {}');
+
+    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    await builder.addFileEdit(path, (DartFileEditBuilder builder) {
+      builder.addInsertion(9, (DartEditBuilder builder) {
+        builder.writeConstructorDeclaration('A', bodyWriter: () {
+          builder.write(' { print(42); }');
+        });
+      });
+    });
+    SourceEdit edit = getEdit(builder);
+    expect(edit.replacement, equalsIgnoringWhitespace('A() { print(42); }'));
+  }
+
+  test_writeConstructorDeclaration_fieldNames() async {
+    String path = provider.convertPath('/test.dart');
+    addSource(path, r'''
+class C {
+  final int a;
+  final bool bb;
+}
+''');
+
+    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    await builder.addFileEdit(path, (DartFileEditBuilder builder) {
+      builder.addInsertion(42, (DartEditBuilder builder) {
+        builder.writeConstructorDeclaration('A', fieldNames: ['a', 'bb']);
+      });
+    });
+    SourceEdit edit = getEdit(builder);
+    expect(edit.replacement, equalsIgnoringWhitespace('A(this.a, this.bb);'));
+  }
+
+  test_writeConstructorDeclaration_initializerWriter() async {
+    String path = provider.convertPath('/test.dart');
+    addSource(path, 'class C {}');
+
+    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    await builder.addFileEdit(path, (DartFileEditBuilder builder) {
+      builder.addInsertion(9, (DartEditBuilder builder) {
+        builder.writeConstructorDeclaration('A', initializerWriter: () {
+          builder.write('super()');
+        });
+      });
+    });
+    SourceEdit edit = getEdit(builder);
+    expect(edit.replacement, equalsIgnoringWhitespace('A() : super();'));
+  }
+
+  test_writeConstructorDeclaration_parameterWriter() async {
+    String path = provider.convertPath('/test.dart');
+    addSource(path, 'class C {}');
+
+    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    await builder.addFileEdit(path, (DartFileEditBuilder builder) {
+      builder.addInsertion(9, (DartEditBuilder builder) {
+        builder.writeConstructorDeclaration('A', parameterWriter: () {
+          builder.write('int a, {this.b}');
+        });
+      });
+    });
+    SourceEdit edit = getEdit(builder);
+    expect(edit.replacement, equalsIgnoringWhitespace('A(int a, {this.b});'));
+  }
+
   test_writeFieldDeclaration_initializerWriter() async {
     String path = provider.convertPath('/test.dart');
     String content = 'class A {}';
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index 3dc07e6..055d40e 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -576,27 +576,27 @@
   ClassEntity get controllerStream =>
       _findAsyncHelperClass("_ControllerStream");
 
-  ConstructorEntity get syncStarIterableConstructor =>
-      _env.lookupConstructor(syncStarIterable, "");
-
-  ConstructorEntity get syncCompleterConstructor =>
-      _env.lookupConstructor(_findAsyncHelperClass("Completer"), "sync");
-
-  ConstructorEntity get asyncAwaitCompleterConstructor =>
-      _env.lookupConstructor(asyncAwaitCompleter, "");
-
-  ClassEntity get asyncAwaitCompleter =>
-      _findAsyncHelperClass("_AsyncAwaitCompleter");
-
-  ClassEntity get asyncStarController =>
-      _findAsyncHelperClass("_AsyncStarStreamController");
-
-  ConstructorEntity get asyncStarControllerConstructor =>
-      _env.lookupConstructor(asyncStarController, "", required: true);
-
   ConstructorEntity get streamIteratorConstructor =>
       _env.lookupConstructor(_findAsyncHelperClass("StreamIterator"), "");
 
+  FunctionEntity _syncStarIterableFactory;
+  FunctionEntity get syncStarIterableFactory => _syncStarIterableFactory ??=
+      _findAsyncHelperFunction('_makeSyncStarIterable');
+
+  FunctionEntity _asyncAwaitCompleterFactory;
+  FunctionEntity get asyncAwaitCompleterFactory =>
+      _asyncAwaitCompleterFactory ??=
+          _findAsyncHelperFunction('_makeAsyncAwaitCompleter');
+
+  FunctionEntity _syncCompleterFactory;
+  FunctionEntity get syncCompleterFactory =>
+      _syncCompleterFactory ??= _findAsyncHelperFunction('_makeSyncCompleter');
+
+  FunctionEntity _asyncStarStreamControllerFactory;
+  FunctionEntity get asyncStarStreamControllerFactory =>
+      _asyncStarStreamControllerFactory ??=
+          _findAsyncHelperFunction('_makeAsyncStarStreamController');
+
   // From dart:mirrors
   FunctionEntity _findMirrorsFunction(String name) {
     LibraryEntity library = _env.lookupLibrary(Uris.dart__js_mirrors);
@@ -1492,11 +1492,16 @@
   /// Returns the function type variables defined on [function].
   List<TypeVariableType> getFunctionTypeVariables(FunctionEntity function);
 
-  /// Returns the 'element' type of a function with an async, async* ot sync*
+  /// Returns the 'element' type of a function with an async, async* or sync*
   /// marker. The return type of the method is inspected to determine the type
   /// parameter of the Future, Stream or Iterable.
   DartType getFunctionAsyncOrSyncStarElementType(FunctionEntity function);
 
+  /// Returns the 'element' type of a function with the async, async* or sync*
+  /// marker [marker]. [returnType] is the return type marked function.
+  DartType getAsyncOrSyncStarElementType(
+      AsyncMarker marker, DartType returnType);
+
   /// Returns the type of [field].
   DartType getFieldType(FieldEntity field);
 
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index dbe005f..c7db088 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -16,6 +16,7 @@
         ConstructedConstantValue,
         DeferredConstantValue,
         DeferredGlobalConstantValue,
+        InstantiationConstantValue,
         TypeConstantValue;
 import 'elements/types.dart';
 import 'elements/elements.dart'
@@ -389,6 +390,13 @@
           _updateElementRecursive(type.element, oldSet, newSet, queue);
         }
       }
+      if (constant is InstantiationConstantValue) {
+        for (DartType type in constant.typeArguments) {
+          if (type is InterfaceType) {
+            _updateElementRecursive(type.element, oldSet, newSet, queue);
+          }
+        }
+      }
       constant.getDependencies().forEach((ConstantValue dependency) {
         if (dependency is DeferredConstantValue) {
           /// New deferred-imports are only discovered when we are visiting the
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index dd73a35..c83d813 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -7,7 +7,7 @@
 import '../common.dart';
 import '../common/backend_api.dart'
     show ForeignResolver, NativeRegistry, ImpactTransformer;
-import '../common/codegen.dart' show CodegenWorkItem;
+import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem;
 import '../common/names.dart' show Uris;
 import '../common/resolution.dart' show Resolution, Target;
 import '../common/tasks.dart' show CompilerTask;
@@ -50,6 +50,7 @@
 import '../universe/class_hierarchy_builder.dart'
     show ClassHierarchyBuilder, ClassQueries;
 import '../universe/selector.dart' show Selector;
+import '../universe/use.dart' show StaticUse;
 import '../universe/world_builder.dart';
 import '../universe/world_impact.dart'
     show ImpactStrategy, ImpactUseCase, WorldImpact, WorldImpactVisitor;
@@ -974,7 +975,10 @@
     _namer = determineNamer(closedWorld, codegenWorldBuilder);
     tracer = new Tracer(closedWorld, namer, compiler.outputProvider);
     _rtiEncoder = _namer.rtiEncoder = new RuntimeTypesEncoderImpl(
-        namer, closedWorld.elementEnvironment, closedWorld.commonElements,
+        namer,
+        closedWorld.nativeData,
+        closedWorld.elementEnvironment,
+        closedWorld.commonElements,
         strongMode: compiler.options.strongMode);
     emitter.createEmitter(namer, closedWorld, codegenWorldBuilder, sorter);
     // TODO(johnniwinther): Share the impact object created in
@@ -1157,6 +1161,7 @@
   jsAst.Expression rewriteAsync(
       CommonElements commonElements,
       ElementEnvironment elementEnvironment,
+      CodegenRegistry registry,
       FunctionEntity element,
       jsAst.Expression code,
       SourceInformation bodySourceInformation,
@@ -1169,14 +1174,14 @@
     switch (element.asyncMarker) {
       case AsyncMarker.ASYNC:
         rewriter = _makeAsyncRewriter(
-            commonElements, elementEnvironment, element, code, name);
+            commonElements, elementEnvironment, registry, element, code, name);
         break;
       case AsyncMarker.SYNC_STAR:
         rewriter = new SyncStarRewriter(reporter, element,
             endOfIteration:
                 emitter.staticFunctionAccess(commonElements.endOfIteration),
-            iterableFactory: emitter.staticFunctionAccess(
-                commonElements.syncStarIterableConstructor),
+            iterableFactory: emitter
+                .staticFunctionAccess(commonElements.syncStarIterableFactory),
             iterableFactoryTypeArgument:
                 _fetchItemType(element, elementEnvironment),
             yieldStarExpression:
@@ -1185,6 +1190,11 @@
                 .staticFunctionAccess(commonElements.syncStarUncaughtError),
             safeVariableName: namer.safeVariablePrefixForAsyncRewrite,
             bodyName: namer.deriveAsyncBodyName(name));
+        registry.registerStaticUse(new StaticUse.staticInvoke(
+            commonElements.syncStarIterableFactory,
+            const CallStructure.unnamed(1, 1), [
+          elementEnvironment.getFunctionAsyncOrSyncStarElementType(element)
+        ]));
         break;
       case AsyncMarker.ASYNC_STAR:
         rewriter = new AsyncStarRewriter(reporter, element,
@@ -1194,7 +1204,7 @@
                 emitter.staticFunctionAccess(commonElements.streamOfController),
             wrapBody: emitter.staticFunctionAccess(commonElements.wrapBody),
             newController: emitter.staticFunctionAccess(
-                commonElements.asyncStarControllerConstructor),
+                commonElements.asyncStarStreamControllerFactory),
             newControllerTypeArgument:
                 _fetchItemType(element, elementEnvironment),
             safeVariableName: namer.safeVariablePrefixForAsyncRewrite,
@@ -1203,6 +1213,11 @@
             yieldStarExpression:
                 emitter.staticFunctionAccess(commonElements.yieldStar),
             bodyName: namer.deriveAsyncBodyName(name));
+        registry.registerStaticUse(new StaticUse.staticInvoke(
+            commonElements.asyncStarStreamControllerFactory,
+            const CallStructure.unnamed(1, 1), [
+          elementEnvironment.getFunctionAsyncOrSyncStarElementType(element)
+        ]));
         break;
     }
     return rewriter.rewrite(code, bodySourceInformation, exitSourceInformation);
@@ -1226,6 +1241,7 @@
   AsyncRewriter _makeAsyncRewriter(
       CommonElements commonElements,
       ElementEnvironment elementEnvironment,
+      CodegenRegistry registry,
       FunctionEntity element,
       jsAst.Expression code,
       jsAst.Name name) {
@@ -1234,9 +1250,9 @@
     var startFunction = startAsyncSynchronously
         ? commonElements.asyncHelperStartSync
         : commonElements.asyncHelperStart;
-    var completerConstructor = startAsyncSynchronously
-        ? commonElements.asyncAwaitCompleterConstructor
-        : commonElements.syncCompleterConstructor;
+    var completerFactory = startAsyncSynchronously
+        ? commonElements.asyncAwaitCompleterFactory
+        : commonElements.syncCompleterFactory;
 
     jsAst.Expression itemTypeExpression =
         _fetchItemType(element, elementEnvironment);
@@ -1250,11 +1266,16 @@
         asyncRethrow:
             emitter.staticFunctionAccess(commonElements.asyncHelperRethrow),
         wrapBody: emitter.staticFunctionAccess(commonElements.wrapBody),
-        completerFactory: emitter.staticFunctionAccess(completerConstructor),
+        completerFactory: emitter.staticFunctionAccess(completerFactory),
         completerFactoryTypeArgument: itemTypeExpression,
         safeVariableName: namer.safeVariablePrefixForAsyncRewrite,
         bodyName: namer.deriveAsyncBodyName(name));
 
+    registry.registerStaticUse(new StaticUse.staticInvoke(
+        completerFactory,
+        const CallStructure.unnamed(0, 1),
+        [elementEnvironment.getFunctionAsyncOrSyncStarElementType(element)]));
+
     return rewriter;
   }
 
diff --git a/pkg/compiler/lib/src/js_backend/backend_impact.dart b/pkg/compiler/lib/src/js_backend/backend_impact.dart
index 8424c42..cf43c6c 100644
--- a/pkg/compiler/lib/src/js_backend/backend_impact.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_impact.dart
@@ -128,54 +128,67 @@
 
   BackendImpact _asyncBody;
 
-  BackendImpact get asyncBody {
-    var staticUses = [
-      _commonElements.asyncHelperAwait,
-      _commonElements.asyncHelperReturn,
-      _commonElements.asyncHelperRethrow,
-      _commonElements.streamIteratorConstructor,
-      _commonElements.wrapBody
-    ];
-    var instantiantedClasses = <ClassEntity>[];
-    if (_options.startAsyncSynchronously) {
-      staticUses.add(_commonElements.asyncAwaitCompleterConstructor);
-      staticUses.add(_commonElements.asyncHelperStartSync);
-      instantiantedClasses.add(_commonElements.asyncAwaitCompleter);
-    } else {
-      staticUses.add(_commonElements.syncCompleterConstructor);
-      staticUses.add(_commonElements.asyncHelperStart);
-    }
-    return _asyncBody ??= new BackendImpact(
-        staticUses: staticUses, instantiatedClasses: instantiantedClasses);
-  }
+  BackendImpact get asyncBody => _asyncBody ??= () {
+        var staticUses = [
+          _commonElements.asyncHelperAwait,
+          _commonElements.asyncHelperReturn,
+          _commonElements.asyncHelperRethrow,
+          _commonElements.streamIteratorConstructor,
+          _commonElements.wrapBody
+        ];
+        if (_options.startAsyncSynchronously) {
+          staticUses.add(_commonElements.asyncHelperStartSync);
+        } else {
+          staticUses.add(_commonElements.asyncHelperStart);
+        }
+        if (!_options.useKernel) {
+          if (_options.startAsyncSynchronously) {
+            staticUses.add(_commonElements.asyncAwaitCompleterFactory);
+          } else {
+            staticUses.add(_commonElements.syncCompleterFactory);
+          }
+        }
+        return new BackendImpact(staticUses: staticUses);
+      }();
 
   BackendImpact _syncStarBody;
 
   BackendImpact get syncStarBody {
-    return _syncStarBody ??= new BackendImpact(staticUses: [
-      _commonElements.syncStarIterableConstructor,
-      _commonElements.endOfIteration,
-      _commonElements.yieldStar,
-      _commonElements.syncStarUncaughtError
-    ], instantiatedClasses: [
-      _commonElements.syncStarIterable
-    ]);
+    return _syncStarBody ??= _options.useKernel
+        ? new BackendImpact(staticUses: [
+            _commonElements.endOfIteration,
+            _commonElements.yieldStar,
+            _commonElements.syncStarUncaughtError,
+          ])
+        : new BackendImpact(staticUses: [
+            _commonElements.endOfIteration,
+            _commonElements.yieldStar,
+            _commonElements.syncStarUncaughtError,
+            _commonElements.syncStarIterableFactory,
+          ]);
   }
 
   BackendImpact _asyncStarBody;
 
   BackendImpact get asyncStarBody {
-    return _asyncStarBody ??= new BackendImpact(staticUses: [
-      _commonElements.asyncStarHelper,
-      _commonElements.streamOfController,
-      _commonElements.yieldSingle,
-      _commonElements.yieldStar,
-      _commonElements.asyncStarControllerConstructor,
-      _commonElements.streamIteratorConstructor,
-      _commonElements.wrapBody
-    ], instantiatedClasses: [
-      _commonElements.asyncStarController
-    ]);
+    return _asyncStarBody ??= _options.useKernel
+        ? new BackendImpact(staticUses: [
+            _commonElements.asyncStarHelper,
+            _commonElements.streamOfController,
+            _commonElements.yieldSingle,
+            _commonElements.yieldStar,
+            _commonElements.streamIteratorConstructor,
+            _commonElements.wrapBody,
+          ])
+        : new BackendImpact(staticUses: [
+            _commonElements.asyncStarHelper,
+            _commonElements.streamOfController,
+            _commonElements.yieldSingle,
+            _commonElements.yieldStar,
+            _commonElements.streamIteratorConstructor,
+            _commonElements.wrapBody,
+            _commonElements.asyncStarStreamControllerFactory,
+          ]);
   }
 
   BackendImpact _typeVariableBoundCheck;
diff --git a/pkg/compiler/lib/src/js_backend/backend_usage.dart b/pkg/compiler/lib/src/js_backend/backend_usage.dart
index c69a632..ac81356 100644
--- a/pkg/compiler/lib/src/js_backend/backend_usage.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_usage.dart
@@ -179,8 +179,7 @@
     if (element is ConstructorEntity &&
         (element == _commonElements.streamIteratorConstructor ||
             _commonElements.isSymbolConstructor(element) ||
-            _commonElements.isSymbolValidatedConstructor(element) ||
-            element == _commonElements.syncCompleterConstructor)) {
+            _commonElements.isSymbolValidatedConstructor(element))) {
       // TODO(johnniwinther): These are valid but we could be more precise.
       return true;
     } else if (element == _commonElements.symbolImplementationClass ||
diff --git a/pkg/compiler/lib/src/js_backend/codegen_listener.dart b/pkg/compiler/lib/src/js_backend/codegen_listener.dart
index 77e39a4..b5d3feb 100644
--- a/pkg/compiler/lib/src/js_backend/codegen_listener.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen_listener.dart
@@ -190,6 +190,19 @@
         InterfaceType representedType = type.representedType;
         _customElementsAnalysis.registerTypeConstant(representedType.element);
       }
+    } else if (constant is InstantiationConstantValue) {
+      impactBuilder.registerTypeUse(new TypeUse.instantiation(
+          _elementEnvironment
+              .getThisType(_commonElements.instantiation1Class)));
+      impactBuilder.registerTypeUse(new TypeUse.instantiation(
+          _elementEnvironment
+              .getThisType(_commonElements.instantiation2Class)));
+      impactBuilder.registerTypeUse(new TypeUse.instantiation(
+          _elementEnvironment
+              .getThisType(_commonElements.instantiation2Class)));
+      impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
+          _commonElements.instantiatedGenericFunctionType,
+          CallStructure.TWO_ARGS));
     }
   }
 
diff --git a/pkg/compiler/lib/src/js_backend/constant_emitter.dart b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
index c218a40..c5915dc 100644
--- a/pkg/compiler/lib/src/js_backend/constant_emitter.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
@@ -188,7 +188,7 @@
         .toList(growable: false);
     jsAst.ArrayInitializer array = new jsAst.ArrayInitializer(elements);
     jsAst.Expression value = makeConstantList(array);
-    return maybeAddTypeArguments(constant.type, value);
+    return maybeAddTypeArguments(constant, constant.type, value);
   }
 
   @override
@@ -262,7 +262,8 @@
     }
 
     if (_rtiNeed.classNeedsTypeArguments(classElement)) {
-      arguments.add(_reifiedTypeArguments(constant.type));
+      arguments
+          .add(_reifiedTypeArguments(constant, constant.type.typeArguments));
     }
 
     jsAst.Expression constructor = _emitter.constructorAccess(classElement);
@@ -327,18 +328,38 @@
       fields.add(constantReferenceGenerator(constant.fields[field]));
     });
     if (_rtiNeed.classNeedsTypeArguments(constant.type.element)) {
-      fields.add(_reifiedTypeArguments(constant.type));
+      fields.add(_reifiedTypeArguments(constant, constant.type.typeArguments));
     }
-    jsAst.New instantiation = new jsAst.New(constructor, fields);
-    return instantiation;
+    return new jsAst.New(constructor, fields);
   }
 
   @override
   jsAst.Expression visitInstantiation(InstantiationConstantValue constant,
       [_]) {
-    // TODO(sigmund, sra): add a runtime representation for constant
-    // instantiations. See issue 32774.
-    return constantReferenceGenerator(constant.function);
+    // TODO(johnniwinther,sra): Support arbitrary type argument count.
+    ClassEntity cls;
+    switch (constant.typeArguments.length) {
+      case 1:
+        cls = _commonElements.instantiation1Class;
+        break;
+      case 2:
+        cls = _commonElements.instantiation2Class;
+        break;
+      case 3:
+        cls = _commonElements.instantiation3Class;
+        break;
+      default:
+        failedAt(
+            NO_LOCATION_SPANNABLE,
+            "Unsupported instantiation argument count: "
+            "${constant.typeArguments.length}");
+    }
+    List<jsAst.Expression> fields = <jsAst.Expression>[
+      constantReferenceGenerator(constant.function),
+      _reifiedTypeArguments(constant, constant.typeArguments)
+    ];
+    jsAst.Expression constructor = _emitter.constructorAccess(cls);
+    return new jsAst.New(constructor, fields);
   }
 
   String stripComments(String rawJavaScript) {
@@ -346,28 +367,29 @@
   }
 
   jsAst.Expression maybeAddTypeArguments(
-      InterfaceType type, jsAst.Expression value) {
+      ConstantValue constant, InterfaceType type, jsAst.Expression value) {
     if (type is InterfaceType &&
         !type.treatAsRaw &&
         _rtiNeed.classNeedsTypeArguments(type.element)) {
       return new jsAst.Call(
           getHelperProperty(_commonElements.setRuntimeTypeInfo),
-          [value, _reifiedTypeArguments(type)]);
+          [value, _reifiedTypeArguments(constant, type.typeArguments)]);
     }
     return value;
   }
 
-  jsAst.Expression _reifiedTypeArguments(InterfaceType type) {
+  jsAst.Expression _reifiedTypeArguments(
+      ConstantValue constant, List<DartType> typeArguments) {
     jsAst.Expression unexpected(TypeVariableType _variable) {
       TypeVariableType variable = _variable;
       throw failedAt(
           NO_LOCATION_SPANNABLE,
           "Unexpected type variable '${variable}'"
-          " in constant type '${type}'");
+          " in constant '${constant.toDartText()}'");
     }
 
     List<jsAst.Expression> arguments = <jsAst.Expression>[];
-    for (DartType argument in type.typeArguments) {
+    for (DartType argument in typeArguments) {
       arguments.add(
           _rtiEncoder.getTypeRepresentation(_emitter, argument, unexpected));
     }
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index 27b074b..4fb3ac1 100644
--- a/pkg/compiler/lib/src/js_backend/impact_transformer.dart
+++ b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
@@ -151,6 +151,9 @@
         case Feature.TYPE_VARIABLE_BOUNDS_CHECK:
           registerImpact(_impacts.typeVariableBoundCheck);
           break;
+        case Feature.LOAD_LIBRARY:
+          registerImpact(_impacts.loadLibrary);
+          break;
       }
     }
 
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index cb5a5f1..5b6488d 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -24,6 +24,7 @@
 import '../world.dart' show ClosedWorld;
 import 'backend_usage.dart';
 import 'namer.dart';
+import 'native_data.dart';
 
 bool cacheRtiDataForTesting = false;
 
@@ -324,9 +325,10 @@
       bool isNativeClass = _closedWorld.nativeData.isNativeClass(cls);
       if (classUse.typeArgument ||
           (isNativeClass && classUse.checkedInstance)) {
+        Substitution substitution = computeSubstitution(cls, cls);
         // We need [cls] at runtime - even if [cls] is not instantiated. Either
         // as a type argument or for an is-test if [cls] is native.
-        checks.add(new TypeCheck(cls, null, needsIs: isNativeClass));
+        checks.add(new TypeCheck(cls, substitution, needsIs: isNativeClass));
       }
 
       // Compute the set of classes that [cls] inherited properties from.
@@ -514,9 +516,19 @@
       return true;
     }
 
-    // If there are no type variables or the type is the same, we do not need
-    // a substitution.
-    if (!_elementEnvironment.isGenericClass(check) || cls == check) {
+    // If there are no type variables, we do not need a substitution.
+    if (!_elementEnvironment.isGenericClass(check)) {
+      return true;
+    }
+
+    // JS-interop classes need an explicit substitution to mark the type
+    // arguments as `any` type.
+    if (_closedWorld.nativeData.isJsInteropClass(cls)) {
+      return false;
+    }
+
+    // If the type is the same, we do not need a substitution.
+    if (cls == check) {
       return true;
     }
 
@@ -565,7 +577,12 @@
     InterfaceType type = _elementEnvironment.getThisType(cls);
     InterfaceType target = _types.asInstanceOf(type, check);
     List<DartType> typeVariables = type.typeArguments;
-    if (typeVariables.isEmpty && !alwaysGenerateFunction) {
+    if (_closedWorld.nativeData.isJsInteropClass(cls)) {
+      int typeArguments = target.typeArguments.length;
+      // Generic JS-interop class need an explicit substitution to mark
+      // the type arguments as `any` type.
+      return new Substitution.jsInterop(typeArguments);
+    } else if (typeVariables.isEmpty && !alwaysGenerateFunction) {
       return new Substitution.list(target.typeArguments);
     } else {
       return new Substitution.function(target.typeArguments, typeVariables);
@@ -624,6 +641,10 @@
   /// is the dynamic type.
   jsAst.Template get templateForIsDynamicType;
 
+  /// Returns the JavaScript template to determine at runtime if a type object
+  /// is a type argument of js-interop class.
+  jsAst.Template get templateForIsJsInteropTypeArgument;
+
   jsAst.Name get getFunctionThatReturnsNullName;
 
   /// Returns a [jsAst.Expression] representing the given [type]. Type variables
@@ -1834,11 +1855,11 @@
   final CommonElements commonElements;
   final TypeRepresentationGenerator _representationGenerator;
 
-  RuntimeTypesEncoderImpl(
-      this.namer, this._elementEnvironment, this.commonElements,
-      {bool strongMode})
-      : _representationGenerator =
-            new TypeRepresentationGenerator(namer, strongMode: strongMode);
+  RuntimeTypesEncoderImpl(this.namer, NativeBasicData nativeData,
+      this._elementEnvironment, this.commonElements, {bool strongMode})
+      : _representationGenerator = new TypeRepresentationGenerator(
+            namer, nativeData,
+            strongMode: strongMode);
 
   @override
   bool isSimpleFunctionType(FunctionType type) {
@@ -1880,6 +1901,11 @@
   }
 
   @override
+  jsAst.Template get templateForIsJsInteropTypeArgument {
+    return _representationGenerator.templateForIsJsInteropTypeArgument;
+  }
+
+  @override
   jsAst.Expression getTypeRepresentation(
       Emitter emitter, DartType type, OnVariableCallback onVariable,
       [ShouldEncodeTypedefCallback shouldEncodeTypedef]) {
@@ -1968,6 +1994,13 @@
       return new jsAst.LiteralNull();
     }
 
+    if (substitution.isJsInterop) {
+      return js(
+          'function() { return # }',
+          _representationGenerator
+              .getJsInteropTypeArguments(substitution.length));
+    }
+
     jsAst.Expression declaration(TypeVariableType variable) {
       return new jsAst.Parameter(getVariableName(variable.element.name));
     }
@@ -2036,6 +2069,7 @@
 class TypeRepresentationGenerator
     implements ResolutionDartTypeVisitor<jsAst.Expression, Emitter> {
   final Namer namer;
+  final NativeBasicData _nativeData;
   // If true, compile using strong mode.
   final bool _strongMode;
   OnVariableCallback onVariable;
@@ -2043,7 +2077,7 @@
   Map<TypeVariableType, jsAst.Expression> typedefBindings;
   List<FunctionTypeVariable> functionTypeVariables = <FunctionTypeVariable>[];
 
-  TypeRepresentationGenerator(this.namer, {bool strongMode})
+  TypeRepresentationGenerator(this.namer, this._nativeData, {bool strongMode})
       : _strongMode = strongMode;
 
   /**
@@ -2075,6 +2109,7 @@
 
   jsAst.Expression getVoidValue() => js('-1');
 
+  jsAst.Expression getJsInteropTypeArgumentValue() => js('-2');
   @override
   jsAst.Expression visit(DartType type, Emitter emitter) =>
       type.accept(this, emitter);
@@ -2102,8 +2137,23 @@
     return getDynamicValue();
   }
 
+  jsAst.Expression getJsInteropTypeArguments(int count,
+      {jsAst.Expression name}) {
+    List<jsAst.Expression> elements = <jsAst.Expression>[];
+    if (name != null) {
+      elements.add(name);
+    }
+    for (int i = 0; i < count; i++) {
+      elements.add(getJsInteropTypeArgumentValue());
+    }
+    return new jsAst.ArrayInitializer(elements);
+  }
+
   jsAst.Expression visitInterfaceType(InterfaceType type, Emitter emitter) {
     jsAst.Expression name = getJavaScriptClassName(type.element, emitter);
+    if (_nativeData.isJsInteropClass(type.element)) {
+      return getJsInteropTypeArguments(type.typeArguments.length, name: name);
+    }
     return type.treatAsRaw
         ? name
         : visitList(type.typeArguments, emitter, head: name);
@@ -2150,6 +2200,10 @@
     return jsAst.js.expressionTemplateFor("# == null");
   }
 
+  jsAst.Template get templateForIsJsInteropTypeArgument {
+    return jsAst.js.expressionTemplateFor("# === -2");
+  }
+
   jsAst.Expression visitFunctionType(FunctionType type, Emitter emitter) {
     List<jsAst.Property> properties = <jsAst.Property>[];
 
@@ -2405,24 +2459,37 @@
   final bool isFunction;
   final List<DartType> arguments;
   final List<DartType> parameters;
+  final int length;
 
   const Substitution.trivial()
       : isTrivial = true,
         isFunction = false,
+        length = null,
         arguments = const <DartType>[],
         parameters = const <DartType>[];
 
   Substitution.list(this.arguments)
       : isTrivial = false,
         isFunction = false,
+        length = null,
         parameters = const <DartType>[];
 
   Substitution.function(this.arguments, this.parameters)
       : isTrivial = false,
-        isFunction = true;
+        isFunction = true,
+        length = null;
+
+  Substitution.jsInterop(this.length)
+      : isTrivial = false,
+        isFunction = false,
+        arguments = const <DartType>[],
+        parameters = const <DartType>[];
+
+  bool get isJsInterop => length != null;
 
   String toString() => 'Substitution(isTrivial=$isTrivial,'
-      'isFunction=$isFunction,arguments=$arguments,parameters=$parameters)';
+      'isFunction=$isFunction,isJsInterop=$isJsInterop,arguments=$arguments,'
+      'parameters=$parameters,length=$length)';
 }
 
 /**
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 7939804..6002105 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
@@ -345,6 +345,9 @@
       case JsBuiltin.isDynamicType:
         return backend.rtiEncoder.templateForIsDynamicType;
 
+      case JsBuiltin.isJsInteropTypeArgument:
+        return backend.rtiEncoder.templateForIsJsInteropTypeArgument;
+
       case JsBuiltin.rawRtiToJsConstructorName:
         return jsAst.js.expressionTemplateFor("#.$typeNameProperty");
 
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 5e3279f..3b55095 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
@@ -768,6 +768,10 @@
     List<StubMethod> checkedSetters = <StubMethod>[];
     List<StubMethod> isChecks = <StubMethod>[];
     if (_nativeData.isJsInteropClass(cls)) {
+      // TODO(johnniwinther): Instead of generating all stubs for each
+      // js-interop class we should generate a stub for each implemented class.
+      // Currently we generate duplicates if a class is implemented by multiple
+      // js-interop classes.
       typeTests.forEachProperty(_sorter, (js.Name name, js.Node code) {
         _classes[_commonElements.jsJavaScriptObjectClass]
             .isChecks
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 18541ce..4d150cc 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.dart
@@ -135,6 +135,9 @@
       case JsBuiltin.isDynamicType:
         return _backend.rtiEncoder.templateForIsDynamicType;
 
+      case JsBuiltin.isJsInteropTypeArgument:
+        return _backend.rtiEncoder.templateForIsJsInteropTypeArgument;
+
       case JsBuiltin.rawRtiToJsConstructorName:
         return js.js.expressionTemplateFor("#.name");
 
diff --git a/pkg/compiler/lib/src/js_model/closure_visitors.dart b/pkg/compiler/lib/src/js_model/closure_visitors.dart
index ea35aaf..5868aea 100644
--- a/pkg/compiler/lib/src/js_model/closure_visitors.dart
+++ b/pkg/compiler/lib/src/js_model/closure_visitors.dart
@@ -629,6 +629,11 @@
     node.body.accept(this);
   }
 
+  @override
+  visitInstantiation(ir.Instantiation node) {
+    visitChildrenInContext(node, VariableUse.explicit);
+  }
+
   /// Returns true if the node is a field, or a constructor (factory or
   /// generative).
   bool _isFieldOrConstructor(ir.Node node) =>
diff --git a/pkg/compiler/lib/src/kernel/deferred_load.dart b/pkg/compiler/lib/src/kernel/deferred_load.dart
index f2641c6..f3f1a9c 100644
--- a/pkg/compiler/lib/src/kernel/deferred_load.dart
+++ b/pkg/compiler/lib/src/kernel/deferred_load.dart
@@ -6,8 +6,8 @@
 
 import 'package:kernel/ast.dart' as ir;
 
-import '../compiler.dart' show Compiler;
 import '../common_elements.dart';
+import '../compiler.dart' show Compiler;
 import '../constants/values.dart' show ConstantValue;
 import '../deferred_load.dart';
 import '../elements/entities.dart';
@@ -141,8 +141,13 @@
 
   CommonElements get commonElements => elementMap.commonElements;
 
-  void add(ir.Expression node) =>
-      constants.add(elementMap.getConstantValue(node));
+  void add(ir.Expression node, {bool required: true}) {
+    ConstantValue constant =
+        elementMap.getConstantValue(node, requireConstant: required);
+    if (constant != null) {
+      constants.add(constant);
+    }
+  }
 
   @override
   void visitIntLiteral(ir.IntLiteral literal) {}
@@ -193,4 +198,11 @@
   void visitTypeLiteral(ir.TypeLiteral node) {
     if (node.type is! ir.TypeParameterType) add(node);
   }
+
+  @override
+  void visitInstantiation(ir.Instantiation node) {
+    // TODO(johnniwinther): The CFE should mark constant instantiations as
+    // constant.
+    add(node, required: false);
+  }
 }
diff --git a/pkg/compiler/lib/src/kernel/element_map.dart b/pkg/compiler/lib/src/kernel/element_map.dart
index d9c3e7a..d6167ba 100644
--- a/pkg/compiler/lib/src/kernel/element_map.dart
+++ b/pkg/compiler/lib/src/kernel/element_map.dart
@@ -189,6 +189,9 @@
   /// Returns the static type of [node].
   // TODO(johnniwinther): This should be provided directly from kernel.
   DartType getStaticType(ir.Expression node);
+
+  /// Returns the element type of a async/sync*/async* function.
+  DartType getFunctionAsyncOrSyncStarElementType(ir.FunctionNode functionNode);
 }
 
 /// Interface that translates between Kernel IR nodes and entities used for
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index e7791c6..5216b83 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -1369,6 +1369,27 @@
   ClassDefinition getClassDefinition(ClassEntity cls) {
     return _getClassDefinition(cls);
   }
+
+  /// Returns the element type of a async/sync*/async* function.
+  @override
+  DartType getFunctionAsyncOrSyncStarElementType(ir.FunctionNode functionNode) {
+    DartType returnType = getFunctionType(functionNode).returnType;
+    switch (functionNode.asyncMarker) {
+      case ir.AsyncMarker.SyncStar:
+        return elementEnvironment.getAsyncOrSyncStarElementType(
+            AsyncMarker.SYNC_STAR, returnType);
+      case ir.AsyncMarker.Async:
+        return elementEnvironment.getAsyncOrSyncStarElementType(
+            AsyncMarker.ASYNC, returnType);
+      case ir.AsyncMarker.AsyncStar:
+        return elementEnvironment.getAsyncOrSyncStarElementType(
+            AsyncMarker.ASYNC_STAR, returnType);
+      default:
+        failedAt(CURRENT_ELEMENT_SPANNABLE,
+            "Unexpected ir.AsyncMarker: ${functionNode.asyncMarker}");
+    }
+    return null;
+  }
 }
 
 class KernelElementEnvironment extends ElementEnvironment {
@@ -1451,7 +1472,13 @@
   @override
   DartType getFunctionAsyncOrSyncStarElementType(FunctionEntity function) {
     DartType returnType = getFunctionType(function).returnType;
-    switch (function.asyncMarker) {
+    return getAsyncOrSyncStarElementType(function.asyncMarker, returnType);
+  }
+
+  @override
+  DartType getAsyncOrSyncStarElementType(
+      AsyncMarker asyncMarker, DartType returnType) {
+    switch (asyncMarker) {
       case AsyncMarker.SYNC:
         return returnType;
       case AsyncMarker.SYNC_STAR:
@@ -1477,7 +1504,7 @@
         }
         return dynamicType;
     }
-    assert(false, 'Unexpected marker ${function.asyncMarker}');
+    assert(false, 'Unexpected marker ${asyncMarker}');
     return null;
   }
 
diff --git a/pkg/compiler/lib/src/kernel/element_map_mixins.dart b/pkg/compiler/lib/src/kernel/element_map_mixins.dart
index 1a4ca53..3588b19 100644
--- a/pkg/compiler/lib/src/kernel/element_map_mixins.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_mixins.dart
@@ -500,6 +500,7 @@
   ConstantExpression visit(ir.Expression node) {
     ConstantExpression constant = node.accept(this);
     if (constant == null && requireConstant) {
+      // TODO(johnniwinther): Support contextual error messages.
       elementMap.reporter.reportErrorMessage(
           computeSourceSpanFromTreeNode(failNode ?? node),
           MessageKind.NOT_A_COMPILE_TIME_CONSTANT);
@@ -699,9 +700,16 @@
 
   @override
   ConstantExpression visitInstantiation(ir.Instantiation node) {
-    return new InstantiationConstantExpression(
-        node.typeArguments.map(elementMap.getDartType).toList(),
-        visit(node.expression));
+    List<DartType> typeArguments =
+        node.typeArguments.map(elementMap.getDartType).toList();
+    for (DartType typeArgument in typeArguments) {
+      if (typeArgument.containsTypeVariables) {
+        return null;
+      }
+    }
+    ConstantExpression expression = visit(node.expression);
+    if (expression == null) return null;
+    return new InstantiationConstantExpression(typeArguments, expression);
   }
 
   @override
diff --git a/pkg/compiler/lib/src/resolution/resolution_strategy.dart b/pkg/compiler/lib/src/resolution/resolution_strategy.dart
index b73f923..06718ca 100644
--- a/pkg/compiler/lib/src/resolution/resolution_strategy.dart
+++ b/pkg/compiler/lib/src/resolution/resolution_strategy.dart
@@ -742,6 +742,11 @@
   }
 
   @override
+  DartType getAsyncOrSyncStarElementType(AsyncMarker marker, DartType type) {
+    return dynamicType;
+  }
+
+  @override
   DartType getFieldType(covariant FieldElement field) {
     field.computeType(_resolution);
     return field.type;
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 06ebbe7..029f975 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -4028,6 +4028,7 @@
   }
 
   FunctionEntity _instantiator(int count) {
+    // TODO(johnniwinther,sra): Support arbitrary type argument count.
     if (count == 1) return _commonElements.instantiate1;
     if (count == 2) return _commonElements.instantiate2;
     if (count == 3) return _commonElements.instantiate3;
@@ -4439,7 +4440,8 @@
       js.Name operator = namer.operatorIs(element);
       HInstruction isFieldName =
           graph.addConstantStringFromName(operator, closedWorld);
-      HInstruction asFieldName = closedWorld.hasAnyStrictSubtype(element)
+      HInstruction asFieldName = closedWorld.hasAnyStrictSubtype(element) ||
+              closedWorld.nativeData.isJsInteropClass(element)
           ? graph.addConstantStringFromName(
               namer.substitutionName(element), closedWorld)
           : graph.addConstantNull(closedWorld);
diff --git a/pkg/compiler/lib/src/ssa/kernel_impact.dart b/pkg/compiler/lib/src/ssa/kernel_impact.dart
index 6f96104..b22749f 100644
--- a/pkg/compiler/lib/src/ssa/kernel_impact.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart
@@ -146,19 +146,42 @@
     return impactBuilder;
   }
 
-  void handleAsyncMarker(ir.AsyncMarker asyncMarker) {
+  void handleAsyncMarker(ir.FunctionNode function) {
+    ir.AsyncMarker asyncMarker = function.asyncMarker;
+    if (asyncMarker == ir.AsyncMarker.Sync) return;
+
+    DartType elementType =
+        elementMap.getFunctionAsyncOrSyncStarElementType(function);
+
     switch (asyncMarker) {
-      case ir.AsyncMarker.Sync:
-        break;
       case ir.AsyncMarker.SyncStar:
         impactBuilder.registerFeature(Feature.SYNC_STAR);
+        impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
+            commonElements.syncStarIterableFactory,
+            const CallStructure.unnamed(1, 1),
+            <DartType>[elementType]));
         break;
+
       case ir.AsyncMarker.Async:
         impactBuilder.registerFeature(Feature.ASYNC);
+        var completerFactory = _options.startAsyncSynchronously
+            ? commonElements.asyncAwaitCompleterFactory
+            : commonElements.syncCompleterFactory;
+        impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
+            completerFactory,
+            const CallStructure.unnamed(0, 1),
+            <DartType>[elementType]));
         break;
+
       case ir.AsyncMarker.AsyncStar:
         impactBuilder.registerFeature(Feature.ASYNC_STAR);
+        impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
+            commonElements.asyncStarStreamControllerFactory,
+            const CallStructure.unnamed(1, 1),
+            <DartType>[elementType]));
         break;
+
+      case ir.AsyncMarker.Sync:
       case ir.AsyncMarker.SyncYielding:
         failedAt(CURRENT_ELEMENT_SPANNABLE,
             "Unexpected async marker: ${asyncMarker}");
@@ -168,7 +191,7 @@
   ResolutionImpact buildProcedure(ir.Procedure procedure) {
     handleSignature(procedure.function);
     visitNode(procedure.function.body);
-    handleAsyncMarker(procedure.function.asyncMarker);
+    handleAsyncMarker(procedure.function);
     if (procedure.isExternal &&
         !elementMap.isForeignLibrary(procedure.enclosingLibrary)) {
       MemberEntity member = elementMap.getMember(procedure);
@@ -607,19 +630,19 @@
 
   @override
   void visitFunctionDeclaration(ir.FunctionDeclaration node) {
-    impactBuilder.registerStaticUse(
-        new StaticUse.closure(elementMap.getLocalFunction(node)));
+    Local function = elementMap.getLocalFunction(node);
+    impactBuilder.registerStaticUse(new StaticUse.closure(function));
     handleSignature(node.function);
-    handleAsyncMarker(node.function.asyncMarker);
+    handleAsyncMarker(node.function);
     visitNode(node.function.body);
   }
 
   @override
   void visitFunctionExpression(ir.FunctionExpression node) {
-    impactBuilder.registerStaticUse(
-        new StaticUse.closure(elementMap.getLocalFunction(node)));
+    Local function = elementMap.getLocalFunction(node);
+    impactBuilder.registerStaticUse(new StaticUse.closure(function));
     handleSignature(node.function);
-    handleAsyncMarker(node.function.asyncMarker);
+    handleAsyncMarker(node.function);
     visitNode(node.function.body);
   }
 
@@ -728,6 +751,7 @@
   void visitLoadLibrary(ir.LoadLibrary node) {
     impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
         commonElements.loadDeferredLibrary, CallStructure.ONE_ARG));
+    impactBuilder.registerFeature(Feature.LOAD_LIBRARY);
   }
 
   // TODO(johnniwinther): Make this throw and visit child nodes explicitly
diff --git a/pkg/compiler/lib/src/ssa/ssa.dart b/pkg/compiler/lib/src/ssa/ssa.dart
index 4dd04bc..f9c45ea 100644
--- a/pkg/compiler/lib/src/ssa/ssa.dart
+++ b/pkg/compiler/lib/src/ssa/ssa.dart
@@ -51,6 +51,7 @@
       result = backend.rewriteAsync(
           closedWorld.commonElements,
           closedWorld.elementEnvironment,
+          work.registry,
           element,
           result,
           sourceInformationBuilder.buildAsyncBody(),
diff --git a/pkg/compiler/lib/src/universe/feature.dart b/pkg/compiler/lib/src/universe/feature.dart
index 611f6a8..d63fa34 100644
--- a/pkg/compiler/lib/src/universe/feature.dart
+++ b/pkg/compiler/lib/src/universe/feature.dart
@@ -46,11 +46,14 @@
   /// A generic instantiation (application of type parameters).
   GENERIC_INSTANTIATION,
 
+  /// A field whose initialization is not a constant.
+  LAZY_FIELD,
+
   /// A local variable without an initializer.
   LOCAL_WITHOUT_INITIALIZER,
 
-  /// A field whose initialization is not a constant.
-  LAZY_FIELD,
+  /// Access to `loadLibrary` on a deferred import.
+  LOAD_LIBRARY,
 
   /// A catch clause with a variable for the stack trace.
   STACK_TRACE_IN_CATCH,
diff --git a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
index 8fbce54..c7c523d 100644
--- a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
@@ -239,7 +239,7 @@
         stringClass = _getLibrary(c, 'dart:core').getType('String'),
         functionClass = _getLibrary(c, 'dart:core').getType('Function'),
         privateSymbolClass =
-            _getLibrary(c, 'dart:_internal').getType('PrivateSymbol'),
+            _getLibrary(c, 'dart:_js_helper').getType('PrivateSymbol'),
         linkedHashMapImplType =
             _getLibrary(c, 'dart:_js_helper').getType('LinkedMap').type,
         identityHashMapImplType =
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_async.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_async.dart
index e6bcb2d..0f6165e 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_async.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_async.dart
@@ -3,10 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 main() {
-  // This call is no longer on the stack when the error is thrown.
-  /*:main*/ test();
+  /*1:main*/ test();
 }
 
-test() async {
-  /*1:test*/ throw '>ExceptionMarker<';
+test /*ddk.2:test*/ () /*ddc.2:test*/ async {
+  /*3:test*/ throw '>ExceptionMarker<';
 }
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_awaited_async.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_awaited_async.dart
index fbc5eff..2801397 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_awaited_async.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_awaited_async.dart
@@ -3,14 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 main() {
-  test1();
+  /*1:main*/ test1();
 }
 
-test1() async {
-  // This call is no longer on the stack when the error is thrown.
-  await /*:test1*/ test2();
+test1 /*ddk.2:test1*/ () /*ddc.2:test1*/ async {
+  await /*3:test1*/ test2();
 }
 
-test2() async {
-  /*1:test2*/ throw '>ExceptionMarker<';
+test2 /*ddk.4:test2*/ () /*ddc.4:test2*/ async {
+  /*5:test2*/ throw '>ExceptionMarker<';
 }
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_constructor_from_async.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_constructor_from_async.dart
index 1eaf256..c3cf435 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_constructor_from_async.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_constructor_from_async.dart
@@ -4,17 +4,17 @@
 
 main() {
   // This call is no longer on the stack when the error is thrown.
-  /*:main*/ test();
+  /*1:main*/ test();
 }
 
-test() async {
+test /*ddk.2:test*/ () /*ddc.2:test*/ async {
   // ignore: UNUSED_LOCAL_VARIABLE
-  var c = new /*1:test*/ Class();
+  var c = new /*3:test*/ Class();
 }
 
 class Class {
   Class() {
     // Some comment
-    /*2:Class.new*/ throw '>ExceptionMarker<';
+    /*4:Class.new*/ throw '>ExceptionMarker<';
   }
 }
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_top_level_method_from_async.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_top_level_method_from_async.dart
index 0eeaefe..f58dde6 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_top_level_method_from_async.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_top_level_method_from_async.dart
@@ -3,13 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 main() {
-  test1();
+  /*1:main*/ test1();
 }
 
-test1() async {
-  /*1:test1*/ test2();
+test1 /*ddk.2:test1*/ () /*ddc.2:test1*/ async {
+  /*3:test1*/ test2();
 }
 
 test2() {
-  /*2:test2*/ throw '>ExceptionMarker<';
+  /*4:test2*/ throw '>ExceptionMarker<';
 }
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/hello_async.dart b/pkg/dev_compiler/test/sourcemap/testfiles/hello_async.dart
index a462a3b..6758e46 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/hello_async.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/hello_async.dart
@@ -5,10 +5,10 @@
 main() {
   /*bl*/
   /*s:1*/ foo();
-/*nbb:0:3*/ /*s:3*/
+  /*s:4*/
 }
 
-foo() async {
-  /*nbb:0:4*/ /*bc:4*/ print("hello from foo");
-/*s:2*/
+foo() /*sl:2*/ async {
+  print("hello from foo");
+/*s:3*/
 }
diff --git a/pkg/dev_compiler/tool/ddc b/pkg/dev_compiler/tool/ddc
index 9846cd6..cc8f410 100755
--- a/pkg/dev_compiler/tool/ddc
+++ b/pkg/dev_compiler/tool/ddc
@@ -60,12 +60,6 @@
   shift
 fi
 
-SYNC_ASYNC=false
-if [ "$1" = "--sync-async" ]; then
-  SYNC_ASYNC=true
-  shift
-fi
-
 BASENAME=$( basename "${1%.*}")
 LIBROOT=$(cd $( dirname "${1%.*}") && pwd)
 
@@ -110,7 +104,6 @@
     let sdk = require(\"dart_sdk\");
     let main = require(\"./$BASENAME\").$BASENAME.main;
     sdk.dart.ignoreWhitelistedErrors(false);
-    if ($SYNC_ASYNC) sdk.dart.setStartAsyncSynchronously();
     try {
       sdk._isolate_helper.startRootIsolate(main, []);
     } catch(e) {
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/generators.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/generators.dart
index e6cfecf..584a6f1 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/generators.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/generators.dart
@@ -11,8 +11,9 @@
 /// stepping stone for proposed ES7 async/await, and uses ES6 Promises.
 part of dart._runtime;
 
-// TODO(vsm): Remove once this flag is the default.
-bool startAsyncSynchronously = false;
+// TODO(vsm): Remove once this flag we've removed the ability to
+// whitelist / fallback on the old behavior.
+bool startAsyncSynchronously = true;
 void setStartAsyncSynchronously([bool value = true]) {
   startAsyncSynchronously = value;
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
index 6a36f63..b28594e 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
@@ -443,21 +443,23 @@
 }
 
 @JSExportName('as')
-cast(obj, type, bool typeError) {
+cast(obj, type, bool isExplicit) {
   if (obj == null) return obj;
   var actual = getReifiedType(obj);
   var result = isSubtype(actual, type);
   if (JS(
       'bool',
-      '# === true || # === null && dart.__ignoreWhitelistedErrors && #(#, #)',
+      '# === true || # === null && # && '
+      'dart.__ignoreWhitelistedErrors && #(#, #)',
       result,
       result,
+      isExplicit,
       _ignoreTypeFailure,
       actual,
       type)) {
     return obj;
   }
-  return castError(obj, type, typeError);
+  return castError(obj, type, isExplicit);
 }
 
 bool test(bool obj) {
@@ -484,7 +486,7 @@
       "type '${typeName(expected)}' in boolean expression");
 }
 
-castError(obj, type, bool typeError) {
+castError(obj, type, bool isExplicit) {
   var objType = getReifiedType(obj);
   if (JS('bool', '!dart.__ignoreAllErrors')) {
     var errorInStrongMode = isSubtype(objType, type) == null;
@@ -493,7 +495,7 @@
     var expected = typeName(type);
     if (JS('bool', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
 
-    var error = JS('bool', '#', typeError)
+    var error = JS('bool', '#', isExplicit)
         ? new TypeErrorImplementation(obj, actual, expected, errorInStrongMode)
         : new CastErrorImplementation(obj, actual, expected, errorInStrongMode);
     throw error;
diff --git a/pkg/front_end/lib/src/base/instrumentation.dart b/pkg/front_end/lib/src/base/instrumentation.dart
index 92ebf2f..4f537c7 100644
--- a/pkg/front_end/lib/src/base/instrumentation.dart
+++ b/pkg/front_end/lib/src/base/instrumentation.dart
@@ -65,9 +65,6 @@
       buffer.write('abstract ');
     }
     var function = procedure.function;
-    if (procedure.isGenericContravariant) {
-      buffer.write('genericContravariant ');
-    }
     buffer.write(function.returnType);
     buffer.write(' ');
     switch (procedure.kind) {
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index f6d512c..27e264e 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -227,4 +227,6 @@
       {List<LocatedMessage> context}) {
     library.addProblem(message, charOffset, length, fileUri, context: context);
   }
+
+  int get typeVariablesCount;
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/function_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_type_alias_builder.dart
index 710e5e3..564c636 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_type_alias_builder.dart
@@ -28,4 +28,6 @@
   String get debugName => "FunctionTypeAliasBuilder";
 
   LibraryBuilder get parent => super.parent;
+
+  int get typeVariablesCount;
 }
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 2737d27..5ad37c7 100644
--- a/pkg/front_end/lib/src/fasta/builder/library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
@@ -31,6 +31,8 @@
         ScopeBuilder,
         TypeBuilder;
 
+import '../import.dart' show Import;
+
 abstract class LibraryBuilder<T extends TypeBuilder, R>
     extends ModifierBuilder {
   final Scope scope;
@@ -215,4 +217,19 @@
     if (!isPatch) return;
     unsupported("${runtimeType}.applyPatches", -1, fileUri);
   }
+
+  void addSpecificImportsToScope(Iterable<Import> imports) {
+    bool explicitCoreImport = this == loader.coreLibrary;
+    for (Import import in imports) {
+      if (import.imported == loader.coreLibrary) {
+        explicitCoreImport = true;
+      }
+      import.finalizeImports(this);
+    }
+    if (!explicitCoreImport) {
+      loader.coreLibrary.exportScope.forEach((String name, Builder member) {
+        addToScope(name, member, -1, true);
+      });
+    }
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
index eca2778..fb021d6 100644
--- a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
@@ -4,6 +4,8 @@
 
 library fasta.named_type_builder;
 
+import '../fasta_codes.dart' show Message;
+
 import 'builder.dart'
     show
         Builder,
@@ -23,7 +25,8 @@
 
   NamedTypeBuilder(this.name, this.arguments);
 
-  InvalidTypeBuilder<T, R> buildInvalidType(int charOffset, Uri fileUri);
+  InvalidTypeBuilder<T, R> buildInvalidType(int charOffset, Uri fileUri,
+      [Message message]);
 
   @override
   void bind(TypeDeclarationBuilder builder) {
diff --git a/pkg/front_end/lib/src/fasta/builder/unresolved_type.dart b/pkg/front_end/lib/src/fasta/builder/unresolved_type.dart
index fb09b30..ef75ed9 100644
--- a/pkg/front_end/lib/src/fasta/builder/unresolved_type.dart
+++ b/pkg/front_end/lib/src/fasta/builder/unresolved_type.dart
@@ -4,7 +4,16 @@
 
 library fasta.unresolved_type;
 
-import 'builder.dart' show Scope, TypeBuilder;
+import '../fasta_codes.dart' show templateTypeArgumentMismatch;
+
+import 'builder.dart'
+    show
+        ClassBuilder,
+        FunctionTypeAliasBuilder,
+        NamedTypeBuilder,
+        Scope,
+        TypeBuilder,
+        TypeDeclarationBuilder;
 
 /// A wrapper around a type that is yet to be resolved.
 class UnresolvedType<T extends TypeBuilder> {
@@ -15,4 +24,31 @@
   UnresolvedType(this.builder, this.charOffset, this.fileUri);
 
   void resolveIn(Scope scope) => builder.resolveIn(scope, charOffset, fileUri);
+
+  /// Performs checks on the type after it's resolved.
+  void checkType() {
+    if (builder is NamedTypeBuilder) {
+      NamedTypeBuilder resolvedType = builder as NamedTypeBuilder;
+      TypeDeclarationBuilder declaration = resolvedType.builder;
+      if (declaration is ClassBuilder) {
+        if (resolvedType.arguments != null &&
+            resolvedType.arguments.length != declaration.typeVariablesCount) {
+          resolvedType.builder = resolvedType.buildInvalidType(
+              charOffset,
+              fileUri,
+              templateTypeArgumentMismatch.withArguments(
+                  resolvedType.name, "${declaration.typeVariablesCount}"));
+        }
+      } else if (declaration is FunctionTypeAliasBuilder) {
+        if (resolvedType.arguments != null &&
+            resolvedType.arguments.length != declaration.typeVariablesCount) {
+          resolvedType.builder = resolvedType.buildInvalidType(
+              charOffset,
+              fileUri,
+              templateTypeArgumentMismatch.withArguments(
+                  resolvedType.name, "${declaration.typeVariablesCount}"));
+        }
+      }
+    }
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
index caa23e7..a2089f3 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
@@ -60,6 +60,9 @@
     }
   }
 
+  @override
+  int get typeVariablesCount => cls.typeParameters.length;
+
   List<TypeBuilder> get calculatedBounds {
     if (super.calculatedBounds != null) {
       return super.calculatedBounds;
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
index 2b6c733..57cb4e0 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
@@ -11,6 +11,7 @@
         Class,
         Field,
         Library,
+        LibraryDependency,
         ListLiteral,
         Member,
         Procedure,
@@ -18,9 +19,15 @@
         StringLiteral,
         Typedef;
 
+import 'package:kernel/ast.dart' as kernel show Combinator;
+
+import '../combinator.dart' show Combinator;
+
 import '../fasta_codes.dart' show templateUnspecified;
 
-import '../problems.dart' show internalProblem, unhandled, unimplemented;
+import '../import.dart' show Import;
+
+import '../problems.dart' show internalProblem, unhandled;
 
 import '../kernel/kernel_builder.dart'
     show
@@ -118,7 +125,16 @@
 
   @override
   void addToScope(String name, Builder member, int charOffset, bool isImport) {
-    unimplemented("addToScope", charOffset, fileUri);
+    Map<String, Builder> map = member.isSetter ? scope.setters : scope.local;
+    Builder existing = map[name];
+    if (existing != null) {
+      if (existing != member) {
+        map[name] = buildAmbiguousBuilder(name, existing, member, charOffset,
+            isImport: isImport);
+      }
+    } else {
+      map[name] = member;
+    }
   }
 
   @override
@@ -209,4 +225,23 @@
       assert(node == builder.target);
     }
   }
+
+  void addImportsToScope(Map<Uri, LibraryBuilder> libraries) {
+    List<Import> imports = <Import>[];
+    for (LibraryDependency dependency in library.dependencies) {
+      if (!dependency.isImport) continue;
+      LibraryBuilder imported = libraries[dependency.targetLibrary.importUri];
+      assert(imported != null);
+
+      List<Combinator> syntheticCombinators = <Combinator>[];
+      for (kernel.Combinator combinator in dependency.combinators) {
+        syntheticCombinators.add(new Combinator(combinator.isShow,
+            new Set<String>.from(combinator.names), -1, uri));
+      }
+
+      imports.add(new Import(this, imported, false, dependency.name,
+          syntheticCombinators, [], dependency.fileOffset, -1));
+    }
+    addSpecificImportsToScope(imports);
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
index d033d7d..ea49d48 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
@@ -8,6 +8,8 @@
 
 import 'package:kernel/ast.dart' show Library, Component, Source;
 
+import 'package:kernel/core_types.dart' show CoreTypes;
+
 import '../fasta_codes.dart'
     show SummaryTemplate, Template, templateDillOutlineSummary;
 
@@ -28,6 +30,9 @@
   /// Sources for all appended components.
   final Map<Uri, Source> uriToSource = <Uri, Source>{};
 
+  /// Should be set if code will be compiled in the context of this library.
+  CoreTypes coreTypes;
+
   DillLoader(TargetImplementation target) : super(target);
 
   Template<SummaryTemplate> get outlineSummaryTemplate =>
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_typedef_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_typedef_builder.dart
index 7f9ba1b..e6eebed 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_typedef_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_typedef_builder.dart
@@ -33,6 +33,9 @@
     return unimplemented("metadata", -1, null);
   }
 
+  @override
+  int get typeVariablesCount => target.typeParameters.length;
+
   List<TypeBuilder> get calculatedBounds {
     if (super.calculatedBounds != null) {
       return super.calculatedBounds;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
index 6584f7c..59f4546 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
@@ -122,6 +122,9 @@
     return arguments == null ? cls.rawType : new InterfaceType(cls, arguments);
   }
 
+  @override
+  int get typeVariablesCount => typeVariables?.length ?? 0;
+
   List<DartType> buildTypeArguments(
       LibraryBuilder library, List<KernelTypeBuilder> arguments) {
     List<DartType> typeArguments = <DartType>[];
@@ -304,17 +307,26 @@
 
     List<LocatedMessage> context = null;
 
+    bool mustHaveImplementation(Member member) {
+      // Forwarding stub
+      if (member is Procedure && member.isSyntheticForwarder) return false;
+      // Public member
+      if (!member.name.isPrivate) return true;
+      // Private member in different library
+      if (member.enclosingLibrary != cls.enclosingLibrary) return false;
+      // Private member in patch
+      if (member.fileUri != member.enclosingClass.fileUri) return false;
+      // Private member in same library
+      return true;
+    }
+
     void findMissingImplementations({bool setters}) {
       List<Member> dispatchTargets =
           hierarchy.getDispatchTargets(cls, setters: setters);
       int targetIndex = 0;
       for (Member interfaceMember
           in hierarchy.getInterfaceMembers(cls, setters: setters)) {
-        // Is this either a public member or a visible private member?
-        if (!interfaceMember.name.isPrivate ||
-            (interfaceMember.enclosingLibrary == cls.enclosingLibrary &&
-                interfaceMember.fileUri ==
-                    interfaceMember.enclosingClass.fileUri)) {
+        if (mustHaveImplementation(interfaceMember)) {
           while (targetIndex < dispatchTargets.length &&
               ClassHierarchy.compareMembers(
                       dispatchTargets[targetIndex], interfaceMember) <
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
index 1830ea2..28105fd 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
@@ -12,9 +12,9 @@
 import 'kernel_builder.dart'
     show
         FormalParameterBuilder,
-        KernelLibraryBuilder,
         KernelTypeBuilder,
-        MetadataBuilder;
+        MetadataBuilder,
+        LibraryBuilder;
 
 import 'package:front_end/src/fasta/source/source_library_builder.dart'
     show SourceLibraryBuilder;
@@ -30,7 +30,7 @@
       KernelTypeBuilder type,
       String name,
       bool hasThis,
-      KernelLibraryBuilder compilationUnit,
+      LibraryBuilder compilationUnit,
       this.charOffset)
       : super(metadata, modifiers, type, name, hasThis, compilationUnit,
             charOffset);
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 6bf1aa2..d91de6e 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
@@ -98,6 +98,9 @@
   }
 
   @override
+  int get typeVariablesCount => typeVariables?.length ?? 0;
+
+  @override
   DartType buildType(
       LibraryBuilder library, List<KernelTypeBuilder> arguments) {
     arguments ??= calculatedBounds;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_named_type_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_named_type_builder.dart
index 3428329..c70f250f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_named_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_named_type_builder.dart
@@ -6,6 +6,8 @@
 
 import 'package:kernel/ast.dart' show DartType, Supertype;
 
+import '../fasta_codes.dart' show Message;
+
 import '../messages.dart'
     show noLength, templateSupertypeIsIllegal, templateSupertypeIsTypeVariable;
 
@@ -17,6 +19,7 @@
         LibraryBuilder,
         NamedTypeBuilder,
         TypeBuilder,
+        TypeDeclarationBuilder,
         TypeVariableBuilder;
 
 class KernelNamedTypeBuilder
@@ -25,10 +28,11 @@
   KernelNamedTypeBuilder(Object name, List<KernelTypeBuilder> arguments)
       : super(name, arguments);
 
-  KernelInvalidTypeBuilder buildInvalidType(int charOffset, Uri fileUri) {
+  KernelInvalidTypeBuilder buildInvalidType(int charOffset, Uri fileUri,
+      [Message message]) {
     // TODO(ahe): Consider if it makes sense to pass a QualifiedName to
     // KernelInvalidTypeBuilder?
-    return new KernelInvalidTypeBuilder("$name", charOffset, fileUri);
+    return new KernelInvalidTypeBuilder("$name", charOffset, fileUri, message);
   }
 
   Supertype handleInvalidSupertype(
@@ -47,9 +51,16 @@
 
   Supertype buildSupertype(
       LibraryBuilder library, int charOffset, Uri fileUri) {
-    if (builder is KernelClassBuilder) {
-      KernelClassBuilder builder = this.builder;
-      return builder.buildSupertype(library, arguments);
+    TypeDeclarationBuilder declaration = builder;
+    if (declaration is KernelClassBuilder) {
+      return declaration.buildSupertype(library, arguments);
+    } else if (declaration is KernelInvalidTypeBuilder) {
+      library.addCompileTimeError(
+          declaration.message.messageObject,
+          declaration.message.charOffset,
+          declaration.message.length,
+          declaration.message.uri);
+      return null;
     } else {
       return handleInvalidSupertype(library, charOffset, fileUri);
     }
@@ -57,9 +68,16 @@
 
   Supertype buildMixedInType(
       LibraryBuilder library, int charOffset, Uri fileUri) {
-    if (builder is KernelClassBuilder) {
-      KernelClassBuilder builder = this.builder;
-      return builder.buildMixedInType(library, arguments);
+    TypeDeclarationBuilder declaration = builder;
+    if (declaration is KernelClassBuilder) {
+      return declaration.buildMixedInType(library, arguments);
+    } else if (declaration is KernelInvalidTypeBuilder) {
+      library.addCompileTimeError(
+          declaration.message.messageObject,
+          declaration.message.charOffset,
+          declaration.message.length,
+          declaration.message.uri);
+      return null;
     } else {
       return handleInvalidSupertype(library, charOffset, fileUri);
     }
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 4255dbc..d27cf0d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -106,9 +106,6 @@
   /// Shared with [CompilerContext].
   final Map<Uri, Source> uriToSource;
 
-  /// The [MetadataCollector] to write metadata to.
-  final MetadataCollector metadataCollector;
-
   SourceLoader<Library> loader;
 
   Component component;
@@ -133,8 +130,8 @@
       {Map<Uri, Source> uriToSource, MetadataCollector metadataCollector})
       : dillTarget = dillTarget,
         uriToSource = uriToSource ?? CompilerContext.current.uriToSource,
-        metadataCollector = metadataCollector,
-        super(dillTarget.ticker, uriTranslator, dillTarget.backendTarget) {
+        super(dillTarget.ticker, uriTranslator, dillTarget.backendTarget,
+            metadataCollector) {
     resetCrashReporting();
     loader = createLoader();
   }
diff --git a/pkg/front_end/lib/src/fasta/parser/identifier_context.dart b/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
index 26dea92..0199b13 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
@@ -22,10 +22,7 @@
 class IdentifierContext {
   /// Identifier is being declared as the name of an import prefix (i.e. `Foo`
   /// in `import "..." as Foo;`)
-  static const importPrefixDeclaration = const IdentifierContext(
-      'importPrefixDeclaration',
-      inDeclaration: true,
-      isBuiltInIdentifierAllowed: false);
+  static const importPrefixDeclaration = const ImportPrefixIdentifierContext();
 
   /// Identifier is the start of a dotted name in a conditional import or
   /// export.
diff --git a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
index 97798fb..000b2f2 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
@@ -31,6 +31,7 @@
       return identifier;
     }
 
+    // Recovery
     if (looksLikeStartOfNextTopLevelDeclaration(identifier) ||
         isOneOfOrEof(
             identifier, const ['<', '{', 'extends', 'with', 'implements'])) {
@@ -76,6 +77,7 @@
       }
     }
 
+    // Recovery
     if (looksLikeStartOfNextTopLevelDeclaration(identifier) ||
         isOneOfOrEof(identifier, followingValues)) {
       identifier = parser.insertSyntheticIdentifier(token, this,
@@ -123,6 +125,8 @@
       }
       return identifier;
     }
+
+    // Recovery
     parser.reportRecoverableErrorWithToken(
         identifier, fasta.templateExpectedIdentifier);
     if (identifier.isKeywordOrIdentifier) {
@@ -152,6 +156,7 @@
     if (identifier.isIdentifier) {
       return identifier;
     }
+
     // Recovery
     if (isOneOfOrEof(identifier, const [';', '=', ',', '}']) ||
         looksLikeStartOfNextClassMember(identifier)) {
@@ -183,6 +188,8 @@
     if (identifier.isIdentifier) {
       return identifier;
     }
+
+    // Recovery
     parser.reportRecoverableErrorWithToken(
         identifier, fasta.templateExpectedIdentifier);
     // Insert a synthetic identifier to satisfy listeners.
@@ -190,6 +197,43 @@
   }
 }
 
+/// See [IdentifierContext].importPrefixDeclaration
+class ImportPrefixIdentifierContext extends IdentifierContext {
+  const ImportPrefixIdentifierContext()
+      : super('importPrefixDeclaration',
+            inDeclaration: true, isBuiltInIdentifierAllowed: false);
+
+  @override
+  Token ensureIdentifier(Token token, Parser parser) {
+    Token identifier = token.next;
+    assert(identifier.kind != IDENTIFIER_TOKEN);
+    if (identifier.type.isPseudo) {
+      return identifier;
+    }
+
+    // Recovery
+    const followingValues = const [';', 'if', 'show', 'hide', 'deferred', 'as'];
+    if (identifier.type.isBuiltIn &&
+        isOneOfOrEof(identifier.next, followingValues)) {
+      parser.reportRecoverableErrorWithToken(
+          identifier, fasta.templateBuiltInIdentifierInDeclaration);
+    } else if (looksLikeStartOfNextTopLevelDeclaration(identifier) ||
+        isOneOfOrEof(identifier, followingValues)) {
+      identifier = parser.insertSyntheticIdentifier(token, this,
+          message: fasta.templateExpectedIdentifier.withArguments(identifier));
+    } else {
+      parser.reportRecoverableErrorWithToken(
+          identifier, fasta.templateExpectedIdentifier);
+      if (!identifier.isKeywordOrIdentifier) {
+        // When in doubt, consume the token to ensure we make progress
+        // but insert a synthetic identifier to satisfy listeners.
+        identifier = insertSyntheticIdentifierAfter(identifier, parser);
+      }
+    }
+    return identifier;
+  }
+}
+
 /// See [IdentifierContext].libraryName
 class LibraryIdentifierContext extends IdentifierContext {
   const LibraryIdentifierContext()
@@ -213,6 +257,8 @@
       // is invalid and this looks like the start of the next declaration.
       // In this situation, fall through to insert a synthetic library name.
     }
+
+    // Recovery
     if (isOneOfOrEof(identifier, const ['.', ';']) ||
         looksLikeStartOfNextTopLevelDeclaration(identifier)) {
       identifier = parser.insertSyntheticIdentifier(token, this,
@@ -243,6 +289,8 @@
       checkAsyncAwaitYieldAsIdentifier(identifier, parser);
       return identifier;
     }
+
+    // Recovery
     if (isOneOfOrEof(identifier, const [';', '=', ',', '{', '}']) ||
         looksLikeStartOfNextStatement(identifier)) {
       identifier = parser.insertSyntheticIdentifier(token, this,
@@ -275,6 +323,7 @@
     if (identifier.isIdentifier) {
       return identifier;
     }
+
     // Recovery
     if (identifier.isUserDefinableOperator && !isContinuation) {
       return parser.insertSyntheticIdentifier(identifier, this,
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index e66820c..d58fa45 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -2005,8 +2005,6 @@
       followingValues = [',', '}'];
     } else if (context == IdentifierContext.formalParameterDeclaration) {
       followingValues = [':', '=', ',', '(', ')', '[', ']', '{', '}'];
-    } else if (context == IdentifierContext.importPrefixDeclaration) {
-      followingValues = [';', 'hide', 'show', 'deferred', 'as'];
     } else if (context == IdentifierContext.labelDeclaration) {
       followingValues = [':'];
     } else if (context == IdentifierContext.literalSymbol ||
@@ -2084,8 +2082,6 @@
         ..addAll(classMemberKeywords())
         ..addAll(statementKeywords())
         ..add('covariant');
-    } else if (context == IdentifierContext.importPrefixDeclaration) {
-      initialKeywords = topLevelKeywords();
     } else if (context == IdentifierContext.labelDeclaration) {
       initialKeywords = statementKeywords();
     } else if (context == IdentifierContext.localAccessorDeclaration) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 149991e..6def2ba 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -652,18 +652,7 @@
   }
 
   void addImportsToScope() {
-    bool explicitCoreImport = this == loader.coreLibrary;
-    for (Import import in imports) {
-      if (import.imported == loader.coreLibrary) {
-        explicitCoreImport = true;
-      }
-      import.finalizeImports(this);
-    }
-    if (!explicitCoreImport) {
-      loader.coreLibrary.exportScope.forEach((String name, Builder member) {
-        addToScope(name, member, -1, true);
-      });
-    }
+    super.addSpecificImportsToScope(imports);
   }
 
   @override
@@ -687,6 +676,9 @@
     int typeCount = types.length;
     for (UnresolvedType<T> t in types) {
       t.resolveIn(scope);
+      if (loader.target.strongMode) {
+        t.checkType();
+      }
     }
     types.clear();
     return typeCount;
diff --git a/pkg/front_end/lib/src/fasta/target_implementation.dart b/pkg/front_end/lib/src/fasta/target_implementation.dart
index 5abbd00..2c21ecf 100644
--- a/pkg/front_end/lib/src/fasta/target_implementation.dart
+++ b/pkg/front_end/lib/src/fasta/target_implementation.dart
@@ -18,6 +18,8 @@
 
 import 'uri_translator.dart' show UriTranslator;
 
+import 'kernel/metadata_collector.dart' show MetadataCollector;
+
 /// Provides the implementation details used by a loader for a target.
 abstract class TargetImplementation extends Target {
   final UriTranslator uriTranslator;
@@ -33,7 +35,13 @@
   Builder cachedNativeAnnotation;
   Builder cachedNativeExtensionAnnotation;
 
-  TargetImplementation(Ticker ticker, this.uriTranslator, this.backendTarget)
+  /// The [MetadataCollector] to write metadata to.
+  ///
+  /// Maybe be [null] for targets where metadata cannot be written.
+  final MetadataCollector metadataCollector;
+
+  TargetImplementation(Ticker ticker, this.uriTranslator, this.backendTarget,
+      [this.metadataCollector = null])
       : super(ticker);
 
   /// Creates a [LibraryBuilder] corresponding to [uri], if one doesn't exist
diff --git a/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart b/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
index 6fbd643..d041aac 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
@@ -230,15 +230,6 @@
     bool needsCheck(DartType type) => needsCheckVisitor == null
         ? false
         : substitution.substituteType(type).accept(needsCheckVisitor);
-    needsCheckVisitor?.inCovariantContext = false;
-    var isGenericContravariant = needsCheck(interfaceFunction.returnType);
-    needsCheckVisitor?.inCovariantContext = true;
-    if (isGenericContravariant != interfaceMember.isGenericContravariant) {
-      fixes.add((FunctionNode function) {
-        Procedure procedure = function.parent;
-        procedure.isGenericContravariant = isGenericContravariant;
-      });
-    }
     for (int i = 0; i < interfacePositionalParameters.length; i++) {
       var parameter = interfacePositionalParameters[i];
       var isGenericCovariantInterface = needsCheck(parameter.type);
@@ -491,8 +482,7 @@
         fileUri: enclosingClass.fileUri,
         forwardingStubInterfaceTarget: finalTarget)
       ..fileOffset = enclosingClass.fileOffset
-      ..parent = enclosingClass
-      ..isGenericContravariant = target.isGenericContravariant;
+      ..parent = enclosingClass;
   }
 
   /// Creates a forwarding stub for this node if necessary, and propagates
@@ -1103,13 +1093,6 @@
       }
     }
 
-    void recordContravariance(int fileOffset, bool isGenericContravariant) {
-      if (isGenericContravariant) {
-        _instrumentation.record(uri, fileOffset, 'genericContravariant',
-            new InstrumentationValueLiteral('true'));
-      }
-    }
-
     for (var procedure in class_.procedures) {
       if (procedure.isStatic) continue;
       // Forwarding stubs are annotated separately
@@ -1132,14 +1115,11 @@
       procedure.function.positionalParameters.forEach(recordFormalAnnotations);
       procedure.function.namedParameters.forEach(recordFormalAnnotations);
       procedure.function.typeParameters.forEach(recordTypeParameterAnnotations);
-      recordContravariance(
-          procedure.fileOffset, procedure.isGenericContravariant);
     }
     for (var field in class_.fields) {
       if (field.isStatic) continue;
       recordCovariance(field.fileOffset, field.isCovariant,
           field.isGenericCovariantInterface, field.isGenericCovariantImpl);
-      recordContravariance(field.fileOffset, field.isGenericContravariant);
     }
   }
 
@@ -1250,16 +1230,6 @@
   @override
   DartType get getterType => _field.type;
 
-  @override
-  bool get isGenericContravariant =>
-      kind == ProcedureKind.Getter && _field.isGenericContravariant;
-
-  @override
-  void set isGenericContravariant(bool value) {
-    assert(kind == ProcedureKind.Getter);
-    _field.isGenericContravariant = value;
-  }
-
   static getField(SyntheticAccessor accessor) => accessor._field;
 }
 
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 23a9329..4971952 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -89,7 +89,8 @@
 
 import 'type_constraint_gatherer.dart' show TypeConstraintGatherer;
 
-import 'type_inference_engine.dart' show TypeInferenceEngineImpl;
+import 'type_inference_engine.dart'
+    show IncludesTypeParametersCovariantly, TypeInferenceEngineImpl;
 
 import 'type_promotion.dart' show TypePromoter, TypePromoterDisabled;
 
@@ -867,9 +868,12 @@
         interfaceMember != null &&
         receiver is! ThisExpression) {
       if (interfaceMember is Procedure) {
-        checkReturn = interfaceMember.isGenericContravariant;
+        checkReturn = typeParametersOccurNegatively(
+            interfaceMember.enclosingClass,
+            interfaceMember.function.returnType);
       } else if (interfaceMember is Field) {
-        checkReturn = interfaceMember.isGenericContravariant;
+        checkReturn = typeParametersOccurNegatively(
+            interfaceMember.enclosingClass, interfaceMember.type);
       }
     }
     var replacedExpression = desugaredGet ?? expression;
@@ -1397,6 +1401,19 @@
     return tearoffType;
   }
 
+  /// True if [type] has negative occurrences of any of [class_]'s type
+  /// parameters.
+  ///
+  /// A negative occurrence of a type parameter is one that is to the left of
+  /// an odd number of arrows.  For example, T occurs negatively in T -> T0,
+  /// T0 -> (T -> T1), (T0 -> T) -> T1 but not in (T -> T0) -> T1.
+  static bool typeParametersOccurNegatively(Class class_, DartType type) {
+    if (class_.typeParameters.isEmpty) return false;
+    var checker = new IncludesTypeParametersCovariantly(class_.typeParameters)
+      ..inCovariantContext = false;
+    return type.accept(checker);
+  }
+
   /// Determines the dispatch category of a [MethodInvocation] and returns a
   /// boolean indicating whether an "as" check will need to be added due to
   /// contravariance.
@@ -1416,16 +1433,19 @@
       }
       if (receiver != null && receiver is! ThisExpression) {
         if ((interfaceMember is Field &&
-                interfaceMember.isGenericContravariant) ||
+                typeParametersOccurNegatively(
+                    interfaceMember.enclosingClass, interfaceMember.type)) ||
             (interfaceMember is Procedure &&
-                interfaceMember.isGenericContravariant)) {
+                typeParametersOccurNegatively(interfaceMember.enclosingClass,
+                    interfaceMember.function.returnType))) {
           return MethodContravarianceCheckKind.checkGetterReturn;
         }
       }
     } else if (receiver != null &&
         receiver is! ThisExpression &&
         interfaceMember is Procedure &&
-        interfaceMember.isGenericContravariant) {
+        typeParametersOccurNegatively(interfaceMember.enclosingClass,
+            interfaceMember.function.returnType)) {
       return MethodContravarianceCheckKind.checkMethodReturn;
     }
     return MethodContravarianceCheckKind.none;
diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml
index e4a0be5..1f9aa73 100644
--- a/pkg/front_end/pubspec.yaml
+++ b/pkg/front_end/pubspec.yaml
@@ -1,5 +1,5 @@
 name: front_end
-version: 0.1.0-alpha.11
+version: 0.1.0-alpha.12
 author: Dart Team <misc@dartlang.org>
 description: Front end for compilation of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/front_end
@@ -9,7 +9,7 @@
   charcode: '^1.1.1'
   convert: '^2.0.1'
   crypto: '^2.0.2'
-  kernel: 0.3.0-alpha.11
+  kernel: 0.3.0-alpha.12
   meta: '^1.1.1'
   package_config: '^1.0.1'
   path: '^1.3.9'
diff --git a/pkg/front_end/test/fasta/expression_test.dart b/pkg/front_end/test/fasta/expression_test.dart
new file mode 100644
index 0000000..c0611b0
--- /dev/null
+++ b/pkg/front_end/test/fasta/expression_test.dart
@@ -0,0 +1,380 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+library fasta.test.incremental_test;
+
+import "dart:async" show Future;
+
+import "dart:convert" show JsonEncoder;
+
+import "dart:io" show File, IOSink;
+
+import "package:kernel/ast.dart"
+    show
+        Procedure,
+        Component,
+        CanonicalName,
+        DynamicType,
+        DartType,
+        TypeParameter;
+
+import "package:testing/testing.dart"
+    show Chain, ChainContext, Result, Step, TestDescription, runMe;
+
+import "package:yaml/yaml.dart" show YamlMap, YamlList, loadYamlNode;
+
+import "package:front_end/src/api_prototype/front_end.dart"
+    show CompilationMessage, CompilerOptions;
+
+import "package:front_end/src/api_prototype/memory_file_system.dart"
+    show MemoryFileSystem;
+
+import 'package:front_end/src/compute_platform_binaries_location.dart'
+    show computePlatformBinariesLocation;
+
+import 'package:front_end/src/external_state_snapshot.dart'
+    show ExternalStateSnapshot;
+
+import 'package:front_end/src/base/processed_options.dart'
+    show ProcessedOptions;
+
+import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
+
+import 'package:front_end/src/fasta/incremental_compiler.dart'
+    show IncrementalCompiler;
+
+import 'package:kernel/text/ast_to_text.dart' show Printer;
+
+import '../../lib/src/fasta/testing/kernel_chain.dart' show runDiff, openWrite;
+
+import '../../lib/src/fasta/kernel/utils.dart' show writeComponentToFile;
+
+const JsonEncoder json = const JsonEncoder.withIndent("  ");
+
+class Context extends ChainContext {
+  final CompilerContext compilerContext;
+  final ExternalStateSnapshot snapshot;
+  final List<CompilationMessage> errors;
+
+  final List<Step> steps;
+
+  Context(
+      this.compilerContext, this.snapshot, this.errors, bool updateExpectations)
+      : steps = <Step>[
+          const ReadTest(),
+          const CompileExpression(),
+          new MatchProcedureExpectations(".expect",
+              updateExpectations: updateExpectations)
+        ];
+
+  ProcessedOptions get options => compilerContext.options;
+
+  MemoryFileSystem get fileSystem => options.fileSystem;
+
+  T runInContext<T>(T action(CompilerContext c)) {
+    return compilerContext.runInContext<T>(action);
+  }
+
+  void reset() {
+    errors.clear();
+    snapshot.restore();
+  }
+
+  List<CompilationMessage> takeErrors() {
+    List<CompilationMessage> result = new List<CompilationMessage>.from(errors);
+    errors.clear();
+    return result;
+  }
+}
+
+class CompilationResult {
+  Procedure compiledProcedure;
+  List<CompilationMessage> errors;
+  CompilationResult(this.compiledProcedure, this.errors);
+
+  String printResult(Uri entryPoint, Context context) {
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("Errors: {\n");
+    for (var error in errors) {
+      buffer.write("  ");
+      buffer.write("${error.message} (@${error.span.start.offset})");
+      buffer.write("\n");
+    }
+    buffer.write("}\n");
+    if (compiledProcedure == null) {
+      buffer.write("<no procedure>");
+    } else {
+      new Printer(buffer).visitProcedure(compiledProcedure);
+    }
+    Uri base = entryPoint.resolve(".");
+    return "$buffer".replaceAll("$base", "org-dartlang-testcase:///");
+  }
+}
+
+class TestCase {
+  final TestDescription description;
+
+  final Uri entryPoint;
+
+  final List<String> definitions;
+
+  final List<String> typeDefinitions;
+
+  final bool isStaticMethod;
+
+  final CanonicalName enclosingNode;
+
+  String expression;
+
+  List<CompilationResult> results = [];
+
+  TestCase(
+      this.description,
+      this.entryPoint,
+      this.definitions,
+      this.typeDefinitions,
+      this.isStaticMethod,
+      this.enclosingNode,
+      this.expression);
+
+  String toString() {
+    return "TestCase("
+        "$entryPoint, "
+        "$definitions, "
+        "$typeDefinitions,"
+        "$enclosingNode, "
+        "static = $isStaticMethod)";
+  }
+
+  String validate() {
+    print(this);
+    if (entryPoint == null) {
+      return "No entryPoint.";
+    }
+    if (!(new File.fromUri(entryPoint)).existsSync()) {
+      return "Entry point $entryPoint doesn't exist.";
+    }
+    if (enclosingNode == null || enclosingNode == "") {
+      return "No enclosing node.";
+    }
+    if (expression == null) {
+      return "No expression to compile.";
+    }
+    return null;
+  }
+}
+
+class MatchProcedureExpectations extends Step<List<TestCase>, Null, Context> {
+  final String suffix;
+  final bool updateExpectations;
+
+  const MatchProcedureExpectations(this.suffix,
+      {this.updateExpectations: false});
+
+  String get name => "match expectations";
+
+  Future<Result<Null>> run(List<TestCase> tests, Context context) async {
+    String actual = "";
+    for (var test in tests) {
+      var primary = test.results.first.printResult(test.entryPoint, context);
+      actual += primary;
+      for (int i = 1; i < test.results.length; ++i) {
+        var secondary = test.results[i].printResult(test.entryPoint, context);
+        if (primary != secondary) {
+          return fail(
+              null,
+              "Multiple expectations don't match on $test:" +
+                  "\nFirst expectation:\n$actual\n" +
+                  "\nSecond expectation:\n$secondary\n");
+        }
+      }
+    }
+    var test = tests.first;
+    Uri testUri = test.description.uri;
+    File expectedFile = new File("${testUri.toFilePath()}$suffix");
+    if (await expectedFile.exists()) {
+      String expected = await expectedFile.readAsString();
+      if (expected.trim() != actual.trim()) {
+        if (!updateExpectations) {
+          String diff = await runDiff(expectedFile.uri, actual);
+          return fail(
+              null, "$testUri doesn't match ${expectedFile.uri}\n$diff");
+        }
+      } else {
+        return pass(null);
+      }
+    }
+    if (updateExpectations) {
+      await openWrite(expectedFile.uri, (IOSink sink) {
+        sink.writeln(actual.trim());
+      });
+      return pass(null);
+    } else {
+      return fail(null, """
+Please create file ${expectedFile.path} with this content:
+$actual""");
+    }
+  }
+}
+
+class ReadTest extends Step<TestDescription, List<TestCase>, Context> {
+  const ReadTest();
+
+  String get name => "read test";
+
+  Future<Result<List<TestCase>>> run(
+      TestDescription description, Context context) async {
+    context.reset();
+    Uri uri = description.uri;
+    String contents = await new File.fromUri(uri).readAsString();
+
+    Uri entryPoint;
+    List<String> definitions = <String>[];
+    List<String> typeDefinitions = <String>[];
+    bool isStaticMethod = false;
+    CanonicalName enclosingNode;
+    String expression;
+
+    dynamic maps = loadYamlNode(contents, sourceUrl: uri);
+    if (maps is YamlMap) maps = [maps];
+
+    final List<TestCase> tests = [];
+    for (YamlMap map in maps) {
+      for (var _key in map.keys) {
+        String key = _key;
+        var value = map[key];
+
+        if (key == "entry_point") {
+          entryPoint = description.uri.resolveUri(Uri.parse(value as String));
+        } else if (key == "position") {
+          Uri positionUri =
+              description.uri.resolveUri(Uri.parse(value as String));
+          enclosingNode = new CanonicalName.root();
+          enclosingNode =
+              enclosingNode.getChild("${positionUri.removeFragment()}");
+          if (positionUri.fragment != null && positionUri.fragment != '') {
+            enclosingNode = enclosingNode.getChild(positionUri.fragment);
+          }
+        } else if (key == "definitions") {
+          definitions = (value as YamlList).map((x) => x as String).toList();
+        } else if (key == "type_definitions") {
+          typeDefinitions =
+              (value as YamlList).map((x) => x as String).toList();
+        } else if (key == "static") {
+          isStaticMethod = value;
+        } else if (key == "expression") {
+          expression = value;
+        }
+      }
+      var test = new TestCase(description, entryPoint, definitions,
+          typeDefinitions, isStaticMethod, enclosingNode, expression);
+      var result = test.validate();
+      if (result != null) {
+        return new Result.fail(tests, result);
+      }
+      tests.add(test);
+    }
+    return new Result.pass(tests);
+  }
+}
+
+class CompileExpression extends Step<List<TestCase>, List<TestCase>, Context> {
+  const CompileExpression();
+
+  String get name => "compile expression";
+
+  Future<Result<List<TestCase>>> run(
+      List<TestCase> tests, Context context) async {
+    for (var test in tests) {
+      context.fileSystem.entityForUri(test.entryPoint).writeAsBytesSync(
+          await new File.fromUri(test.entryPoint).readAsBytes());
+
+      var sourceCompiler = new IncrementalCompiler(context.compilerContext);
+      Component component =
+          await sourceCompiler.computeDelta(entryPoint: test.entryPoint);
+      var errors = context.takeErrors();
+      if (!errors.isEmpty) {
+        return fail(tests, "Couldn't compile entry-point: $errors");
+      }
+      Uri dillFileUri = new Uri(
+          scheme: test.entryPoint.scheme, path: test.entryPoint.path + ".dill");
+      File dillFile = new File.fromUri(dillFileUri);
+      if (!await dillFile.exists()) {
+        await writeComponentToFile(component, dillFileUri);
+      }
+
+      var dillCompiler =
+          new IncrementalCompiler(context.compilerContext, dillFileUri);
+      await dillCompiler.computeDelta(entryPoint: test.entryPoint);
+      await dillFile.delete();
+
+      errors = context.takeErrors();
+
+      // Since it compiled successfully from source, the bootstrap-from-Dill
+      // should also succeed without errors.
+      assert(errors.isEmpty);
+
+      Map<String, DartType> definitions = {};
+      for (String name in test.definitions) {
+        definitions[name] = new DynamicType();
+      }
+      List<TypeParameter> typeParams = [];
+      for (String name in test.typeDefinitions) {
+        typeParams.add(new TypeParameter(name, new DynamicType()));
+      }
+
+      for (var compiler in [sourceCompiler, dillCompiler]) {
+        // TODO: actually run the compiler
+        test.results
+            .add(new CompilationResult(compiler == null ? null : null, []));
+      }
+    }
+    return new Result.pass(tests);
+  }
+}
+
+Future<Context> createContext(
+    Chain suite, Map<String, String> environment) async {
+  final Uri base = Uri.parse("org-dartlang-test:///");
+
+  /// Unused because we supply entry points to [computeDelta] directly above.
+  final Uri entryPoint = base.resolve("nothing.dart");
+
+  /// The custom URI used to locate the dill file in the MemoryFileSystem.
+  final Uri sdkSummary = base.resolve("vm_platform.dill");
+
+  /// The actual location of the dill file.
+  final Uri sdkSummaryFile =
+      computePlatformBinariesLocation().resolve("vm_platform.dill");
+
+  final MemoryFileSystem fs = new MemoryFileSystem(base);
+
+  fs
+      .entityForUri(sdkSummary)
+      .writeAsBytesSync(await new File.fromUri(sdkSummaryFile).readAsBytes());
+
+  final List<CompilationMessage> errors = <CompilationMessage>[];
+
+  final CompilerOptions optionBuilder = new CompilerOptions()
+    ..strongMode = false
+    ..reportMessages = true
+    ..verbose = true
+    ..fileSystem = fs
+    ..sdkSummary = sdkSummary
+    ..onError = (CompilationMessage message) {
+      errors.add(message);
+    };
+
+  final ProcessedOptions options =
+      new ProcessedOptions(optionBuilder, false, [entryPoint]);
+
+  final ExternalStateSnapshot snapshot =
+      new ExternalStateSnapshot(await options.loadSdkSummary(null));
+
+  return new Context(new CompilerContext(options), snapshot, errors,
+      new String.fromEnvironment("updateExpectations") == "true");
+}
+
+main([List<String> arguments = const []]) =>
+    runMe(arguments, createContext, "../../testing.json");
diff --git a/pkg/front_end/testcases/expression.status b/pkg/front_end/testcases/expression.status
index de541b8..87a97a3 100644
--- a/pkg/front_end/testcases/expression.status
+++ b/pkg/front_end/testcases/expression.status
@@ -2,51 +2,46 @@
 // for 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_capture.expression: Crash
-class_getter.expression: Crash
-class_invalid_static.expression: Crash
-class_invalid_static_capture.expression: Crash
-class_invalid_static_getter.expression: Crash
-class_invalid_static_setter.expression: Crash
-class_method.expression: Crash
-class_setter.expression: Crash
-class_static.expression: Crash
-class_static2.expression: Crash
-class_static3.expression: Crash
-class_type_param_bound.expression: Crash
-class_type_param_bound_illegal.expression: Crash
-class_type_param_reference.expression: Crash
-class_type_param_reference_arg.expression: Crash
-class_type_param_reference_arg_inferred.expression: Crash
-class_type_param_reference_ctor.expression: Crash
-class_type_param_reference_ctor_inferred.expression: Crash
-class_type_param_reference_var.expression: Crash
-core_lib_imported.expression: Crash
-core_lib_internal.expression: Crash
-eval.dart: Crash
-invalid.expression: Crash
-invalid_type_variable.expression: Crash
-invalid_variable.expression: Crash
-lib_ctor.expression: Crash
-lib_external_ctor.expression: Crash
-lib_nonctor.expression: Crash
-lib_nonreference.expression: Crash
-lib_nonshown_ctor.expression: Crash
-lib_reference.expression: Crash
-lib_simple.expression: Crash
-missing_variable_types.expression: Crash
-noclass.expression: Crash
-nolib.expression: Crash
-param_assign.expression: Crash
-param_capture.expression: Crash
-param_conflict.expression: Crash
-param_conflict_class.expression: Crash
-param_method.expression: Crash
-type_param_bound.expression: Crash
-type_param_shadow.expression: Crash
-type_param_shadow_arg.expression: Crash
-type_param_shadow_arg_ctor_inferred.expression: Crash
-type_param_shadow_arg_inferred.expression: Crash
-type_param_shadow_ctor.expression: Crash
-type_param_shadow_var.expression: Crash
-
+class_capture.expression: Fail
+class_getter.expression: Fail
+class_invalid_static.expression: Fail
+class_invalid_static_capture.expression: Fail
+class_invalid_static_getter.expression: Fail
+class_invalid_static_setter.expression: Fail
+class_method.expression: Fail
+class_setter.expression: Fail
+class_static.expression: Fail
+class_static2.expression: Fail
+class_static3.expression: Fail
+class_type_param_bound.expression: Fail
+class_type_param_bound_illegal.expression: Fail
+class_type_param_reference.expression: Fail
+class_type_param_reference_arg.expression: Fail
+class_type_param_reference_arg_inferred.expression: Fail
+class_type_param_reference_ctor.expression: Fail
+class_type_param_reference_ctor_inferred.expression: Fail
+class_type_param_reference_var.expression: Fail
+core_lib_imported.expression: Fail
+core_lib_internal.expression: Fail
+eval.dart: Fail
+invalid.expression: Fail
+lib_ctor.expression: Fail
+lib_external_ctor.expression: Fail
+lib_nonctor.expression: Fail
+lib_nonreference.expression: Fail
+lib_nonshown_ctor.expression: Fail
+lib_reference.expression: Fail
+lib_simple.expression: Fail
+missing_variable_types.expression: Fail
+param_assign.expression: Fail
+param_capture.expression: Fail
+param_conflict.expression: Fail
+param_conflict_class.expression: Fail
+param_method.expression: Fail
+type_param_bound.expression: Fail
+type_param_shadow.expression: Fail
+type_param_shadow_arg.expression: Fail
+type_param_shadow_arg_ctor_inferred.expression: Fail
+type_param_shadow_arg_inferred.expression: Fail
+type_param_shadow_ctor.expression: Fail
+type_param_shadow_var.expression: Fail
diff --git a/pkg/front_end/testcases/expression/class_capture.expression.yaml b/pkg/front_end/testcases/expression/class_capture.expression.yaml
index 8d7121f..fdce2d6 100644
--- a/pkg/front_end/testcases/expression/class_capture.expression.yaml
+++ b/pkg/front_end/testcases/expression/class_capture.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/class_getter.expression.yaml b/pkg/front_end/testcases/expression/class_getter.expression.yaml
index b633a11..f6e64e6 100644
--- a/pkg/front_end/testcases/expression/class_getter.expression.yaml
+++ b/pkg/front_end/testcases/expression/class_getter.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/class_invalid_static.expression.yaml b/pkg/front_end/testcases/expression/class_invalid_static.expression.yaml
index d607088..59c21b9 100644
--- a/pkg/front_end/testcases/expression/class_invalid_static.expression.yaml
+++ b/pkg/front_end/testcases/expression/class_invalid_static.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/class_invalid_static_capture.expression.yaml b/pkg/front_end/testcases/expression/class_invalid_static_capture.expression.yaml
index 9e410c8..0c6f18a 100644
--- a/pkg/front_end/testcases/expression/class_invalid_static_capture.expression.yaml
+++ b/pkg/front_end/testcases/expression/class_invalid_static_capture.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/class_invalid_static_getter.expression.yaml b/pkg/front_end/testcases/expression/class_invalid_static_getter.expression.yaml
index e9fa6d2..2fd524f 100644
--- a/pkg/front_end/testcases/expression/class_invalid_static_getter.expression.yaml
+++ b/pkg/front_end/testcases/expression/class_invalid_static_getter.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/class_invalid_static_setter.expression.yaml b/pkg/front_end/testcases/expression/class_invalid_static_setter.expression.yaml
index 17539fb..289cf59 100644
--- a/pkg/front_end/testcases/expression/class_invalid_static_setter.expression.yaml
+++ b/pkg/front_end/testcases/expression/class_invalid_static_setter.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/class_method.expression.yaml b/pkg/front_end/testcases/expression/class_method.expression.yaml
index 5a08e80..13b9772 100644
--- a/pkg/front_end/testcases/expression/class_method.expression.yaml
+++ b/pkg/front_end/testcases/expression/class_method.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/class_setter.expression.yaml b/pkg/front_end/testcases/expression/class_setter.expression.yaml
index 44d76b6..f559566 100644
--- a/pkg/front_end/testcases/expression/class_setter.expression.yaml
+++ b/pkg/front_end/testcases/expression/class_setter.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/class_static.expression.yaml b/pkg/front_end/testcases/expression/class_static.expression.yaml
index 51be2c2..309ff3f 100644
--- a/pkg/front_end/testcases/expression/class_static.expression.yaml
+++ b/pkg/front_end/testcases/expression/class_static.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/class_static2.expression.yaml b/pkg/front_end/testcases/expression/class_static2.expression.yaml
index 2c8e2b0..69e19b9 100644
--- a/pkg/front_end/testcases/expression/class_static2.expression.yaml
+++ b/pkg/front_end/testcases/expression/class_static2.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/class_static3.expression.yaml b/pkg/front_end/testcases/expression/class_static3.expression.yaml
index 935b013..e1e7796 100644
--- a/pkg/front_end/testcases/expression/class_static3.expression.yaml
+++ b/pkg/front_end/testcases/expression/class_static3.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 - entry_point: "eval.dart"
   definitions: []
diff --git a/pkg/front_end/testcases/expression/class_type_param_bound.expression.yaml b/pkg/front_end/testcases/expression/class_type_param_bound.expression.yaml
index be7df51..b415f4a 100644
--- a/pkg/front_end/testcases/expression/class_type_param_bound.expression.yaml
+++ b/pkg/front_end/testcases/expression/class_type_param_bound.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: ["x"]
diff --git a/pkg/front_end/testcases/expression/class_type_param_bound_illegal.expression.yaml b/pkg/front_end/testcases/expression/class_type_param_bound_illegal.expression.yaml
index d2b970d..2ff676d 100644
--- a/pkg/front_end/testcases/expression/class_type_param_bound_illegal.expression.yaml
+++ b/pkg/front_end/testcases/expression/class_type_param_bound_illegal.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: ["x"]
diff --git a/pkg/front_end/testcases/expression/class_type_param_reference.expression.yaml b/pkg/front_end/testcases/expression/class_type_param_reference.expression.yaml
index d5afdd7..18371de 100644
--- a/pkg/front_end/testcases/expression/class_type_param_reference.expression.yaml
+++ b/pkg/front_end/testcases/expression/class_type_param_reference.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: ["x"]
diff --git a/pkg/front_end/testcases/expression/class_type_param_reference_arg.expression.yaml b/pkg/front_end/testcases/expression/class_type_param_reference_arg.expression.yaml
index fa1365b..13ab5ef 100644
--- a/pkg/front_end/testcases/expression/class_type_param_reference_arg.expression.yaml
+++ b/pkg/front_end/testcases/expression/class_type_param_reference_arg.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: ["x"]
diff --git a/pkg/front_end/testcases/expression/class_type_param_reference_arg_inferred.expression.yaml b/pkg/front_end/testcases/expression/class_type_param_reference_arg_inferred.expression.yaml
index 900cff7..d42666f 100644
--- a/pkg/front_end/testcases/expression/class_type_param_reference_arg_inferred.expression.yaml
+++ b/pkg/front_end/testcases/expression/class_type_param_reference_arg_inferred.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: ["x"]
diff --git a/pkg/front_end/testcases/expression/class_type_param_reference_ctor.expression.yaml b/pkg/front_end/testcases/expression/class_type_param_reference_ctor.expression.yaml
index 7312962..a1526e4 100644
--- a/pkg/front_end/testcases/expression/class_type_param_reference_ctor.expression.yaml
+++ b/pkg/front_end/testcases/expression/class_type_param_reference_ctor.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: ["x"]
diff --git a/pkg/front_end/testcases/expression/class_type_param_reference_ctor_inferred.expression.yaml b/pkg/front_end/testcases/expression/class_type_param_reference_ctor_inferred.expression.yaml
index 5ae73cf..39ff366 100644
--- a/pkg/front_end/testcases/expression/class_type_param_reference_ctor_inferred.expression.yaml
+++ b/pkg/front_end/testcases/expression/class_type_param_reference_ctor_inferred.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: ["x"]
diff --git a/pkg/front_end/testcases/expression/class_type_param_reference_var.expression.yaml b/pkg/front_end/testcases/expression/class_type_param_reference_var.expression.yaml
index 1426f35..642f7ef 100644
--- a/pkg/front_end/testcases/expression/class_type_param_reference_var.expression.yaml
+++ b/pkg/front_end/testcases/expression/class_type_param_reference_var.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/core_lib_imported.expression.yaml b/pkg/front_end/testcases/expression/core_lib_imported.expression.yaml
index 328df34..61f679b 100644
--- a/pkg/front_end/testcases/expression/core_lib_imported.expression.yaml
+++ b/pkg/front_end/testcases/expression/core_lib_imported.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 - entry_point: "main.dart"
   definitions: []
diff --git a/pkg/front_end/testcases/expression/core_lib_internal.expression.yaml b/pkg/front_end/testcases/expression/core_lib_internal.expression.yaml
index f3a1533..6a2652b 100644
--- a/pkg/front_end/testcases/expression/core_lib_internal.expression.yaml
+++ b/pkg/front_end/testcases/expression/core_lib_internal.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 - entry_point: "main.dart"
   definitions: []
diff --git a/pkg/front_end/testcases/expression/invalid.expression.yaml b/pkg/front_end/testcases/expression/invalid.expression.yaml
index 410e7a9..374eda8 100644
--- a/pkg/front_end/testcases/expression/invalid.expression.yaml
+++ b/pkg/front_end/testcases/expression/invalid.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/invalid_type_variable.expression.yaml b/pkg/front_end/testcases/expression/invalid_type_variable.expression.yaml
index 79ff7ae..70beb29 100644
--- a/pkg/front_end/testcases/expression/invalid_type_variable.expression.yaml
+++ b/pkg/front_end/testcases/expression/invalid_type_variable.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 type_definitions: ["a#b"]
diff --git a/pkg/front_end/testcases/expression/invalid_variable.expression.yaml b/pkg/front_end/testcases/expression/invalid_variable.expression.yaml
index 3409817..6d44881 100644
--- a/pkg/front_end/testcases/expression/invalid_variable.expression.yaml
+++ b/pkg/front_end/testcases/expression/invalid_variable.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: ["a#b"]
diff --git a/pkg/front_end/testcases/expression/lib_ctor.expression.yaml b/pkg/front_end/testcases/expression/lib_ctor.expression.yaml
index 9bfc310..c1d5cee 100644
--- a/pkg/front_end/testcases/expression/lib_ctor.expression.yaml
+++ b/pkg/front_end/testcases/expression/lib_ctor.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/lib_external_ctor.expression.yaml b/pkg/front_end/testcases/expression/lib_external_ctor.expression.yaml
index aac6c87..51e04a2 100644
--- a/pkg/front_end/testcases/expression/lib_external_ctor.expression.yaml
+++ b/pkg/front_end/testcases/expression/lib_external_ctor.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/lib_nonctor.expression.yaml b/pkg/front_end/testcases/expression/lib_nonctor.expression.yaml
index 4cf924a..bae7baa 100644
--- a/pkg/front_end/testcases/expression/lib_nonctor.expression.yaml
+++ b/pkg/front_end/testcases/expression/lib_nonctor.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/lib_nonreference.expression.yaml b/pkg/front_end/testcases/expression/lib_nonreference.expression.yaml
index 67849fd..a50ac5c 100644
--- a/pkg/front_end/testcases/expression/lib_nonreference.expression.yaml
+++ b/pkg/front_end/testcases/expression/lib_nonreference.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/lib_nonshown_ctor.expression.yaml b/pkg/front_end/testcases/expression/lib_nonshown_ctor.expression.yaml
index dbc9544..db9b51c 100644
--- a/pkg/front_end/testcases/expression/lib_nonshown_ctor.expression.yaml
+++ b/pkg/front_end/testcases/expression/lib_nonshown_ctor.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/lib_reference.expression.yaml b/pkg/front_end/testcases/expression/lib_reference.expression.yaml
index e4f0254..59999cc 100644
--- a/pkg/front_end/testcases/expression/lib_reference.expression.yaml
+++ b/pkg/front_end/testcases/expression/lib_reference.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/lib_simple.expression.yaml b/pkg/front_end/testcases/expression/lib_simple.expression.yaml
index 0e7ca4c..052b9b4 100644
--- a/pkg/front_end/testcases/expression/lib_simple.expression.yaml
+++ b/pkg/front_end/testcases/expression/lib_simple.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/missing_variable_types.expression.yaml b/pkg/front_end/testcases/expression/missing_variable_types.expression.yaml
index 9411454..2c83b92 100644
--- a/pkg/front_end/testcases/expression/missing_variable_types.expression.yaml
+++ b/pkg/front_end/testcases/expression/missing_variable_types.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: ["s"]
diff --git a/pkg/front_end/testcases/expression/noclass.expression.yaml b/pkg/front_end/testcases/expression/noclass.expression.yaml
index ef09ec8..bc5edf0 100644
--- a/pkg/front_end/testcases/expression/noclass.expression.yaml
+++ b/pkg/front_end/testcases/expression/noclass.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/nolib.expression.yaml b/pkg/front_end/testcases/expression/nolib.expression.yaml
index 1502f41..9ec59b7 100644
--- a/pkg/front_end/testcases/expression/nolib.expression.yaml
+++ b/pkg/front_end/testcases/expression/nolib.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/param_assign.expression.yaml b/pkg/front_end/testcases/expression/param_assign.expression.yaml
index a0262f1..137e2a4 100644
--- a/pkg/front_end/testcases/expression/param_assign.expression.yaml
+++ b/pkg/front_end/testcases/expression/param_assign.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: ["x", "y"]
diff --git a/pkg/front_end/testcases/expression/param_capture.expression.yaml b/pkg/front_end/testcases/expression/param_capture.expression.yaml
index 72b991d..ac45276 100644
--- a/pkg/front_end/testcases/expression/param_capture.expression.yaml
+++ b/pkg/front_end/testcases/expression/param_capture.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: ["x", "y"]
diff --git a/pkg/front_end/testcases/expression/param_conflict.expression.yaml b/pkg/front_end/testcases/expression/param_conflict.expression.yaml
index 8304043..b63adf0 100644
--- a/pkg/front_end/testcases/expression/param_conflict.expression.yaml
+++ b/pkg/front_end/testcases/expression/param_conflict.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: ["dostat", "y"]
diff --git a/pkg/front_end/testcases/expression/param_conflict_class.expression.yaml b/pkg/front_end/testcases/expression/param_conflict_class.expression.yaml
index 48969a2..2bf8db6 100644
--- a/pkg/front_end/testcases/expression/param_conflict_class.expression.yaml
+++ b/pkg/front_end/testcases/expression/param_conflict_class.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: ["A", "y"]
diff --git a/pkg/front_end/testcases/expression/param_method.expression.yaml b/pkg/front_end/testcases/expression/param_method.expression.yaml
index da82702..dbb3b59 100644
--- a/pkg/front_end/testcases/expression/param_method.expression.yaml
+++ b/pkg/front_end/testcases/expression/param_method.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: ["x", "y"]
diff --git a/pkg/front_end/testcases/expression/type_param_bound.expression.yaml b/pkg/front_end/testcases/expression/type_param_bound.expression.yaml
index 9c3a1ce..e2d74e1 100644
--- a/pkg/front_end/testcases/expression/type_param_bound.expression.yaml
+++ b/pkg/front_end/testcases/expression/type_param_bound.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/type_param_shadow.expression.yaml b/pkg/front_end/testcases/expression/type_param_shadow.expression.yaml
index 4a291a5..1cc3d38 100644
--- a/pkg/front_end/testcases/expression/type_param_shadow.expression.yaml
+++ b/pkg/front_end/testcases/expression/type_param_shadow.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: ["x"]
diff --git a/pkg/front_end/testcases/expression/type_param_shadow_arg.expression.yaml b/pkg/front_end/testcases/expression/type_param_shadow_arg.expression.yaml
index 412fea8..f18d8d3 100644
--- a/pkg/front_end/testcases/expression/type_param_shadow_arg.expression.yaml
+++ b/pkg/front_end/testcases/expression/type_param_shadow_arg.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: ["x"]
diff --git a/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml b/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml
index 94e653b..4078116 100644
--- a/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml
+++ b/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/type_param_shadow_arg_inferred.expression.yaml b/pkg/front_end/testcases/expression/type_param_shadow_arg_inferred.expression.yaml
index fa853f1..c379cd5 100644
--- a/pkg/front_end/testcases/expression/type_param_shadow_arg_inferred.expression.yaml
+++ b/pkg/front_end/testcases/expression/type_param_shadow_arg_inferred.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/type_param_shadow_ctor.expression.yaml b/pkg/front_end/testcases/expression/type_param_shadow_ctor.expression.yaml
index 6dacbfb..bcc4445 100644
--- a/pkg/front_end/testcases/expression/type_param_shadow_ctor.expression.yaml
+++ b/pkg/front_end/testcases/expression/type_param_shadow_ctor.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: []
diff --git a/pkg/front_end/testcases/expression/type_param_shadow_var.expression.yaml b/pkg/front_end/testcases/expression/type_param_shadow_var.expression.yaml
index bf266c6..c1c6c10 100644
--- a/pkg/front_end/testcases/expression/type_param_shadow_var.expression.yaml
+++ b/pkg/front_end/testcases/expression/type_param_shadow_var.expression.yaml
@@ -1,6 +1,6 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
 
 entry_point: "main.dart"
 definitions: ["x"]
diff --git a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.expect b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.expect
index 33bcd2c..4a97594 100644
--- a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.expect
@@ -4,7 +4,7 @@
 
 typedef Function2<S extends core::Object, T extends core::Object> = (S) → T;
 class A<T extends core::Object> extends core::Object {
-  generic-covariant-impl generic-covariant-interface generic-contravariant field (self::A::T) → self::A::T x;
+  generic-covariant-impl generic-covariant-interface field (self::A::T) → self::A::T x;
   constructor •((self::A::T) → self::A::T x) → void
     : self::A::x = x, super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.transformed.expect
index 33bcd2c..4a97594 100644
--- a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef Function2<S extends core::Object, T extends core::Object> = (S) → T;
 class A<T extends core::Object> extends core::Object {
-  generic-covariant-impl generic-covariant-interface generic-contravariant field (self::A::T) → self::A::T x;
+  generic-covariant-impl generic-covariant-interface field (self::A::T) → self::A::T x;
   constructor •((self::A::T) → self::A::T x) → void
     : self::A::x = x, super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect
index d26a271..5dc12db 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  generic-contravariant method f<U extends core::Object>(self::C::f::U x) → (self::C::T) → void
+  method f<U extends core::Object>(self::C::f::U x) → (self::C::T) → void
     return (self::C::T y) → core::Null {};
 }
 static method test(self::C<core::String> c) → void {
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect
index d26a271..5dc12db 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  generic-contravariant method f<U extends core::Object>(self::C::f::U x) → (self::C::T) → void
+  method f<U extends core::Object>(self::C::f::U x) → (self::C::T) → void
     return (self::C::T y) → core::Null {};
 }
 static method test(self::C<core::String> c) → void {
diff --git a/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.expect b/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.expect
index e409ade..2175864 100644
--- a/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.expect
@@ -11,19 +11,19 @@
     return new self::Bar::•<self::Foo::T>();
   get v2() → self::Bar<core::List<self::Foo::T>>
     return new self::Bar::•<core::List<self::Foo::T>>();
-  generic-contravariant get v3() → self::Bar<(self::Foo::T) → self::Foo::T>
+  get v3() → self::Bar<(self::Foo::T) → self::Foo::T>
     return new self::Bar::•<(self::Foo::T) → self::Foo::T>();
-  generic-contravariant get v4() → self::Bar<((self::Foo::T) → self::Foo::T) → self::Foo::T>
+  get v4() → self::Bar<((self::Foo::T) → self::Foo::T) → self::Foo::T>
     return new self::Bar::•<((self::Foo::T) → self::Foo::T) → self::Foo::T>();
   get v5() → core::List<self::Foo::T>
     return <self::Foo::T>[];
-  generic-contravariant get v6() → core::List<(self::Foo::T) → self::Foo::T>
+  get v6() → core::List<(self::Foo::T) → self::Foo::T>
     return <(self::Foo::T) → self::Foo::T>[];
   get v7() → core::Map<self::Foo::T, self::Foo::T>
     return <self::Foo::T, self::Foo::T>{};
-  generic-contravariant get v8() → core::Map<(self::Foo::T) → self::Foo::T, self::Foo::T>
+  get v8() → core::Map<(self::Foo::T) → self::Foo::T, self::Foo::T>
     return <(self::Foo::T) → self::Foo::T, self::Foo::T>{};
-  generic-contravariant get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
+  get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
     return <self::Foo::T, (self::Foo::T) → self::Foo::T>{};
 }
 class Bar<T extends core::Object> extends core::Object {
diff --git a/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.transformed.expect
index e409ade..2175864 100644
--- a/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.transformed.expect
@@ -11,19 +11,19 @@
     return new self::Bar::•<self::Foo::T>();
   get v2() → self::Bar<core::List<self::Foo::T>>
     return new self::Bar::•<core::List<self::Foo::T>>();
-  generic-contravariant get v3() → self::Bar<(self::Foo::T) → self::Foo::T>
+  get v3() → self::Bar<(self::Foo::T) → self::Foo::T>
     return new self::Bar::•<(self::Foo::T) → self::Foo::T>();
-  generic-contravariant get v4() → self::Bar<((self::Foo::T) → self::Foo::T) → self::Foo::T>
+  get v4() → self::Bar<((self::Foo::T) → self::Foo::T) → self::Foo::T>
     return new self::Bar::•<((self::Foo::T) → self::Foo::T) → self::Foo::T>();
   get v5() → core::List<self::Foo::T>
     return <self::Foo::T>[];
-  generic-contravariant get v6() → core::List<(self::Foo::T) → self::Foo::T>
+  get v6() → core::List<(self::Foo::T) → self::Foo::T>
     return <(self::Foo::T) → self::Foo::T>[];
   get v7() → core::Map<self::Foo::T, self::Foo::T>
     return <self::Foo::T, self::Foo::T>{};
-  generic-contravariant get v8() → core::Map<(self::Foo::T) → self::Foo::T, self::Foo::T>
+  get v8() → core::Map<(self::Foo::T) → self::Foo::T, self::Foo::T>
     return <(self::Foo::T) → self::Foo::T, self::Foo::T>{};
-  generic-contravariant get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
+  get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
     return <self::Foo::T, (self::Foo::T) → self::Foo::T>{};
 }
 class Bar<T extends core::Object> extends core::Object {
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.expect b/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.expect
index ae42957..6926e12 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.expect
@@ -11,19 +11,19 @@
     return const self::Bar::•<core::Null>();
   get v2() → self::Bar<core::List<self::Foo::T>>
     return const self::Bar::•<core::List<core::Null>>();
-  generic-contravariant get v3() → self::Bar<(self::Foo::T) → self::Foo::T>
+  get v3() → self::Bar<(self::Foo::T) → self::Foo::T>
     return const self::Bar::•<(core::Object) → core::Null>();
-  generic-contravariant get v4() → self::Bar<((self::Foo::T) → self::Foo::T) → self::Foo::T>
+  get v4() → self::Bar<((self::Foo::T) → self::Foo::T) → self::Foo::T>
     return const self::Bar::•<((core::Null) → core::Object) → core::Null>();
   get v5() → core::List<self::Foo::T>
     return const <core::Null>[];
-  generic-contravariant get v6() → core::List<(self::Foo::T) → self::Foo::T>
+  get v6() → core::List<(self::Foo::T) → self::Foo::T>
     return const <(core::Object) → core::Null>[];
   get v7() → core::Map<self::Foo::T, self::Foo::T>
     return const <core::Null, core::Null>{};
-  generic-contravariant get v8() → core::Map<(self::Foo::T) → self::Foo::T, self::Foo::T>
+  get v8() → core::Map<(self::Foo::T) → self::Foo::T, self::Foo::T>
     return const <(core::Object) → core::Null, core::Null>{};
-  generic-contravariant get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
+  get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
     return const <core::Null, (core::Object) → core::Null>{};
 }
 class Bar<T extends core::Object> extends core::Object {
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.transformed.expect
index ae42957..6926e12 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.transformed.expect
@@ -11,19 +11,19 @@
     return const self::Bar::•<core::Null>();
   get v2() → self::Bar<core::List<self::Foo::T>>
     return const self::Bar::•<core::List<core::Null>>();
-  generic-contravariant get v3() → self::Bar<(self::Foo::T) → self::Foo::T>
+  get v3() → self::Bar<(self::Foo::T) → self::Foo::T>
     return const self::Bar::•<(core::Object) → core::Null>();
-  generic-contravariant get v4() → self::Bar<((self::Foo::T) → self::Foo::T) → self::Foo::T>
+  get v4() → self::Bar<((self::Foo::T) → self::Foo::T) → self::Foo::T>
     return const self::Bar::•<((core::Null) → core::Object) → core::Null>();
   get v5() → core::List<self::Foo::T>
     return const <core::Null>[];
-  generic-contravariant get v6() → core::List<(self::Foo::T) → self::Foo::T>
+  get v6() → core::List<(self::Foo::T) → self::Foo::T>
     return const <(core::Object) → core::Null>[];
   get v7() → core::Map<self::Foo::T, self::Foo::T>
     return const <core::Null, core::Null>{};
-  generic-contravariant get v8() → core::Map<(self::Foo::T) → self::Foo::T, self::Foo::T>
+  get v8() → core::Map<(self::Foo::T) → self::Foo::T, self::Foo::T>
     return const <(core::Object) → core::Null, core::Null>{};
-  generic-contravariant get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
+  get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
     return const <core::Null, (core::Object) → core::Null>{};
 }
 class Bar<T extends core::Object> extends core::Object {
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.expect
index e674c32..b156915 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.expect
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::Object> = (T) → dynamic;
 class B<S extends core::Object> extends core::Object {
-  generic-contravariant final field core::List<(self::B::S) → dynamic> foo = <(self::B::S) → dynamic>[];
+  final field core::List<(self::B::S) → dynamic> foo = <(self::B::S) → dynamic>[];
   final field core::List<(core::num) → dynamic> bar = <(core::num) → dynamic>[];
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.transformed.expect
index e674c32..b156915 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef A<T extends core::Object> = (T) → dynamic;
 class B<S extends core::Object> extends core::Object {
-  generic-contravariant final field core::List<(self::B::S) → dynamic> foo = <(self::B::S) → dynamic>[];
+  final field core::List<(self::B::S) → dynamic> foo = <(self::B::S) → dynamic>[];
   final field core::List<(core::num) → dynamic> bar = <(core::num) → dynamic>[];
   synthetic constructor •() → void
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/qualified.dart.direct.expect b/pkg/front_end/testcases/qualified.dart.direct.expect
index 85f2bbf..9a7583a 100644
--- a/pkg/front_end/testcases/qualified.dart.direct.expect
+++ b/pkg/front_end/testcases/qualified.dart.direct.expect
@@ -25,9 +25,9 @@
   static factory b<T extends core::Object>() → self::C<self::C::b::T>
     let dynamic #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:11:7: Error: The type 'lib.Missing' can't be used as supertype.
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
 class Bad extends lib.Missing {
-      ^"]/* from null */;
+                  ^"]/* from null */;
 static method main() → dynamic {
   new self::C::•<core::String>();
   new self::C::a<core::String>();
diff --git a/pkg/front_end/testcases/qualified.dart.direct.transformed.expect b/pkg/front_end/testcases/qualified.dart.direct.transformed.expect
index 6849bb6..a428888 100644
--- a/pkg/front_end/testcases/qualified.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/qualified.dart.direct.transformed.expect
@@ -31,9 +31,9 @@
   static factory b<T extends core::Object>() → self::C<self::C::b::T>
     let dynamic #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:11:7: Error: The type 'lib.Missing' can't be used as supertype.
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
 class Bad extends lib.Missing {
-      ^"]/* from null */;
+                  ^"]/* from null */;
 static method main() → dynamic {
   new self::C::•<core::String>();
   new self::C::a<core::String>();
diff --git a/pkg/front_end/testcases/qualified.dart.strong.expect b/pkg/front_end/testcases/qualified.dart.strong.expect
index 4522e74..7136bf5 100644
--- a/pkg/front_end/testcases/qualified.dart.strong.expect
+++ b/pkg/front_end/testcases/qualified.dart.strong.expect
@@ -27,9 +27,9 @@
 }
 static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:12:3: Error: Type 'lib.Missing' not found.
   lib.Missing method() {}
-  ^", "pkg/front_end/testcases/qualified.dart:11:7: Error: The type 'lib.Missing' can't be used as supertype.
+  ^", "pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
 class Bad extends lib.Missing {
-      ^", "pkg/front_end/testcases/qualified.dart: Error: Couldn't find constructor 'WrongName'."]/* from null */;
+                  ^", "pkg/front_end/testcases/qualified.dart: Error: Couldn't find constructor 'WrongName'."]/* from null */;
 static method main() → dynamic {
   new self::C::•<core::String>();
   new self::C::a<core::String>();
diff --git a/pkg/front_end/testcases/qualified.dart.strong.transformed.expect b/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
index 5a41492..b90128a 100644
--- a/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
@@ -33,9 +33,9 @@
 }
 static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/qualified.dart:12:3: Error: Type 'lib.Missing' not found.
   lib.Missing method() {}
-  ^", "pkg/front_end/testcases/qualified.dart:11:7: Error: The type 'lib.Missing' can't be used as supertype.
+  ^", "pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
 class Bad extends lib.Missing {
-      ^", "pkg/front_end/testcases/qualified.dart: Error: Couldn't find constructor 'WrongName'."]/* from null */;
+                  ^", "pkg/front_end/testcases/qualified.dart: Error: Couldn't find constructor 'WrongName'."]/* from null */;
 static method main() → dynamic {
   new self::C::•<core::String>();
   new self::C::a<core::String>();
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect
index 1aa328a..c4d09ee 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object> extends core::Object {
-  field self::C<dynamic> field = null;
+  field invalid-type field = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29981.dart.strong.transformed.expect
index 1aa328a..c4d09ee 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object> extends core::Object {
-  field self::C<dynamic> field = null;
+  field invalid-type field = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart
index c730901..e953f32 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart
@@ -8,7 +8,7 @@
 typedef void F<T>(T x);
 
 class C<T> {
-  F<T> /*@genericContravariant=true*/ y;
+  F<T> y;
   void f() {
     var x = this.y;
   }
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.expect
index c2e5212..c6d729f 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.expect
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object> = (T) → void;
 class C<T extends core::Object> extends core::Object {
-  generic-contravariant field (self::C::T) → void y = null;
+  field (self::C::T) → void y = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.transformed.expect
index c2e5212..c6d729f 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object> = (T) → void;
 class C<T extends core::Object> extends core::Object {
-  generic-contravariant field (self::C::T) → void y = null;
+  field (self::C::T) → void y = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart
index 12df74a..8072cc9 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart
@@ -8,8 +8,8 @@
 typedef void F<T>(T x);
 
 class C<T> {
-  F<T> /*@genericContravariant=true*/ f1() {}
-  List<F<T>> /*@genericContravariant=true*/ f2() {
+  F<T> f1() {}
+  List<F<T>> f2() {
     return [this.f1()];
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.expect
index adab8ca..a18c06b 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.expect
@@ -7,8 +7,8 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  generic-contravariant method f1() → (self::C::T) → void {}
-  generic-contravariant method f2() → core::List<(self::C::T) → void> {
+  method f1() → (self::C::T) → void {}
+  method f2() → core::List<(self::C::T) → void> {
     return <(self::C::T) → void>[this.{self::C::f1}()];
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.transformed.expect
index adab8ca..a18c06b 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.transformed.expect
@@ -7,8 +7,8 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  generic-contravariant method f1() → (self::C::T) → void {}
-  generic-contravariant method f2() → core::List<(self::C::T) → void> {
+  method f1() → (self::C::T) → void {}
+  method f2() → core::List<(self::C::T) → void> {
     return <(self::C::T) → void>[this.{self::C::f1}()];
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart
index 0531ccf..24609f7 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart
@@ -8,8 +8,8 @@
 typedef void F<T>(T x);
 
 class C<T> {
-  F<T> /*@genericContravariant=true*/ f1() {}
-  List<F<T>> /*@genericContravariant=true*/ f2() {
+  F<T> f1() {}
+  List<F<T>> f2() {
     return [this?.f1()];
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.expect
index 7635298..a67d03d 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.expect
@@ -7,8 +7,8 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  generic-contravariant method f1() → (self::C::T) → void {}
-  generic-contravariant method f2() → core::List<(self::C::T) → void> {
+  method f1() → (self::C::T) → void {}
+  method f2() → core::List<(self::C::T) → void> {
     return <(self::C::T) → void>[this.{self::C::f1}()];
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.transformed.expect
index 7635298..a67d03d 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.transformed.expect
@@ -7,8 +7,8 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  generic-contravariant method f1() → (self::C::T) → void {}
-  generic-contravariant method f2() → core::List<(self::C::T) → void> {
+  method f1() → (self::C::T) → void {}
+  method f2() → core::List<(self::C::T) → void> {
     return <(self::C::T) → void>[this.{self::C::f1}()];
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart
index e0de24f..4b202f2 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart
@@ -9,9 +9,9 @@
 typedef F<T> G<T>();
 
 class C<T> {
-  F<T> /*@genericContravariant=true*/ _x;
+  F<T> _x;
   C(this._x);
-  F<T> /*@genericContravariant=true*/ f() => _x;
+  F<T> f() => _x;
 }
 
 G<num> g(C<num> c) {
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.expect
index f667624..ce92ed1 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.expect
@@ -5,11 +5,11 @@
 typedef F<T extends core::Object> = (T) → void;
 typedef G<T extends core::Object> = () → (T) → void;
 class C<T extends core::Object> extends core::Object {
-  generic-contravariant field (self::C::T) → void _x;
+  field (self::C::T) → void _x;
   constructor •((self::C::T) → void _x) → void
     : self::C::_x = _x, super core::Object::•()
     ;
-  generic-contravariant method f() → (self::C::T) → void
+  method f() → (self::C::T) → void
     return this.{self::C::_x};
 }
 static method g(self::C<core::num> c) → () → (core::num) → void {
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.transformed.expect
index f667624..ce92ed1 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.transformed.expect
@@ -5,11 +5,11 @@
 typedef F<T extends core::Object> = (T) → void;
 typedef G<T extends core::Object> = () → (T) → void;
 class C<T extends core::Object> extends core::Object {
-  generic-contravariant field (self::C::T) → void _x;
+  field (self::C::T) → void _x;
   constructor •((self::C::T) → void _x) → void
     : self::C::_x = _x, super core::Object::•()
     ;
-  generic-contravariant method f() → (self::C::T) → void
+  method f() → (self::C::T) → void
     return this.{self::C::_x};
 }
 static method g(self::C<core::num> c) → () → (core::num) → void {
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart
index cebae23..93f520f 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart
@@ -8,7 +8,7 @@
 typedef void F<T>(T x);
 
 class C<T> {
-  F<T> /*@genericContravariant=true*/ y;
+  F<T> y;
   void f(T /*@covariance=genericInterface, genericImpl*/ value) {
     this.y(value);
   }
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.expect
index 88625d3..a13a055 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.expect
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object> = (T) → void;
 class C<T extends core::Object> extends core::Object {
-  generic-contravariant field (self::C::T) → void y = null;
+  field (self::C::T) → void y = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.transformed.expect
index 88625d3..a13a055 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 typedef F<T extends core::Object> = (T) → void;
 class C<T extends core::Object> extends core::Object {
-  generic-contravariant field (self::C::T) → void y = null;
+  field (self::C::T) → void y = null;
   synthetic constructor •() → void
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart
index 9f1f536..8900412 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart
@@ -8,8 +8,8 @@
 typedef void F<T>(T x);
 
 class C<T> {
-  F<T> get /*@genericContravariant=true*/ f1 => null;
-  List<F<T>> get /*@genericContravariant=true*/ f2 {
+  F<T> get f1 => null;
+  List<F<T>> get f2 {
     return [this.f1];
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.expect
index 5c3e2d2..5f2899e 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.expect
@@ -7,9 +7,9 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  generic-contravariant get f1() → (self::C::T) → void
+  get f1() → (self::C::T) → void
     return null;
-  generic-contravariant get f2() → core::List<(self::C::T) → void> {
+  get f2() → core::List<(self::C::T) → void> {
     return <(self::C::T) → void>[this.{self::C::f1}];
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.transformed.expect
index 5c3e2d2..5f2899e 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.transformed.expect
@@ -7,9 +7,9 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  generic-contravariant get f1() → (self::C::T) → void
+  get f1() → (self::C::T) → void
     return null;
-  generic-contravariant get f2() → core::List<(self::C::T) → void> {
+  get f2() → core::List<(self::C::T) → void> {
     return <(self::C::T) → void>[this.{self::C::f1}];
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart
index 546563d..a8cd708 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart
@@ -8,8 +8,8 @@
 typedef void F<T>(T x);
 
 class C<T> {
-  F<T> get /*@genericContravariant=true*/ f1 => null;
-  List<F<T>> get /*@genericContravariant=true*/ f2 {
+  F<T> get f1 => null;
+  List<F<T>> get f2 {
     return [this?.f1];
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.expect
index fcd0c39..764aea8 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.expect
@@ -7,9 +7,9 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  generic-contravariant get f1() → (self::C::T) → void
+  get f1() → (self::C::T) → void
     return null;
-  generic-contravariant get f2() → core::List<(self::C::T) → void> {
+  get f2() → core::List<(self::C::T) → void> {
     return <(self::C::T) → void>[this.{self::C::f1}];
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.transformed.expect
index fcd0c39..764aea8 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.transformed.expect
@@ -7,9 +7,9 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  generic-contravariant get f1() → (self::C::T) → void
+  get f1() → (self::C::T) → void
     return null;
-  generic-contravariant get f2() → core::List<(self::C::T) → void> {
+  get f2() → core::List<(self::C::T) → void> {
     return <(self::C::T) → void>[this.{self::C::f1}];
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart
index 4f77378..a28b798 100644
--- a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart
@@ -22,27 +22,27 @@
     c.f(x);
   }
 
-  F<T> /*@genericContravariant=true*/ g4() => this.f;
+  F<T> g4() => this.f;
 }
 
 class
 /*@forwardingStub=abstract void f(covariance=(genericImpl) int x)*/
 /*@forwardingStub=abstract void g1(covariance=(genericImpl) int x)*/
 /*@forwardingStub=abstract void g2(covariance=(genericImpl) int x)*/
-/*@forwardingStub=abstract (int) -> dynamic g4()*/
 /*@forwardingStub=abstract void g3(covariance=(genericImpl) C<int> c, covariance=(genericImpl) int x)*/
+
     D extends C<int> {}
 
 class /*@forwardingStub=abstract void g1(covariance=(genericImpl) num x)*/
 /*@forwardingStub=abstract void g2(covariance=(genericImpl) num x)*/
-/*@forwardingStub=abstract (num) -> dynamic g4()*/
 /*@forwardingStub=abstract void g3(covariance=(genericImpl) C<num> c, covariance=(genericImpl) num x)*/
+
     E extends C<num> {
   void f(covariant int /*@covariance=explicit*/ x) {}
 }
 
 test() {
-  var x = new D().g4() as F<Object>;
+  var x = new D().g4 /*@checkReturn=(int) -> dynamic*/ () as F<Object>;
   x('hi');
   new E().g1(1.5);
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.expect
index 1a496c8..a8e4634 100644
--- a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.expect
@@ -17,7 +17,7 @@
   method g3(generic-covariant-impl generic-covariant-interface self::C<self::C::T> c, generic-covariant-impl generic-covariant-interface self::C::T x) → void {
     c.{self::C::f}(x);
   }
-  generic-contravariant method g4() → (self::C::T) → dynamic
+  method g4() → (self::C::T) → dynamic
     return this.{self::C::f};
 }
 class D extends self::C<core::int> {
@@ -27,7 +27,6 @@
   abstract forwarding-stub method f(generic-covariant-impl core::int x) → void;
   abstract forwarding-stub method g1(generic-covariant-impl core::int x) → void;
   abstract forwarding-stub method g2(generic-covariant-impl core::int x) → void;
-  abstract forwarding-stub method g4() → (core::int) → dynamic;
   abstract forwarding-stub method g3(generic-covariant-impl self::C<core::int> c, generic-covariant-impl core::int x) → void;
 }
 class E extends self::C<core::num> {
@@ -37,11 +36,10 @@
   method f(covariant generic-covariant-impl core::int x) → void {}
   abstract forwarding-stub method g1(generic-covariant-impl core::num x) → void;
   abstract forwarding-stub method g2(generic-covariant-impl core::num x) → void;
-  abstract forwarding-stub method g4() → (core::num) → dynamic;
   abstract forwarding-stub method g3(generic-covariant-impl self::C<core::num> c, generic-covariant-impl core::num x) → void;
 }
 static method test() → dynamic {
-  (core::Object) → dynamic x = new self::D::•().{self::D::g4}() as (core::Object) → dynamic;
+  (core::Object) → dynamic x = (new self::D::•().{self::C::g4}() as{TypeError} (core::int) → dynamic) as (core::Object) → dynamic;
   x.call("hi");
   new self::E::•().{self::E::g1}(1.5);
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.transformed.expect
index 1a496c8..a8e4634 100644
--- a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.transformed.expect
@@ -17,7 +17,7 @@
   method g3(generic-covariant-impl generic-covariant-interface self::C<self::C::T> c, generic-covariant-impl generic-covariant-interface self::C::T x) → void {
     c.{self::C::f}(x);
   }
-  generic-contravariant method g4() → (self::C::T) → dynamic
+  method g4() → (self::C::T) → dynamic
     return this.{self::C::f};
 }
 class D extends self::C<core::int> {
@@ -27,7 +27,6 @@
   abstract forwarding-stub method f(generic-covariant-impl core::int x) → void;
   abstract forwarding-stub method g1(generic-covariant-impl core::int x) → void;
   abstract forwarding-stub method g2(generic-covariant-impl core::int x) → void;
-  abstract forwarding-stub method g4() → (core::int) → dynamic;
   abstract forwarding-stub method g3(generic-covariant-impl self::C<core::int> c, generic-covariant-impl core::int x) → void;
 }
 class E extends self::C<core::num> {
@@ -37,11 +36,10 @@
   method f(covariant generic-covariant-impl core::int x) → void {}
   abstract forwarding-stub method g1(generic-covariant-impl core::num x) → void;
   abstract forwarding-stub method g2(generic-covariant-impl core::num x) → void;
-  abstract forwarding-stub method g4() → (core::num) → dynamic;
   abstract forwarding-stub method g3(generic-covariant-impl self::C<core::num> c, generic-covariant-impl core::num x) → void;
 }
 static method test() → dynamic {
-  (core::Object) → dynamic x = new self::D::•().{self::D::g4}() as (core::Object) → dynamic;
+  (core::Object) → dynamic x = (new self::D::•().{self::C::g4}() as{TypeError} (core::int) → dynamic) as (core::Object) → dynamic;
   x.call("hi");
   new self::E::•().{self::E::g1}(1.5);
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart
index 08ade7a..d272d69 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart
@@ -8,7 +8,7 @@
 typedef void F<T>(T x);
 
 class B<T, U extends F<T>> {
-  B<T, F<T>> operator /*@genericContravariant=true*/ +(other) => null;
+  B<T, F<T>> operator +(other) => null;
 }
 
 class C {
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.expect
index 0449783..abb7c26 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.expect
@@ -7,7 +7,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  generic-contravariant operator +(dynamic other) → self::B<self::B::T, (self::B::T) → void>
+  operator +(dynamic other) → self::B<self::B::T, (self::B::T) → void>
     return null;
 }
 class C extends core::Object {
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect
index 0449783..abb7c26 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  generic-contravariant operator +(dynamic other) → self::B<self::B::T, (self::B::T) → void>
+  operator +(dynamic other) → self::B<self::B::T, (self::B::T) → void>
     return null;
 }
 class C extends core::Object {
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart
index ea84715..ed38b37 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart
@@ -20,9 +20,8 @@
 
 class C<T> {
   C(this.plusResult);
-  final num Function(T) /*@genericContravariant=true*/ plusResult;
-  num Function(T) operator /*@genericContravariant=true*/ +(int i) =>
-      plusResult;
+  final num Function(T) plusResult;
+  num Function(T) operator +(int i) => plusResult;
 }
 
 class D {
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
index 3a6e93a..8a36099 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C<T extends core::Object> extends core::Object {
-  generic-contravariant final field (self::C::T) → core::num plusResult;
+  final field (self::C::T) → core::num plusResult;
   constructor •((self::C::T) → core::num plusResult) → void
     : self::C::plusResult = plusResult, super core::Object::•()
     ;
-  generic-contravariant operator +(core::int i) → (self::C::T) → core::num
+  operator +(core::int i) → (self::C::T) → core::num
     return this.{self::C::plusResult};
 }
 class D extends core::Object {
@@ -41,14 +41,14 @@
   return 2;
 static method main() → void {
   self::D d = new self::D::•(new self::C::•<core::num>(self::numToInt));
-  let final self::D #t1 = d in #t1.{self::D::value} = let final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:50:41: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.
+  let final self::D #t1 = d in #t1.{self::D::value} = let final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:41: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::int'.
   d.value /*@checkReturn=(num) -> num*/ += 1;
                                         ^" in let final dynamic #t3 = #t1.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num) → core::num in null;
   self::expect(d.{self::D::setValue}(0), 1);
   d = new self::D::•(new self::C::•<core::num>(self::numToNum));
   self::expectTypeError(() → core::Null {
-    let final self::D #t4 = d in #t4.{self::D::value} = let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:54:43: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.
+    let final self::D #t4 = d in #t4.{self::D::value} = let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:43: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::int'.
     d.value /*@checkReturn=(num) -> num*/ += 1;
                                           ^" in let final dynamic #t6 = #t4.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num) → core::num in null;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
index 9a89e10..9e71b47 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C<T extends core::Object> extends core::Object {
-  generic-contravariant final field (self::C::T) → core::num plusResult;
+  final field (self::C::T) → core::num plusResult;
   constructor •((self::C::T) → core::num plusResult) → void
     : self::C::plusResult = plusResult, super core::Object::•()
     ;
-  generic-contravariant operator +(core::int i) → (self::C::T) → core::num
+  operator +(core::int i) → (self::C::T) → core::num
     return this.{self::C::plusResult};
 }
 class D extends core::Object {
@@ -41,14 +41,14 @@
   return 2;
 static method main() → void {
   self::D d = new self::D::•(new self::C::•<core::num>(self::numToInt));
-  let final self::D #t1 = d in #t1.{self::D::value} = let final dynamic #t2 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:50:41: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.
+  let final self::D #t1 = d in #t1.{self::D::value} = let final dynamic #t2 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:41: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::int'.
   d.value /*@checkReturn=(num) -> num*/ += 1;
                                         ^" in let final (core::num) → core::num #t3 = #t1.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num) → core::num in null;
   self::expect(d.{self::D::setValue}(0), 1);
   d = new self::D::•(new self::C::•<core::num>(self::numToNum));
   self::expectTypeError(() → core::Null {
-    let final self::D #t4 = d in #t4.{self::D::value} = let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:54:43: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.
+    let final self::D #t4 = d in #t4.{self::D::value} = let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:43: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::int'.
     d.value /*@checkReturn=(num) -> num*/ += 1;
                                           ^" in let final (core::num) → core::num #t6 = #t4.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num) → core::num in null;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart
index 604513f..15854b3 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart
@@ -13,7 +13,7 @@
 }
 
 class C<T> {
-  B<F<T>> get /*@genericContravariant=true*/ x => null;
+  B<F<T>> get x => null;
   void set x(B<F<T>> value) {}
 }
 
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect
index ee09fb4..5661177 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect
@@ -14,7 +14,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  generic-contravariant get x() → self::B<(self::C::T) → void>
+  get x() → self::B<(self::C::T) → void>
     return null;
   set x(self::B<(self::C::T) → void> value) → void {}
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect
index f379cd8..7a9ab98 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect
@@ -14,7 +14,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  generic-contravariant get x() → self::B<(self::C::T) → void>
+  get x() → self::B<(self::C::T) → void>
     return null;
   set x(self::B<(self::C::T) → void> value) → void {}
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart
index 4be3197..ffa9c1d 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart
@@ -13,7 +13,7 @@
 }
 
 class C<T> {
-  B<F<T>> operator /*@genericContravariant=true*/ [](int i) => null;
+  B<F<T>> operator [](int i) => null;
   void operator []=(int i, B<F<T>> x) {}
 }
 
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.expect
index 74c67a7..4c7b92c 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.expect
@@ -14,7 +14,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  generic-contravariant operator [](core::int i) → self::B<(self::C::T) → void>
+  operator [](core::int i) → self::B<(self::C::T) → void>
     return null;
   operator []=(core::int i, self::B<(self::C::T) → void> x) → void {}
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.transformed.expect
index 74c67a7..4c7b92c 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.transformed.expect
@@ -14,7 +14,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  generic-contravariant operator [](core::int i) → self::B<(self::C::T) → void>
+  operator [](core::int i) → self::B<(self::C::T) → void>
     return null;
   operator []=(core::int i, self::B<(self::C::T) → void> x) → void {}
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart
index 0c5a7fc..722ec8b 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart
@@ -8,7 +8,7 @@
 typedef void F<T>(T x);
 
 class C<T> {
-  F<T> operator /*@genericContravariant=true*/ [](int i) => null;
+  F<T> operator [](int i) => null;
 }
 
 F<num> test(C<num> c) {
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.expect
index 5653b2b..4c9a372 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.expect
@@ -7,7 +7,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  generic-contravariant operator [](core::int i) → (self::C::T) → void
+  operator [](core::int i) → (self::C::T) → void
     return null;
 }
 static method test(self::C<core::num> c) → (core::num) → void {
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.transformed.expect
index 5653b2b..4c9a372 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  generic-contravariant operator [](core::int i) → (self::C::T) → void
+  operator [](core::int i) → (self::C::T) → void
     return null;
 }
 static method test(self::C<core::num> c) → (core::num) → void {
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart
index a1739c5..7797a4a 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart
@@ -31,7 +31,7 @@
 }
 
 abstract class I<T> {
-  F<T> get /*@genericContravariant=true*/ x;
+  F<T> get x;
   void set x(Object value);
 }
 
@@ -44,10 +44,7 @@
   T f();
 }
 
-abstract class
-/*@forwardingStub=abstract genericContravariant (C::T) -> void f()*/
-/*@forwardingStub=abstract genericContravariant (C::T) -> void get x()*/
-    C<T> = B with M<F<T>> implements I<T>;
+abstract class C<T> = B with M<F<T>> implements I<T>;
 
 class D extends C<int> {
   F<int> f() => (int i) {
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.strong.expect
index 66a0075..f3d6139 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.strong.expect
@@ -18,7 +18,7 @@
   synthetic constructor •() → void
     : super core::Object::•()
     ;
-  abstract generic-contravariant get x() → (self::I::T) → void;
+  abstract get x() → (self::I::T) → void;
   abstract set x(core::Object value) → void;
 }
 abstract class M<T extends core::Object> extends core::Object {
@@ -36,8 +36,6 @@
   synthetic constructor •() → void
     : super self::B::•()
     ;
-  abstract forwarding-stub generic-contravariant method f() → (self::C::T) → void;
-  abstract forwarding-stub generic-contravariant get x() → (self::C::T) → void;
 }
 class D extends self::C<core::int> {
   synthetic constructor •() → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart
index 0ae133d..34982db 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart
@@ -16,7 +16,7 @@
 }
 
 class
-/*@forwardingStub=abstract genericContravariant (C::T) -> void f(covariance=() Object x)*/
+/*@forwardingStub=abstract (C::T) -> void f(covariance=() Object x)*/
     C<T> extends B<F<T>> implements I<F<T>> {}
 
 void main() {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.strong.expect
index 0278865..fde8b6f 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.strong.expect
@@ -19,6 +19,6 @@
   synthetic constructor •() → void
     : super self::B::•()
     ;
-  abstract forwarding-stub generic-contravariant method f(core::Object x) → (self::C::T) → void;
+  abstract forwarding-stub method f(core::Object x) → (self::C::T) → void;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testing.json b/pkg/front_end/testing.json
index 231aa5e..c283616 100644
--- a/pkg/front_end/testing.json
+++ b/pkg/front_end/testing.json
@@ -149,7 +149,18 @@
       "exclude": [
       ]
     },
-
+    {
+      "name": "expression",
+      "kind": "Chain",
+      "source": "test/fasta/expression_test.dart",
+      "path": "testcases/expression/",
+      "status": "testcases/expression.status",
+      "pattern": [
+        "\\.expression\\.yaml$"
+      ],
+      "exclude": [
+      ]
+    },
     {
       "name": "incremental_load_from_dill",
       "kind": "Chain",
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index f87de3d..c5638dd 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -42,6 +42,8 @@
 
 type UInt32 = big endian 32-bit unsigned integer
 
+type Double = Double-precision floating-point number.
+
 type List<T> {
   UInt length;
   T[length] items;
@@ -312,7 +314,6 @@
   FileOffset fileEndOffset;
   Byte flags (isFinal, isConst, isStatic, hasImplicitGetter, hasImplicitSetter,
               isCovariant, isGenericCovariantImpl, isGenericCovariantInterface);
-  Byte flags2 (isGenericContravariant);
   Name name;
   List<Expression> annotations;
   DartType type;
@@ -351,9 +352,9 @@
   FileOffset fileEndOffset;
   Byte kind; // Index into the ProcedureKind enum above.
   Byte flags (isStatic, isAbstract, isExternal, isConst, isForwardingStub,
-              isGenericContravariant, isForwardingSemiStub,
-              isRedirectingFactoryConstructor);
-  Byte flags2 (isNoSuchMethodForwarder);
+              isForwardingSemiStub,
+              isRedirectingFactoryConstructor,
+              isNoSuchMethodForwarder);
   Name name;
   List<Expression> annotations;
   // Only present if the 'isForwardingStub' flag is set.
@@ -712,7 +713,7 @@
 
 type DoubleLiteral extends Expression {
   Byte tag = 40;
-  StringReference valueString;
+  Double value;
 }
 
 type TrueLiteral extends Expression {
@@ -875,7 +876,7 @@
 
 type DoubleConstant extends Constant {
   Byte tag = 3;
-  StringReference value;
+  Double value;
 }
 
 type StringConstant extends Constant {
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 4d44b72..3bfd973 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -1039,7 +1039,6 @@
 class Field extends Member {
   DartType type; // Not null. Defaults to DynamicType.
   int flags = 0;
-  int flags2 = 0;
   Expression initializer; // May be null.
 
   Field(Name name,
@@ -1075,9 +1074,6 @@
   static const int FlagGenericCovariantImpl = 1 << 6;
   static const int FlagGenericCovariantInterface = 1 << 7;
 
-  // Must match serialized bit positions
-  static const int Flag2GenericContravariant = 1 << 0;
-
   /// Whether the field is declared with the `covariant` keyword.
   bool get isCovariant => flags & FlagCovariant != 0;
 
@@ -1120,14 +1116,6 @@
   bool get isGenericCovariantInterface =>
       flags & FlagGenericCovariantInterface != 0;
 
-  /// Indicates whether getter invocations using this interface target may need
-  /// to perform a runtime type check to deal with generic covariance.
-  ///
-  /// Note that the appropriate runtime checks are inserted by the front end, so
-  /// back ends need not consult this flag; this flag exists merely to reduce
-  /// front end computational overhead.
-  bool get isGenericContravariant => flags2 & Flag2GenericContravariant != 0;
-
   void set isCovariant(bool value) {
     flags = value ? (flags | FlagCovariant) : (flags & ~FlagCovariant);
   }
@@ -1168,12 +1156,6 @@
         : (flags & ~FlagGenericCovariantInterface);
   }
 
-  void set isGenericContravariant(bool value) {
-    flags2 = value
-        ? (flags2 | Flag2GenericContravariant)
-        : (flags2 & ~Flag2GenericContravariant);
-  }
-
   /// True if the field is neither final nor const.
   bool get isMutable => flags & (FlagFinal | FlagConst) == 0;
   bool get isInstanceMember => !isStatic;
@@ -1450,7 +1432,6 @@
 class Procedure extends Member {
   ProcedureKind kind;
   int flags = 0;
-  int flags2 = 0;
   // function is null if and only if abstract, external.
   FunctionNode function;
 
@@ -1535,11 +1516,10 @@
   static const int FlagExternal = 1 << 2;
   static const int FlagConst = 1 << 3; // Only for external const factories.
   static const int FlagForwardingStub = 1 << 4;
-  static const int FlagGenericContravariant = 1 << 5;
-  static const int FlagForwardingSemiStub = 1 << 6;
+  static const int FlagForwardingSemiStub = 1 << 5;
   // TODO(29841): Remove this flag after the issue is resolved.
-  static const int FlagRedirectingFactoryConstructor = 1 << 7;
-  static const int Flag2NoSuchMethodForwarder = 1 << 0;
+  static const int FlagRedirectingFactoryConstructor = 1 << 6;
+  static const int FlagNoSuchMethodForwarder = 1 << 7;
 
   bool get isStatic => flags & FlagStatic != 0;
   bool get isAbstract => flags & FlagAbstract != 0;
@@ -1559,14 +1539,6 @@
   /// was present in the source, consult [isSyntheticForwarder].
   bool get isForwardingStub => flags & FlagForwardingStub != 0;
 
-  /// Indicates whether invocations using this interface target may need to
-  /// perform a runtime type check to deal with generic covariance.
-  ///
-  /// Note that the appropriate runtime checks are inserted by the front end, so
-  /// back ends need not consult this flag; this flag exists merely to reduce
-  /// front end computational overhead.
-  bool get isGenericContravariant => flags & FlagGenericContravariant != 0;
-
   /// If set, this flag indicates that although this function is a forwarding
   /// stub, it was present in the original source as an abstract method.
   bool get isForwardingSemiStub => flags & FlagForwardingSemiStub != 0;
@@ -1582,7 +1554,7 @@
   /// and forwarding to [forwardingStubSuperTarget].
   bool get isSyntheticForwarder => isForwardingStub && !isForwardingSemiStub;
 
-  bool get isNoSuchMethodForwarder => flags2 & Flag2NoSuchMethodForwarder != 0;
+  bool get isNoSuchMethodForwarder => flags & FlagNoSuchMethodForwarder != 0;
 
   void set isStatic(bool value) {
     flags = value ? (flags | FlagStatic) : (flags & ~FlagStatic);
@@ -1605,12 +1577,6 @@
         value ? (flags | FlagForwardingStub) : (flags & ~FlagForwardingStub);
   }
 
-  void set isGenericContravariant(bool value) {
-    flags = value
-        ? (flags | FlagGenericContravariant)
-        : (flags & ~FlagGenericContravariant);
-  }
-
   void set isForwardingSemiStub(bool value) {
     flags = value
         ? (flags | FlagForwardingSemiStub)
@@ -1625,9 +1591,9 @@
 
   void set isNoSuchMethodForwarder(bool value) {
     assert(isAbstract);
-    flags2 = value
-        ? (flags2 | Flag2NoSuchMethodForwarder)
-        : (flags2 & ~Flag2NoSuchMethodForwarder);
+    flags = value
+        ? (flags | FlagNoSuchMethodForwarder)
+        : (flags & ~FlagNoSuchMethodForwarder);
   }
 
   bool get isInstanceMember => !isStatic;
@@ -3445,8 +3411,7 @@
     assert(constant != null);
   }
 
-  DartType getStaticType(TypeEnvironment types) =>
-      throw 'ConstantExpression.staticType() is unimplemented';
+  DartType getStaticType(TypeEnvironment types) => constant.getType(types);
 
   accept(ExpressionVisitor v) => v.visitConstantExpression(this);
   accept1(ExpressionVisitor1 v, arg) => v.visitConstantExpression(this, arg);
@@ -5191,6 +5156,9 @@
   /// comparable via hashCode/==!
   int get hashCode;
   bool operator ==(Object other);
+
+  /// Gets the type of this constant.
+  DartType getType(TypeEnvironment types);
 }
 
 abstract class PrimitiveConstant<T> extends Constant {
@@ -5212,6 +5180,8 @@
   visitChildren(Visitor v) {}
   accept(ConstantVisitor v) => v.visitNullConstant(this);
   acceptReference(Visitor v) => v.visitNullConstantReference(this);
+
+  DartType getType(TypeEnvironment types) => types.nullType;
 }
 
 class BoolConstant extends PrimitiveConstant<bool> {
@@ -5220,6 +5190,8 @@
   visitChildren(Visitor v) {}
   accept(ConstantVisitor v) => v.visitBoolConstant(this);
   acceptReference(Visitor v) => v.visitBoolConstantReference(this);
+
+  DartType getType(TypeEnvironment types) => types.boolType;
 }
 
 class IntConstant extends PrimitiveConstant<int> {
@@ -5228,6 +5200,8 @@
   visitChildren(Visitor v) {}
   accept(ConstantVisitor v) => v.visitIntConstant(this);
   acceptReference(Visitor v) => v.visitIntConstantReference(this);
+
+  DartType getType(TypeEnvironment types) => types.intType;
 }
 
 class DoubleConstant extends PrimitiveConstant<double> {
@@ -5241,6 +5215,8 @@
   bool operator ==(Object other) =>
       other is DoubleConstant &&
       (other.value == value || identical(value, other.value) /* For NaN */);
+
+  DartType getType(TypeEnvironment types) => types.doubleType;
 }
 
 class StringConstant extends PrimitiveConstant<String> {
@@ -5251,6 +5227,8 @@
   visitChildren(Visitor v) {}
   accept(ConstantVisitor v) => v.visitStringConstant(this);
   acceptReference(Visitor v) => v.visitStringConstantReference(this);
+
+  DartType getType(TypeEnvironment types) => types.stringType;
 }
 
 class MapConstant extends Constant {
@@ -5288,6 +5266,9 @@
           other.keyType == keyType &&
           other.valueType == valueType &&
           listEquals(other.entries, entries));
+
+  DartType getType(TypeEnvironment types) =>
+      types.literalMapType(keyType, valueType);
 }
 
 class ConstantMapEntry {
@@ -5331,6 +5312,9 @@
       (other is ListConstant &&
           other.typeArgument == typeArgument &&
           listEquals(other.entries, entries));
+
+  DartType getType(TypeEnvironment types) =>
+      types.literalListType(typeArgument);
 }
 
 class InstanceConstant extends Constant {
@@ -5386,6 +5370,9 @@
             listEquals(other.typeArguments, typeArguments) &&
             mapEquals(other.fieldValues, fieldValues));
   }
+
+  DartType getType(TypeEnvironment types) =>
+      new InterfaceType(klass, typeArguments);
 }
 
 class PartialInstantiationConstant extends Constant {
@@ -5414,6 +5401,15 @@
         other.tearOffConstant == tearOffConstant &&
         listEquals(other.types, types);
   }
+
+  DartType getType(TypeEnvironment typeEnvironment) {
+    final FunctionType type = tearOffConstant.getType(typeEnvironment);
+    final mapping = <TypeParameter, DartType>{};
+    for (final parameter in type.typeParameters) {
+      mapping[parameter] = types[mapping.length];
+    }
+    return substitute(type.withoutTypeParameters, mapping);
+  }
 }
 
 class TearOffConstant extends Constant {
@@ -5444,6 +5440,9 @@
   bool operator ==(Object other) {
     return other is TearOffConstant && other.procedure == procedure;
   }
+
+  FunctionType getType(TypeEnvironment types) =>
+      procedure.function.functionType;
 }
 
 class TypeLiteralConstant extends Constant {
@@ -5465,6 +5464,8 @@
   bool operator ==(Object other) {
     return other is TypeLiteralConstant && other.type == type;
   }
+
+  DartType getType(TypeEnvironment types) => types.typeType;
 }
 
 // ------------------------------------------------------------------------
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index bfdf151..384fcf5 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -97,6 +97,22 @@
         readByte();
   }
 
+  final Float64List _doubleBuffer = new Float64List(1);
+  Uint8List _doubleBufferUint8;
+
+  double readDouble() {
+    _doubleBufferUint8 ??= _doubleBuffer.buffer.asUint8List();
+    _doubleBufferUint8[0] = readByte();
+    _doubleBufferUint8[1] = readByte();
+    _doubleBufferUint8[2] = readByte();
+    _doubleBufferUint8[3] = readByte();
+    _doubleBufferUint8[4] = readByte();
+    _doubleBufferUint8[5] = readByte();
+    _doubleBufferUint8[6] = readByte();
+    _doubleBufferUint8[7] = readByte();
+    return _doubleBuffer[0];
+  }
+
   List<int> readByteList() {
     List<int> bytes = new Uint8List(readUInt());
     bytes.setRange(0, bytes.length, _bytes, _byteOffset);
@@ -174,7 +190,7 @@
       case ConstantTag.IntConstant:
         return new IntConstant((readExpression() as IntLiteral).value);
       case ConstantTag.DoubleConstant:
-        return new DoubleConstant(double.parse(readStringReference()));
+        return new DoubleConstant(readDouble());
       case ConstantTag.StringConstant:
         return new StringConstant(readStringReference());
       case ConstantTag.MapConstant:
@@ -857,7 +873,6 @@
     int fileOffset = readOffset();
     int fileEndOffset = readOffset();
     int flags = readByte();
-    int flags2 = readByte();
     var name = readName();
     var annotations = readAnnotationList(node);
     assert(() {
@@ -872,7 +887,6 @@
       node.fileOffset = fileOffset;
       node.fileEndOffset = fileEndOffset;
       node.flags = flags;
-      node.flags2 = flags2;
       node.name = name;
       node.fileUri = fileUri;
       node.annotations = annotations;
@@ -944,7 +958,6 @@
     int kindIndex = readByte();
     var kind = ProcedureKind.values[kindIndex];
     var flags = readByte();
-    var flags2 = readByte();
     var name = readName();
     var annotations = readAnnotationList(node);
     assert(() {
@@ -968,7 +981,6 @@
       node.fileEndOffset = fileEndOffset;
       node.kind = kind;
       node.flags = flags;
-      node.flags2 = flags2;
       node.name = name;
       node.fileUri = fileUri;
       node.annotations = annotations;
@@ -1337,7 +1349,7 @@
       case Tag.BigIntLiteral:
         return new IntLiteral(int.parse(readStringReference()));
       case Tag.DoubleLiteral:
-        return new DoubleLiteral(double.parse(readStringReference()));
+        return new DoubleLiteral(readDouble());
       case Tag.TrueLiteral:
         return new BoolLiteral(true);
       case Tag.FalseLiteral:
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 3c8dc01..7314521 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -147,7 +147,7 @@
       writeInteger(constant.value);
     } else if (constant is DoubleConstant) {
       writeByte(ConstantTag.DoubleConstant);
-      writeStringReference('${constant.value}');
+      writeDouble(constant.value);
     } else if (constant is StringConstant) {
       writeByte(ConstantTag.StringConstant);
       writeStringReference(constant.value);
@@ -830,7 +830,6 @@
     writeOffset(node.fileEndOffset);
     writeByte(node.kind.index);
     writeByte(node.flags);
-    writeByte(node.flags2);
     writeName(node.name ?? '');
     writeAnnotationList(node.annotations);
     writeOptionalReference(node.forwardingStubSuperTargetReference);
@@ -860,7 +859,6 @@
     writeOffset(node.fileOffset);
     writeOffset(node.fileEndOffset);
     writeByte(node.flags);
-    writeByte(node.flags2);
     writeName(node.name);
     writeAnnotationList(node.annotations);
     writeNode(node.type);
@@ -1240,13 +1238,12 @@
 
   @override
   void visitDoubleLiteral(DoubleLiteral node) {
+    writeByte(Tag.DoubleLiteral);
     writeDouble(node.value);
   }
 
   writeDouble(double value) {
-    // TODO: Pick a better format for double literals.
-    writeByte(Tag.DoubleLiteral);
-    writeStringReference('$value');
+    _sink.addDouble(value);
   }
 
   @override
@@ -2193,8 +2190,20 @@
   int length = 0;
   int flushedLength = 0;
 
+  Float64List _doubleBuffer = new Float64List(1);
+  Uint8List _doubleBufferUint8;
+
   BufferedSink(this._sink);
 
+  void addDouble(double d) {
+    _doubleBufferUint8 ??= _doubleBuffer.buffer.asUint8List();
+    _doubleBuffer[0] = d;
+    addByte4(_doubleBufferUint8[0], _doubleBufferUint8[1],
+        _doubleBufferUint8[2], _doubleBufferUint8[3]);
+    addByte4(_doubleBufferUint8[4], _doubleBufferUint8[5],
+        _doubleBufferUint8[6], _doubleBufferUint8[7]);
+  }
+
   void addByte(int byte) {
     _buffer[length++] = byte;
     if (length == SIZE) {
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index bc70203..877657f 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -135,7 +135,7 @@
   /// Internal version of kernel binary format.
   /// Bump it when making incompatible changes in kernel binaries.
   /// Keep in sync with runtime/vm/kernel_binary.h.
-  static const int BinaryFormatVersion = 4;
+  static const int BinaryFormatVersion = 5;
 }
 
 abstract class ConstantTag {
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index c104afe..b7cfe0a 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -424,9 +424,7 @@
         forwardingStubInterfaceTarget: node.forwardingStubInterfaceTarget)
       ..fileOffset = _cloneFileOffset(node.fileOffset)
       ..fileEndOffset = _cloneFileOffset(node.fileEndOffset)
-      ..isGenericContravariant = node.isGenericContravariant
-      ..flags = node.flags
-      ..flags2 = node.flags2;
+      ..flags = node.flags;
   }
 
   visitField(Field node) {
@@ -443,8 +441,7 @@
         fileUri: _activeFileUri)
       ..fileOffset = _cloneFileOffset(node.fileOffset)
       ..fileEndOffset = _cloneFileOffset(node.fileEndOffset)
-      ..flags = node.flags
-      ..flags2 = node.flags2;
+      ..flags = node.flags;
   }
 
   visitRedirectingFactoryConstructor(RedirectingFactoryConstructor node) {
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 1a19346..4ec4cbd 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -887,7 +887,6 @@
     writeModifier(node.isGenericCovariantImpl, 'generic-covariant-impl');
     writeModifier(
         node.isGenericCovariantInterface, 'generic-covariant-interface');
-    writeModifier(node.isGenericContravariant, 'generic-contravariant');
     writeModifier(node.isFinal, 'final');
     writeModifier(node.isConst, 'const');
     // Only show implicit getter/setter modifiers in cases where they are
@@ -928,7 +927,6 @@
     writeModifier(node.isAbstract, 'abstract');
     writeModifier(node.isForwardingStub, 'forwarding-stub');
     writeModifier(node.isForwardingSemiStub, 'forwarding-semi-stub');
-    writeModifier(node.isGenericContravariant, 'generic-contravariant');
     writeModifier(node.isNoSuchMethodForwarder, 'no-such-method-forwarder');
     writeWord(procedureKindToString(node.kind));
     if ((node.enclosingClass == null &&
diff --git a/pkg/kernel/lib/transformations/constants.dart b/pkg/kernel/lib/transformations/constants.dart
index c618d81..2c55885 100644
--- a/pkg/kernel/lib/transformations/constants.dart
+++ b/pkg/kernel/lib/transformations/constants.dart
@@ -18,6 +18,8 @@
 /// language.  Issue(http://dartbug.com/31799)
 library kernel.transformations.constants;
 
+import 'dart:io' as io;
+
 import '../kernel.dart';
 import '../ast.dart';
 import '../core_types.dart';
@@ -30,8 +32,10 @@
     {bool keepFields: false,
     bool strongMode: false,
     bool enableAsserts: false,
+    bool evaluateAnnotations: true,
     CoreTypes coreTypes,
-    ClassHierarchy hierarchy}) {
+    ClassHierarchy hierarchy,
+    ErrorReporter errorReporter: const _SimpleErrorReporter()}) {
   coreTypes ??= new CoreTypes(component);
   hierarchy ??= new ClassHierarchy(component);
 
@@ -41,7 +45,9 @@
   transformLibraries(component.libraries, backend, coreTypes, typeEnvironment,
       keepFields: keepFields,
       strongMode: strongMode,
-      enableAsserts: enableAsserts);
+      enableAsserts: enableAsserts,
+      evaluateAnnotations: evaluateAnnotations,
+      errorReporter: errorReporter);
   return component;
 }
 
@@ -49,47 +55,22 @@
     CoreTypes coreTypes, TypeEnvironment typeEnvironment,
     {bool keepFields: false,
     bool keepVariables: false,
+    bool evaluateAnnotations: true,
     bool strongMode: false,
-    bool enableAsserts: false}) {
+    bool enableAsserts: false,
+    ErrorReporter errorReporter: const _SimpleErrorReporter()}) {
   final ConstantsTransformer constantsTransformer = new ConstantsTransformer(
       backend,
       keepFields,
       keepVariables,
+      evaluateAnnotations,
       coreTypes,
       typeEnvironment,
       strongMode,
-      enableAsserts);
+      enableAsserts,
+      errorReporter);
   for (final Library library in libraries) {
-    for (final Field field in library.fields.toList()) {
-      constantsTransformer.convertField(field);
-    }
-    for (final Procedure procedure in library.procedures) {
-      constantsTransformer.convertProcedure(procedure);
-    }
-    for (final Class klass in library.classes) {
-      constantsTransformer.convertClassAnnotations(klass);
-
-      for (final Field field in klass.fields.toList()) {
-        constantsTransformer.convertField(field);
-      }
-      for (final Procedure procedure in klass.procedures) {
-        constantsTransformer.convertProcedure(procedure);
-      }
-      for (final Constructor constructor in klass.constructors) {
-        constantsTransformer.convertConstructor(constructor);
-      }
-    }
-    for (final Typedef td in library.typedefs) {
-      constantsTransformer.convertTypedef(td);
-    }
-
-    if (!keepFields) {
-      // The transformer API does not iterate over `Library.additionalExports`,
-      // so we manually delete the references to shaken nodes.
-      library.additionalExports.removeWhere((Reference reference) {
-        return reference.canonicalName == null;
-      });
-    }
+    constantsTransformer.convertLibrary(library);
   }
 }
 
@@ -101,56 +82,157 @@
   /// Whether to preserve constant [Field]s.  All use-sites will be rewritten.
   final bool keepFields;
   final bool keepVariables;
+  final bool evaluateAnnotations;
 
   ConstantsTransformer(
       ConstantsBackend backend,
       this.keepFields,
       this.keepVariables,
+      this.evaluateAnnotations,
       this.coreTypes,
       this.typeEnvironment,
       bool strongMode,
-      bool enableAsserts)
-      : constantEvaluator = new ConstantEvaluator(
-            backend, typeEnvironment, coreTypes, strongMode, enableAsserts);
+      bool enableAsserts,
+      ErrorReporter errorReporter)
+      : constantEvaluator = new ConstantEvaluator(backend, typeEnvironment,
+            coreTypes, strongMode, enableAsserts, errorReporter);
 
   // Transform the library/class members:
 
-  void convertClassAnnotations(Class klass) {
-    constantEvaluator.withNewEnvironment(() {
-      transformList(klass.annotations, this, klass);
-    });
+  void convertLibrary(Library library) {
+    transformAnnotations(library.annotations, library);
+
+    transformList(library.dependencies, this, library);
+    transformList(library.parts, this, library);
+    transformList(library.typedefs, this, library);
+    transformList(library.classes, this, library);
+    transformList(library.procedures, this, library);
+    transformList(library.fields, this, library);
+
+    if (!keepFields) {
+      // The transformer API does not iterate over `Library.additionalExports`,
+      // so we manually delete the references to shaken nodes.
+      library.additionalExports.removeWhere((Reference reference) {
+        return reference.canonicalName == null;
+      });
+    }
   }
 
-  void convertProcedure(Procedure procedure) {
+  visitLibraryPart(LibraryPart node) {
     constantEvaluator.withNewEnvironment(() {
-      procedure.accept(this);
+      transformAnnotations(node.annotations, node);
     });
+    return node;
   }
 
-  void convertConstructor(Constructor constructor) {
+  visitLibraryDependency(LibraryDependency node) {
     constantEvaluator.withNewEnvironment(() {
-      constructor.accept(this);
+      transformAnnotations(node.annotations, node);
     });
+    return node;
   }
 
-  void convertField(Field field) {
+  visitClass(Class node) {
     constantEvaluator.withNewEnvironment(() {
-      if (field.accept(this) == null) field.remove();
+      transformAnnotations(node.annotations, node);
+      transformList(node.fields, this, node);
+      transformList(node.typeParameters, this, node);
+      transformList(node.constructors, this, node);
+      transformList(node.procedures, this, node);
+      transformList(node.redirectingFactoryConstructors, this, node);
     });
+    return node;
   }
 
-  void convertTypedef(Typedef td) {
-    // A typedef can have annotations on variables which are constants.
+  visitProcedure(Procedure node) {
     constantEvaluator.withNewEnvironment(() {
-      td.accept(this);
+      transformAnnotations(node.annotations, node);
+      node.function = node.function.accept(this)..parent = node;
     });
+    return node;
+  }
+
+  visitConstructor(Constructor node) {
+    constantEvaluator.withNewEnvironment(() {
+      transformAnnotations(node.annotations, node);
+      transformList(node.initializers, this, node);
+      node.function = node.function.accept(this)..parent = node;
+    });
+    return node;
+  }
+
+  visitTypedef(Typedef node) {
+    constantEvaluator.withNewEnvironment(() {
+      transformAnnotations(node.annotations, node);
+    });
+    return node;
+  }
+
+  visitRedirectingFactoryConstructor(RedirectingFactoryConstructor node) {
+    constantEvaluator.withNewEnvironment(() {
+      transformAnnotations(node.annotations, node);
+      transformList(node.typeParameters, this, node);
+      transformList(node.positionalParameters, this, node);
+      transformList(node.namedParameters, this, node);
+    });
+    return node;
+  }
+
+  visitTypeParameter(TypeParameter node) {
+    transformAnnotations(node.annotations, node);
+    return node;
+  }
+
+  void transformAnnotations(List<Expression> nodes, TreeNode parent) {
+    if (evaluateAnnotations && nodes.length > 0) {
+      constantEvaluator.withNewEnvironment(() {
+        for (int i = 0; i < nodes.length; ++i) {
+          nodes[i] = tryEvaluateAndTransformWithContext(parent, nodes[i])
+            ..parent = parent;
+        }
+      });
+    }
   }
 
   // Handle definition of constants:
 
+  visitFunctionNode(FunctionNode node) {
+    final positionalParameterCount = node.positionalParameters.length;
+    for (int i = node.requiredParameterCount;
+        i < positionalParameterCount;
+        ++i) {
+      final VariableDeclaration variable = node.positionalParameters[i];
+      if (variable.initializer != null) {
+        variable.initializer =
+            tryEvaluateAndTransformWithContext(variable, variable.initializer)
+              ..parent = node;
+      }
+    }
+    for (final VariableDeclaration variable in node.namedParameters) {
+      if (variable.initializer != null) {
+        variable.initializer =
+            tryEvaluateAndTransformWithContext(variable, variable.initializer)
+              ..parent = node;
+      }
+    }
+    if (node.body != null) {
+      node.body = node.body.accept(this)..parent = node;
+    }
+    return node;
+  }
+
   visitVariableDeclaration(VariableDeclaration node) {
+    transformAnnotations(node.annotations, node);
+
     if (node.isConst) {
-      final Constant constant = constantEvaluator.evaluate(node.initializer);
+      final Constant constant = tryEvaluateWithContext(node, node.initializer);
+
+      // If there was a constant evaluation error we will not continue and
+      // simply keep the old [node].
+      if (constant == null) {
+        return node;
+      }
+
       constantEvaluator.env.addVariableValue(node, constant);
 
       if (keepVariables) {
@@ -170,20 +252,30 @@
   }
 
   visitField(Field node) {
-    if (node.isConst) {
-      // Since we convert all use-sites of constants, the constant [Field]
-      // cannot be referenced anymore.  We therefore get rid of it if
-      // [keepFields] was not specified.
-      if (!keepFields) return null;
+    return constantEvaluator.withNewEnvironment(() {
+      if (node.isConst) {
+        // Since we convert all use-sites of constants, the constant [Field]
+        // cannot be referenced anymore.  We therefore get rid of it if
+        // [keepFields] was not specified.
+        if (!keepFields) {
+          return null;
+        }
 
-      // Otherwise we keep the constant [Field] and convert it's initializer.
-      if (node.initializer != null) {
-        final Constant constant = constantEvaluator.evaluate(node.initializer);
-        node.initializer = new ConstantExpression(constant)..parent = node;
+        // Otherwise we keep the constant [Field] and convert it's initializer.
+        transformAnnotations(node.annotations, node);
+        if (node.initializer != null) {
+          node.initializer =
+              tryEvaluateAndTransformWithContext(node, node.initializer)
+                ..parent = node;
+        }
+      } else {
+        transformAnnotations(node.annotations, node);
+        if (node.initializer != null) {
+          node.initializer = node.initializer.accept(this)..parent = node;
+        }
       }
       return node;
-    }
-    return super.visitField(node);
+    });
   }
 
   // Handle use-sites of constants (and "inline" constant expressions):
@@ -191,44 +283,65 @@
   visitStaticGet(StaticGet node) {
     final Member target = node.target;
     if (target is Field && target.isConst) {
-      final Constant constant = constantEvaluator.evaluate(target.initializer);
-      return new ConstantExpression(constant);
+      final Constant constant =
+          tryEvaluateWithContext(node, target.initializer);
+      return constant != null ? new ConstantExpression(constant) : node;
     } else if (target is Procedure && target.kind == ProcedureKind.Method) {
-      final Constant constant = constantEvaluator.evaluate(node);
-      return new ConstantExpression(constant);
+      return tryEvaluateAndTransformWithContext(node, node);
     }
     return super.visitStaticGet(node);
   }
 
   visitVariableGet(VariableGet node) {
     if (node.variable.isConst) {
-      final Constant constant =
-          constantEvaluator.evaluate(node.variable.initializer);
-      return new ConstantExpression(constant);
+      return tryEvaluateAndTransformWithContext(node, node);
     }
     return super.visitVariableGet(node);
   }
 
   visitListLiteral(ListLiteral node) {
     if (node.isConst) {
-      return new ConstantExpression(constantEvaluator.evaluate(node));
+      return tryEvaluateAndTransformWithContext(node, node);
     }
     return super.visitListLiteral(node);
   }
 
   visitMapLiteral(MapLiteral node) {
     if (node.isConst) {
-      return new ConstantExpression(constantEvaluator.evaluate(node));
+      return tryEvaluateAndTransformWithContext(node, node);
     }
     return super.visitMapLiteral(node);
   }
 
   visitConstructorInvocation(ConstructorInvocation node) {
     if (node.isConst) {
-      return new ConstantExpression(constantEvaluator.evaluate(node));
+      return tryEvaluateAndTransformWithContext(node, node);
     }
     return super.visitConstructorInvocation(node);
   }
+
+  tryEvaluateAndTransformWithContext(TreeNode treeContext, Expression node) {
+    final Constant constant = tryEvaluateWithContext(treeContext, node);
+    return constant != null ? new ConstantExpression(constant) : node;
+  }
+
+  tryEvaluateWithContext(TreeNode treeContext, Expression node) {
+    if (treeContext == node) {
+      try {
+        return constantEvaluator.evaluate(node);
+      } on _AbortCurrentEvaluation catch (_) {
+        return null;
+      }
+    }
+
+    return constantEvaluator.runInsideContext(treeContext, () {
+      try {
+        return constantEvaluator.evaluate(node);
+      } on _AbortCurrentEvaluation catch (_) {
+        return null;
+      }
+    });
+  }
 }
 
 class ConstantEvaluator extends RecursiveVisitor {
@@ -237,19 +350,23 @@
   final TypeEnvironment typeEnvironment;
   final bool strongMode;
   final bool enableAsserts;
+  final ErrorReporter errorReporter;
 
   final Map<Constant, Constant> canonicalizationCache;
-  final Map<Node, Constant> nodeCache;
+  final Map<Node, Object> nodeCache;
 
   final NullConstant nullConstant = new NullConstant();
   final BoolConstant trueConstant = new BoolConstant(true);
   final BoolConstant falseConstant = new BoolConstant(false);
 
+  final List<TreeNode> contextChain = [];
+
   InstanceBuilder instanceBuilder;
   EvaluationEnvironment env;
 
   ConstantEvaluator(this.backend, this.typeEnvironment, this.coreTypes,
-      this.strongMode, this.enableAsserts)
+      this.strongMode, this.enableAsserts,
+      [this.errorReporter = const _SimpleErrorReporter()])
       : canonicalizationCache = <Constant, Constant>{},
         nodeCache = <Node, Constant>{};
 
@@ -257,16 +374,44 @@
   Constant evaluate(Expression node) {
     if (node == null) return nullConstant;
     if (env.isEmpty) {
-      return nodeCache.putIfAbsent(node, () => node.accept(this));
+      // We only try to evaluate the same [node] *once* within an empty
+      // environment.
+      if (nodeCache.containsKey(node)) {
+        final Constant constant = nodeCache[node];
+        if (constant == null) throw const _AbortCurrentEvaluation();
+        return constant;
+      }
+
+      nodeCache[node] = null;
+      return nodeCache[node] = node.accept(this);
     }
     return node.accept(this);
   }
 
+  Constant runInsideContext(TreeNode node, Constant fun()) {
+    try {
+      pushContext(node);
+      return fun();
+    } finally {
+      popContext(node);
+    }
+  }
+
+  pushContext(TreeNode contextNode) {
+    contextChain.add(contextNode);
+  }
+
+  popContext(TreeNode contextNode) {
+    assert(contextChain.last == contextNode);
+    contextChain.length = contextChain.length - 1;
+  }
+
   defaultTreeNode(Node node) {
     // Only a subset of the expression language is valid for constant
     // evaluation.
-    throw new ConstantEvaluationError(
+    errorReporter.unimplemented(contextChain, node,
         'Constant evaluation has no support for ${node.runtimeType} yet!');
+    throw const _AbortCurrentEvaluation();
   }
 
   visitNullLiteral(NullLiteral node) => nullConstant;
@@ -303,6 +448,10 @@
   }
 
   visitListLiteral(ListLiteral node) {
+    if (!node.isConst) {
+      errorReporter.nonConstantLiteral(contextChain, node, 'List');
+      throw const _AbortCurrentEvaluation();
+    }
     final List<Constant> entries = new List<Constant>(node.expressions.length);
     for (int i = 0; i < node.expressions.length; ++i) {
       entries[i] = node.expressions[i].accept(this);
@@ -313,6 +462,10 @@
   }
 
   visitMapLiteral(MapLiteral node) {
+    if (!node.isConst) {
+      errorReporter.nonConstantLiteral(contextChain, node, 'Map');
+      throw const _AbortCurrentEvaluation();
+    }
     final Set<Constant> usedKeys = new Set<Constant>();
     final List<ConstantMapEntry> entries =
         new List<ConstantMapEntry>(node.entries.length);
@@ -320,8 +473,8 @@
       final key = node.entries[i].key.accept(this);
       final value = node.entries[i].value.accept(this);
       if (!usedKeys.add(key)) {
-        throw new ConstantEvaluationError(
-            'Duplicate key "$key" in constant map literal.');
+        errorReporter.duplicateKey(contextChain, node.entries[i], key);
+        throw const _AbortCurrentEvaluation();
       }
       entries[i] = new ConstantMapEntry(key, value);
     }
@@ -335,6 +488,21 @@
   visitConstructorInvocation(ConstructorInvocation node) {
     final Constructor constructor = node.target;
     final Class klass = constructor.enclosingClass;
+    if (!constructor.isConst) {
+      errorReporter.nonConstConstructorInvocation(
+          contextChain, node, constructor);
+      throw const _AbortCurrentEvaluation();
+    }
+    if (constructor.function.body is! EmptyStatement) {
+      errorReporter.unreachable(contextChain, node,
+          'Constructor "$node" has non-trivial body "${constructor.function.body.runtimeType}".');
+      throw const _AbortCurrentEvaluation();
+    }
+    if (klass.isAbstract) {
+      errorReporter.unreachable(contextChain, node,
+          'Constructor "$node" belongs to abstract class "${klass}".');
+      throw const _AbortCurrentEvaluation();
+    }
 
     final typeArguments = evaluateTypeArguments(node.arguments);
     final positionals = evaluatePositionalArguments(node.arguments);
@@ -355,80 +523,87 @@
     });
   }
 
-  void handleConstructorInvocation(
+  handleConstructorInvocation(
       Constructor constructor,
       List<DartType> typeArguments,
       List<Constant> positionalArguments,
       Map<String, Constant> namedArguments) {
-    return withNewEnvironment(() {
-      final Class klass = constructor.enclosingClass;
-      final FunctionNode function = constructor.function;
+    return runInsideContext(constructor, () {
+      return withNewEnvironment(() {
+        final Class klass = constructor.enclosingClass;
+        final FunctionNode function = constructor.function;
 
-      // We simulate now the constructor invocation.
+        // We simulate now the constructor invocation.
 
-      // Step 1) Map type arguments and normal arguments from caller to callee.
-      for (int i = 0; i < klass.typeParameters.length; i++) {
-        env.addTypeParameterValue(klass.typeParameters[i], typeArguments[i]);
-      }
-      for (int i = 0; i < function.positionalParameters.length; i++) {
-        final VariableDeclaration parameter = function.positionalParameters[i];
-        final Constant value = (i < positionalArguments.length)
-            ? positionalArguments[i]
-            : evaluate(parameter.initializer);
-        env.addVariableValue(parameter, value);
-      }
-      for (final VariableDeclaration parameter in function.namedParameters) {
-        final Constant value =
-            namedArguments[parameter.name] ?? evaluate(parameter.initializer);
-        env.addVariableValue(parameter, value);
-      }
-
-      // Step 2) Run all initializers (including super calls) with environment setup.
-      for (final Field field in klass.fields) {
-        if (!field.isStatic) {
-          instanceBuilder.setFieldValue(field, evaluate(field.initializer));
+        // Step 1) Map type arguments and normal arguments from caller to callee.
+        for (int i = 0; i < klass.typeParameters.length; i++) {
+          env.addTypeParameterValue(klass.typeParameters[i], typeArguments[i]);
         }
-      }
-      for (final Initializer init in constructor.initializers) {
-        if (init is FieldInitializer) {
-          instanceBuilder.setFieldValue(init.field, evaluate(init.value));
-        } else if (init is LocalInitializer) {
-          final VariableDeclaration variable = init.variable;
-          env.addVariableValue(variable, evaluate(variable.initializer));
-        } else if (init is SuperInitializer) {
-          handleConstructorInvocation(
-              init.target,
-              evaluateSuperTypeArguments(constructor.enclosingClass.supertype),
-              evaluatePositionalArguments(init.arguments),
-              evaluateNamedArguments(init.arguments));
-        } else if (init is RedirectingInitializer) {
-          // Since a redirecting constructor targets a constructor of the same
-          // class, we pass the same [typeArguments].
-          handleConstructorInvocation(
-              init.target,
-              typeArguments,
-              evaluatePositionalArguments(init.arguments),
-              evaluateNamedArguments(init.arguments));
-        } else if (init is AssertInitializer) {
-          if (enableAsserts) {
-            final Constant condition = init.statement.condition.accept(this);
+        for (int i = 0; i < function.positionalParameters.length; i++) {
+          final VariableDeclaration parameter =
+              function.positionalParameters[i];
+          final Constant value = (i < positionalArguments.length)
+              ? positionalArguments[i]
+              : evaluate(parameter.initializer);
+          env.addVariableValue(parameter, value);
+        }
+        for (final VariableDeclaration parameter in function.namedParameters) {
+          final Constant value =
+              namedArguments[parameter.name] ?? evaluate(parameter.initializer);
+          env.addVariableValue(parameter, value);
+        }
 
-            if (condition is BoolConstant) {
-              if (!condition.value) {
-                final Constant message = init.statement.message?.accept(this);
-                throw new ConstantEvaluationError(
-                    'Assert initializer condition failed with message: $message.');
-              }
-            } else {
-              throw new ConstantEvaluationError(
-                  'Assert initializer did not evaluate to a boolean condition.');
-            }
+        // Step 2) Run all initializers (including super calls) with environment setup.
+        for (final Field field in klass.fields) {
+          if (!field.isStatic) {
+            instanceBuilder.setFieldValue(field, evaluate(field.initializer));
           }
-        } else {
-          throw new ConstantEvaluationError(
-              'Cannot evaluate constant with [${init.runtimeType}].');
         }
-      }
+        for (final Initializer init in constructor.initializers) {
+          if (init is FieldInitializer) {
+            instanceBuilder.setFieldValue(init.field, evaluate(init.value));
+          } else if (init is LocalInitializer) {
+            final VariableDeclaration variable = init.variable;
+            env.addVariableValue(variable, evaluate(variable.initializer));
+          } else if (init is SuperInitializer) {
+            handleConstructorInvocation(
+                init.target,
+                evaluateSuperTypeArguments(
+                    constructor.enclosingClass.supertype),
+                evaluatePositionalArguments(init.arguments),
+                evaluateNamedArguments(init.arguments));
+          } else if (init is RedirectingInitializer) {
+            // Since a redirecting constructor targets a constructor of the same
+            // class, we pass the same [typeArguments].
+            handleConstructorInvocation(
+                init.target,
+                typeArguments,
+                evaluatePositionalArguments(init.arguments),
+                evaluateNamedArguments(init.arguments));
+          } else if (init is AssertInitializer) {
+            if (enableAsserts) {
+              final Constant condition = init.statement.condition.accept(this);
+
+              if (condition is BoolConstant) {
+                if (!condition.value) {
+                  final Constant message = init.statement.message?.accept(this);
+                  errorReporter.failedAssertion(
+                      contextChain, init.statement.condition, message);
+                  throw const _AbortCurrentEvaluation();
+                }
+              } else {
+                errorReporter.invalidType(
+                    contextChain, init.statement.condition, condition, 'bool');
+                throw const _AbortCurrentEvaluation();
+              }
+            }
+          } else {
+            errorReporter.unimplemented(contextChain, init,
+                'No support for handling initializer of type "${init.runtimeType}".');
+            throw const _AbortCurrentEvaluation();
+          }
+        }
+      });
     });
   }
 
@@ -463,9 +638,14 @@
       if (arguments.length == 1) {
         switch (node.name.name) {
           case '+':
-            final StringConstant other = arguments[0];
-            return canonicalize(
-                new StringConstant(receiver.value + other.value));
+            final Constant other = arguments[0];
+            if (other is StringConstant) {
+              return canonicalize(
+                  new StringConstant(receiver.value + other.value));
+            }
+            errorReporter.invalidBinaryOperandType(
+                contextChain, node, 'String', '+', 'String', '$other');
+            throw const _AbortCurrentEvaluation();
         }
       }
     } else if (receiver is BoolConstant) {
@@ -488,8 +668,9 @@
                   : falseConstant;
           }
         }
-        throw new ConstantEvaluationError(
-            'Method "${node.name}" is only allowed with boolean arguments.');
+        errorReporter.invalidBinaryOperandType(
+            contextChain, node, 'bool', '${node.name.name}', 'bool', '$right');
+        throw const _AbortCurrentEvaluation();
       }
     } else if (receiver is IntConstant) {
       if (arguments.length == 0) {
@@ -526,8 +707,12 @@
               ? other.value
               : (other as DoubleConstant).value;
           return evaluateBinaryNumericOperation(
-              node.name.name, receiver.value, value);
+              node.name.name, receiver.value, value, node);
         }
+
+        errorReporter.invalidBinaryOperandType(contextChain, node, 'int',
+            '${node.name.name}', 'int/double', '$other');
+        throw const _AbortCurrentEvaluation();
       }
     } else if (receiver is DoubleConstant) {
       if (arguments.length == 0) {
@@ -543,14 +728,16 @@
               ? other.value
               : (other as DoubleConstant).value;
           return evaluateBinaryNumericOperation(
-              node.name.name, receiver.value, value);
+              node.name.name, receiver.value, value, node);
         }
+        errorReporter.invalidBinaryOperandType(contextChain, node, 'double',
+            '${node.name.name}', 'int/double', '$other');
+        throw const _AbortCurrentEvaluation();
       }
     }
-
-    throw new ConstantEvaluationError(
-        'Cannot evaluate general method invocation: '
-        'receiver: $receiver, method: ${node.name}, arguments: $arguments!');
+    errorReporter.invalidMethodInvocation(
+        contextChain, node, receiver, node.name.name);
+    throw const _AbortCurrentEvaluation();
   }
 
   visitLogicalExpression(LogicalExpression node) {
@@ -564,11 +751,13 @@
           if (right is BoolConstant) {
             return right;
           }
-          throw new ConstantEvaluationError(
-              '"$right" is not bool constant and is disallowed with "||".');
+          errorReporter.invalidBinaryOperandType(
+              contextChain, node, 'bool', '${node.operator}', 'bool', '$right');
+          throw const _AbortCurrentEvaluation();
         }
-        throw new ConstantEvaluationError(
-            '"$left" is not bool constant and is disallowed with "||".');
+        errorReporter.invalidMethodInvocation(
+            contextChain, node, left, '${node.operator}');
+        throw const _AbortCurrentEvaluation();
       case '&&':
         if (left is BoolConstant) {
           if (!left.value) return falseConstant;
@@ -577,16 +766,19 @@
           if (right is BoolConstant) {
             return right;
           }
-          throw new ConstantEvaluationError(
-              '"$right" is not bool constant and is disallowed with "&&".');
+          errorReporter.invalidBinaryOperandType(
+              contextChain, node, 'bool', '${node.operator}', 'bool', '$right');
+          throw const _AbortCurrentEvaluation();
         }
-        throw new ConstantEvaluationError(
-            '"$left" is not bool constant and is disallowed with "&&".');
+        errorReporter.invalidMethodInvocation(
+            contextChain, node, left, '${node.operator}');
+        throw const _AbortCurrentEvaluation();
       case '??':
         return (left is! NullConstant) ? left : evaluate(node.right);
       default:
-        throw new ConstantEvaluationError(
-            'No support for logical operator ${node.operator}.');
+        errorReporter.invalidMethodInvocation(
+            contextChain, node, left, '${node.operator}');
+        throw const _AbortCurrentEvaluation();
     }
   }
 
@@ -597,8 +789,8 @@
     } else if (constant == falseConstant) {
       return evaluate(node.otherwise);
     } else {
-      throw new ConstantEvaluationError(
-          'Cannot use $constant as condition in a conditional expression.');
+      errorReporter.invalidType(contextChain, node, constant, 'bool');
+      throw const _AbortCurrentEvaluation();
     }
   }
 
@@ -623,7 +815,6 @@
         }
       }
     }
-
     throw 'Could not evaluate property get on $receiver.';
   }
 
@@ -633,6 +824,19 @@
   }
 
   visitVariableGet(VariableGet node) {
+    // Not every variable which a [VariableGet] refers to must be marked as
+    // constant.  For example function parameters as well as constructs
+    // desugared to [Let] expressions are ok.
+    //
+    // TODO(kustermann): The heuristic of allowing all [VariableGet]s on [Let]
+    // variables might allow more than it should.
+    final VariableDeclaration variable = node.variable;
+    if (!variable.isConst &&
+        !_isFormalParameter(variable) &&
+        variable.parent is! Let) {
+      errorReporter.nonConstantVariableGet(contextChain, node);
+      throw const _AbortCurrentEvaluation();
+    }
     return env.lookupVariable(node.variable);
   }
 
@@ -640,11 +844,20 @@
     return withNewEnvironment(() {
       final Member target = node.target;
       if (target is Field && target.isConst) {
-        return evaluate(target.initializer);
+        return runInsideContext(target, () {
+          return evaluate(target.initializer);
+        });
       } else if (target is Procedure) {
-        return canonicalize(new TearOffConstant(target));
+        if (target.kind == ProcedureKind.Method) {
+          return canonicalize(new TearOffConstant(target));
+        }
+        errorReporter.invalidStaticInvocation(contextChain, node, target);
+        throw const _AbortCurrentEvaluation();
+      } else {
+        errorReporter.unreachable(contextChain, node,
+            'No support for ${target.runtimeType} in a static-get.');
+        throw const _AbortCurrentEvaluation();
       }
-      throw 'Could not handle static get of $target.';
     });
   }
 
@@ -663,55 +876,51 @@
       } else if (constant is StringConstant) {
         return constant.value;
       } else {
-        throw new ConstantEvaluationError(
-            'Only null/bool/int/double/String values are allowed as string '
-            'interpolation expressions during constant evaluation.');
+        errorReporter.invalidStringInterpolationOperand(
+            contextChain, node, constant);
+        throw const _AbortCurrentEvaluation();
       }
     }).join('');
     return canonicalize(new StringConstant(value));
   }
 
   visitStaticInvocation(StaticInvocation node) {
-    final Member target = node.target;
-    if (target is Procedure) {
-      if (target.kind == ProcedureKind.Factory) {
-        final String nativeName = findNativeName(target);
-        if (nativeName != null) {
-          final Constant constant = backend.buildConstantForNative(
-              nativeName,
-              evaluateTypeArguments(node.arguments),
-              evaluatePositionalArguments(node.arguments),
-              evaluateNamedArguments(node.arguments));
-          assert(constant != null);
-          return canonicalize(constant);
-        }
-      } else if (target.name.name == 'identical') {
-        // Ensure the "identical()" function comes from dart:core.
-        final parent = target.parent;
-        if (parent is Library && parent == coreTypes.coreLibrary) {
-          final positionalArguments =
-              evaluatePositionalArguments(node.arguments);
-          final Constant left = positionalArguments[0];
-          // TODO(http://dartbug.com/31799): Re-enable these checks.
-          //ensurePrimitiveConstant(left);
-          final Constant right = positionalArguments[1];
-          // TODO(http://dartbug.com/31799): Re-enable these checks.
-          //ensurePrimitiveConstant(right);
-          // Since we canonicalize constants during the evaluation, we can use
-          // identical here.
-          assert(left == right);
-          return identical(left, right) ? trueConstant : falseConstant;
-        }
+    final Procedure target = node.target;
+    if (target.kind == ProcedureKind.Factory) {
+      final String nativeName = findNativeName(target);
+      if (nativeName != null) {
+        final Constant constant = backend.buildConstantForNative(
+            nativeName,
+            evaluateTypeArguments(node.arguments),
+            evaluatePositionalArguments(node.arguments),
+            evaluateNamedArguments(node.arguments));
+        assert(constant != null);
+        return canonicalize(constant);
+      }
+    } else if (target.name.name == 'identical') {
+      // Ensure the "identical()" function comes from dart:core.
+      final parent = target.parent;
+      if (parent is Library && parent == coreTypes.coreLibrary) {
+        final positionalArguments = evaluatePositionalArguments(node.arguments);
+        final Constant left = positionalArguments[0];
+        // TODO(http://dartbug.com/31799): Re-enable these checks.
+        //ensurePrimitiveConstant(left, node);
+        final Constant right = positionalArguments[1];
+        // TODO(http://dartbug.com/31799): Re-enable these checks.
+        //ensurePrimitiveConstant(right, node);
+        // Since we canonicalize constants during the evaluation, we can use
+        // identical here.
+        assert(left == right);
+        return identical(left, right) ? trueConstant : falseConstant;
       }
     }
-
-    throw new ConstantEvaluationError(
-        'Calling "$target" during constant evaluation is disallowed.');
+    errorReporter.invalidStaticInvocation(contextChain, node, target);
+    throw const _AbortCurrentEvaluation();
   }
 
   visitAsExpression(AsExpression node) {
     final Constant constant = node.operand.accept(this);
-    ensureIsSubtype(constant, evaluateDartType(node.type));
+    ensureIsSubtype(constant, evaluateDartType(node.type), node);
     return constant;
   }
 
@@ -720,8 +929,8 @@
     if (constant is BoolConstant) {
       return constant == trueConstant ? falseConstant : trueConstant;
     }
-    throw new ConstantEvaluationError(
-        'A not expression must have a boolean operand.');
+    errorReporter.invalidType(contextChain, node, constant, 'bool');
+    throw const _AbortCurrentEvaluation();
   }
 
   visitSymbolLiteral(SymbolLiteral node) {
@@ -737,17 +946,21 @@
         return canonicalize(
             new PartialInstantiationConstant(constant, node.typeArguments));
       }
-      throw new ConstantEvaluationError(
+      errorReporter.unreachable(
+          contextChain,
+          node,
           'The number of type arguments supplied in the partial instantiation '
           'does not match the number of type arguments of the $constant.');
+      throw const _AbortCurrentEvaluation();
     }
-    throw new ConstantEvaluationError(
+    errorReporter.unreachable(contextChain, node,
         'Only tear-off constants can be partially instantiated.');
+    throw const _AbortCurrentEvaluation();
   }
 
   // Helper methods:
 
-  void ensureIsSubtype(Constant constant, DartType type) {
+  void ensureIsSubtype(Constant constant, DartType type, TreeNode node) {
     DartType constantType;
     if (constant is NullConstant) {
       constantType = new InterfaceType(coreTypes.nullClass);
@@ -772,13 +985,14 @@
     } else if (constant is TypeLiteralConstant) {
       constantType = new InterfaceType(coreTypes.typeClass);
     } else {
-      throw new ConstantEvaluationError(
-          'No support for obtaining the type of $constant.');
+      errorReporter.unreachable(contextChain, node,
+          'No support for ${constant.runtimeType}.runtimeType');
+      throw const _AbortCurrentEvaluation();
     }
 
     if (!typeEnvironment.isSubtypeOf(constantType, type)) {
-      throw new ConstantEvaluationError(
-          'Constant $constant is not a subtype of ${type}.');
+      errorReporter.invalidType(contextChain, node, constant, '$type');
+      throw const _AbortCurrentEvaluation();
     }
   }
 
@@ -821,33 +1035,37 @@
 
   withNewInstanceBuilder(Class klass, List<DartType> typeArguments, fn()) {
     InstanceBuilder old = instanceBuilder;
-    instanceBuilder = new InstanceBuilder(klass, typeArguments);
-    final result = fn();
-    instanceBuilder = old;
-    return result;
+    try {
+      instanceBuilder = new InstanceBuilder(klass, typeArguments);
+      return fn();
+    } finally {
+      instanceBuilder = old;
+    }
   }
 
   withNewEnvironment(fn()) {
     final EvaluationEnvironment oldEnv = env;
-    env = new EvaluationEnvironment();
-    final result = fn();
-    env = oldEnv;
-    return result;
+    try {
+      env = new EvaluationEnvironment();
+      return fn();
+    } finally {
+      env = oldEnv;
+    }
   }
 
-  ensurePrimitiveConstant(Constant value) {
+  ensurePrimitiveConstant(Constant value, TreeNode node) {
     if (value is! NullConstant &&
         value is! BoolConstant &&
         value is! IntConstant &&
         value is! DoubleConstant &&
         value is! StringConstant) {
-      throw new ConstantEvaluationError(
-          '"$value" is not a primitive constant (null/bool/int/double/string) '
-          ' and is disallowed in this context.');
+      errorReporter.invalidType(
+          contextChain, node, value, 'bool/int/double/Null/String');
+      throw const _AbortCurrentEvaluation();
     }
   }
 
-  evaluateBinaryNumericOperation(String op, num a, num b) {
+  evaluateBinaryNumericOperation(String op, num a, num b, TreeNode node) {
     num result;
     switch (op) {
       case '+':
@@ -887,8 +1105,8 @@
         return a > b ? trueConstant : falseConstant;
     }
 
-    throw new ConstantEvaluationError(
-        'Binary operation "$op" on num is disallowed.');
+    errorReporter.invalidBinaryMethodInvocation(contextChain, node, op);
+    throw const _AbortCurrentEvaluation();
   }
 
   int _wrapAroundInteger(int value) {
@@ -985,11 +1203,165 @@
   Constant lowerMapConstant(MapConstant constant);
 }
 
-/// Represents a compile-time error reported during constant evaluation.
-class ConstantEvaluationError {
-  final String message;
+// Used as control-flow to abort the current evaluation.
+class _AbortCurrentEvaluation {
+  const _AbortCurrentEvaluation();
+}
 
-  ConstantEvaluationError(this.message);
+abstract class ErrorReporter {
+  const ErrorReporter();
 
-  String toString() => 'Error during constant evaluation: $message';
+  invalidType(List<TreeNode> context, TreeNode node, Constant receiver,
+      String expectedType);
+  invalidBinaryOperandType(List<TreeNode> context, TreeNode node,
+      String receiverType, String op, String expectedType, String actualType);
+  invalidBinaryMethodInvocation(
+      List<TreeNode> context, TreeNode node, String op);
+  invalidMethodInvocation(
+      List<TreeNode> context, TreeNode node, Constant receiver, String op);
+  invalidStaticInvocation(
+      List<TreeNode> context, TreeNode node, Procedure target);
+  invalidStringInterpolationOperand(
+      List<TreeNode> context, TreeNode node, Constant constant);
+  duplicateKey(List<TreeNode> context, TreeNode node, Constant key);
+  nonConstantLiteral(List<TreeNode> context, TreeNode node, String literalType);
+  nonConstantVariableGet(List<TreeNode> context, VariableGet node);
+  nonConstConstructorInvocation(
+      List<TreeNode> context, TreeNode node, Constructor target);
+  failedAssertion(List<TreeNode> context, TreeNode node, Constant message);
+  unimplemented(List<TreeNode> context, TreeNode node, String message);
+  unreachable(List<TreeNode> context, TreeNode node, String message);
+}
+
+abstract class ErrorReporterBase implements ErrorReporter {
+  const ErrorReporterBase();
+
+  report(List<TreeNode> context, String message, TreeNode node);
+
+  getFileUri(TreeNode node) {
+    while (node is! FileUriNode) {
+      node = node.parent;
+    }
+    return (node as FileUriNode).fileUri;
+  }
+
+  getFileOffset(TreeNode node) {
+    while (node.fileOffset == TreeNode.noOffset) {
+      node = node.parent;
+    }
+    return node == null ? TreeNode.noOffset : node.fileOffset;
+  }
+
+  invalidType(List<TreeNode> context, TreeNode node, Constant receiver,
+      String expectedType) {
+    report(
+        context,
+        'Expected expression to evaluate to "$expectedType" but got "$receiver.',
+        node);
+  }
+
+  invalidBinaryOperandType(List<TreeNode> context, TreeNode node,
+      String receiverType, String op, String expectedType, String actualType) {
+    report(
+        context,
+        'Calling "$op" on "$receiverType" needs operand of type '
+        '"$expectedType" (but got "$actualType")',
+        node);
+  }
+
+  invalidBinaryMethodInvocation(
+      List<TreeNode> context, TreeNode node, String op) {
+    report(context, 'Cannot call "$op" on a numeric constant receiver', node);
+  }
+
+  invalidMethodInvocation(
+      List<TreeNode> context, TreeNode node, Constant receiver, String op) {
+    report(context, 'Cannot call "$op" on "$receiver" in constant expression',
+        node);
+  }
+
+  invalidStaticInvocation(
+      List<TreeNode> context, TreeNode node, Procedure target) {
+    report(
+        context, 'Cannot invoke "$target" inside a constant expression', node);
+  }
+
+  invalidStringInterpolationOperand(
+      List<TreeNode> context, TreeNode node, Constant constant) {
+    report(
+        context,
+        'Only null/bool/int/double/String values are allowed as string '
+        'interpolation expressions during constant evaluation (was: "$constant").',
+        node);
+  }
+
+  duplicateKey(List<TreeNode> context, TreeNode node, Constant key) {
+    report(
+        context,
+        'Duplicate keys are not allowed in constant maps (found duplicate key "$key")',
+        node);
+  }
+
+  nonConstantLiteral(
+      List<TreeNode> context, TreeNode node, String literalType) {
+    report(
+        context,
+        '"$literalType" literals inside constant expressions are required to '
+        'be constant.',
+        node);
+  }
+
+  nonConstantVariableGet(List<TreeNode> context, VariableGet node) {
+    report(
+        context,
+        'The variable "${node.variable.name}" is non-const and '
+        'can therefore not be used inside a constant expression.'
+        ' (${node}, ${node.parent.parent}, )',
+        node);
+  }
+
+  nonConstConstructorInvocation(
+      List<TreeNode> context, TreeNode node, Constructor target) {
+    report(
+        context,
+        'The non-const constructor "$target" cannot be called inside a '
+        'constant expression',
+        node);
+  }
+
+  failedAssertion(List<TreeNode> context, TreeNode node, Constant message) {
+    report(
+        context,
+        'The assertion condition evaluated to "false" with message "$message"',
+        node);
+  }
+
+  unimplemented(List<TreeNode> context, TreeNode node, String message) {
+    report(context, 'Unimplemented: $message', node);
+  }
+
+  unreachable(List<TreeNode> context, TreeNode node, String message) {
+    report(context, 'Unreachable: $message', node);
+  }
+}
+
+class _SimpleErrorReporter extends ErrorReporterBase {
+  const _SimpleErrorReporter();
+
+  report(List<TreeNode> context, String message, TreeNode node) {
+    io.exitCode = 42;
+    final Uri uri = getFileUri(node);
+    final int fileOffset = getFileOffset(node);
+
+    io.stderr.writeln('$uri:$fileOffset Constant evaluation error: $message');
+  }
+}
+
+bool _isFormalParameter(VariableDeclaration variable) {
+  final parent = variable.parent;
+  if (parent is FunctionNode) {
+    return parent.positionalParameters.contains(variable) ||
+        parent.namedParameters.contains(variable);
+  }
+  return false;
 }
diff --git a/pkg/kernel/pubspec.yaml b/pkg/kernel/pubspec.yaml
index a08802c..9e5e4f8 100644
--- a/pkg/kernel/pubspec.yaml
+++ b/pkg/kernel/pubspec.yaml
@@ -1,5 +1,5 @@
 name: kernel
-version: 0.3.0-alpha.11
+version: 0.3.0-alpha.12
 author: Dart Team <misc@dartlang.org>
 description: Dart IR (Intermediate Representation)
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/kernel
@@ -12,7 +12,7 @@
   package_config: ^1.0.0
 dev_dependencies:
   analyzer: '>=0.30.0 <0.32.0'
-  front_end: 0.1.0-alpha.11
+  front_end: 0.1.0-alpha.12
   test: ^0.12.15+6
   stack_trace: ^1.6.6
   ansicolor: ^0.0.9
diff --git a/pkg/sourcemap_testing/lib/src/annotated_code_helper.dart b/pkg/sourcemap_testing/lib/src/annotated_code_helper.dart
index b446f0e..d6291b9 100644
--- a/pkg/sourcemap_testing/lib/src/annotated_code_helper.dart
+++ b/pkg/sourcemap_testing/lib/src/annotated_code_helper.dart
@@ -25,6 +25,9 @@
   final String text;
 
   Annotation(this.lineNo, this.columnNo, this.offset, this.text);
+
+  String toString() =>
+      'Annotation(lineNo=$lineNo,columnNo=$columnNo,offset=$offset,text=$text)';
 }
 
 /// A source code text with annotated positions.
@@ -183,17 +186,30 @@
   for (String prefix in prefixes) {
     map[prefix] = <Annotation>[];
   }
-  outer:
   for (Annotation annotation in annotatedCode.annotations) {
-    for (String prefix in prefixes) {
-      if (annotation.text.startsWith(prefix)) {
-        map[prefix].add(new Annotation(annotation.lineNo, annotation.columnNo,
-            annotation.offset, annotation.text.substring(prefix.length)));
-        continue outer;
-      }
+    String annotationText = annotation.text;
+    String annotationPrefix;
+    bool not = false;
+    if (annotationText.startsWith('!')) {
+      annotationText = annotationText.substring(1);
+      not = true;
     }
     for (String prefix in prefixes) {
-      map[prefix].add(annotation);
+      if (annotationText.startsWith(prefix)) {
+        annotationPrefix = prefix;
+        annotation = new Annotation(annotation.lineNo, annotation.columnNo,
+            annotation.offset, annotationText.substring(prefix.length));
+      }
+    }
+
+    for (String prefix in prefixes) {
+      if (annotationPrefix == null) {
+        map[prefix].add(annotation);
+      } else if (annotationPrefix != prefix && not) {
+        map[prefix].add(annotation);
+      } else if (annotationPrefix == prefix && !not) {
+        map[prefix].add(annotation);
+      }
     }
   }
   Map<String, AnnotatedCode> split = <String, AnnotatedCode>{};
diff --git a/pkg/vm/lib/transformations/no_dynamic_invocations_annotator.dart b/pkg/vm/lib/transformations/no_dynamic_invocations_annotator.dart
index 9806c89..aff93fa 100644
--- a/pkg/vm/lib/transformations/no_dynamic_invocations_annotator.dart
+++ b/pkg/vm/lib/transformations/no_dynamic_invocations_annotator.dart
@@ -164,6 +164,13 @@
   }
 
   @override
+  visitConstantExpression(ConstantExpression node) {
+    // We run the kernel2kernel "constants" transformation before running the
+    // this transformation, so we will encounter constant expressions.
+    // We don't need to do anything here, because there are no invocations.
+  }
+
+  @override
   visitMethodInvocation(MethodInvocation node) {
     super.visitMethodInvocation(node);
 
diff --git a/runtime/bin/io_buffer.cc b/runtime/bin/io_buffer.cc
index ec8962a..b213a85 100644
--- a/runtime/bin/io_buffer.cc
+++ b/runtime/bin/io_buffer.cc
@@ -12,9 +12,8 @@
   if (data == NULL) {
     return Dart_Null();
   }
-  Dart_Handle result =
-      Dart_NewExternalTypedData(Dart_TypedData_kUint8, data, size);
-  Dart_NewWeakPersistentHandle(result, data, size, IOBuffer::Finalizer);
+  Dart_Handle result = Dart_NewExternalTypedDataWithFinalizer(
+      Dart_TypedData_kUint8, data, size, data, size, IOBuffer::Finalizer);
 
   if (Dart_IsError(result)) {
     Free(data);
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 1e9e8e1..7d7a298 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -2086,9 +2086,8 @@
  * Returns a TypedData object which references an external data array.
  *
  * \param type The type of the data array.
- * \param value A data array. This array must not move.
+ * \param data A data array. This array must not move.
  * \param length The length of the data array (length in type units).
- * \param peer An external pointer to associate with this array.
  *
  * \return The TypedData object if no error occurs. Otherwise returns
  *   an error handle.
@@ -2098,6 +2097,31 @@
                                                   intptr_t length);
 
 /**
+ * Returns a TypedData object which references an external data array.
+ *
+ * \param type The type of the data array.
+ * \param data A data array. This array must not move.
+ * \param length The length of the data array (length in type units).
+ * \param peer A pointer to a native object or NULL.  This value is
+ *   provided to callback when it is invoked.
+ * \param external_allocation_size The number of externally allocated
+ *   bytes for peer. Used to inform the garbage collector.
+ * \param callback A function pointer that will be invoked sometime
+ *   after the object is garbage collected, unless the handle has been deleted.
+ *   A valid callback needs to be specified it cannot be NULL.
+ *
+ * \return The TypedData object if no error occurs. Otherwise returns
+ *   an error handle.
+ */
+DART_EXPORT Dart_Handle Dart_NewExternalTypedDataWithFinalizer(
+    Dart_TypedData_Type type,
+    void* data,
+    intptr_t length,
+    void* peer,
+    intptr_t external_allocation_size,
+    Dart_WeakPersistentHandleFinalizer callback);
+
+/**
  * Returns a ByteBuffer object for the typed data.
  *
  * \param type_data The TypedData object.
diff --git a/runtime/lib/vmservice.cc b/runtime/lib/vmservice.cc
index eeeeb50..fce6e21 100644
--- a/runtime/lib/vmservice.cc
+++ b/runtime/lib/vmservice.cc
@@ -403,11 +403,10 @@
         FilenameFinalizer);
     ASSERT(!Dart_IsError(dart_filename));
 
-    Dart_Handle dart_contents = Dart_NewExternalTypedData(
-        Dart_TypedData_kUint8, contents, contents_length);
+    Dart_Handle dart_contents = Dart_NewExternalTypedDataWithFinalizer(
+        Dart_TypedData_kUint8, contents, contents_length, contents,
+        contents_length, ContentsFinalizer);
     ASSERT(!Dart_IsError(dart_contents));
-    Dart_NewWeakPersistentHandle(dart_contents, contents, contents_length,
-                                 ContentsFinalizer);
 
     Dart_ListSetAt(result_list, idx, dart_filename);
     Dart_ListSetAt(result_list, (idx + 1), dart_contents);
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index 10e307c..ef225bc 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -245,13 +245,6 @@
 #error Architecture was not detected as supported by Dart.
 #endif
 
-#if defined(TARGET_ARCH_ARM64) || defined(TARGET_ARCH_X64)
-// On 64 bit architectures the optimizing compilers should prefer unboxed int64
-// and unboxed uint32 values, which have direct support in the instruction set.
-// We avoid the unboxed signed int32 type.
-#define AVOID_UNBOXED_INT32 1
-#endif
-
 // DART_FORCE_INLINE strongly hints to the compiler that a function should
 // be inlined. Your function is not guaranteed to be inlined but this is
 // stronger than just using "inline".
diff --git a/runtime/platform/utils.h b/runtime/platform/utils.h
index c717cbc..2917008 100644
--- a/runtime/platform/utils.h
+++ b/runtime/platform/utils.h
@@ -317,7 +317,7 @@
   static uword NBitMask(uint32_t n) {
     ASSERT(n <= kBitsPerWord);
     if (n == kBitsPerWord) {
-#if defined(ARCH_IS_64_BIT)
+#if defined(TARGET_ARCH_X64)
       return 0xffffffffffffffffll;
 #else
       return 0xffffffff;
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 650db2a..e465222 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -5348,6 +5348,13 @@
 }
 
 RawApiError* Deserializer::VerifyVersionAndFeatures(Isolate* isolate) {
+  if (image_reader_ != NULL) {
+    RawApiError* error = image_reader_->VerifyAlignment();
+    if (error != ApiError::null()) {
+      return error;
+    }
+  }
+
   // If the version string doesn't match, return an error.
   // Note: New things are allocated only if we're going to return an error.
 
diff --git a/runtime/vm/compiler/assembler/assembler_arm.h b/runtime/vm/compiler/assembler/assembler_arm.h
index 9b81f54..ab6f811 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.h
+++ b/runtime/vm/compiler/assembler/assembler_arm.h
@@ -141,11 +141,6 @@
                 static_cast<uint32_t>(rm);
   }
 
-  static bool CanHold(uint32_t immediate) {
-    Operand dummy;
-    return CanHold(immediate, &dummy);
-  }
-
   static bool CanHold(uint32_t immediate, Operand* o) {
     // Avoid the more expensive test for frequent small immediate values.
     if (immediate < (1 << kImmed8Bits)) {
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index 255c85b..a322f7c 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -660,43 +660,24 @@
   blr(TMP);
 }
 
-void Assembler::AddImmediate(Register dest,
-                             Register rn,
-                             int64_t imm,
-                             OperandSize sz) {
+void Assembler::AddImmediate(Register dest, Register rn, int64_t imm) {
   Operand op;
   if (imm == 0) {
     if (dest != rn) {
-      if (sz == kWord) {
-        uxtw(dest, rn);
-      } else {
-        mov(dest, rn);
-      }
+      mov(dest, rn);
     }
     return;
   }
   if (Operand::CanHold(imm, kXRegSizeInBits, &op) == Operand::Immediate) {
-    if (sz == kDoubleWord) {
-      add(dest, rn, op);
-    } else {
-      addw(dest, rn, op);
-    }
+    add(dest, rn, op);
   } else if (Operand::CanHold(-imm, kXRegSizeInBits, &op) ==
              Operand::Immediate) {
-    if (sz == kDoubleWord) {
-      sub(dest, rn, op);
-    } else {
-      subw(dest, rn, op);
-    }
+    sub(dest, rn, op);
   } else {
     // TODO(zra): Try adding top 12 bits, then bottom 12 bits.
     ASSERT(rn != TMP2);
     LoadImmediate(TMP2, imm);
-    if (sz == kDoubleWord) {
-      add(dest, rn, Operand(TMP2));
-    } else {
-      addw(dest, rn, Operand(TMP2));
-    }
+    add(dest, rn, Operand(TMP2));
   }
 }
 
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index 437c246..5a6a9d1 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -390,17 +390,6 @@
   // undefined.
   static bool IsImmLogical(uint64_t value, uint8_t width, Operand* imm_op);
 
-  static bool IsImmLogical(int64_t imm) {
-    Operand operand;
-    return IsImmLogical(imm, kXRegSizeInBits, &operand);
-  }
-
-  static bool IsImmArithmethic(int64_t imm) {
-    Operand operand;
-    CanHold(imm, kXRegSizeInBits, &operand);
-    return operand.type_ == Immediate;
-  }
-
   // An immediate imm can be an operand to add/sub when the return value is
   // Immediate, or a logical operation over sz bits when the return value is
   // BitfieldImm. If the return value is Unknown, then the immediate can't be
@@ -1418,10 +1407,7 @@
   // the object pool when possible. Unless you are sure that the untagged object
   // pool pointer is in another register, or that it is not available at all,
   // PP should be passed for pp.
-  void AddImmediate(Register dest,
-                    Register rn,
-                    int64_t imm,
-                    OperandSize sz = kDoubleWord);
+  void AddImmediate(Register dest, Register rn, int64_t imm);
   void AddImmediateSetFlags(Register dest,
                             Register rn,
                             int64_t imm,
@@ -1641,27 +1627,6 @@
 #endif
   }
 
-  void AssertValidUint32(Register r) {
-#if defined(DEBUG)
-    Label ok;
-    cmp(ZR, Operand(r, LSR, 32));
-    b(&ok, EQ);
-    Stop("uint32 should be zero extended");
-    Bind(&ok);
-#endif
-  }
-
-  void AssertValidSignExtendedInt32(Register r) {
-#if defined(DEBUGFOO)
-    Label ok;
-    AsrImmediate(TMP, r, 63);  // 0 or -1.
-    cmp(TMP, Operand(r, ASR, 31));
-    b(&ok, EQ);
-    Stop("int32 should be sign extended");
-    Bind(&ok);
-#endif
-  }
-
  private:
   AssemblerBuffer buffer_;  // Contains position independent code.
   ObjectPoolWrapper object_pool_wrapper_;
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index 70c492a..5d9375d3 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -977,24 +977,6 @@
   static bool IsSafe(const Object& object) { return true; }
   static bool IsSafeSmi(const Object& object) { return object.IsSmi(); }
 
-  void AssertValidUint32(Register r) {
-    Label ok;
-    movl(TMP, r);
-    cmpq(TMP, r);
-    j(EQUAL, &ok);
-    Stop("uint32 should be zero extended");
-    Bind(&ok);
-  }
-
-  void AssertValidSignExtendedInt32(Register r) {
-    Label ok;
-    movsxd(TMP, r);
-    cmpq(TMP, r);
-    j(EQUAL, &ok);
-    Stop("int32 should be sign extended");
-    Bind(&ok);
-  }
-
  private:
   AssemblerBuffer buffer_;
 
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index df9fc5b..499bfc7 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -1643,14 +1643,10 @@
     }
 
     if (should_unbox) {
-#if defined(AVOID_UNBOXED_INT32)
-      unboxed = kUnboxedInt64;
-#else
       unboxed =
           RangeUtils::Fits(phi->range(), RangeBoundary::kRangeBoundaryInt32)
               ? kUnboxedInt32
               : kUnboxedInt64;
-#endif
     }
   }
 
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 772b0e8..fa6d94a 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -776,7 +776,9 @@
 
 const Object& Value::BoundConstant() const {
   ASSERT(BindsToConstant());
-  return definition()->AsConstant()->value();
+  ConstantInstr* constant = definition()->AsConstant();
+  ASSERT(constant != NULL);
+  return constant->value();
 }
 
 GraphEntryInstr::GraphEntryInstr(const ParsedFunction& parsed_function,
@@ -1867,9 +1869,9 @@
 
     case Token::kBIT_NOT:
       if (value.IsSmi()) {
-        result = Integer::New(~Smi::Cast(value).Value(), Heap::kOld);
+        result = Integer::New(~Smi::Cast(value).Value());
       } else if (value.IsMint()) {
-        result = Integer::New(~Mint::Cast(value).value(), Heap::kOld);
+        result = Integer::New(~Mint::Cast(value).value());
       }
       break;
 
@@ -2104,7 +2106,7 @@
     case Token::kBIT_AND:
       if (rhs == 0) {
         return right()->definition();
-      } else if ((rhs & range_mask) == range_mask) {
+      } else if (rhs == range_mask) {
         return left()->definition();
       }
       break;
@@ -2493,11 +2495,9 @@
     Definition* replacement = this;
 
     switch (conv->from()) {
-#if !defined(AVOID_UNBOXED_INT32)
       case kUnboxedInt32:
         replacement = new BoxInt32Instr(conv->value()->CopyWithType());
         break;
-#endif
       case kUnboxedUint32:
         replacement = new BoxUint32Instr(conv->value()->CopyWithType());
         break;
@@ -2675,35 +2675,6 @@
     return replacement;
   }
 
-  if (value()->BindsToConstant()) {
-    const Object& input = value()->BoundConstant();
-    int64_t constant;
-    if (input.IsSmi()) {
-      constant = Smi::Cast(input).Value();
-    } else if (input.IsMint()) {
-      constant = Mint::Cast(input).value();
-    } else {
-      return this;
-    }
-    Definition* replacement = NULL;
-    if (to() == kUnboxedUint32) {
-      const Object& cast = Integer::Handle(
-          flow_graph->zone(),
-          Integer::New(static_cast<uint32_t>(constant), Heap::kOld));
-      replacement = new UnboxedConstantInstr(cast, kUnboxedUint32);
-    } else if (to() == kUnboxedInt32) {
-      const Object& cast = Integer::Handle(
-          flow_graph->zone(),
-          Integer::New(static_cast<int32_t>(constant), Heap::kOld));
-      replacement = new UnboxedConstantInstr(cast, kUnboxedUint32);
-    } else if (to() == kUnboxedInt64) {
-      replacement = new UnboxedConstantInstr(input, kUnboxedInt64);
-    }
-    if (replacement != NULL) {
-      flow_graph->InsertBefore(this, replacement, env(), FlowGraph::kValue);
-      return replacement;
-    }
-  }
   return this;
 }
 
@@ -3049,10 +3020,8 @@
 
 BoxInstr* BoxInstr::Create(Representation from, Value* value) {
   switch (from) {
-#if !defined(AVOID_UNBOXED_INT32)
     case kUnboxedInt32:
       return new BoxInt32Instr(value);
-#endif
 
     case kUnboxedUint32:
       return new BoxUint32Instr(value);
@@ -3077,11 +3046,10 @@
                                intptr_t deopt_id,
                                SpeculativeMode speculative_mode) {
   switch (to) {
-#if !defined(AVOID_UNBOXED_INT32)
     case kUnboxedInt32:
       return new UnboxInt32Instr(UnboxInt32Instr::kNoTruncation, value,
                                  deopt_id, speculative_mode);
-#endif
+
     case kUnboxedUint32:
       return new UnboxUint32Instr(value, deopt_id, speculative_mode);
 
@@ -4793,7 +4761,7 @@
 // Make representaion from type name used by SIMD_OP_LIST.
 #define REP(T) (kUnboxed##T)
 static const Representation kUnboxedBool = kTagged;
-static const Representation kUnboxedInt8 = kUnboxedUint32;
+static const Representation kUnboxedInt8 = kUnboxedInt32;
 
 #define ENCODE_INPUTS_0()
 #define ENCODE_INPUTS_1(In0) REP(In0)
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 6fd8fdd..62ebc72 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -2012,12 +2012,7 @@
 
   virtual Representation representation() const { return representation_; }
 
-  virtual void set_representation(Representation r) {
-#if defined(AVOID_UNBOXED_INT32)
-    ASSERT(r != kUnboxedInt32);
-#endif
-    representation_ = r;
-  }
+  virtual void set_representation(Representation r) { representation_ = r; }
 
   virtual intptr_t Hashcode() const {
     UNREACHABLE();
@@ -2804,14 +2799,13 @@
 
   virtual TokenPosition token_pos() const { return token_pos_; }
 
-  bool IsUnboxedIntegerConstant() const {
-    return representation() == kUnboxedUint32 ||
-           representation() == kUnboxedInt32 ||
+  bool IsUnboxedSignedIntegerConstant() const {
+    return representation() == kUnboxedInt32 ||
            representation() == kUnboxedInt64;
   }
 
-  int64_t GetUnboxedIntegerConstantValue() const {
-    ASSERT(IsUnboxedIntegerConstant());
+  int64_t GetUnboxedSignedIntegerConstantValue() const {
+    ASSERT(IsUnboxedSignedIntegerConstant());
     return value_.IsSmi() ? Smi::Cast(value_).Value()
                           : Mint::Cast(value_).value();
   }
@@ -5434,11 +5428,7 @@
                             truncation_mode,
                             value,
                             deopt_id,
-                            speculative_mode) {
-#if defined(AVOID_UNBOXED_INT32)
-    UNREACHABLE();
-#endif
-  }
+                            speculative_mode) {}
 
   virtual bool ComputeCanDeoptimize() const;
 
@@ -6974,15 +6964,10 @@
         to_representation_(to),
         is_truncating_(to == kUnboxedUint32) {
     ASSERT(from != to);
-#if !defined(AVOID_UNBOXED_INT32)
     ASSERT((from == kUnboxedInt64) || (from == kUnboxedUint32) ||
            (from == kUnboxedInt32));
     ASSERT((to == kUnboxedInt64) || (to == kUnboxedUint32) ||
            (to == kUnboxedInt32));
-#else
-    ASSERT((from == kUnboxedInt64) || (from == kUnboxedUint32));
-    ASSERT((to == kUnboxedInt64) || (to == kUnboxedUint32));
-#endif
     SetInputAt(0, value);
   }
 
@@ -7090,12 +7075,6 @@
 #define SIMD_CONVERSION(M, FromType, ToType)                                   \
   M(1, _, FromType##To##ToType, (FromType), ToType)
 
-#if defined(AVOID_UNBOXED_INT32)
-#define Int32x4Arg Uint32
-#else
-#define Int32x4Arg Int32
-#endif
-
 // List of all recognized SIMD operations.
 // Note: except for operations that map to operators (Add, Mul, Sub, Div,
 // BitXor, BitOr) all other operations must match names used by
@@ -7121,8 +7100,7 @@
   M(2, _, Float32x4LessThan, (Float32x4, Float32x4), Int32x4)                  \
   M(2, _, Float32x4LessThanOrEqual, (Float32x4, Float32x4), Int32x4)           \
   M(2, _, Float32x4NotEqual, (Float32x4, Float32x4), Int32x4)                  \
-  M(4, _, Int32x4Constructor,                                                  \
-    (Int32x4Arg, Int32x4Arg, Int32x4Arg, Int32x4Arg), Int32x4)                 \
+  M(4, _, Int32x4Constructor, (Int32, Int32, Int32, Int32), Int32x4)           \
   M(4, _, Int32x4BoolConstructor, (Bool, Bool, Bool, Bool), Int32x4)           \
   M(4, _, Float32x4Constructor, (Double, Double, Double, Double), Float32x4)   \
   M(2, _, Float64x2Constructor, (Double, Double), Float64x2)                   \
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 6e310bf..9b5729c 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -328,8 +328,7 @@
                                        const Location& destination,
                                        Register tmp) {
   if (destination.IsRegister()) {
-    if (representation() == kUnboxedInt32 ||
-        representation() == kUnboxedUint32) {
+    if (representation() == kUnboxedInt32) {
       __ LoadImmediate(destination.reg(), Smi::Cast(value_).Value());
     } else {
       ASSERT(representation() == kTagged);
@@ -5986,45 +5985,34 @@
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
-  ConstantInstr* right_constant = right()->definition()->AsConstant();
-  if (right_constant != NULL && op_kind() != Token::kMUL &&
-      right_constant->value().IsSmi() &&
-      Operand::CanHold(Smi::Cast(right_constant->value()).Value())) {
-    summary->set_in(1, Location::Constant(right_constant));
-  } else {
-    summary->set_in(1, Location::RequiresRegister());
-  }
   return summary;
 }
 
 void BinaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register left = locs()->in(0).reg();
+  Register right = locs()->in(1).reg();
   Register out = locs()->out(0).reg();
   ASSERT(out != left);
-  Location r = locs()->in(1);
-  if (op_kind() == Token::kMUL) {
-    __ mul(out, left, r.reg());
-    return;
-  }
-  const Operand right = r.IsRegister()
-                            ? Operand(r.reg())
-                            : Operand(Smi::Cast(r.constant()).Value());
   switch (op_kind()) {
     case Token::kBIT_AND:
-      __ and_(out, left, right);
+      __ and_(out, left, Operand(right));
       break;
     case Token::kBIT_OR:
-      __ orr(out, left, right);
+      __ orr(out, left, Operand(right));
       break;
     case Token::kBIT_XOR:
-      __ eor(out, left, right);
+      __ eor(out, left, Operand(right));
       break;
     case Token::kADD:
-      __ add(out, left, right);
+      __ add(out, left, Operand(right));
       break;
     case Token::kSUB:
-      __ sub(out, left, right);
+      __ sub(out, left, Operand(right));
+      break;
+    case Token::kMUL:
+      __ mul(out, left, right);
       break;
     default:
       UNREACHABLE();
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index abafd9d..4f4a097 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -324,9 +324,8 @@
 void ConstantInstr::EmitMoveToLocation(FlowGraphCompiler* compiler,
                                        const Location& destination,
                                        Register tmp) {
-  ASSERT(representation() != kUnboxedInt32);
   if (destination.IsRegister()) {
-    if (representation() == kUnboxedUint32 ||
+    if (representation() == kUnboxedInt32 ||
         representation() == kUnboxedInt64) {
       const int64_t value = value_.IsSmi() ? Smi::Cast(value_).Value()
                                            : Mint::Cast(value_).value();
@@ -354,7 +353,11 @@
     ASSERT(destination.IsStackSlot());
     ASSERT(tmp != kNoRegister);
     const intptr_t dest_offset = destination.ToStackSlotOffset();
-    __ LoadObject(tmp, value_);
+    if (value_.IsSmi() && representation() == kUnboxedInt32) {
+      __ LoadImmediate(tmp, static_cast<int32_t>(Smi::Cast(value_).Value()));
+    } else {
+      __ LoadObject(tmp, value_);
+    }
     __ StoreToOffset(tmp, destination.base_reg(), dest_offset);
   }
 }
@@ -362,7 +365,7 @@
 LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
-  const intptr_t kNumTemps = IsUnboxedIntegerConstant() ? 0 : 1;
+  const intptr_t kNumTemps = IsUnboxedSignedIntegerConstant() ? 0 : 1;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   switch (representation()) {
@@ -370,7 +373,7 @@
       locs->set_out(0, Location::RequiresFpuRegister());
       locs->set_temp(0, Location::RequiresRegister());
       break;
-    case kUnboxedUint32:  // We don't used signed int32 on ARM64.
+    case kUnboxedInt32:
     case kUnboxedInt64:
       locs->set_out(0, Location::RequiresRegister());
       break;
@@ -384,7 +387,7 @@
 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   if (!locs()->out(0).IsInvalid()) {
     const Register scratch =
-        IsUnboxedIntegerConstant() ? kNoRegister : locs()->temp(0).reg();
+        IsUnboxedSignedIntegerConstant() ? kNoRegister : locs()->temp(0).reg();
     EmitMoveToLocation(compiler, locs()->out(0), scratch);
   }
 }
@@ -590,9 +593,9 @@
       right_constant = right.constant_instruction();
     }
 
-    if (right_constant->IsUnboxedIntegerConstant()) {
-      __ CompareImmediate(left.reg(),
-                          right_constant->GetUnboxedIntegerConstantValue());
+    if (right_constant->IsUnboxedSignedIntegerConstant()) {
+      __ CompareImmediate(
+          left.reg(), right_constant->GetUnboxedSignedIntegerConstantValue());
     } else {
       ASSERT(right_constant->representation() == kTagged);
       __ CompareObject(left.reg(), right.constant());
@@ -1025,10 +1028,11 @@
     case kExternalTwoByteStringCid:
       return kTagged;
     case kTypedDataInt32ArrayCid:
-    case kTypedDataInt64ArrayCid:
-      return kUnboxedInt64;
+      return kUnboxedInt32;
     case kTypedDataUint32ArrayCid:
       return kUnboxedUint32;
+    case kTypedDataInt64ArrayCid:
+      return kUnboxedInt64;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return kUnboxedDouble;
@@ -1154,35 +1158,24 @@
     return;
   }
 
-  if (representation() == kUnboxedUint32) {
-    ASSERT(class_id() == kTypedDataUint32ArrayCid);
+  if ((representation() == kUnboxedInt32) ||
+      (representation() == kUnboxedUint32)) {
     const Register result = locs()->out(0).reg();
-    if (aligned()) {
-      __ ldr(result, element_address, kUnsignedWord);
-    } else {
-      __ LoadUnaligned(result, address, TMP, kUnsignedWord);
-    }
-    __ AssertValidUint32(result);
-    return;
-  }
-
-  if (representation() == kUnboxedInt64) {
-    Register result = locs()->out(0).reg();
     switch (class_id()) {
       case kTypedDataInt32ArrayCid:
-        ASSERT(representation() == kUnboxedInt64);
+        ASSERT(representation() == kUnboxedInt32);
         if (aligned()) {
           __ ldr(result, element_address, kWord);
         } else {
           __ LoadUnaligned(result, address, TMP, kWord);
         }
-        __ AssertValidSignExtendedInt32(result);
         break;
-      case kTypedDataInt64ArrayCid:
+      case kTypedDataUint32ArrayCid:
+        ASSERT(representation() == kUnboxedUint32);
         if (aligned()) {
-          __ ldr(result, element_address, kDoubleWord);
+          __ ldr(result, element_address, kUnsignedWord);
         } else {
-          __ LoadUnaligned(result, address, TMP, kDoubleWord);
+          __ LoadUnaligned(result, address, TMP, kUnsignedWord);
         }
         break;
       default:
@@ -1191,6 +1184,17 @@
     return;
   }
 
+  if (representation() == kUnboxedInt64) {
+    ASSERT(class_id() == kTypedDataInt64ArrayCid);
+    Register result = locs()->out(0).reg();
+    if (aligned()) {
+      __ ldr(result, element_address, kDoubleWord);
+    } else {
+      __ LoadUnaligned(result, address, TMP, kDoubleWord);
+    }
+    return;
+  }
+
   ASSERT(representation() == kTagged);
   const Register result = locs()->out(0).reg();
   switch (class_id()) {
@@ -1315,6 +1319,7 @@
     case kTypedDataUint16ArrayCid:
       return kTagged;
     case kTypedDataInt32ArrayCid:
+      return kUnboxedInt32;
     case kTypedDataUint32ArrayCid:
       return kUnboxedUint32;
     case kTypedDataInt64ArrayCid:
@@ -3591,7 +3596,8 @@
 
 LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
-  ASSERT(from_representation() == kUnboxedUint32);
+  ASSERT((from_representation() == kUnboxedInt32) ||
+         (from_representation() == kUnboxedUint32));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
   LocationSummary* summary = new (zone)
@@ -3710,37 +3716,44 @@
 }
 
 void UnboxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  // We don't use unboxed signed int32 on 64 bit platforms, so this is an
-  // unboxing to 32 bit unsigned integer, zero extended.
-  ASSERT(representation() == kUnboxedUint32);
-  ASSERT(is_truncating());
   const intptr_t value_cid = value()->Type()->ToCid();
   const Register out = locs()->out(0).reg();
   const Register value = locs()->in(0).reg();
+  Label* deopt = CanDeoptimize() ? compiler->AddDeoptStub(
+                                       GetDeoptId(), ICData::kDeoptUnboxInteger)
+                                 : NULL;
 
   if (value_cid == kSmiCid) {
-    ASSERT(kSmiTagSize == 1);
-    // Unsigned bitfield extract, untags the Smi, truncating to 32 bit unsigned.
-    __ ubfx(out, value, 1, 32);
+    __ SmiUntag(out, value);
   } else if (value_cid == kMintCid) {
-    __ LoadFieldFromOffset(out, value, Mint::value_offset(), kUnsignedWord);
-  } else {
-    // Type information is not conclusive.
+    __ LoadFieldFromOffset(out, value, Mint::value_offset());
+  } else if (!CanDeoptimize()) {
+    // Type information is not conclusive, but range analysis found
+    // the value to be in int64 range. Therefore it must be a smi
+    // or mint value.
+    ASSERT(is_truncating());
     Label done;
-    ASSERT(kSmiTagSize == 1);
-    // Unsigned bitfield extract, untags the Smi, truncating to 32 bit unsigned.
-    __ ubfx(out, value, 1, 32);
+    __ SmiUntag(out, value);
     __ BranchIfSmi(value, &done);
-    if (CanDeoptimize()) {
-      Label* deopt =
-          compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger);
-      __ CompareClassId(value, kMintCid);
-      __ b(deopt, NE);
-    }
-    __ LoadFieldFromOffset(out, value, Mint::value_offset(), kUnsignedWord);
+    __ LoadFieldFromOffset(out, value, Mint::value_offset());
+    __ Bind(&done);
+  } else {
+    Label done;
+    __ SmiUntag(out, value);
+    __ BranchIfSmi(value, &done);
+    __ CompareClassId(value, kMintCid);
+    __ b(deopt, NE);
+    __ LoadFieldFromOffset(out, value, Mint::value_offset());
     __ Bind(&done);
   }
-  __ AssertValidUint32(out);
+
+  // TODO(vegorov): as it is implemented right now truncating unboxing would
+  // leave "garbage" in the higher word.
+  if (!is_truncating() && (deopt != NULL)) {
+    ASSERT(representation() == kUnboxedInt32);
+    __ cmp(out, Operand(out, SXTW, 0));
+    __ b(deopt, NE);
+  }
 }
 
 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Zone* zone,
@@ -5099,7 +5112,8 @@
     Register r = TMP;
     if (right.IsConstant()) {
       ConstantInstr* constant_instr = right.constant_instruction();
-      const int64_t value = constant_instr->GetUnboxedIntegerConstantValue();
+      const int64_t value =
+          constant_instr->GetUnboxedSignedIntegerConstantValue();
       __ LoadImmediate(r, value);
     } else {
       r = right.reg();
@@ -5116,7 +5130,8 @@
 
   if (right.IsConstant()) {
     ConstantInstr* constant_instr = right.constant_instruction();
-    const int64_t value = constant_instr->GetUnboxedIntegerConstantValue();
+    const int64_t value =
+        constant_instr->GetUnboxedSignedIntegerConstantValue();
     switch (op_kind()) {
       case Token::kADD:
         if (CanDeoptimize()) {
@@ -5296,82 +5311,37 @@
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  summary->set_out(0, Location::RequiresRegister());
-  ConstantInstr* right_constant = right()->definition()->AsConstant();
-  if (right_constant != NULL &&
-      (right_constant->value().IsSmi() || right_constant->value().IsMint())) {
-    int64_t imm = right_constant->GetUnboxedIntegerConstantValue();
-    bool is_arithmetic = op_kind() == Token::kADD || op_kind() == Token::kSUB;
-    bool is_logical = op_kind() == Token::kBIT_AND ||
-                      op_kind() == Token::kBIT_OR ||
-                      op_kind() == Token::kBIT_XOR;
-    if ((is_logical && Operand::IsImmLogical(imm)) ||
-        (is_arithmetic && Operand::IsImmArithmethic(imm))) {
-      summary->set_in(1, Location::Constant(right_constant));
-      return summary;
-    }
-  }
   summary->set_in(1, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
 
 void BinaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  ConstantInstr* right_constant = right()->definition()->AsConstant();
   Register left = locs()->in(0).reg();
-  Location right = locs()->in(1);
+  Register right = locs()->in(1).reg();
+  Operand r = Operand(right);
   Register out = locs()->out(0).reg();
-  int64_t imm = 0;
-  if (right_constant != NULL) {
-    const Object& constant = right_constant->value();
-    if (constant.IsSmi()) {
-      imm = Smi::Cast(constant).AsInt64Value();
-    } else {
-      imm = Mint::Cast(constant).value();
-    }
-  }
-  if (right.IsRegister()) {
-    switch (op_kind()) {
-      case Token::kBIT_AND:
-        __ and_(out, left, Operand(right.reg()));
-        break;
-      case Token::kBIT_OR:
-        __ orr(out, left, Operand(right.reg()));
-        break;
-      case Token::kBIT_XOR:
-        __ eor(out, left, Operand(right.reg()));
-        break;
-      case Token::kADD:
-        __ addw(out, left, Operand(right.reg()));
-        break;
-      case Token::kSUB:
-        __ subw(out, left, Operand(right.reg()));
-        break;
-      case Token::kMUL:
-        __ mulw(out, left, right.reg());
-        break;
-      default:
-        UNREACHABLE();
-    }
-  } else {
-    switch (op_kind()) {
-      case Token::kBIT_AND:
-        __ andi(out, left, Immediate(imm));
-        break;
-      case Token::kBIT_OR:
-        __ orri(out, left, Immediate(imm));
-        break;
-      case Token::kBIT_XOR:
-        __ eori(out, left, Immediate(imm));
-        break;
-      case Token::kADD:
-        __ AddImmediate(out, left, imm, kWord);
-        break;
-      case Token::kSUB:
-        __ AddImmediate(out, left, -imm, kWord);
-        break;
-      default:
-        UNREACHABLE();
-    }
+  switch (op_kind()) {
+    case Token::kBIT_AND:
+      __ and_(out, left, r);
+      break;
+    case Token::kBIT_OR:
+      __ orr(out, left, r);
+      break;
+    case Token::kBIT_XOR:
+      __ eor(out, left, r);
+      break;
+    case Token::kADD:
+      __ addw(out, left, r);
+      break;
+    case Token::kSUB:
+      __ subw(out, left, r);
+      break;
+    case Token::kMUL:
+      __ mulw(out, left, right);
+      break;
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -5476,14 +5446,19 @@
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (from() == kUnboxedInt64) {
-    ASSERT(to() == kUnboxedUint32);  // No unboxed int32 on ARM64.
+    ASSERT((to() == kUnboxedUint32) || (to() == kUnboxedInt32));
+  } else if (to() == kUnboxedInt64) {
+    ASSERT((from() == kUnboxedUint32) || (from() == kUnboxedInt32));
   } else {
-    ASSERT(to() == kUnboxedInt64);
-    ASSERT(from() == kUnboxedUint32);  // No unboxed int32 on ARM64.
+    ASSERT((to() == kUnboxedUint32) || (to() == kUnboxedInt32));
+    ASSERT((from() == kUnboxedUint32) || (from() == kUnboxedInt32));
   }
-  ASSERT(!CanDeoptimize());
   summary->set_in(0, Location::RequiresRegister());
-  summary->set_out(0, Location::SameAsFirstInput());
+  if (CanDeoptimize()) {
+    summary->set_out(0, Location::RequiresRegister());
+  } else {
+    summary->set_out(0, Location::SameAsFirstInput());
+  }
   return summary;
 }
 
@@ -5491,16 +5466,52 @@
   ASSERT(from() != to());  // We don't convert from a representation to itself.
   const Register value = locs()->in(0).reg();
   const Register out = locs()->out(0).reg();
-  ASSERT(!CanDeoptimize());
-  if (from() == kUnboxedInt64) {
-    ASSERT(to() == kUnboxedUint32);
-    __ uxtw(out, value);  // Zero the top bits.
-  } else {
-    ASSERT(from() == kUnboxedUint32);
-    ASSERT(to() == kUnboxedInt64);
-    if (out != value) {
-      __ mov(out, value);  // Bits are the same.
+  Label* deopt = !CanDeoptimize() ? NULL
+                                  : compiler->AddDeoptStub(
+                                        deopt_id(), ICData::kDeoptUnboxInteger);
+  if (from() == kUnboxedInt32 && to() == kUnboxedUint32) {
+    if (CanDeoptimize()) {
+      __ tbnz(deopt, value,
+              31);  // If sign bit is set it won't fit in a uint32.
     }
+    if (out != value) {
+      __ mov(out, value);  // For positive values the bits are the same.
+    }
+  } else if (from() == kUnboxedUint32 && to() == kUnboxedInt32) {
+    if (CanDeoptimize()) {
+      __ tbnz(deopt, value,
+              31);  // If high bit is set it won't fit in an int32.
+    }
+    if (out != value) {
+      __ mov(out, value);  // For 31 bit values the bits are the same.
+    }
+  } else if (from() == kUnboxedInt64) {
+    if (to() == kUnboxedInt32) {
+      if (is_truncating() || out != value) {
+        __ sxtw(out, value);  // Signed extension 64->32.
+      }
+    } else {
+      ASSERT(to() == kUnboxedUint32);
+      if (is_truncating() || out != value) {
+        __ uxtw(out, value);  // Unsigned extension 64->32.
+      }
+    }
+    if (CanDeoptimize()) {
+      ASSERT(to() == kUnboxedInt32);
+      __ cmp(out, Operand(value));
+      __ b(deopt, NE);  // Value cannot be held in Int32, deopt.
+    }
+  } else if (to() == kUnboxedInt64) {
+    if (from() == kUnboxedUint32) {
+      if (out != value) {
+        __ mov(out, value);
+      }
+    } else {
+      ASSERT(from() == kUnboxedInt32);
+      __ sxtw(out, value);  // Signed extension 32->64.
+    }
+  } else {
+    UNREACHABLE();
   }
 }
 
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index 4505c0f..c92b517 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -187,8 +187,7 @@
   if (destination.IsRegister()) {
     if (value_.IsSmi() && Smi::Cast(value_).Value() == 0) {
       __ xorl(destination.reg(), destination.reg());
-    } else if (value_.IsSmi() && (representation() == kUnboxedInt32 ||
-                                  representation() == kUnboxedUint32)) {
+    } else if (value_.IsSmi() && (representation() == kUnboxedInt32)) {
       __ movl(destination.reg(), Immediate(Smi::Cast(value_).Value()));
     } else {
       ASSERT(representation() == kTagged);
@@ -3237,16 +3236,6 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = (op_kind() == Token::kMUL) ? 1 : 0;
-  ConstantInstr* right_constant = right()->definition()->AsConstant();
-  if (right_constant != NULL && right_constant->value().IsSmi() &&
-      op_kind() != Token::kMUL) {
-    LocationSummary* summary = new (zone)
-        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    summary->set_in(0, Location::RequiresRegister());
-    summary->set_in(1, Location::Constant(right_constant));
-    summary->set_out(0, Location::SameAsFirstInput());
-    return summary;
-  }
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (op_kind() == Token::kMUL) {
@@ -3262,33 +3251,25 @@
 
 void BinaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register left = locs()->in(0).reg();
+  Register right = locs()->in(1).reg();
   Register out = locs()->out(0).reg();
   ASSERT(out == left);
-  if (locs()->in(1).IsRegister()) {
-    Register right = locs()->in(1).reg();
-    switch (op_kind()) {
-      case Token::kBIT_AND:
-      case Token::kBIT_OR:
-      case Token::kBIT_XOR:
-      case Token::kADD:
-      case Token::kSUB:
-        EmitIntegerArithmetic(compiler, op_kind(), left, right, NULL);
-        return;
+  switch (op_kind()) {
+    case Token::kBIT_AND:
+    case Token::kBIT_OR:
+    case Token::kBIT_XOR:
+    case Token::kADD:
+    case Token::kSUB:
+      EmitIntegerArithmetic(compiler, op_kind(), left, right, NULL);
+      return;
 
-      case Token::kMUL:
-        __ mull(right);  // Result in EDX:EAX.
-        ASSERT(out == EAX);
-        ASSERT(locs()->temp(0).reg() == EDX);
-        break;
-      default:
-        UNREACHABLE();
-    }
-  } else {
-    ASSERT(locs()->in(1).IsConstant());
-    ConstantInstr* right_constant = right()->definition()->AsConstant();
-    const Object& constant = right_constant->value();
-    int64_t imm = Smi::Cast(constant).AsInt64Value();
-    EmitIntegerArithmetic(compiler, op_kind(), left, Immediate(imm), NULL);
+    case Token::kMUL:
+      __ mull(right);  // Result in EDX:EAX.
+      ASSERT(out == EAX);
+      ASSERT(locs()->temp(0).reg() == EDX);
+      break;
+    default:
+      UNREACHABLE();
   }
 }
 
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index a564b48..bf409ff 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -287,7 +287,7 @@
                                        const Location& destination,
                                        Register tmp) {
   if (destination.IsRegister()) {
-    if (representation() == kUnboxedUint32 ||
+    if (representation() == kUnboxedInt32 ||
         representation() == kUnboxedInt64) {
       const int64_t value = value_.IsSmi() ? Smi::Cast(value_).Value()
                                            : Mint::Cast(value_).value();
@@ -320,14 +320,19 @@
     __ movsd(destination.ToStackSlotAddress(), XMM0);
   } else {
     ASSERT(destination.IsStackSlot());
-    __ StoreObject(destination.ToStackSlotAddress(), value_);
+    if (value_.IsSmi() && representation() == kUnboxedInt32) {
+      __ movl(destination.ToStackSlotAddress(),
+              Immediate(Smi::Cast(value_).Value()));
+    } else {
+      __ StoreObject(destination.ToStackSlotAddress(), value_);
+    }
   }
 }
 
 LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
-  const intptr_t kNumTemps = IsUnboxedIntegerConstant() ? 0 : 1;
+  const intptr_t kNumTemps = IsUnboxedSignedIntegerConstant() ? 0 : 1;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   switch (representation()) {
@@ -335,7 +340,7 @@
       locs->set_out(0, Location::RequiresFpuRegister());
       locs->set_temp(0, Location::RequiresRegister());
       break;
-    case kUnboxedUint32:
+    case kUnboxedInt32:
     case kUnboxedInt64:
       locs->set_out(0, Location::RequiresRegister());
       break;
@@ -350,7 +355,7 @@
   // The register allocator drops constant definitions that have no uses.
   if (!locs()->out(0).IsInvalid()) {
     const Register scratch =
-        IsUnboxedIntegerConstant() ? kNoRegister : locs()->temp(0).reg();
+        IsUnboxedSignedIntegerConstant() ? kNoRegister : locs()->temp(0).reg();
     EmitMoveToLocation(compiler, locs()->out(0), scratch);
   }
 }
@@ -604,9 +609,9 @@
       constant = right.constant_instruction();
     }
 
-    if (constant->IsUnboxedIntegerConstant()) {
+    if (constant->IsUnboxedSignedIntegerConstant()) {
       __ cmpq(left.reg(),
-              Immediate(constant->GetUnboxedIntegerConstantValue()));
+              Immediate(constant->GetUnboxedSignedIntegerConstantValue()));
     } else {
       ASSERT(constant->representation() == kTagged);
       __ CompareObject(left.reg(), right.constant());
@@ -1100,9 +1105,10 @@
     case kExternalOneByteStringCid:
     case kExternalTwoByteStringCid:
       return kTagged;
+    case kTypedDataInt32ArrayCid:
+      return kUnboxedInt32;
     case kTypedDataUint32ArrayCid:
       return kUnboxedUint32;
-    case kTypedDataInt32ArrayCid:
     case kTypedDataInt64ArrayCid:
       return kUnboxedInt64;
     case kTypedDataFloat32ArrayCid:
@@ -1187,31 +1193,20 @@
     return;
   }
 
-  if ((representation() == kUnboxedUint32)) {
-    ASSERT(class_id() == kTypedDataUint32ArrayCid);
-    if ((index_scale() == 1) && index.IsRegister()) {
-      __ SmiUntag(index.reg());
-    }
-    Register result = locs()->out(0).reg();
-    __ movl(result, element_address);
-    return;
-  }
-
-  if (representation() == kUnboxedInt64) {
+  if ((representation() == kUnboxedUint32) ||
+      (representation() == kUnboxedInt32)) {
     if ((index_scale() == 1) && index.IsRegister()) {
       __ SmiUntag(index.reg());
     }
     Register result = locs()->out(0).reg();
     switch (class_id()) {
       case kTypedDataInt32ArrayCid:
-        ASSERT(representation() == kUnboxedInt64);
-        __ movl(result, element_address);
-        __ movsxd(result, result);
-        __ AssertValidSignExtendedInt32(result);
+        ASSERT(representation() == kUnboxedInt32);
+        __ movsxd(result, element_address);
         break;
-      case kTypedDataInt64ArrayCid:
-        ASSERT(representation() == kUnboxedInt64);
-        __ movq(result, element_address);
+      case kTypedDataUint32ArrayCid:
+        ASSERT(representation() == kUnboxedUint32);
+        __ movl(result, element_address);
         break;
       default:
         UNREACHABLE();
@@ -1219,6 +1214,16 @@
     return;
   }
 
+  if (representation() == kUnboxedInt64) {
+    ASSERT(class_id() == kTypedDataInt64ArrayCid);
+    if ((index_scale() == 1) && index.IsRegister()) {
+      __ SmiUntag(index.reg());
+    }
+    Register result = locs()->out(0).reg();
+    __ movq(result, element_address);
+    return;
+  }
+
   ASSERT(representation() == kTagged);
 
   if ((index_scale() == 1) && index.IsRegister()) {
@@ -1366,9 +1371,10 @@
     case kTypedDataInt16ArrayCid:
     case kTypedDataUint16ArrayCid:
       return kTagged;
+    case kTypedDataInt32ArrayCid:
+      return kUnboxedInt32;
     case kTypedDataUint32ArrayCid:
       return kUnboxedUint32;
-    case kTypedDataInt32ArrayCid:
     case kTypedDataInt64ArrayCid:
       return kUnboxedInt64;
     case kTypedDataFloat32ArrayCid:
@@ -3157,16 +3163,6 @@
          Immediate(reinterpret_cast<int64_t>(constant.raw())).is_int32();
 }
 
-static bool CanBeUint32Immediate(const Object& constant) {
-  if (constant.IsSmi()) {
-    return Immediate(Smi::Cast(constant).Value()).is_uint32();
-  }
-  if (constant.IsMint()) {
-    return Immediate(Mint::Cast(constant).value()).is_uint32();
-  }
-  return false;
-}
-
 static bool IsSmiValue(const Object& constant, intptr_t value) {
   return constant.IsSmi() && (Smi::Cast(constant).Value() == value);
 }
@@ -3771,12 +3767,7 @@
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  const intptr_t value_cid = value()->Type()->ToCid();
-  if (value_cid == kSmiCid || value_cid == kMintCid) {
-    summary->set_out(0, Location::SameAsFirstInput());
-  } else {
-    summary->set_out(0, Location::RequiresRegister());
-  }
+  summary->set_out(0, Location::SameAsFirstInput());
   if (kNumTemps > 0) {
     summary->set_temp(0, Location::RequiresRegister());
   }
@@ -3784,47 +3775,64 @@
 }
 
 void UnboxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  // We don't use unboxed signed int32 on 64 bit platforms, so this is an
-  // unboxing to 32 bit unsigned integer, zero extended.
-  ASSERT(representation() == kUnboxedUint32);
-  ASSERT(is_truncating());
   const intptr_t value_cid = value()->Type()->ToCid();
   const Register value = locs()->in(0).reg();
-  const Register out = locs()->out(0).reg();
+  Label* deopt = CanDeoptimize() ? compiler->AddDeoptStub(
+                                       GetDeoptId(), ICData::kDeoptUnboxInteger)
+                                 : NULL;
+  ASSERT(value == locs()->out(0).reg());
   Label done_and_no_need_to_check_range;
 
+  ASSERT(locs()->out(0).reg() == value);
+
   if (value_cid == kSmiCid) {
-    ASSERT(value == out);
     __ AssertSmiInRange(value);
-    // A 32 bit Smi (31 bits plus tag) can just be made into a uint32 with a 32
-    // bit sar operation.
-    __ sarl(value, Immediate(kSmiTagShift));
+    __ SmiUntag(value);
+    return;
   } else if (value_cid == kMintCid) {
-    ASSERT(value == out);
-    __ movl(value, FieldAddress(value, Mint::value_offset()));
-  } else {
+    __ movq(value, FieldAddress(value, Mint::value_offset()));
+  } else if (!CanDeoptimize()) {
     Label done;
-    ASSERT(out != value);
-    __ movl(out, value);
-    __ sarl(out, Immediate(kSmiTagShift));  // See sarl comment above.
-    ASSERT(kSmiTag == 0);
+    __ SmiUntag(value);
     __ j(NOT_CARRY, &done, Assembler::kNearJump);
-    if (CanDeoptimize()) {
-      Label* deopt =
-          compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger);
-      __ LoadClassId(TMP, value);
-      __ cmpl(TMP, Immediate(kMintCid));
-      __ j(NOT_EQUAL, deopt);
+    // Multiply by two in addressing mode because we erroneously
+    // untagged a pointer by dividing it by two.
+    Address value_field(value, TIMES_2, Mint::value_offset());
+    if (is_truncating()) {
+      __ movl(value, value_field);
+      __ movsxd(value, value);
+    } else {
+      __ movq(value, value_field);
     }
-    __ movl(out, FieldAddress(value, Mint::value_offset()));
     __ Bind(&done);
+    return;
+  } else {
+    __ SmiUntagOrCheckClass(value, kMintCid, &done_and_no_need_to_check_range);
+    __ j(NOT_EQUAL, deopt);
+    // Multiply by two in addressing mode because we erroneously
+    // untagged a pointer by dividing it by two.
+    __ movq(value, Address(value, TIMES_2, Mint::value_offset()));
   }
-  __ AssertValidUint32(locs()->out(0).reg());
+
+  // We get here for the Mint cases, which might be out of range for an
+  // unboxed int32 output.
+
+  // TODO(vegorov): Truncating unboxing leaves garbage in the higher word.
+  // Is this the best semantics?
+  if (!is_truncating() && (deopt != NULL)) {
+    ASSERT(representation() == kUnboxedInt32);
+    const Register temp = locs()->temp(0).reg();
+    __ movsxd(temp, value);
+    __ cmpq(temp, value);
+    __ j(NOT_EQUAL, deopt);
+  }
+  __ Bind(&done_and_no_need_to_check_range);
 }
 
 LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
-  ASSERT(from_representation() == kUnboxedUint32);
+  ASSERT((from_representation() == kUnboxedInt32) ||
+         (from_representation() == kUnboxedUint32));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
   LocationSummary* summary = new (zone)
@@ -3846,23 +3854,38 @@
 void BoxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register value = locs()->in(0).reg();
   const Register out = locs()->out(0).reg();
+  Label done;
 
-  // Unsigned unboxed 32 bit to sign extended 31 bit Smi.
-  __ leaq(out, Address(value, value, TIMES_1, 0));
+  if (from_representation() == kUnboxedInt32) {
+    __ MoveRegister(out, value);
+    ASSERT(kSmiTagMask == 1 && kSmiTag == 0);
+    __ addl(out, out);
+    __ movsxd(out, out);  // Does not affect flags.
+  } else {
+    // Unsigned.
+    __ movl(out, value);
+    __ SmiTag(out);
+  }
 
   if (!ValueFitsSmi()) {
-    Label done;
-    ASSERT(value != out);
-    __ TestImmediate(value, Immediate(0xc0000000ll));
-    __ j(ZERO, &done);
-
+    if (from_representation() == kUnboxedInt32) {
+      __ j(NO_OVERFLOW, &done);
+    } else {
+      ASSERT(value != out);
+      __ TestImmediate(value, Immediate(0xc0000000ll));
+      __ j(ZERO, &done);
+    }
     // Allocate a mint.
     // Value input is a writable register and we have to inform the compiler of
     // the type so it can be preserved untagged on the slow path
     locs()->live_registers()->Add(locs()->in(0), kUnboxedInt32);
     BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(), out,
                                     locs()->temp(0).reg());
-    __ AssertValidUint32(value);
+    if (from_representation() == kUnboxedInt32) {
+      __ movsxd(value, value);
+    } else {
+      __ movl(value, value);
+    }
     __ movq(FieldAddress(out, Mint::value_offset()), value);
     __ Bind(&done);
   }
@@ -5315,7 +5338,8 @@
 
   if (right.IsConstant()) {
     ConstantInstr* constant_instr = right.constant_instruction();
-    const int64_t value = constant_instr->GetUnboxedIntegerConstantValue();
+    const int64_t value =
+        constant_instr->GetUnboxedSignedIntegerConstantValue();
     EmitInt64Arithmetic(compiler, op_kind(), left.reg(), Immediate(value),
                         deopt);
   } else {
@@ -5446,16 +5470,6 @@
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  ConstantInstr* right_constant = right()->definition()->AsConstant();
-  if (right_constant != NULL && op_kind() != Token::kMUL &&
-      CanBeUint32Immediate(right_constant->value())) {
-    LocationSummary* summary = new (zone)
-        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    summary->set_in(0, Location::RequiresRegister());
-    summary->set_in(1, Location::Constant(right_constant));
-    summary->set_out(0, Location::SameAsFirstInput());
-    return summary;
-  }
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
@@ -5469,7 +5483,6 @@
                                   Token::Kind op_kind,
                                   Register left,
                                   const OperandType& right) {
-  __ AssertValidUint32(left);
   switch (op_kind) {
     case Token::kADD:
       __ addl(left, right);
@@ -5492,21 +5505,24 @@
     default:
       UNREACHABLE();
   }
-  __ AssertValidUint32(left);
 }
 
 void BinaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register left = locs()->in(0).reg();
+  Register right = locs()->in(1).reg();
   Register out = locs()->out(0).reg();
   ASSERT(out == left);
-  if (locs()->in(1).IsRegister()) {
-    Register right = locs()->in(1).reg();
-    EmitIntegerArithmetic(compiler, op_kind(), left, right);
-  } else {
-    ASSERT(locs()->in(1).IsConstant());
-    ConstantInstr* right_constant = right()->definition()->AsConstant();
-    int32_t imm = right_constant->GetUnboxedIntegerConstantValue();
-    EmitIntegerArithmetic(compiler, op_kind(), left, Immediate(imm));
+  switch (op_kind()) {
+    case Token::kBIT_AND:
+    case Token::kBIT_OR:
+    case Token::kBIT_XOR:
+    case Token::kADD:
+    case Token::kSUB:
+    case Token::kMUL:
+      EmitIntegerArithmetic(compiler, op_kind(), left, right);
+      return;
+    default:
+      UNREACHABLE();
   }
 }
 
@@ -5594,7 +5610,6 @@
 }
 
 DEFINE_BACKEND(UnaryUint32Op, (SameAsFirstInput, Register value)) {
-  __ AssertValidUint32(value);
   __ notl(value);
 }
 
diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc
index 5db455b..e137fad 100644
--- a/runtime/vm/compiler/backend/inliner.cc
+++ b/runtime/vm/compiler/backend/inliner.cc
@@ -2478,16 +2478,13 @@
         DoubleToFloatInstr(new (Z) Value(stored_value), call->deopt_id());
     cursor =
         flow_graph->AppendTo(cursor, stored_value, NULL, FlowGraph::kValue);
-#if !defined(AVOID_UNBOXED_INT32)
   } else if (array_cid == kTypedDataInt32ArrayCid) {
     stored_value =
         new (Z) UnboxInt32Instr(UnboxInt32Instr::kTruncate,
                                 new (Z) Value(stored_value), call->deopt_id());
     cursor = flow_graph->AppendTo(cursor, stored_value, call->env(),
                                   FlowGraph::kValue);
-#endif
-  } else if (array_cid == kTypedDataUint32ArrayCid ||
-             array_cid == kTypedDataInt32ArrayCid) {
+  } else if (array_cid == kTypedDataUint32ArrayCid) {
     stored_value =
         new (Z) UnboxUint32Instr(new (Z) Value(stored_value), call->deopt_id());
     ASSERT(stored_value->AsUnboxInteger()->is_truncating());
@@ -2789,16 +2786,13 @@
         DoubleToFloatInstr(new (Z) Value(stored_value), call->deopt_id());
     cursor =
         flow_graph->AppendTo(cursor, stored_value, NULL, FlowGraph::kValue);
-#if !defined(AVOID_UNBOXED_INT32)
   } else if (view_cid == kTypedDataInt32ArrayCid) {
     stored_value =
         new (Z) UnboxInt32Instr(UnboxInt32Instr::kTruncate,
                                 new (Z) Value(stored_value), call->deopt_id());
     cursor = flow_graph->AppendTo(cursor, stored_value, call->env(),
                                   FlowGraph::kValue);
-#endif
-  } else if (view_cid == kTypedDataInt32ArrayCid ||  // Again, outside ifdef.
-             view_cid == kTypedDataUint32ArrayCid) {
+  } else if (view_cid == kTypedDataUint32ArrayCid) {
     stored_value =
         new (Z) UnboxUint32Instr(new (Z) Value(stored_value), call->deopt_id());
     ASSERT(stored_value->AsUnboxInteger()->is_truncating());
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 82d89d1..11c5abc 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -175,9 +175,6 @@
     case kFlags:
       flags_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
-    case kFlags2:
-      secondary_flags_ = helper_->ReadFlags();
-      if (++next_read_ == field) return;
     case kName:
       helper_->SkipName();  // read name.
       if (++next_read_ == field) return;
@@ -246,7 +243,6 @@
       if (++next_read_ == field) return;
     case kFlags:
       flags_ = helper_->ReadFlags();
-      flags2_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
     case kName:
       helper_->SkipName();  // read name.
@@ -1552,7 +1548,7 @@
       builder_->ReadUInt();  // read value.
       return;
     case kDoubleLiteral:
-      builder_->SkipStringReference();  // read index into string table.
+      builder_->ReadDouble();  // read value.
       return;
     case kTrueLiteral:
       return;
@@ -3546,8 +3542,7 @@
 }
 
 void StreamingConstantEvaluator::EvaluateDoubleLiteral() {
-  result_ = Double::New(H.DartString(builder_->ReadStringReference()),
-                        Heap::kOld);  // read string reference.
+  result_ = Double::New(builder_->ReadDouble(), Heap::kOld);  // read value.
   result_ = H.Canonicalize(result_);
 }
 
@@ -4423,7 +4418,7 @@
   }
 
   BuildHash(name.Hash());
-  BuildHash((field_helper.flags_ << 8) | field_helper.secondary_flags_);
+  BuildHash(field_helper.flags_);
   BuildHash(field_helper.annotation_count_);
   return hash_;
 }
@@ -4469,7 +4464,6 @@
 
   BuildHash(procedure_helper.kind_);
   BuildHash(procedure_helper.flags_);
-  BuildHash(procedure_helper.flags2_);
   BuildHash(procedure_helper.annotation_count_);
   BuildHash(name.Hash());
   return hash_;
@@ -6027,6 +6021,10 @@
   return reader_.ReadUInt();
 }
 
+double KernelReaderHelper::ReadDouble() {
+  return reader_.ReadDouble();
+}
+
 uint32_t KernelReaderHelper::PeekListLength() {
   AlternativeReadingScope alt(&reader_);
   return reader_.ReadListLength();
@@ -6494,7 +6492,7 @@
       ReadUInt();  // read value.
       return;
     case kDoubleLiteral:
-      SkipStringReference();  // read index into string table.
+      ReadDouble();  // read value.
       return;
     case kTrueLiteral:
       return;
@@ -8987,8 +8985,7 @@
   if (position != NULL) *position = TokenPosition::kNoSource;
 
   Double& constant = Double::ZoneHandle(
-      Z, Double::NewCanonical(
-             H.DartString(ReadStringReference())));  // read string reference.
+      Z, Double::NewCanonical(ReadDouble()));  // read double.
   return Constant(constant);
 }
 
@@ -10822,8 +10819,7 @@
         break;
       }
       case kDoubleConstant: {
-        temp_instance_ = Double::New(
-            H.DartString(builder_.ReadStringReference()), Heap::kOld);
+        temp_instance_ = Double::New(builder_.ReadDouble(), Heap::kOld);
         temp_instance_ = H.Canonicalize(temp_instance_);
         break;
       }
@@ -10852,8 +10848,13 @@
         break;
       }
       case kInstanceConstant: {
-        temp_class_ =
-            H.LookupClassByKernelClass(builder_.ReadCanonicalNameReference());
+        const NameIndex index = builder_.ReadCanonicalNameReference();
+        if (ShouldSkipConstant(index)) {
+          temp_instance_ = Instance::null();
+          break;
+        }
+
+        temp_class_ = H.LookupClassByKernelClass(index);
         temp_object_ = temp_class_.EnsureIsFinalized(H.thread());
         ASSERT(temp_object_.IsNull());
 
@@ -10889,16 +10890,19 @@
         const intptr_t entry_index = builder_.ReadUInt();
         temp_object_ = constants.At(entry_index);
 
+        // Happens if the tearoff was in the vmservice library and we have
+        // [skip_vm_service_library] enabled.
+        if (temp_object_.IsNull()) {
+          temp_instance_ = Instance::null();
+          break;
+        }
+
         const intptr_t number_of_type_arguments = builder_.ReadUInt();
-        if (temp_class_.NumTypeArguments() > 0) {
-          temp_type_arguments_ =
-              TypeArguments::New(number_of_type_arguments, Heap::kOld);
-          for (intptr_t j = 0; j < number_of_type_arguments; ++j) {
-            temp_type_arguments_.SetTypeAt(j, type_translator_.BuildType());
-          }
-        } else {
-          ASSERT(number_of_type_arguments == 0);
-          temp_type_arguments_ = TypeArguments::null();
+        ASSERT(number_of_type_arguments > 0);
+        temp_type_arguments_ =
+            TypeArguments::New(number_of_type_arguments, Heap::kOld);
+        for (intptr_t j = 0; j < number_of_type_arguments; ++j) {
+          temp_type_arguments_.SetTypeAt(j, type_translator_.BuildType());
         }
 
         // Make a copy of the old closure, with the delayed type arguments
@@ -10916,12 +10920,7 @@
       }
       case kTearOffConstant: {
         const NameIndex index = builder_.ReadCanonicalNameReference();
-        NameIndex lib_index = index;
-        while (!H.IsLibrary(lib_index)) {
-          lib_index = H.CanonicalNameParent(lib_index);
-        }
-        ASSERT(H.IsLibrary(lib_index));
-        if (lib_index == skip_vmservice_library_) {
+        if (ShouldSkipConstant(index)) {
           temp_instance_ = Instance::null();
           break;
         }
@@ -10960,6 +10959,19 @@
   *type_arguments = temp_type_.arguments();
 }
 
+// If [index] has `dart:vm_service` as a parent and we are skipping the VM
+// service library, this method returns `true`, otherwise `false`.
+bool ConstantHelper::ShouldSkipConstant(NameIndex index) {
+  if (index == NameIndex::kInvalidName) {
+    return false;
+  }
+  while (!H.IsLibrary(index)) {
+    index = H.CanonicalNameParent(index);
+  }
+  ASSERT(H.IsLibrary(index));
+  return index == skip_vmservice_library_;
+}
+
 }  // namespace kernel
 }  // namespace dart
 
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index b4c4b83..a572a7d 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -202,7 +202,6 @@
     kPosition,
     kEndPosition,
     kFlags,
-    kFlags2,
     kName,
     kAnnotations,
     kType,
@@ -260,7 +259,6 @@
   TokenPosition position_;
   TokenPosition end_position_;
   uint8_t flags_;
-  uint8_t secondary_flags_;
   intptr_t source_uri_index_;
   intptr_t annotation_count_;
 
@@ -314,11 +312,8 @@
     kForwardingStub = 1 << 4,
 
     // TODO(29841): Remove this line after the issue is resolved.
-    kRedirectingFactoryConstructor = 1 << 7,
-  };
-
-  enum Flag2 {
-    kNoSuchMethodForwarder = 1 << 0,
+    kRedirectingFactoryConstructor = 1 << 6,
+    kNoSuchMethodForwarder = 1 << 7,
   };
 
   explicit ProcedureHelper(KernelReaderHelper* helper)
@@ -342,7 +337,7 @@
     return (flags_ & kRedirectingFactoryConstructor) != 0;
   }
   bool IsNoSuchMethodForwarder() {
-    return (flags2_ & kNoSuchMethodForwarder) != 0;
+    return (flags_ & kNoSuchMethodForwarder) != 0;
   }
 
   NameIndex canonical_name_;
@@ -350,7 +345,6 @@
   TokenPosition end_position_;
   Kind kind_;
   uint8_t flags_;
-  uint8_t flags2_;
   intptr_t source_uri_index_;
   intptr_t annotation_count_;
 
@@ -1049,6 +1043,7 @@
   uint32_t ReadUInt();
   uint32_t ReadUInt32();
   uint32_t PeekUInt();
+  double ReadDouble();
   uint32_t PeekListLength();
   StringIndex ReadStringReference();
   NameIndex ReadCanonicalNameReference();
@@ -1704,6 +1699,10 @@
   void InstantiateTypeArguments(const Class& receiver_class,
                                 TypeArguments* type_arguments);
 
+  // If [index] has `dart:vm_service` as a parent and we are skipping the VM
+  // service library, this method returns `true`, otherwise `false`.
+  bool ShouldSkipConstant(NameIndex index);
+
   NameIndex skip_vmservice_library_;
   ActiveClass* active_class_;
   StreamingFlowGraphBuilder& builder_;
diff --git a/runtime/vm/compiler/intrinsifier.cc b/runtime/vm/compiler/intrinsifier.cc
index 8ea16bb..654d33c 100644
--- a/runtime/vm/compiler/intrinsifier.cc
+++ b/runtime/vm/compiler/intrinsifier.cc
@@ -373,9 +373,6 @@
   }
 
   Definition* AddUnboxInstr(Representation rep, Value* value, bool is_checked) {
-#if defined(AVOID_UNBOXED_INT32)
-    ASSERT(rep != kUnboxedInt32);
-#endif
     Definition* unboxed_value =
         AddDefinition(UnboxInstr::Create(rep, value, Thread::kNoDeoptId));
     if (is_checked) {
@@ -458,11 +455,7 @@
     case kTypedDataInt32ArrayCid:
     case kExternalTypedDataInt32ArrayCid:
       result = builder.AddDefinition(
-#if defined(AVOID_UNBOXED_INT32)
-          BoxInstr::Create(kUnboxedInt64, new Value(result)));
-#else
           BoxInstr::Create(kUnboxedInt32, new Value(result)));
-#endif
       break;
     case kTypedDataUint32ArrayCid:
     case kExternalTypedDataUint32ArrayCid:
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 8ae8279..7398646 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -946,13 +946,10 @@
 
 static Dart_WeakPersistentHandle AllocateFinalizableHandle(
     Thread* thread,
-    Dart_Handle object,
+    const Object& ref,
     void* peer,
     intptr_t external_allocation_size,
     Dart_WeakPersistentHandleFinalizer callback) {
-  REUSABLE_OBJECT_HANDLESCOPE(thread);
-  Object& ref = thread->ObjectHandle();
-  ref = Api::UnwrapHandle(object);
   if (!ref.raw()->IsHeapObject()) {
     return NULL;
   }
@@ -962,6 +959,19 @@
   return finalizable_ref->apiHandle();
 }
 
+static Dart_WeakPersistentHandle AllocateFinalizableHandle(
+    Thread* thread,
+    Dart_Handle object,
+    void* peer,
+    intptr_t external_allocation_size,
+    Dart_WeakPersistentHandleFinalizer callback) {
+  REUSABLE_OBJECT_HANDLESCOPE(thread);
+  Object& ref = thread->ObjectHandle();
+  ref = Api::UnwrapHandle(object);
+  return AllocateFinalizableHandle(thread, ref, peer, external_allocation_size,
+                                   callback);
+}
+
 DART_EXPORT Dart_WeakPersistentHandle
 Dart_NewWeakPersistentHandle(Dart_Handle object,
                              void* peer,
@@ -3285,25 +3295,38 @@
   return Api::NewHandle(thread, TypedData::New(cid, length));
 }
 
-static Dart_Handle NewExternalTypedData(Thread* thread,
-                                        intptr_t cid,
-                                        void* data,
-                                        intptr_t length) {
+static Dart_Handle NewExternalTypedData(
+    Thread* thread,
+    intptr_t cid,
+    void* data,
+    intptr_t length,
+    void* peer,
+    intptr_t external_allocation_size,
+    Dart_WeakPersistentHandleFinalizer callback) {
   CHECK_LENGTH(length, ExternalTypedData::MaxElements(cid));
   Zone* zone = thread->zone();
   intptr_t bytes = length * ExternalTypedData::ElementSizeInBytes(cid);
   const ExternalTypedData& result = ExternalTypedData::Handle(
       zone, ExternalTypedData::New(cid, reinterpret_cast<uint8_t*>(data),
                                    length, SpaceForExternal(thread, bytes)));
+  if (callback != NULL) {
+    AllocateFinalizableHandle(thread, result, peer, external_allocation_size,
+                              callback);
+  }
   return Api::NewHandle(thread, result.raw());
 }
 
-static Dart_Handle NewExternalByteData(Thread* thread,
-                                       void* data,
-                                       intptr_t length) {
+static Dart_Handle NewExternalByteData(
+    Thread* thread,
+    void* data,
+    intptr_t length,
+    void* peer,
+    intptr_t external_allocation_size,
+    Dart_WeakPersistentHandleFinalizer callback) {
   Zone* zone = thread->zone();
-  Dart_Handle ext_data = NewExternalTypedData(
-      thread, kExternalTypedDataUint8ArrayCid, data, length);
+  Dart_Handle ext_data =
+      NewExternalTypedData(thread, kExternalTypedDataUint8ArrayCid, data,
+                           length, peer, external_allocation_size, callback);
   if (::Dart_IsError(ext_data)) {
     return ext_data;
   }
@@ -3376,6 +3399,17 @@
 DART_EXPORT Dart_Handle Dart_NewExternalTypedData(Dart_TypedData_Type type,
                                                   void* data,
                                                   intptr_t length) {
+  return Dart_NewExternalTypedDataWithFinalizer(type, data, length, NULL, 0,
+                                                NULL);
+}
+
+DART_EXPORT Dart_Handle Dart_NewExternalTypedDataWithFinalizer(
+    Dart_TypedData_Type type,
+    void* data,
+    intptr_t length,
+    void* peer,
+    intptr_t external_allocation_size,
+    Dart_WeakPersistentHandleFinalizer callback) {
   DARTSCOPE(Thread::Current());
   if (data == NULL && length != 0) {
     RETURN_NULL_ERROR(data);
@@ -3383,43 +3417,56 @@
   CHECK_CALLBACK_STATE(T);
   switch (type) {
     case Dart_TypedData_kByteData:
-      return NewExternalByteData(T, data, length);
+      return NewExternalByteData(T, data, length, peer,
+                                 external_allocation_size, callback);
     case Dart_TypedData_kInt8:
       return NewExternalTypedData(T, kExternalTypedDataInt8ArrayCid, data,
-                                  length);
+                                  length, peer, external_allocation_size,
+                                  callback);
     case Dart_TypedData_kUint8:
       return NewExternalTypedData(T, kExternalTypedDataUint8ArrayCid, data,
-                                  length);
+                                  length, peer, external_allocation_size,
+                                  callback);
     case Dart_TypedData_kUint8Clamped:
       return NewExternalTypedData(T, kExternalTypedDataUint8ClampedArrayCid,
-                                  data, length);
+                                  data, length, peer, external_allocation_size,
+                                  callback);
     case Dart_TypedData_kInt16:
       return NewExternalTypedData(T, kExternalTypedDataInt16ArrayCid, data,
-                                  length);
+                                  length, peer, external_allocation_size,
+                                  callback);
     case Dart_TypedData_kUint16:
       return NewExternalTypedData(T, kExternalTypedDataUint16ArrayCid, data,
-                                  length);
+                                  length, peer, external_allocation_size,
+                                  callback);
     case Dart_TypedData_kInt32:
       return NewExternalTypedData(T, kExternalTypedDataInt32ArrayCid, data,
-                                  length);
+                                  length, peer, external_allocation_size,
+                                  callback);
     case Dart_TypedData_kUint32:
       return NewExternalTypedData(T, kExternalTypedDataUint32ArrayCid, data,
-                                  length);
+                                  length, peer, external_allocation_size,
+                                  callback);
     case Dart_TypedData_kInt64:
       return NewExternalTypedData(T, kExternalTypedDataInt64ArrayCid, data,
-                                  length);
+                                  length, peer, external_allocation_size,
+                                  callback);
     case Dart_TypedData_kUint64:
       return NewExternalTypedData(T, kExternalTypedDataUint64ArrayCid, data,
-                                  length);
+                                  length, peer, external_allocation_size,
+                                  callback);
     case Dart_TypedData_kFloat32:
       return NewExternalTypedData(T, kExternalTypedDataFloat32ArrayCid, data,
-                                  length);
+                                  length, peer, external_allocation_size,
+                                  callback);
     case Dart_TypedData_kFloat64:
       return NewExternalTypedData(T, kExternalTypedDataFloat64ArrayCid, data,
-                                  length);
+                                  length, peer, external_allocation_size,
+                                  callback);
     case Dart_TypedData_kFloat32x4:
       return NewExternalTypedData(T, kExternalTypedDataFloat32x4ArrayCid, data,
-                                  length);
+                                  length, peer, external_allocation_size,
+                                  callback);
     default:
       return Api::NewError(
           "%s expects argument 'type' to be of"
@@ -6089,7 +6136,7 @@
                                     const char** argument_values) {
   return;
 }
-#else   // defined(PRODUCT)
+#else  // defined(PRODUCT)
 DART_EXPORT void Dart_RegisterIsolateServiceRequestCallback(
     const char* name,
     Dart_ServiceRequestCallback callback,
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 377cff0..7e7b9d7 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -1955,6 +1955,68 @@
   }
 }
 
+static bool byte_data_finalizer_run = false;
+void ByteDataFinalizer(void* isolate_data,
+                       Dart_WeakPersistentHandle handle,
+                       void* peer) {
+  ASSERT(!byte_data_finalizer_run);
+  free(peer);
+  byte_data_finalizer_run = true;
+}
+
+TEST_CASE(DartAPI_ExternalByteDataFinalizer) {
+  // Check finalizer associated with the underlying array instead of the
+  // wrapper.
+  const char* kScriptChars =
+      "var array;\n"
+      "extractAndSaveArray(byteData) {\n"
+      "  array = byteData.buffer.asUint8List();\n"
+      "}\n"
+      "releaseArray() {\n"
+      "  array = null;\n"
+      "}\n";
+  // Create a test library and Load up a test script in it.
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+
+  {
+    Dart_EnterScope();
+
+    const intptr_t kBufferSize = 100;
+    void* buffer = malloc(kBufferSize);
+    Dart_Handle byte_data = Dart_NewExternalTypedDataWithFinalizer(
+        Dart_TypedData_kByteData, buffer, kBufferSize, buffer, kBufferSize,
+        ByteDataFinalizer);
+
+    Dart_Handle result =
+        Dart_Invoke(lib, NewString("extractAndSaveArray"), 1, &byte_data);
+    EXPECT_VALID(result);
+
+    // ByteData wrapper is still reachable from the scoped handle.
+    EXPECT(!byte_data_finalizer_run);
+
+    // The ByteData wrapper is now unreachable, but the underlying
+    // ExternalUint8List is still alive.
+    Dart_ExitScope();
+  }
+
+  {
+    TransitionNativeToVM transition(Thread::Current());
+    Isolate::Current()->heap()->CollectAllGarbage();
+  }
+
+  EXPECT(!byte_data_finalizer_run);
+
+  Dart_Handle result = Dart_Invoke(lib, NewString("releaseArray"), 0, NULL);
+  EXPECT_VALID(result);
+
+  {
+    TransitionNativeToVM transition(Thread::Current());
+    Isolate::Current()->heap()->CollectAllGarbage();
+  }
+
+  EXPECT(byte_data_finalizer_run);
+}
+
 #ifndef PRODUCT
 
 static const intptr_t kOptExtLength = 16;
@@ -2405,10 +2467,9 @@
   {
     Dart_EnterScope();
     uint8_t data[] = {1, 2, 3, 4};
-    Dart_Handle obj = Dart_NewExternalTypedData(Dart_TypedData_kUint8, data,
-                                                ARRAY_SIZE(data));
-    Dart_NewWeakPersistentHandle(obj, &peer, sizeof(data),
-                                 ExternalTypedDataFinalizer);
+    Dart_Handle obj = Dart_NewExternalTypedDataWithFinalizer(
+        Dart_TypedData_kUint8, data, ARRAY_SIZE(data), &peer, sizeof(data),
+        ExternalTypedDataFinalizer);
     EXPECT_VALID(obj);
     Dart_ExitScope();
   }
@@ -2496,10 +2557,9 @@
   // Dart_NewExternalTypedData.
   Dart_EnterScope();
   {
-    Dart_Handle lcl =
-        Dart_NewExternalTypedData(Dart_TypedData_kFloat32x4, data, 10);
-    Dart_NewWeakPersistentHandle(lcl, &peer, sizeof(data),
-                                 ExternalTypedDataFinalizer);
+    Dart_Handle lcl = Dart_NewExternalTypedDataWithFinalizer(
+        Dart_TypedData_kFloat32x4, data, 10, &peer, sizeof(data),
+        ExternalTypedDataFinalizer);
     CheckFloat32x4Data(lcl);
   }
   Dart_ExitScope();
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index 4210097..162f58b 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -583,10 +583,19 @@
       shared_instructions_image_(shared_instructions_image) {
   ASSERT(data_image != NULL);
   ASSERT(instructions_image != NULL);
-  ASSERT(Utils::IsAligned(reinterpret_cast<uword>(instructions_image),
-                          OS::PreferredCodeAlignment()));
-  ASSERT(Utils::IsAligned(reinterpret_cast<uword>(shared_instructions_image),
-                          OS::PreferredCodeAlignment()));
+}
+
+RawApiError* ImageReader::VerifyAlignment() const {
+  if (!Utils::IsAligned(data_image_, kObjectAlignment) ||
+      !Utils::IsAligned(shared_data_image_, kObjectAlignment) ||
+      !Utils::IsAligned(instructions_image_, OS::PreferredCodeAlignment()) ||
+      !Utils::IsAligned(shared_instructions_image_,
+                        OS::PreferredCodeAlignment())) {
+    return ApiError::New(
+        String::Handle(String::New("Snapshot is misaligned", Heap::kOld)),
+        Heap::kOld);
+  }
+  return ApiError::null();
 }
 
 RawInstructions* ImageReader::GetInstructionsAt(int32_t offset) const {
diff --git a/runtime/vm/image_snapshot.h b/runtime/vm/image_snapshot.h
index 99a3e02..a4af7e4 100644
--- a/runtime/vm/image_snapshot.h
+++ b/runtime/vm/image_snapshot.h
@@ -19,6 +19,7 @@
 class Dwarf;
 class Instructions;
 class Object;
+class RawApiError;
 class RawCode;
 class RawInstructions;
 class RawObject;
@@ -54,6 +55,8 @@
               const uint8_t* shared_data_image,
               const uint8_t* shared_instructions_image);
 
+  RawApiError* VerifyAlignment() const;
+
   RawInstructions* GetInstructionsAt(int32_t offset) const;
   RawObject* GetObjectAt(uint32_t offset) const;
   RawObject* GetSharedObjectAt(uint32_t offset) const;
diff --git a/runtime/vm/kernel.h b/runtime/vm/kernel.h
index 8568139..036e3a4 100644
--- a/runtime/vm/kernel.h
+++ b/runtime/vm/kernel.h
@@ -16,7 +16,9 @@
 namespace kernel {
 class NameIndex {
  public:
-  NameIndex() : value_(-1) {}
+  static const int kInvalidName = -1;
+
+  NameIndex() : value_(kInvalidName) {}
   explicit NameIndex(int value) : value_(value) {}
 
   operator int() const { return value_; }
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index e426f4d..daee540 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -19,7 +19,7 @@
 // Keep in sync with package:kernel/lib/binary/tag.dart.
 
 static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
-static const uint32_t kBinaryFormatVersion = 4;
+static const uint32_t kBinaryFormatVersion = 5;
 
 // Keep in sync with package:kernel/lib/binary/tag.dart
 #define KERNEL_TAG_LIST(V)                                                     \
@@ -213,6 +213,14 @@
     return value;
   }
 
+  double ReadDouble() {
+    ASSERT((size_ >= 8) && (offset_ >= 0) && (offset_ <= size_ - 8));
+    double value = ReadUnaligned(
+        reinterpret_cast<const double*>(&this->buffer()[offset_]));
+    offset_ += 8;
+    return value;
+  }
+
   uint32_t ReadUInt() {
     ASSERT((size_ >= 1) && (offset_ >= 0) && (offset_ <= size_ - 1));
 
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 4b83212..6a3358c 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -82,8 +82,7 @@
         return true;
       case kDoubleLiteral:
         simple_value_ = &Double::ZoneHandle(
-            Z, Double::New(H.DartString(builder_->ReadStringReference()),
-                           Heap::kOld));  // read string reference.
+            Z, Double::New(builder_->ReadDouble(), Heap::kOld));  // read value.
         *simple_value_ = H.Canonicalize(*simple_value_);
         return true;
       case kTrueLiteral:
diff --git a/runtime/vm/os_android.cc b/runtime/vm/os_android.cc
index 0b796ff..4481f19 100644
--- a/runtime/vm/os_android.cc
+++ b/runtime/vm/os_android.cc
@@ -243,7 +243,7 @@
   __builtin_trap();
 }
 
-uintptr_t DART_NOINLINE OS::GetProgramCounter() {
+DART_NOINLINE uintptr_t OS::GetProgramCounter() {
   return reinterpret_cast<uintptr_t>(
       __builtin_extract_return_addr(__builtin_return_address(0)));
 }
diff --git a/runtime/vm/os_fuchsia.cc b/runtime/vm/os_fuchsia.cc
index 2424836..879df86 100644
--- a/runtime/vm/os_fuchsia.cc
+++ b/runtime/vm/os_fuchsia.cc
@@ -160,7 +160,7 @@
   UNIMPLEMENTED();
 }
 
-uintptr_t DART_NOINLINE OS::GetProgramCounter() {
+DART_NOINLINE uintptr_t OS::GetProgramCounter() {
   return reinterpret_cast<uintptr_t>(
       __builtin_extract_return_addr(__builtin_return_address(0)));
 }
diff --git a/runtime/vm/os_linux.cc b/runtime/vm/os_linux.cc
index 4a4bf3d..6c28bd6 100644
--- a/runtime/vm/os_linux.cc
+++ b/runtime/vm/os_linux.cc
@@ -253,7 +253,7 @@
   __builtin_trap();
 }
 
-uintptr_t DART_NOINLINE OS::GetProgramCounter() {
+DART_NOINLINE uintptr_t OS::GetProgramCounter() {
   return reinterpret_cast<uintptr_t>(
       __builtin_extract_return_addr(__builtin_return_address(0)));
 }
diff --git a/runtime/vm/os_macos.cc b/runtime/vm/os_macos.cc
index 0d52e03..8c5e2c9 100644
--- a/runtime/vm/os_macos.cc
+++ b/runtime/vm/os_macos.cc
@@ -207,7 +207,7 @@
   __builtin_trap();
 }
 
-uintptr_t DART_NOINLINE OS::GetProgramCounter() {
+DART_NOINLINE uintptr_t OS::GetProgramCounter() {
   return reinterpret_cast<uintptr_t>(
       __builtin_extract_return_addr(__builtin_return_address(0)));
 }
diff --git a/runtime/vm/os_thread.cc b/runtime/vm/os_thread.cc
index 6aa8ab9..5b62d16 100644
--- a/runtime/vm/os_thread.cc
+++ b/runtime/vm/os_thread.cc
@@ -97,6 +97,7 @@
 // stack (SafeStack).
 NO_SANITIZE_ADDRESS
 NO_SANITIZE_SAFE_STACK
+DART_NOINLINE
 uword OSThread::GetCurrentStackPointer() {
   uword stack_allocated_local = reinterpret_cast<uword>(&stack_allocated_local);
   return stack_allocated_local;
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
index 59edcb4..c9906c3 100644
--- a/runtime/vm/simulator_dbc.cc
+++ b/runtime/vm/simulator_dbc.cc
@@ -1008,7 +1008,7 @@
 // Note: functions below are marked DART_NOINLINE to recover performance on
 // ARM where inlining these functions into the interpreter loop seemed to cause
 // some code quality issues.
-static DART_NOINLINE bool InvokeRuntime(Thread* thread,
+DART_NOINLINE static bool InvokeRuntime(Thread* thread,
                                         Simulator* sim,
                                         RuntimeFunction drt,
                                         const NativeArguments& args) {
@@ -1024,7 +1024,7 @@
   }
 }
 
-static DART_NOINLINE bool InvokeNative(Thread* thread,
+DART_NOINLINE static bool InvokeNative(Thread* thread,
                                        Simulator* sim,
                                        NativeFunctionWrapper wrapper,
                                        Dart_NativeFunction function,
diff --git a/sdk/lib/_internal/js_runtime/lib/async_patch.dart b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
index 5f04f0b..0c5c995 100644
--- a/sdk/lib/_internal/js_runtime/lib/async_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
@@ -162,6 +162,20 @@
   bool get isCompleted => _completer.isCompleted;
 }
 
+/// Creates a Completer for an `async` function.
+///
+/// Used as part of the runtime support for the async/await transformation.
+Completer<T> _makeAsyncAwaitCompleter<T>() {
+  return new _AsyncAwaitCompleter<T>();
+}
+
+/// Creates a Completer for an `async` function.
+///
+/// Used as part of the runtime support for the async/await transformation.
+Completer<T> _makeSyncCompleter<T>() {
+  return new Completer<T>.sync();
+}
+
 /// Initiates the computation of an `async` function and starts the body
 /// synchronously.
 ///
@@ -464,9 +478,12 @@
   }
 }
 
-//_makeAsyncStarController(body) {
-//  return new _AsyncStarStreamController(body);
-//}
+/// Creates a stream controller for an `async*` function.
+///
+/// Used as part of the runtime support for the async/await transformation.
+_makeAsyncStarStreamController<T>(_WrappedAsyncBody body) {
+  return new _AsyncStarStreamController<T>(body);
+}
 
 class _IterationMarker {
   static const YIELD_SINGLE = 0;
@@ -618,6 +635,13 @@
   }
 }
 
+/// Creates an Iterable for a `sync*` function.
+///
+/// Used as part of the runtime support for the async/await transformation.
+_SyncStarIterable<T> _makeSyncStarIterable<T>(body) {
+  return new _SyncStarIterable<T>(body);
+}
+
 /// An Iterable corresponding to a sync* method.
 ///
 /// Each invocation of a sync* method will return a new instance of this class.
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index 28307ad..a89baa8 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -182,6 +182,12 @@
       'returns:bool;effects:none;depends:none', JsBuiltin.isDynamicType, type);
 }
 
+@ForceInline()
+bool isDartJsInteropTypeArgumentRti(type) {
+  return JS_BUILTIN('returns:bool;effects:none;depends:none',
+      JsBuiltin.isJsInteropTypeArgument, type);
+}
+
 /// Returns whether the given type is _the_ Dart Object type.
 // TODO(floitsch): move this to foreign_helper.dart or similar.
 @ForceInline()
diff --git a/sdk/lib/_internal/js_runtime/lib/js_rti.dart b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
index 427a1b0..6fe6853 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
@@ -256,6 +256,9 @@
     var typeArgument = getFutureOrArgument(rti);
     return 'FutureOr<${runtimeTypeToStringV2(typeArgument, genericContext)}>';
   }
+  if (isDartJsInteropTypeArgumentRti(rti)) {
+    return 'dynamic';
+  }
   // We should not get here.
   return 'unknown-reified-type';
 }
@@ -745,7 +748,8 @@
 bool isTopTypeV2(var type) {
   return isDartDynamicTypeRti(type) ||
       isDartVoidTypeRti(type) ||
-      isDartObjectTypeRti(type);
+      isDartObjectTypeRti(type) ||
+      isDartJsInteropTypeArgumentRti(type);
 }
 
 /// Returns `true` if the runtime type representation [type] is a supertype of
@@ -776,7 +780,8 @@
   return isDartDynamicTypeRti(type) ||
       isDartObjectTypeRti(type) ||
       isNullTypeRti(type) ||
-      isDartVoidTypeRti(type);
+      isDartVoidTypeRti(type) ||
+      isDartJsInteropTypeArgumentRti(type);
 }
 
 /// Returns `true` if the runtime type representation [type] is a `FutureOr`
@@ -946,6 +951,8 @@
   // [t] is a top type?
   if (isTopTypeV2(t)) return true;
 
+  if (isDartJsInteropTypeArgumentRti(s)) return true;
+
   // [s] is a top type?
   if (isTopTypeV2(s)) {
     if (isGenericFunctionTypeParameter(t)) {
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 fdcc183..36c5e25 100644
--- a/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
+++ b/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
@@ -428,6 +428,12 @@
   ///     JS_BUILTIN('bool', JsBuiltin.isDynamicType, o)
   isDynamicType,
 
+  /// Returns true if the given type is a type argument of a js-interop class
+  /// or a supertype of a js-interop class.
+  ///
+  ///     JS_BUILTIN('bool', JsBuiltin.isJsInteropTypeArgument, o)
+  isJsInteropTypeArgument,
+
   /// Returns the JavaScript-constructor name given an rti encoding.
   ///
   ///     JS_BUILTIN('String', JsBuiltin.rawRtiToJsConstructorName, rti)
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index e0024cf..a8cc728 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -6929,12 +6929,8 @@
 Language/Statements/Assert/execution_t03: RuntimeError # Please triage this failure
 Language/Statements/Assert/execution_t11: RuntimeError # Please triage this failure
 Language/Statements/Return/runtime_type_t04: RuntimeError # Issue 26584
-Language/Statements/Return/type_t03: RuntimeError # Would pass if FutureOr checked
-Language/Statements/Return/type_t04: RuntimeError # Would pass if FutureOr checked
 Language/Statements/Switch/execution_t01: Fail # Missing type check in switch expression
 Language/Statements/Switch/type_t01: RuntimeError # Issue 16089
-Language/Statements/Yield_and_Yield_Each/Yield/static_type_t01: RuntimeError
-Language/Statements/Yield_and_Yield_Each/Yield/static_type_t02: RuntimeError
 Language/Types/Dynamic_Type_System/malbounded_type_error_t01: RuntimeError # Issue 21088
 Language/Types/Parameterized_Types/malbounded_t06: RuntimeError # Issue 21088
 Language/Types/Static_Types/malformed_type_t01: RuntimeError # Issue 21089
diff --git a/tests/compiler/dart2js/closure/data/instantiation_strong.dart b/tests/compiler/dart2js/closure/data/instantiation_strong.dart
new file mode 100644
index 0000000..10b70e9
--- /dev/null
+++ b/tests/compiler/dart2js/closure/data/instantiation_strong.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+T id<T>(T t) => t;
+
+method<S>(S s) {
+  /*fields=[S],free=[S]*/
+  S Function(S) getId() => id;
+  return getId();
+}
+
+main() {
+  method(0);
+}
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index 52efe99..d7f0004 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -41,7 +41,8 @@
 packages/*: Skip # Skip packages folder
 quarantined/http_test: RuntimeError # not supported with CFE, consider deleting.
 rti/rti_emission_test: Pass, Slow
-rti/rti_need_test: Pass, Slow
+rti/rti_need0_test: Pass, Slow
+rti/rti_need1_test: Pass, Slow
 show_package_warnings_test: RuntimeError # missing errors from the FE
 sourcemaps/pub_build_validity_test: Pass, RuntimeError # Investigate: passes locally, but only fails in bots.
 sourcemaps/source_mapping_invokes_test: Pass, Slow
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
index 02b0d5e..82bea10 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
@@ -43,25 +43,44 @@
   }
 }
 
-/// Colorize diffs [left] and [right] and [delimiter], if ANSI colors are
-/// supported.
-String colorizeDiff(String left, String delimiter, String right) {
+/// Colorize the actual annotation [text], if ANSI colors are supported.
+String colorizeActual(String text) {
   if (useColors) {
-    return '${colors.green(left)}'
-        '${colors.yellow(delimiter)}${colors.red(right)}';
+    return '${colors.red(text)}';
   } else {
-    return '$left$delimiter$right';
+    return text;
   }
 }
 
+/// Colorize an expected annotation [text], if ANSI colors are supported.
+String colorizeExpected(String text) {
+  if (useColors) {
+    return '${colors.green(text)}';
+  } else {
+    return text;
+  }
+}
+
+/// Colorize delimiter [text], if ANSI colors are supported.
+String colorizeDelimiter(String text) {
+  if (useColors) {
+    return '${colors.yellow(text)}';
+  } else {
+    return text;
+  }
+}
+
+/// Colorize diffs [expected] and [actual] and [delimiter], if ANSI colors are
+/// supported.
+String colorizeDiff(String expected, String delimiter, String actual) {
+  return '${colorizeExpected(expected)}'
+      '${colorizeDelimiter(delimiter)}${colorizeActual(actual)}';
+}
+
 /// Colorize annotation delimiters [start] and [end] surrounding [text], if
 /// ANSI colors are supported.
 String colorizeAnnotation(String start, String text, String end) {
-  if (useColors) {
-    return '${colors.yellow(start)}$text${colors.yellow(end)}';
-  } else {
-    return '$start$text$end';
-  }
+  return '${colorizeDelimiter(start)}$text${colorizeDelimiter(end)}';
 }
 
 /// Function that computes a data mapping for [member].
@@ -98,6 +117,10 @@
 /// Display name used for strong mode compilation using the new common frontend.
 const String strongName = 'strong mode';
 
+/// Display name used for strong mode compilation without implicit checks using
+/// the new common frontend.
+const String trustName = 'strong mode without implicit checks';
+
 /// Compute actual data for all members defined in the program with the
 /// [entryPoint] and [memorySourceFiles].
 ///
@@ -226,7 +249,7 @@
     }
     Expect.isNotNull(
         member,
-        "Global member '$member' not found in the global "
+        "Global member '$memberName' not found in the global "
         "libraries: ${globalLibraries.map((l) => l.canonicalUri).join(', ')}");
     return member;
   }
@@ -275,7 +298,7 @@
       String value1 = '${data1.value}';
       annotations
           .putIfAbsent(data1.offset, () => [])
-          .add(colorizeSingle(value1));
+          .add(colorizeActual(value1));
     });
     return annotations;
   }
@@ -455,7 +478,8 @@
     ComputeClassDataFunction computeClassDataFromAst,
     ComputeClassDataFunction computeClassDataFromKernel,
     int shards: 1,
-    int shardIndex: 0}) async {
+    int shardIndex: 0,
+    bool testOmit: false}) async {
   args = args.toList();
   bool verbose = args.remove('-v');
   bool shouldContinue = args.remove('-c');
@@ -511,6 +535,7 @@
       astMarker: new MemberAnnotations<IdValue>(),
       kernelMarker: new MemberAnnotations<IdValue>(),
       strongMarker: new MemberAnnotations<IdValue>(),
+      omitMarker: new MemberAnnotations<IdValue>(),
     };
     computeExpectedMap(entryPoint, code[entryPoint], expectedMaps);
     Map<String, String> memorySourceFiles = {
@@ -590,7 +615,7 @@
       } else {
         print('--from kernel (strong mode)-----------------------------------');
         List<String> options = [Flags.strongMode]..addAll(testOptions);
-        if (trustTypeAnnotations) {
+        if (trustTypeAnnotations && !testOmit) {
           options.add(Flags.omitImplicitChecks);
         }
         MemberAnnotations<IdValue> annotations = expectedMaps[strongMarker];
@@ -609,6 +634,29 @@
         }
       }
     }
+    if (testOmit) {
+      if (skipForStrong.contains(name)) {
+        print('--skipped for kernel (strong mode, omit-implicit-checks)------');
+      } else {
+        print('--from kernel (strong mode, omit-implicit-checks)-------------');
+        List<String> options = [Flags.strongMode, Flags.omitImplicitChecks]
+          ..addAll(testOptions);
+        MemberAnnotations<IdValue> annotations = expectedMaps[omitMarker];
+        CompiledData compiledData2 = await computeData(
+            entryPoint, memorySourceFiles, computeFromKernel,
+            computeClassData: computeClassDataFromKernel,
+            options: options,
+            verbose: verbose,
+            forUserLibrariesOnly: forUserLibrariesOnly,
+            globalIds: annotations.globalData.keys);
+        if (await checkCode(
+            trustName, entity.uri, code, annotations, compiledData2,
+            filterActualData: filterActualData,
+            fatalErrors: !testAfterFailures)) {
+          hasFailures = true;
+        }
+      }
+    }
   }
   Expect.isFalse(hasFailures, 'Errors found.');
 }
@@ -642,7 +690,7 @@
               data.compiler.reporter,
               actualData.sourceSpan,
               'EXTRA $mode DATA for ${id.descriptor} = '
-              '${colors.red('$actual')} for ${actualData.objectText}. '
+              '${colorizeActual('$actual')} for ${actualData.objectText}. '
               'Data was expected for these ids: ${expectedMap.keys}');
           if (filterActualData == null || filterActualData(null, actualData)) {
             hasLocalFailure = true;
@@ -656,8 +704,8 @@
               actualData.sourceSpan,
               'UNEXPECTED $mode DATA for ${id.descriptor}: '
               'Object: ${actualData.objectText}\n '
-              'expected: ${colors.green('$expected')}\n '
-              'actual: ${colors.red('$actual')}');
+              'expected: ${colorizeExpected('$expected')}\n '
+              'actual: ${colorizeActual('$actual')}');
           if (filterActualData == null ||
               filterActualData(expected, actualData)) {
             hasLocalFailure = true;
@@ -771,6 +819,7 @@
 const String astMarker = 'ast.';
 const String kernelMarker = 'kernel.';
 const String strongMarker = 'strong.';
+const String omitMarker = 'omit.';
 
 /// Compute three [MemberAnnotations] objects from [code] specifying the
 /// expected annotations we anticipate encountering; one corresponding to the
@@ -787,11 +836,12 @@
 /// annotations without prefixes.
 void computeExpectedMap(Uri sourceUri, AnnotatedCode code,
     Map<String, MemberAnnotations<IdValue>> maps) {
-  List<String> mapKeys = [astMarker, kernelMarker, strongMarker];
+  List<String> mapKeys = [astMarker, kernelMarker, strongMarker, omitMarker];
   Map<String, AnnotatedCode> split = splitByPrefixes(code, mapKeys);
 
   split.forEach((String marker, AnnotatedCode code) {
     MemberAnnotations<IdValue> fileAnnotations = maps[marker];
+    assert(fileAnnotations != null, "No annotations for $marker in $maps");
     Map<Id, IdValue> expectedValues = fileAnnotations[sourceUri];
     for (Annotation annotation in code.annotations) {
       String text = annotation.text;
@@ -799,14 +849,14 @@
       if (idValue.id.isGlobal) {
         Expect.isFalse(
             fileAnnotations.globalData.containsKey(idValue.id),
-            "Duplicate annotations for ${idValue.id}: ${idValue} and "
-            "${fileAnnotations.globalData[idValue.id]}.");
+            "Duplicate annotations for ${idValue.id} in $marker: "
+            "${idValue} and ${fileAnnotations.globalData[idValue.id]}.");
         fileAnnotations.globalData[idValue.id] = idValue;
       } else {
         Expect.isFalse(
             expectedValues.containsKey(idValue.id),
-            "Duplicate annotations for ${idValue.id}: ${idValue} and "
-            "${expectedValues[idValue.id]}.");
+            "Duplicate annotations for ${idValue.id} in $marker: "
+            "${idValue} and ${expectedValues[idValue.id]}.");
         expectedValues[idValue.id] = idValue;
       }
     }
diff --git a/tests/compiler/dart2js/inference/load_deferred_library_test.dart b/tests/compiler/dart2js/inference/load_deferred_library_test.dart
new file mode 100644
index 0000000..985453c
--- /dev/null
+++ b/tests/compiler/dart2js/inference/load_deferred_library_test.dart
@@ -0,0 +1,80 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+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/common/names.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_model/js_strategy.dart';
+import 'package:compiler/src/kernel/element_map.dart';
+import 'package:compiler/src/types/types.dart';
+import 'package:compiler/src/world.dart';
+import 'package:expect/expect.dart';
+import 'package:kernel/ast.dart' as ir;
+import '../memory_compiler.dart';
+
+const String source = '''
+import 'package:expect/expect.dart' deferred as expect;
+
+main() {
+  callLoadLibrary();
+}
+
+callLoadLibrary() => expect.loadLibrary();
+''';
+
+main() async {
+  asyncTest(() async {
+    print('--test Dart 1 --use-old-frontend ---------------------------------');
+    await runTest([Flags.useOldFrontend], trust: false, useOldFrontend: true);
+    print('--test Dart 1 ----------------------------------------------------');
+    await runTest([], trust: false);
+    print('--test Dart 1 --trust-type-annotations ---------------------------');
+    await runTest([Flags.trustTypeAnnotations]);
+    print('--test Dart 2 ----------------------------------------------------');
+    await runTest([Flags.strongMode], trust: false);
+    print('--test Dart 2 --omit-implicit-checks -----------------------------');
+    await runTest([Flags.strongMode, Flags.omitImplicitChecks]);
+  });
+}
+
+runTest(List<String> options,
+    {bool trust: true, bool useOldFrontend: false}) async {
+  CompilationResult result = await runCompiler(
+      memorySourceFiles: {'main.dart': source}, options: options);
+  Expect.isTrue(result.isSuccess);
+  Compiler compiler = result.compiler;
+  ClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+  ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
+  LibraryEntity helperLibrary =
+      elementEnvironment.lookupLibrary(Uris.dart__js_helper);
+  FunctionEntity loadDeferredLibrary = elementEnvironment.lookupLibraryMember(
+      helperLibrary, 'loadDeferredLibrary');
+  TypeMask typeMask;
+  if (useOldFrontend) {
+    MethodElement method = loadDeferredLibrary;
+    typeMask = compiler.globalInference.results
+        .resultOfParameter(method.parameters.first)
+        .type;
+  } else {
+    JsBackendStrategy backendStrategy = compiler.backendStrategy;
+    KernelToLocalsMap localsMap = backendStrategy.globalLocalsMapForTesting
+        .getLocalsMap(loadDeferredLibrary);
+    MemberDefinition definition =
+        backendStrategy.elementMap.getMemberDefinition(loadDeferredLibrary);
+    ir.Procedure procedure = definition.node;
+    typeMask = compiler.globalInference.results
+        .resultOfParameter(localsMap
+            .getLocalVariable(procedure.function.positionalParameters.first))
+        .type;
+  }
+  if (trust) {
+    Expect.equals(closedWorld.commonMasks.stringType.nullable(), typeMask);
+  } else {
+    Expect.equals(closedWorld.commonMasks.dynamicType, typeMask);
+  }
+}
diff --git a/tests/compiler/dart2js/jsinterop/world_test.dart b/tests/compiler/dart2js/jsinterop/world_test.dart
index a706741..94e990a 100644
--- a/tests/compiler/dart2js/jsinterop/world_test.dart
+++ b/tests/compiler/dart2js/jsinterop/world_test.dart
@@ -7,25 +7,36 @@
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/common_elements.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart' show ClassEntity;
 import 'package:compiler/src/elements/names.dart';
 import 'package:compiler/src/universe/selector.dart';
 import 'package:compiler/src/world.dart';
-import '../type_test_helper.dart';
+import '../helpers/element_lookup.dart';
+import '../memory_compiler.dart';
 
 void main() {
   asyncTest(() async {
-    await testClasses(CompileMode.memory);
-    await testClasses(CompileMode.kernel);
+    print('--test from ast---------------------------------------------------');
+    await testClasses([Flags.useOldFrontend]);
+    print('--test from kernel------------------------------------------------');
+    await testClasses([]);
+    print('--test from kernel (strong mode)----------------------------------');
+    // TODO(johnniwinther): Update the test to be strong mode compliant.
+    //await testClasses([Flags.strongMode]);
   });
 }
 
-testClasses(CompileMode compileMode) async {
+testClasses(List<String> options) async {
   test(String mainSource,
       {List<String> directlyInstantiated: const <String>[],
       List<String> abstractlyInstantiated: const <String>[],
       List<String> indirectlyInstantiated: const <String>[]}) async {
-    TypeEnvironment env = await TypeEnvironment.create(r"""
+    CompilationResult result = await runCompiler(memorySourceFiles: {
+      'main.dart': """
+import 'package:js/js.dart';
+
 @JS()
 class A {
   get foo;
@@ -74,11 +85,11 @@
 newD() => new D(foo: 3);
 newE() => new E(4);
 newF() => new F(5);
-""", mainSource: """
-import 'package:js/js.dart';
 
 $mainSource
-""", compileMode: compileMode);
+"""
+    }, options: options);
+    Compiler compiler = result.compiler;
     Map<String, ClassEntity> classEnvironment = <String, ClassEntity>{};
 
     ClassEntity registerClass(ClassEntity cls) {
@@ -86,19 +97,19 @@
       return cls;
     }
 
-    ClosedWorld world = env.closedWorld;
+    ClosedWorld world = compiler.backendClosedWorldForTesting;
     ElementEnvironment elementEnvironment = world.elementEnvironment;
     ClassEntity Object_ = registerClass(world.commonElements.objectClass);
     ClassEntity Interceptor =
         registerClass(world.commonElements.jsInterceptorClass);
     ClassEntity JavaScriptObject =
         registerClass(world.commonElements.jsJavaScriptObjectClass);
-    ClassEntity A = registerClass(env.getClass('A'));
-    ClassEntity B = registerClass(env.getClass('B'));
-    ClassEntity C = registerClass(env.getClass('C'));
-    ClassEntity D = registerClass(env.getClass('D'));
-    ClassEntity E = registerClass(env.getClass('E'));
-    ClassEntity F = registerClass(env.getClass('F'));
+    ClassEntity A = registerClass(findClass(world, 'A'));
+    ClassEntity B = registerClass(findClass(world, 'B'));
+    ClassEntity C = registerClass(findClass(world, 'C'));
+    ClassEntity D = registerClass(findClass(world, 'D'));
+    ClassEntity E = registerClass(findClass(world, 'E'));
+    ClassEntity F = registerClass(findClass(world, 'F'));
 
     Selector nonExisting = new Selector.getter(const PublicName('nonExisting'));
 
diff --git a/tests/compiler/dart2js/kernel/impact_test.dart b/tests/compiler/dart2js/kernel/impact_test.dart
index 1e21b09..0138247 100644
--- a/tests/compiler/dart2js/kernel/impact_test.dart
+++ b/tests/compiler/dart2js/kernel/impact_test.dart
@@ -100,21 +100,23 @@
   testIfNotNullSet(null);
   testIfNull(null);
   testSetIfNull(null);
-  testSyncStar();
-  testAsync();
-  testAsyncStar();
-  testLocalSyncStar();
-  testLocalAsync();
-  testLocalAsyncStar();
-  testAnonymousSyncStar();
-  testAnonymousAsync();
-  testAnonymousAsyncStar();
+  // Following tests are disabled because we changed the Kernel version to
+  // register helper function calls with explicit type arguments.
+  //testSyncStar();
+  //testAsync();
+  //testAsyncStar();
+  //testLocalSyncStar();
+  //testLocalAsync();
+  //testLocalAsyncStar();
+  //testAnonymousSyncStar();
+  //testAnonymousAsync();
+  //testAnonymousAsyncStar();
+  //testAsyncForIn(null);
+  //testAsyncForInTyped(null);
   testIfThen();
   testIfThenElse();
   testForIn(null);
   testForInTyped(null);
-  testAsyncForIn(null);
-  testAsyncForInTyped(null);
   testTryCatch();
   testTryCatchOn();
   testTryCatchStackTrace();
@@ -284,30 +286,32 @@
 testIfNull(o) => o ?? 42;
 testSetIfNull(o) => o ??= 42;
 
-testSyncStar() sync* {}
-testAsync() async {}
-testAsyncStar() async* {}
-testLocalSyncStar() {
-  local() sync* {}
-  return local;
-}
-testLocalAsync() {
-  local() async {}
-  return local;
-}
-testLocalAsyncStar() {
-  local() async* {}
-  return local;
-}
-testAnonymousSyncStar() {
-  return () sync* {};
-}
-testAnonymousAsync() {
-  return () async {};
-}
-testAnonymousAsyncStar() {
-  return () async* {};
-}
+// Following tests are disabled because we changed the Kernel version to
+// register helper function calls with explicit type arguments.
+//testSyncStar() sync* {}
+//testAsync() async {}
+//testAsyncStar() async* {}
+//testLocalSyncStar() {
+//  local() sync* {}
+//  return local;
+//}
+//testLocalAsync() {
+//  local() async {}
+//  return local;
+//}
+//testLocalAsyncStar() {
+//  local() async* {}
+//  return local;
+//}
+//testAnonymousSyncStar() {
+//  return () sync* {};
+//}
+//testAnonymousAsync() {
+//  return () async {};
+//}
+//testAnonymousAsyncStar() {
+//  return () async* {};
+//}
 
 testIfThen() {
   if (false) return 42;
@@ -326,12 +330,12 @@
 testForInTyped(o) {
   for (int e in o) {}
 }
-testAsyncForIn(o) async {
-  await for (var e in o) {}
-}
-testAsyncForInTyped(o) async {
-  await for (int e in o) {}
-}
+//testAsyncForIn(o) async {
+//  await for (var e in o) {}
+//}
+//testAsyncForInTyped(o) async {
+//  await for (int e in o) {}
+//}
 testTryCatch() {
   try {} catch (e) {}
 }
diff --git a/tests/compiler/dart2js/rti/data/call_typed_generic.dart b/tests/compiler/dart2js/rti/data/call_typed_generic.dart
index 494b90c..2db2947 100644
--- a/tests/compiler/dart2js/rti/data/call_typed_generic.dart
+++ b/tests/compiler/dart2js/rti/data/call_typed_generic.dart
@@ -5,7 +5,8 @@
 import 'package:expect/expect.dart';
 import 'package:meta/dart2js.dart';
 
-/*class: A:needsArgs*/
+/*!strong.class: A:needsArgs*/
+/*strong.class: A:direct,explicit=[A.T],needsArgs*/
 class A<T> {
   /*element: A.call:needsSignature*/
   call(T t) {}
diff --git a/tests/compiler/dart2js/rti/data/call_typed_generic_strong.dart b/tests/compiler/dart2js/rti/data/call_typed_generic_strong.dart
index ef0e3cb..6678ce8 100644
--- a/tests/compiler/dart2js/rti/data/call_typed_generic_strong.dart
+++ b/tests/compiler/dart2js/rti/data/call_typed_generic_strong.dart
@@ -5,7 +5,8 @@
 import 'package:expect/expect.dart';
 import 'package:meta/dart2js.dart';
 
-/*class: A:needsArgs*/
+/*!strong.class: A:needsArgs*/
+/*strong.class: A:direct,explicit=[A.T],needsArgs*/
 class A<T> {
   /*element: A.call:needsSignature*/
   call(T t) {}
diff --git a/tests/compiler/dart2js/rti/data/closure.dart b/tests/compiler/dart2js/rti/data/closure.dart
index 7b45cde..8b23eeb 100644
--- a/tests/compiler/dart2js/rti/data/closure.dart
+++ b/tests/compiler/dart2js/rti/data/closure.dart
@@ -2,7 +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.
 
-/*class: A:needsArgs*/
+/*!strong.class: A:needsArgs*/
+/*strong.class: A:direct,explicit=[A.T],needsArgs*/
 class A<T> {
   m() {
     return /*needsSignature*/ (T t) {};
@@ -11,7 +12,12 @@
   /*element: A.f:*/
   f() {
     // TODO(johnniwinther): Optimize local function type signature need.
-    return /*ast.*/ /*kernel.*/ /*strong.needsSignature*/ (int t) {};
+    return
+        /*ast.*/
+        /*kernel.*/
+        /*strong.needsSignature*/
+        /*omit.needsSignature*/
+        (int t) {};
   }
 }
 
diff --git a/tests/compiler/dart2js/rti/data/closure_generic_unneeded_strong.dart b/tests/compiler/dart2js/rti/data/closure_generic_unneeded_strong.dart
index 5e985bd..0b26509f 100644
--- a/tests/compiler/dart2js/rti/data/closure_generic_unneeded_strong.dart
+++ b/tests/compiler/dart2js/rti/data/closure_generic_unneeded_strong.dart
@@ -4,7 +4,8 @@
 
 import 'package:expect/expect.dart';
 
-/*class: A:*/
+/*!strong.class: A:*/
+/*strong.class: A:direct,explicit=[A.T],needsArgs*/
 class A<T> {
   @NoInline()
   m() {
diff --git a/tests/compiler/dart2js/rti/data/closure_unneeded.dart b/tests/compiler/dart2js/rti/data/closure_unneeded.dart
index 5e985bd..0b26509f 100644
--- a/tests/compiler/dart2js/rti/data/closure_unneeded.dart
+++ b/tests/compiler/dart2js/rti/data/closure_unneeded.dart
@@ -4,7 +4,8 @@
 
 import 'package:expect/expect.dart';
 
-/*class: A:*/
+/*!strong.class: A:*/
+/*strong.class: A:direct,explicit=[A.T],needsArgs*/
 class A<T> {
   @NoInline()
   m() {
diff --git a/tests/compiler/dart2js/rti/data/dynamic_is2_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_is2_strong.dart
index f3b260d..e928292 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_is2_strong.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_is2_strong.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.
 
+/*!strong.class: A:*/
+/*strong.class: A:explicit=[A]*/
 class A {
   /*element: A.instanceMethod:deps=[B.instanceMethod],direct,explicit=[instanceMethod.T],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)]*/
   instanceMethod<T>(t) => t is T;
diff --git a/tests/compiler/dart2js/rti/data/dynamic_not2_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_not2_strong.dart
index d04a960..55caaec 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_not2_strong.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_not2_strong.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.
 
+/*!strong.class: A:*/
+/*strong.class: A:explicit=[A]*/
 class A {
   /*element: A.instanceMethod:deps=[B.instanceMethod]*/
   instanceMethod<T>(t) => t;
diff --git a/tests/compiler/dart2js/rti/data/dynamic_tear_off3_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_tear_off3_strong.dart
index 8a9c2d6..ba29c64 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_tear_off3_strong.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_tear_off3_strong.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.
 
+/*!strong.class: A:*/
+/*strong.class: A:explicit=[A]*/
 class A {
   /*element: A.instanceMethod:deps=[staticMethod],direct,explicit=[instanceMethod.T],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)]*/
   instanceMethod<T>(t) => t is T;
diff --git a/tests/compiler/dart2js/rti/data/dynamic_type_literal2_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_type_literal2_strong.dart
index b9826a5..975f814 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_type_literal2_strong.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_type_literal2_strong.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/*strong.class: A:explicit=[A]*/
 class A {
   /*element: A.instanceMethod:deps=[B.instanceMethod],exp,needsArgs,selectors=[Selector(call, instanceMethod, arity=0, types=1)]*/
   instanceMethod<T>() => T;
diff --git a/tests/compiler/dart2js/rti/data/function_subtype_local5.dart b/tests/compiler/dart2js/rti/data/function_subtype_local5.dart
index 521daf0..b1cb012 100644
--- a/tests/compiler/dart2js/rti/data/function_subtype_local5.dart
+++ b/tests/compiler/dart2js/rti/data/function_subtype_local5.dart
@@ -18,9 +18,15 @@
 class C<T> {
   void test(String nameOfT, bool expectedResult) {
     // TODO(johnniwinther): Optimize local function type signature need.
-    /*ast.*/ /*kernel.*/ /*strong.needsSignature*/
+    /*ast.*/
+    /*kernel.*/
+    /*strong.needsSignature*/
+    /*omit.needsSignature*/
     int foo(bool a, [String b]) => null;
-    /*ast.*/ /*kernel.*/ /*strong.needsSignature*/
+    /*ast.*/
+    /*kernel.*/
+    /*strong.needsSignature*/
+    /*omit.needsSignature*/
     int baz(bool a, {String b}) => null;
 
     Expect.equals(expectedResult, foo is Foo<T>, 'foo is Foo<$nameOfT>');
diff --git a/tests/compiler/dart2js/rti/data/generic_class_is2.dart b/tests/compiler/dart2js/rti/data/generic_class_is2.dart
index 508466d..4a84003 100644
--- a/tests/compiler/dart2js/rti/data/generic_class_is2.dart
+++ b/tests/compiler/dart2js/rti/data/generic_class_is2.dart
@@ -8,6 +8,8 @@
 /*class: A:implicit=[List<A<C2>>,List<A<C>>]*/
 class A<T> {}
 
+/*!strong.class: A1:*/
+/*strong.class: A1:implicit=[A1]*/
 class A1 implements A<C1> {}
 
 /*class: B:direct,explicit=[B.T],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/generic_method_instantiate.dart b/tests/compiler/dart2js/rti/data/generic_method_instantiate.dart
index a9fb97fe..0162882 100644
--- a/tests/compiler/dart2js/rti/data/generic_method_instantiate.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method_instantiate.dart
@@ -11,6 +11,7 @@
 /*ast.element: method:*/
 /*kernel.element: method:*/
 /*strong.element: method:needsArgs*/
+/*omit.element: method:needsArgs*/
 method<T>() => new B<T>();
 
 main() {
diff --git a/tests/compiler/dart2js/rti/data/generic_method_is.dart b/tests/compiler/dart2js/rti/data/generic_method_is.dart
index 5478c03..a2cfa4a 100644
--- a/tests/compiler/dart2js/rti/data/generic_method_is.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method_is.dart
@@ -5,6 +5,7 @@
 /*ast.element: method:direct,explicit=[method.T]*/
 /*kernel.element: method:direct,explicit=[method.T]*/
 /*strong.element: method:direct,explicit=[method.T],needsArgs*/
+/*omit.element: method:direct,explicit=[method.T],needsArgs*/
 method<T>(T t) => t is T;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/data/generic_method_is2_strong.dart b/tests/compiler/dart2js/rti/data/generic_method_is2_strong.dart
index 2ed28c3..4caa1c3 100644
--- a/tests/compiler/dart2js/rti/data/generic_method_is2_strong.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method_is2_strong.dart
@@ -5,16 +5,19 @@
 /*class: A1:implicit=[A1]*/
 class A1 {}
 
+/*strong.class: A2:implicit=[A2]*/
 class A2 {}
 
 /*class: B1:implicit=[B1]*/
 class B1 {}
 
+/*strong.class: B2:implicit=[B2]*/
 class B2 {}
 
 /*class: C1:implicit=[C1]*/
 class C1 {}
 
+/*strong.class: C2:implicit=[C2]*/
 class C2 {}
 
 /*class: C3:implicit=[C3]*/
@@ -23,16 +26,19 @@
 /*class: D1:implicit=[D1]*/
 class D1 {}
 
+/*strong.class: D2:implicit=[D2]*/
 class D2 {}
 
 /*class: E1:implicit=[E1]*/
 class E1 {}
 
+/*strong.class: E2:implicit=[E2]*/
 class E2 {}
 
 /*class: F1:implicit=[F1]*/
 class F1 {}
 
+/*strong.class: F2:implicit=[F2]*/
 class F2 {}
 
 /*class: F3:implicit=[F3]*/
@@ -42,6 +48,7 @@
 // Calls to this imply a check of the passed type arguments.
 bool topLevelMethod1<T>(T t, {a1}) => t is T;
 
+/*strong.element: topLevelMethod2:direct,explicit=[topLevelMethod2.T],needsArgs,selectors=[Selector(call, call, arity=2, named=[a2], types=1)]*/
 // Calls to this does _not_ imply a check of the passed type arguments.
 T topLevelMethod2<T>(T t, {a2}) => t;
 
@@ -50,6 +57,7 @@
   // Calls to this imply a check of the passed type arguments.
   bool instanceMethod1<S>(S s, {b1}) => s is S;
 
+  /*strong.element: Class.instanceMethod2:direct,explicit=[instanceMethod2.S],needsArgs,selectors=[Selector(call, call, arity=2, named=[b2], types=1),Selector(call, instanceMethod2, arity=2, named=[b2], types=1)]*/
   // Calls to this does _not_ imply a check of the passed type arguments.
   S instanceMethod2<S>(S s, {b2}) => s;
 }
@@ -60,11 +68,13 @@
   bool localFunction1<U>(U u, {c1}) => u is U;
 
   // Calls to this does _not_ imply a check of the passed type arguments.
+  /*strong.direct,explicit=[localFunction2.U],needsArgs,selectors=[Selector(call, call, arity=2, named=[c2], types=1)]*/
   U localFunction2<U>(U u, {c2}) => u;
 
   // Calls to this does _not_ imply a check of the passed type arguments. A
   // call to the .call function on this will, though, since it has the same
   // signature as [localFunction1] which needs its type arguments.
+  /*strong.direct,explicit=[localFunction3.U],needsArgs,selectors=[Selector(call, call, arity=2, named=[c1], types=1)]*/
   localFunction3<U>(U u, {c1}) => u;
 
   var c = new Class();
diff --git a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05_strong.dart b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05_strong.dart
index b0b6317..6208ec6 100644
--- a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05_strong.dart
+++ b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05_strong.dart
@@ -4,18 +4,23 @@
 
 // Test derived from language_2/generic_methods_dynamic_test/05
 
-/*class: global#JSArray:deps=[EmptyIterable,List,ListIterable,SubListIterable],explicit=[JSArray],needsArgs*/
-/*class: global#List:deps=[C.bar,EmptyIterable,Iterable,JSArray,ListIterable],explicit=[List,List<B>],needsArgs*/
+/*!strong.class: global#JSArray:deps=[EmptyIterable,List,ListIterable,SubListIterable],explicit=[JSArray],needsArgs*/
+/*strong.class: global#JSArray:deps=[ArrayIterator,EmptyIterable,List,ListIterable,SubListIterable],direct,explicit=[Iterable<JSArray.E>,JSArray,JSArray.E,JSArray<ArrayIterator.E>,List<JSArray.E>],implicit=[JSArray.E],needsArgs*/
+
+/*!strong.class: global#List:deps=[C.bar,EmptyIterable,Iterable,JSArray,ListIterable],explicit=[List,List<B>],needsArgs*/
+/*strong.class: global#List:deps=[C.bar,EmptyIterable,Iterable,JSArray,ListIterable,makeListFixedLength],direct,explicit=[List,List.E,List<B>,List<JSArray.E>,List<String>,List<makeListFixedLength.T>],implicit=[List.E],needsArgs*/
 
 import "package:expect/expect.dart";
 
 class A {}
 
-/*class: B:explicit=[List<B>]*/
+/*!strong.class: B:explicit=[List<B>]*/
+/*strong.class: B:explicit=[List<B>],implicit=[B]*/
 class B {}
 
 class C {
-  /*element: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
+  /*!strong.element: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
+  /*strong.element: C.bar:explicit=[Iterable<bar.T>],implicit=[bar.T],indirect,needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
   List<T> bar<T>(Iterable<T> t) => <T>[t.first];
 }
 
diff --git a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a_strong.dart b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a_strong.dart
index 8940f95..e7b8007 100644
--- a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a_strong.dart
+++ b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a_strong.dart
@@ -6,18 +6,21 @@
 
 import "package:expect/expect.dart";
 
-/*class: A:deps=[C.bar],explicit=[A<B>],needsArgs*/
+/*!strong.class: A:deps=[C.bar],explicit=[A<B>],needsArgs*/
+/*strong.class: A:deps=[C.bar],direct,explicit=[A.T,A<B>,A<bar.T>],needsArgs*/
 class A<T> {
   final T field;
 
   A(this.field);
 }
 
-/*class: B:explicit=[A<B>]*/
+/*!strong.class: B:explicit=[A<B>]*/
+/*strong.class: B:explicit=[A<B>],implicit=[B]*/
 class B {}
 
 class C {
-  /*element: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
+  /*!strong.element: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
+  /*strong.element: C.bar:explicit=[A<bar.T>],implicit=[bar.T],indirect,needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
   A<T> bar<T>(A<T> t) => new A<T>(t.field);
 }
 
diff --git a/tests/compiler/dart2js/rti/data/list_literal_strong.dart b/tests/compiler/dart2js/rti/data/list_literal_strong.dart
index a2db42d..c682cf3 100644
--- a/tests/compiler/dart2js/rti/data/list_literal_strong.dart
+++ b/tests/compiler/dart2js/rti/data/list_literal_strong.dart
@@ -2,8 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*class: global#List:deps=[Class.m,EmptyIterable,Iterable,JSArray,ListIterable,SetMixin],explicit=[List],implicit=[List.E],indirect,needsArgs*/
-/*class: global#JSArray:deps=[EmptyIterable,List,ListIterable,SetMixin,SubListIterable],explicit=[JSArray],implicit=[JSArray.E],indirect,needsArgs*/
+/*strong.class: global#List:deps=[Class.m,EmptyIterable,Iterable,JSArray,ListIterable,SetMixin,makeListFixedLength],direct,explicit=[List,List.E,List<JSArray.E>,List<String>,List<makeListFixedLength.T>],implicit=[List.E],needsArgs*/
+/*omit.class: global#List:deps=[Class.m,EmptyIterable,Iterable,JSArray,ListIterable,SetMixin],explicit=[List],implicit=[List.E],indirect,needsArgs*/
+
+/*omit.class: global#JSArray:deps=[EmptyIterable,List,ListIterable,SetMixin,SubListIterable],explicit=[JSArray],implicit=[JSArray.E],indirect,needsArgs*/
 
 main() {
   var c = new Class();
diff --git a/tests/compiler/dart2js/rti/data/list_to_set.dart b/tests/compiler/dart2js/rti/data/list_to_set.dart
index 1d86288..83762b3 100644
--- a/tests/compiler/dart2js/rti/data/list_to_set.dart
+++ b/tests/compiler/dart2js/rti/data/list_to_set.dart
@@ -4,11 +4,13 @@
 
 /*ast.class: global#List:deps=[Class,EmptyIterable,Iterable,JSArray,ListIterable,SetMixin,SubListIterable],explicit=[List],implicit=[List.E],indirect,needsArgs*/
 /*kernel.class: global#List:deps=[Class,EmptyIterable,Iterable,JSArray,ListIterable,SetMixin],explicit=[List],implicit=[List.E],indirect,needsArgs*/
-/*strong.class: global#List:deps=[Class,EmptyIterable,Iterable,JSArray,ListIterable,SetMixin],explicit=[List],implicit=[List.E],indirect,needsArgs*/
+/*strong.class: global#List:deps=[Class,EmptyIterable,Iterable,JSArray,ListIterable,SetMixin,makeListFixedLength],direct,explicit=[List,List.E,List<JSArray.E>,List<String>,List<makeListFixedLength.T>],implicit=[List.E],needsArgs*/
+/*omit.class: global#List:deps=[Class,EmptyIterable,Iterable,JSArray,ListIterable,SetMixin],explicit=[List],implicit=[List.E],indirect,needsArgs*/
 
 /*ast.class: global#JSArray:deps=[List],explicit=[JSArray],implicit=[JSArray.E],indirect,needsArgs*/
 /*kernel.class: global#JSArray:deps=[EmptyIterable,List,ListIterable,SetMixin,SubListIterable],explicit=[JSArray],implicit=[JSArray.E],indirect,needsArgs*/
-/*strong.class: global#JSArray:deps=[EmptyIterable,List,ListIterable,SetMixin,SubListIterable],explicit=[JSArray],implicit=[JSArray.E],indirect,needsArgs*/
+/*strong.class: global#JSArray:deps=[ArrayIterator,EmptyIterable,List,ListIterable,SetMixin,SubListIterable],explicit=[Iterable<JSArray.E>,JSArray,JSArray.E,JSArray<ArrayIterator.E>,List<JSArray.E>],implicit=[JSArray.E],indirect,needsArgs*/
+/*omit.class: global#JSArray:deps=[EmptyIterable,List,ListIterable,SetMixin,SubListIterable],explicit=[JSArray],implicit=[JSArray.E],indirect,needsArgs*/
 
 main() {
   var c = new Class<int>();
diff --git a/tests/compiler/dart2js/rti/data/list_to_set_strong.dart b/tests/compiler/dart2js/rti/data/list_to_set_strong.dart
index 9f00b07..60c98f7 100644
--- a/tests/compiler/dart2js/rti/data/list_to_set_strong.dart
+++ b/tests/compiler/dart2js/rti/data/list_to_set_strong.dart
@@ -2,8 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*class: global#List:deps=[Class,EmptyIterable,Iterable,JSArray,ListIterable,SetMixin],explicit=[List],implicit=[List.E],indirect,needsArgs*/
-/*class: global#JSArray:deps=[EmptyIterable,List,ListIterable,SetMixin,SubListIterable],explicit=[JSArray],implicit=[JSArray.E],indirect,needsArgs*/
+/*strong.class: global#List:deps=[Class,EmptyIterable,Iterable,JSArray,ListIterable,SetMixin,makeListFixedLength],direct,explicit=[List,List.E,List<JSArray.E>,List<String>,List<makeListFixedLength.T>],implicit=[List.E],needsArgs*/
+/*omit.class: global#List:deps=[Class,EmptyIterable,Iterable,JSArray,ListIterable,SetMixin],explicit=[List],implicit=[List.E],indirect,needsArgs*/
+
+/*strong.class: global#JSArray:deps=[ArrayIterator,EmptyIterable,List,ListIterable,SetMixin,SubListIterable],explicit=[Iterable<JSArray.E>,JSArray,JSArray.E,JSArray<ArrayIterator.E>,List<JSArray.E>],implicit=[JSArray.E],indirect,needsArgs*/
+/*omit.class: global#JSArray:deps=[EmptyIterable,List,ListIterable,SetMixin,SubListIterable],explicit=[JSArray],implicit=[JSArray.E],indirect,needsArgs*/
 
 main() {
   var c = new Class<int>();
diff --git a/tests/compiler/dart2js/rti/data/local_function_generic_strong.dart b/tests/compiler/dart2js/rti/data/local_function_generic_strong.dart
index 71a9566..6963dd7 100644
--- a/tests/compiler/dart2js/rti/data/local_function_generic_strong.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_generic_strong.dart
@@ -5,7 +5,8 @@
 import 'package:expect/expect.dart';
 
 method1() {
-  /*needsSignature*/
+  /*strong.direct,explicit=[local.T],needsArgs,needsSignature*/
+  /*omit.needsSignature*/
   T local<T>(T t) => t;
   return local;
 }
diff --git a/tests/compiler/dart2js/rti/data/local_function_list_literal_strong.dart b/tests/compiler/dart2js/rti/data/local_function_list_literal_strong.dart
index 40f4aa7..c6f518c 100644
--- a/tests/compiler/dart2js/rti/data/local_function_list_literal_strong.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_list_literal_strong.dart
@@ -4,9 +4,11 @@
 
 import 'package:expect/expect.dart';
 
-/*class: global#JSArray:deps=[EmptyIterable,List,ListIterable,SubListIterable],explicit=[JSArray],needsArgs*/
+/*strong.class: global#JSArray:deps=[ArrayIterator,EmptyIterable,List,ListIterable,SubListIterable],direct,explicit=[Iterable<JSArray.E>,JSArray,JSArray.E,JSArray<ArrayIterator.E>,List<JSArray.E>],implicit=[JSArray.E],needsArgs*/
+/*omit.class: global#JSArray:deps=[EmptyIterable,List,ListIterable,SubListIterable],explicit=[JSArray],needsArgs*/
 
-/*element: method:needsArgs*/
+/*strong.element: method:implicit=[method.T],indirect,needsArgs*/
+/*omit.element: method:needsArgs*/
 @NoInline()
 method<T>() {
   return () => <T>[];
diff --git a/tests/compiler/dart2js/rti/data/local_function_map_literal_strong.dart b/tests/compiler/dart2js/rti/data/local_function_map_literal_strong.dart
index d0d805a..30702fe 100644
--- a/tests/compiler/dart2js/rti/data/local_function_map_literal_strong.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_map_literal_strong.dart
@@ -4,9 +4,11 @@
 
 import 'package:expect/expect.dart';
 
-/*class: global#LinkedHashMap:deps=[Map],needsArgs*/
+/*strong.class: global#LinkedHashMap:deps=[Map],explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],indirect,needsArgs*/
+/*omit.class: global#LinkedHashMap:deps=[Map],needsArgs*/
 
-/*element: method:needsArgs*/
+/*strong.element: method:implicit=[method.T],indirect,needsArgs*/
+/*omit.element: method:needsArgs*/
 @NoInline()
 method<T>() {
   return () => <T, int>{};
diff --git a/tests/compiler/dart2js/rti/data/local_function_signature2_strong.dart b/tests/compiler/dart2js/rti/data/local_function_signature2_strong.dart
index a5dd390c..afb9150 100644
--- a/tests/compiler/dart2js/rti/data/local_function_signature2_strong.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_signature2_strong.dart
@@ -25,7 +25,8 @@
 }
 
 class Class2 {
-  /*element: Class2.method4:needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
+  /*strong.element: Class2.method4:direct,explicit=[method4.T],needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
+  /*omit.element: Class2.method4:needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
   method4<T>() {
     /*needsSignature*/
     num local(T n) => null;
@@ -43,7 +44,8 @@
 }
 
 class Class4 {
-  /*element: Class4.method6:*/
+  /*strong.element: Class4.method6:direct,explicit=[method6.T],needsArgs,selectors=[Selector(call, method6, arity=0, types=1)]*/
+  /*omit.element: Class4.method6:*/
   method6<T>() {
     /**/
     num local(num n, T t) => null;
@@ -51,7 +53,8 @@
   }
 }
 
-/*element: method7:needsArgs*/
+/*strong.element: method7:direct,explicit=[method7.T],needsArgs*/
+/*omit.element: method7:needsArgs*/
 method7<T>() {
   /*needsSignature*/
   num local(T n) => null;
@@ -65,7 +68,8 @@
   return local;
 }
 
-/*element: method9:*/
+/*strong.element: method9:direct,explicit=[method9.T],needsArgs*/
+/*omit.element: method9:*/
 method9<T>() {
   /**/
   num local(num n, T t) => null;
@@ -73,7 +77,8 @@
 }
 
 method10() {
-  /**/
+  /*strong.direct,explicit=[local.T],needsArgs*/
+  /*omit.*/
   num local<T>(T n) => null;
   return local;
 }
@@ -85,7 +90,8 @@
 }
 
 method12() {
-  /**/
+  /*strong.direct,explicit=[local.T],needsArgs*/
+  /*omit.*/
   num local<T>(num n, T t) => null;
   return local;
 }
diff --git a/tests/compiler/dart2js/rti/data/local_function_signatures.dart b/tests/compiler/dart2js/rti/data/local_function_signatures.dart
index cc7bc3d..5759a26 100644
--- a/tests/compiler/dart2js/rti/data/local_function_signatures.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_signatures.dart
@@ -9,6 +9,7 @@
     /*ast.*/
     /*kernel.*/
     /*strong.needsSignature*/
+    /*omit.needsSignature*/
     num local(num n) => null;
     return local;
   }
@@ -24,7 +25,8 @@
   }
 }
 
-/*class: Class2:needsArgs*/
+/*!strong.class: Class2:needsArgs*/
+/*strong.class: Class2:direct,explicit=[Class2.T],needsArgs*/
 class Class2<T> {
   method4() {
     /*needsSignature*/
@@ -42,7 +44,8 @@
   }
 }
 
-/*class: Class4:*/
+/*!strong.class: Class4:*/
+/*strong.class: Class4:direct,explicit=[Class4.T],needsArgs*/
 class Class4<T> {
   method6() {
     /**/
diff --git a/tests/compiler/dart2js/rti/data/local_function_signatures_strong.dart b/tests/compiler/dart2js/rti/data/local_function_signatures_strong.dart
index 71f5374..ce07bec 100644
--- a/tests/compiler/dart2js/rti/data/local_function_signatures_strong.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_signatures_strong.dart
@@ -25,7 +25,8 @@
 }
 
 class Class2 {
-  /*element: Class2.method4:needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
+  /*strong.element: Class2.method4:direct,explicit=[method4.T],needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
+  /*omit.element: Class2.method4:needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
   method4<T>() {
     /*needsSignature*/
     num local(T n) => null;
@@ -43,7 +44,8 @@
 }
 
 class Class4 {
-  /*element: Class4.method6:*/
+  /*strong.element: Class4.method6:direct,explicit=[method6.T],needsArgs,selectors=[Selector(call, method6, arity=0, types=1)]*/
+  /*omit.element: Class4.method6:*/
   method6<T>() {
     /**/
     num local(num n, T t) => null;
@@ -51,7 +53,8 @@
   }
 }
 
-/*element: method7:needsArgs*/
+/*strong.element: method7:direct,explicit=[method7.T],needsArgs*/
+/*omit.element: method7:needsArgs*/
 method7<T>() {
   /*needsSignature*/
   num local(T n) => null;
@@ -65,7 +68,8 @@
   return local;
 }
 
-/*element: method9:*/
+/*strong.element: method9:direct,explicit=[method9.T],needsArgs*/
+/*omit.element: method9:*/
 method9<T>() {
   /**/
   num local(num n, T t) => null;
@@ -73,7 +77,8 @@
 }
 
 method10() {
-  /*needsSignature*/
+  /*strong.direct,explicit=[local.T],needsArgs,needsSignature*/
+  /*omit.needsSignature*/
   num local<T>(T n) => null;
   return local;
 }
@@ -85,7 +90,8 @@
 }
 
 method12() {
-  /**/
+  /*strong.direct,explicit=[local.T],needsArgs*/
+  /*omit.*/
   num local<T>(num n, T t) => null;
   return local;
 }
@@ -97,7 +103,8 @@
 }
 
 num Function(num) method14() {
-  /*needsSignature*/
+  /*strong.direct,explicit=[local.T],needsArgs,needsSignature*/
+  /*omit.needsSignature*/
   num local<T>(T n) => null;
   return local;
 }
diff --git a/tests/compiler/dart2js/rti/data/map_literal.dart b/tests/compiler/dart2js/rti/data/map_literal.dart
index 1643414..2f04d3b 100644
--- a/tests/compiler/dart2js/rti/data/map_literal.dart
+++ b/tests/compiler/dart2js/rti/data/map_literal.dart
@@ -2,10 +2,18 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*class: global#Map:*/
-/*class: global#LinkedHashMap:deps=[Map]*/
-/*class: global#JsLinkedHashMap:deps=[LinkedHashMap]*/
-/*class: global#double:explicit=[double]*/
+/*!strong.class: global#Map:*/
+/*strong.class: global#Map:explicit=[Map],indirect,needsArgs*/
+
+/*!strong.class: global#LinkedHashMap:deps=[Map]*/
+/*strong.class: global#LinkedHashMap:deps=[Map],explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],indirect,needsArgs*/
+
+/*!strong.class: global#JsLinkedHashMap:deps=[LinkedHashMap]*/
+/*strong.class: global#JsLinkedHashMap:deps=[LinkedHashMap],direct,explicit=[JsLinkedHashMap.K,JsLinkedHashMap.V,void Function(JsLinkedHashMap.K,JsLinkedHashMap.V)],implicit=[JsLinkedHashMap.K,JsLinkedHashMap.V],needsArgs*/
+
+/*!strong.class: global#double:explicit=[double]*/
+/*strong.class: global#double:explicit=[double],implicit=[double]*/
+
 /*class: global#JSDouble:*/
 
 main() {
diff --git a/tests/compiler/dart2js/rti/data/map_literal_strong.dart b/tests/compiler/dart2js/rti/data/map_literal_strong.dart
index 1643414..4c0bf5f 100644
--- a/tests/compiler/dart2js/rti/data/map_literal_strong.dart
+++ b/tests/compiler/dart2js/rti/data/map_literal_strong.dart
@@ -2,10 +2,18 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*class: global#Map:*/
-/*class: global#LinkedHashMap:deps=[Map]*/
-/*class: global#JsLinkedHashMap:deps=[LinkedHashMap]*/
-/*class: global#double:explicit=[double]*/
+/*strong.class: global#Map:explicit=[Map],indirect,needsArgs*/
+/*omit.class: global#Map:*/
+
+/*strong.class: global#LinkedHashMap:deps=[Map],explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],indirect,needsArgs*/
+/*omit.class: global#LinkedHashMap:deps=[Map]*/
+
+/*strong.class: global#JsLinkedHashMap:deps=[LinkedHashMap],direct,explicit=[JsLinkedHashMap.K,JsLinkedHashMap.V,void Function(JsLinkedHashMap.K,JsLinkedHashMap.V)],implicit=[JsLinkedHashMap.K,JsLinkedHashMap.V],needsArgs*/
+/*omit.class: global#JsLinkedHashMap:deps=[LinkedHashMap]*/
+
+/*strong.class: global#double:explicit=[double],implicit=[double]*/
+/*omit.class: global#double:explicit=[double]*/
+
 /*class: global#JSDouble:*/
 
 main() {
diff --git a/tests/compiler/dart2js/rti/data/map_to_set.dart b/tests/compiler/dart2js/rti/data/map_to_set.dart
index 4cfda0e..06d337a 100644
--- a/tests/compiler/dart2js/rti/data/map_to_set.dart
+++ b/tests/compiler/dart2js/rti/data/map_to_set.dart
@@ -2,10 +2,18 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*class: global#Map:deps=[Class],needsArgs*/
-/*class: global#LinkedHashMap:deps=[Map],needsArgs*/
-/*class: global#JsLinkedHashMap:deps=[LinkedHashMap],implicit=[JsLinkedHashMap.K],needsArgs*/
-/*class: global#double:explicit=[double]*/
+/*!strong.class: global#Map:deps=[Class],needsArgs*/
+/*strong.class: global#Map:deps=[Class,JsLinkedHashMap,MapMixin],explicit=[Map,Map<JsLinkedHashMap.K,JsLinkedHashMap.V>,Map<MapMixin.K,MapMixin.V>],indirect,needsArgs*/
+
+/*!strong.class: global#LinkedHashMap:deps=[Map],needsArgs*/
+/*strong.class: global#LinkedHashMap:deps=[Map],explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],indirect,needsArgs*/
+
+/*!strong.class: global#JsLinkedHashMap:deps=[LinkedHashMap],implicit=[JsLinkedHashMap.K],needsArgs*/
+/*strong.class: global#JsLinkedHashMap:deps=[LinkedHashMap],explicit=[JsLinkedHashMap.K,JsLinkedHashMap.V,Map<JsLinkedHashMap.K,JsLinkedHashMap.V>,void Function(JsLinkedHashMap.K,JsLinkedHashMap.V)],implicit=[JsLinkedHashMap.K,JsLinkedHashMap.V],indirect,needsArgs*/
+
+/*!strong.class: global#double:explicit=[double]*/
+/*strong.class: global#double:explicit=[double],implicit=[double]*/
+
 /*class: global#JSDouble:*/
 
 main() {
@@ -15,7 +23,8 @@
   set is Set<String>;
 }
 
-/*class: Class:needsArgs*/
+/*!strong.class: Class:needsArgs*/
+/*strong.class: Class:implicit=[Class.S,Class.T],indirect,needsArgs*/
 class Class<T, S> {
   m() {
     return <T, S>{};
diff --git a/tests/compiler/dart2js/rti/data/map_to_set_strong.dart b/tests/compiler/dart2js/rti/data/map_to_set_strong.dart
index 4cfda0e..641baca 100644
--- a/tests/compiler/dart2js/rti/data/map_to_set_strong.dart
+++ b/tests/compiler/dart2js/rti/data/map_to_set_strong.dart
@@ -2,10 +2,18 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*class: global#Map:deps=[Class],needsArgs*/
-/*class: global#LinkedHashMap:deps=[Map],needsArgs*/
-/*class: global#JsLinkedHashMap:deps=[LinkedHashMap],implicit=[JsLinkedHashMap.K],needsArgs*/
-/*class: global#double:explicit=[double]*/
+/*strong.class: global#Map:deps=[Class,JsLinkedHashMap,MapMixin],explicit=[Map,Map<JsLinkedHashMap.K,JsLinkedHashMap.V>,Map<MapMixin.K,MapMixin.V>],indirect,needsArgs*/
+/*omit.class: global#Map:deps=[Class],needsArgs*/
+
+/*strong.class: global#LinkedHashMap:deps=[Map],explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],indirect,needsArgs*/
+/*omit.class: global#LinkedHashMap:deps=[Map],needsArgs*/
+
+/*strong.class: global#JsLinkedHashMap:deps=[LinkedHashMap],explicit=[JsLinkedHashMap.K,JsLinkedHashMap.V,Map<JsLinkedHashMap.K,JsLinkedHashMap.V>,void Function(JsLinkedHashMap.K,JsLinkedHashMap.V)],implicit=[JsLinkedHashMap.K,JsLinkedHashMap.V],indirect,needsArgs*/
+/*omit.class: global#JsLinkedHashMap:deps=[LinkedHashMap],implicit=[JsLinkedHashMap.K],needsArgs*/
+
+/*strong.class: global#double:explicit=[double],implicit=[double]*/
+/*omit.class: global#double:explicit=[double]*/
+
 /*class: global#JSDouble:*/
 
 main() {
@@ -15,7 +23,8 @@
   set is Set<String>;
 }
 
-/*class: Class:needsArgs*/
+/*strong.class: Class:implicit=[Class.S,Class.T],indirect,needsArgs*/
+/*omit.class: Class:needsArgs*/
 class Class<T, S> {
   m() {
     return <T, S>{};
diff --git a/tests/compiler/dart2js/rti/data/method_signatures.dart b/tests/compiler/dart2js/rti/data/method_signatures.dart
index 4c4a161..7c24e036 100644
--- a/tests/compiler/dart2js/rti/data/method_signatures.dart
+++ b/tests/compiler/dart2js/rti/data/method_signatures.dart
@@ -15,7 +15,8 @@
   Object method3(num n) => null;
 }
 
-/*class: Class2:needsArgs*/
+/*!strong.class: Class2:needsArgs*/
+/*strong.class: Class2:direct,explicit=[Class2.T],needsArgs*/
 class Class2<T> {
   /*element: Class2.method4:needsSignature*/
   num method4(T n) => null;
@@ -27,7 +28,8 @@
   T method5(num n) => null;
 }
 
-/*class: Class4:*/
+/*!strong.class: Class4:*/
+/*strong.class: Class4:direct,explicit=[Class4.T],needsArgs*/
 class Class4<T> {
   /*element: Class4.method6:*/
   num method6(num n, T t) => null;
diff --git a/tests/compiler/dart2js/rti/data/method_signatures_strong.dart b/tests/compiler/dart2js/rti/data/method_signatures_strong.dart
index 811548f..03650b8 100644
--- a/tests/compiler/dart2js/rti/data/method_signatures_strong.dart
+++ b/tests/compiler/dart2js/rti/data/method_signatures_strong.dart
@@ -16,7 +16,8 @@
 }
 
 class Class2 {
-  /*element: Class2.method4:*/
+  /*strong.element: Class2.method4:direct,explicit=[method4.T],needsArgs*/
+  /*omit.element: Class2.method4:*/
   num method4<T>(T n) => null;
 }
 
@@ -26,17 +27,20 @@
 }
 
 class Class4 {
-  /*element: Class4.method6:*/
+  /*strong.element: Class4.method6:direct,explicit=[method6.T],needsArgs*/
+  /*omit.element: Class4.method6:*/
   num method6<T>(num n, T t) => null;
 }
 
-/*element: method7:*/
+/*strong.element: method7:direct,explicit=[method7.T],needsArgs*/
+/*omit.element: method7:*/
 num method7<T>(T n) => null;
 
 /*element: method8:*/
 T method8<T>(num n) => null;
 
-/*element: method9:*/
+/*strong.element: method9:direct,explicit=[method9.T],needsArgs*/
+/*omit.element: method9:*/
 num method9<T>(num n, T t) => null;
 
 @NoInline()
diff --git a/tests/compiler/dart2js/rti/data/tear_off_generic.dart b/tests/compiler/dart2js/rti/data/tear_off_generic.dart
index 6aec20e..2579700 100644
--- a/tests/compiler/dart2js/rti/data/tear_off_generic.dart
+++ b/tests/compiler/dart2js/rti/data/tear_off_generic.dart
@@ -2,7 +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.
 
-/*class: A:needsArgs*/
+/*!strong.class: A:needsArgs*/
+/*strong.class: A:direct,explicit=[A.T],needsArgs*/
 class A<T> {
   /*element: A.m:needsSignature*/
   void m(T t) {}
diff --git a/tests/compiler/dart2js/rti/data/tear_off_generic_strong.dart b/tests/compiler/dart2js/rti/data/tear_off_generic_strong.dart
index 6aec20e..887e55f 100644
--- a/tests/compiler/dart2js/rti/data/tear_off_generic_strong.dart
+++ b/tests/compiler/dart2js/rti/data/tear_off_generic_strong.dart
@@ -2,7 +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.
 
-/*class: A:needsArgs*/
+/*strong.class: A:direct,explicit=[A.T],needsArgs*/
+/*omit.class: A:needsArgs*/
 class A<T> {
   /*element: A.m:needsSignature*/
   void m(T t) {}
diff --git a/tests/compiler/dart2js/rti/emission/jsinterop.dart b/tests/compiler/dart2js/rti/emission/jsinterop.dart
new file mode 100644
index 0000000..97b0ca6
--- /dev/null
+++ b/tests/compiler/dart2js/rti/emission/jsinterop.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@JS()
+library jsinterop;
+
+/*class: global#JavaScriptObject:checks=[$isA,$isC],instance*/
+
+import 'package:js/js.dart';
+import 'package:expect/expect.dart';
+
+/*class: A:checkedInstance,checks=[],instance*/
+@JS()
+class A {
+  external A();
+}
+
+/*class: B:checks=[],instance*/
+@JS('BClass')
+class B {
+  external B();
+}
+
+/*class: C:checkedInstance,checks=[],instance*/
+@JS()
+@anonymous
+class C {
+  external factory C();
+}
+
+/*class: D:checks=[],instance*/
+@JS()
+@anonymous
+class D {
+  external factory D();
+}
+
+/*class: E:checkedInstance,checks=[],instance*/
+class E {
+  E();
+}
+
+/*class: F:checks=[],instance*/
+class F {
+  F();
+}
+
+@NoInline()
+test(o) => o is A || o is C || o is E;
+
+main() {
+  test(new A());
+  test(new B());
+  test(new C());
+  test(new D());
+  test(new E());
+  test(new F());
+}
diff --git a/tests/compiler/dart2js/rti/emission/jsinterop_generic.dart b/tests/compiler/dart2js/rti/emission/jsinterop_generic.dart
new file mode 100644
index 0000000..aec7f0d
--- /dev/null
+++ b/tests/compiler/dart2js/rti/emission/jsinterop_generic.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// dart2jsOptions=--strong
+
+@JS()
+library foo;
+
+// TODO(johnniwinther): Avoid generating duplicate is/as function when multiple
+// jsinterop classes implement the same interface.
+/*class: global#JavaScriptObject:checks=[$asA,$asB,$asB,$isA,$isB,$isB],instance*/
+
+import 'package:expect/expect.dart';
+import 'package:js/js.dart';
+
+/*class: A:checkedInstance,checks=[],instance*/
+@JS()
+@anonymous
+class A<T> {
+  external factory A();
+}
+
+/*class: B:checkedInstance*/
+class B<T> {}
+
+/*class: C:checks=[],instance*/
+@JS()
+@anonymous
+class C implements B<int> {
+  external factory C();
+}
+
+/*class: D:checkedInstance*/
+class D<T> {}
+
+/*class: E:checks=[],instance*/
+@JS()
+@anonymous
+class E implements B<String> {
+  external factory E();
+}
+
+main() {
+  test(new A<int>());
+  test(new A<String>());
+  test(new C());
+  test(new E());
+}
+
+test(o) {
+  Expect.isTrue(o is A<int>, "Expected $o to be A<int>");
+  Expect.isTrue(o is A<String>, "Expected $o to be A<String>");
+
+  Expect.isTrue(o is B<int>, "Expected $o to be B<int>");
+  Expect.isTrue(o is B<String>, "Expected $o to be B<String>");
+
+  Expect.isFalse(o is D<int>, "Expected $o not to be D<int>");
+}
diff --git a/tests/compiler/dart2js/rti/rti_need0_test.dart b/tests/compiler/dart2js/rti/rti_need0_test.dart
new file mode 100644
index 0000000..1ffa110
--- /dev/null
+++ b/tests/compiler/dart2js/rti/rti_need0_test.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'rti_need_test_helper.dart';
+
+main(List<String> args) {
+  runTests(args, 0);
+}
diff --git a/tests/compiler/dart2js/rti/rti_need1_test.dart b/tests/compiler/dart2js/rti/rti_need1_test.dart
new file mode 100644
index 0000000..a2d42f4
--- /dev/null
+++ b/tests/compiler/dart2js/rti/rti_need1_test.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'rti_need_test_helper.dart';
+
+main(List<String> args) {
+  runTests(args, 1);
+}
diff --git a/tests/compiler/dart2js/rti/rti_need_test.dart b/tests/compiler/dart2js/rti/rti_need_test_helper.dart
similarity index 98%
rename from tests/compiler/dart2js/rti/rti_need_test.dart
rename to tests/compiler/dart2js/rti/rti_need_test_helper.dart
index 4768628..567e519 100644
--- a/tests/compiler/dart2js/rti/rti_need_test.dart
+++ b/tests/compiler/dart2js/rti/rti_need_test_helper.dart
@@ -7,7 +7,6 @@
 import 'package:compiler/src/closure.dart';
 import 'package:compiler/src/common.dart';
 import 'package:compiler/src/common_elements.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
 import 'package:compiler/src/elements/elements.dart';
@@ -28,6 +27,10 @@
 import '../equivalence/id_equivalence_helper.dart';
 
 main(List<String> args) {
+  runTests(args);
+}
+
+runTests(List<String> args, [int shardIndex]) {
   cacheRtiDataForTesting = true;
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
@@ -35,14 +38,17 @@
         dataDir, computeAstRtiMemberNeed, computeKernelRtiMemberNeed,
         computeClassDataFromAst: computeAstRtiClassNeed,
         computeClassDataFromKernel: computeKernelRtiClassNeed,
-        options: [Flags.omitImplicitChecks], // only used in strong-mode
+        options: [],
         skipForStrong: [
           'map_literal_checked.dart',
           // TODO(johnniwinther): Optimize local function type signature need.
           'subtype_named_args.dart',
           'subtype_named_args1.dart',
         ],
-        args: args);
+        args: args,
+        testOmit: true,
+        shardIndex: shardIndex ?? 0,
+        shards: shardIndex != null ? 2 : 1);
   });
 }
 
diff --git a/tests/compiler/dart2js/rti/show.dart b/tests/compiler/dart2js/rti/show.dart
index 7eeae70..f4ab741 100644
--- a/tests/compiler/dart2js/rti/show.dart
+++ b/tests/compiler/dart2js/rti/show.dart
@@ -9,7 +9,7 @@
 import '../equivalence/id_equivalence_helper.dart';
 import '../equivalence/show_helper.dart';
 import 'rti_emission_test.dart';
-import 'rti_need_test.dart';
+import 'rti_need_test_helper.dart';
 
 main(List<String> args) async {
   cacheRtiDataForTesting = true;
diff --git a/tests/compiler/dart2js/rti/type_representation_test.dart b/tests/compiler/dart2js/rti/type_representation_test.dart
index 36fec2a..80647d9 100644
--- a/tests/compiler/dart2js/rti/type_representation_test.dart
+++ b/tests/compiler/dart2js/rti/type_representation_test.dart
@@ -77,7 +77,9 @@
   JavaScriptBackend backend = compiler.backend;
 
   TypeRepresentationGenerator typeRepresentation =
-      new TypeRepresentationGenerator(backend.namer, strongMode: strongMode);
+      new TypeRepresentationGenerator(
+          backend.namer, compiler.backendClosedWorldForTesting.nativeData,
+          strongMode: strongMode);
 
   Expression onVariable(TypeVariableType _variable) {
     TypeVariableType variable = _variable;
diff --git a/tests/compiler/dart2js_extra/32774_test.dart b/tests/compiler/dart2js_extra/32774_test.dart
new file mode 100644
index 0000000..fbf3199
--- /dev/null
+++ b/tests/compiler/dart2js_extra/32774_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+T id<T>(T t) => t;
+
+class C<T> {
+  final T t;
+  final T Function(T) f;
+
+  const C(this.t, this.f);
+}
+
+class D<T> {
+  final T t;
+  final T Function(T) f;
+
+  const D(this.t, this.f);
+}
+
+const C<int> c1a = const C<int>(0, id);
+const C<int> c1b = const C<int>(0, id);
+
+const C<double> c2a = const C<double>(0.5, id);
+const C<double> c2b = const C<double>(0.5, id);
+
+const D<int> d = const D<int>(0, id);
+
+main() {
+  Expect.equals(c1a, c1b);
+  Expect.isTrue(identical(c1a, c1b));
+  Expect.equals(c1a.f, c1b.f);
+
+  Expect.equals(c2a, c2b);
+  Expect.isTrue(identical(c2a, c2b));
+  Expect.equals(c2a.f, c2b.f);
+
+  Expect.notEquals(c1a, c2a);
+  Expect.notEquals(c1a.f, c2a.f);
+
+  Expect.notEquals(c1a, d);
+  Expect.isTrue(identical(c1a.f, d.f));
+}
diff --git a/tests/compiler/dart2js_extra/32969_test.dart b/tests/compiler/dart2js_extra/32969_test.dart
new file mode 100644
index 0000000..8599b3f
--- /dev/null
+++ b/tests/compiler/dart2js_extra/32969_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// dart2jsOptions=--strong
+
+@JS()
+library foo;
+
+import 'package:expect/expect.dart';
+import 'package:js/js.dart';
+
+@JS()
+@anonymous
+class A<T> {
+  external factory A();
+}
+
+class B<T> {}
+
+@JS()
+@anonymous
+class C implements B<int> {
+  external factory C();
+}
+
+class D<T> {}
+
+@JS()
+@anonymous
+class E implements B<String> {
+  external factory E();
+}
+
+main() {
+  test(new A<int>());
+  test(new A<String>());
+  test(new C());
+  test(new E());
+}
+
+test(o) {
+  Expect.isTrue(o is A<int>, "Expected $o to be A<int>");
+  Expect.isTrue(o is A<String>, "Expected $o to be A<String>");
+
+  Expect.isTrue(o is B<int>, "Expected $o to be B<int>");
+  Expect.isTrue(o is B<String>, "Expected $o to be B<String>");
+
+  Expect.isFalse(o is D<int>, "Expected $o not to be D<int>");
+}
diff --git a/tests/compiler/dart2js_extra/32997a_lib.dart b/tests/compiler/dart2js_extra/32997a_lib.dart
new file mode 100644
index 0000000..54e4f54
--- /dev/null
+++ b/tests/compiler/dart2js_extra/32997a_lib.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+T getFoo<T>(T v) => v;
+
+typedef dynamic G<T>(T v);
+
+m(int x, {G<int> f: getFoo}) {
+  print(f(x));
+}
diff --git a/tests/compiler/dart2js_extra/32997a_test.dart b/tests/compiler/dart2js_extra/32997a_test.dart
new file mode 100644
index 0000000..4e2b00a
--- /dev/null
+++ b/tests/compiler/dart2js_extra/32997a_test.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// dart2jsOptions=--strong
+
+import '32997a_lib.dart' deferred as b;
+
+main() async {
+  await b.loadLibrary();
+  print(b.m(3));
+}
diff --git a/tests/compiler/dart2js_extra/32997b_lib.dart b/tests/compiler/dart2js_extra/32997b_lib.dart
new file mode 100644
index 0000000..62eee11
--- /dev/null
+++ b/tests/compiler/dart2js_extra/32997b_lib.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+T getFoo<T>(T v) => v;
+
+typedef dynamic G<T>(T v);
+
+m<T>(T x, {G<T> f: getFoo}) {
+  print(f);
+}
diff --git a/tests/compiler/dart2js_extra/32997b_test.dart b/tests/compiler/dart2js_extra/32997b_test.dart
new file mode 100644
index 0000000..7783285
--- /dev/null
+++ b/tests/compiler/dart2js_extra/32997b_test.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// dart2jsOptions=--strong
+
+import '32997b_lib.dart' deferred as b; //# 01: compile-time error
+
+main() async {
+  await b.loadLibrary(); //# 01: continued
+  print(b.m<int>(3)); //# 01: continued
+}
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index 02e2263..1dc91cd 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -58,28 +58,15 @@
 [ $compiler == dart2js && $checked ]
 variable_type_test/01: Fail, OK
 variable_type_test/03: Fail, OK
+32997a_test: SkipByDesign # --omit-implicit-checks shouldn't be used together
+32997b_test/none: SkipByDesign # --omit-implicit-checks shouldn't be used together
+32997b_test/01: SkipByDesign # --omit-implicit-checks shouldn't be used together
 
 [ $compiler == dart2js && $checked && $fasta ]
-deferred/default_arg_is_tearoff_test: RuntimeError
-deferred/deferred_class_test: RuntimeError
-deferred/deferred_constant2_test: RuntimeError
-deferred/deferred_constant3_test: RuntimeError
-deferred/deferred_constant4_test: RuntimeError
-deferred/deferred_function_test: RuntimeError
-deferred/deferred_metadata_test: RuntimeError
 deferred/deferred_mirrors1_test: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred/deferred_mirrors2_test: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
-deferred/deferred_overlapping_test: RuntimeError
-deferred/interface_type_variable_test: RuntimeError
-deferred/load_in_correct_order_test: RuntimeError
-deferred/multiple_default_arg_test: RuntimeError
 deferred/reflect_multiple_annotations_test: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred/reflect_multiple_default_arg_test: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
-deferred/shared_constant_test: RuntimeError
-deferred/uninstantiated_type_variable_test: RuntimeError
-deferred_custom_loader_test: RuntimeError
-deferred_inheritance_test: RuntimeError
-deferred_split_test: RuntimeError
 dummy_compiler_test: Crash
 local_signature_test: Crash
 minus_zero_test/01: MissingCompileTimeError
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 9a7255e..15b1905 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -90,9 +90,7 @@
 assign_static_type_test/01: Fail
 assign_static_type_test/02: MissingCompileTimeError
 async_return_types_test/nestedFuture: Fail # Issue 26429
-cha_deopt1_test: RuntimeError
-cha_deopt2_test: RuntimeError
-cha_deopt3_test: RuntimeError
+async_return_types_test/wrongTypeParameter: Fail # Issue 26429
 closure_type_test/01: RuntimeError # Issue 12745
 closure_type_test/none: RuntimeError # Issue 12745
 compile_time_constant_checked2_test/01: MissingCompileTimeError
@@ -132,43 +130,11 @@
 const_constructor3_test/02: MissingCompileTimeError
 const_constructor3_test/04: MissingCompileTimeError
 const_init2_test/02: MissingCompileTimeError
-deferred_closurize_load_library_test: RuntimeError
-deferred_constant_list_test: RuntimeError
 deferred_constraints_constants_test/none: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred_constraints_constants_test/reference_after_load: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
-deferred_constraints_type_annotation_test/as_operation: RuntimeError
-deferred_constraints_type_annotation_test/catch_check: RuntimeError
-deferred_constraints_type_annotation_test/is_check: RuntimeError
-deferred_constraints_type_annotation_test/new: RuntimeError
-deferred_constraints_type_annotation_test/new_before_load: RuntimeError
-deferred_constraints_type_annotation_test/new_generic1: RuntimeError
-deferred_constraints_type_annotation_test/new_generic2: RuntimeError
-deferred_constraints_type_annotation_test/new_generic3: RuntimeError
-deferred_constraints_type_annotation_test/none: RuntimeError
-deferred_constraints_type_annotation_test/static_method: RuntimeError
-deferred_constraints_type_annotation_test/type_annotation_generic2: RuntimeError
-deferred_constraints_type_annotation_test/type_annotation_generic3: RuntimeError
-deferred_constraints_type_annotation_test/type_annotation_non_deferred: RuntimeError
-deferred_constraints_type_annotation_test/type_annotation_null: RuntimeError
-deferred_constraints_type_annotation_test/type_annotation_top_level: RuntimeError
-deferred_function_type_test: RuntimeError
-deferred_global_test: RuntimeError
-deferred_inlined_test: RuntimeError
-deferred_load_constants_test/none: RuntimeError
-deferred_load_inval_code_test: RuntimeError
-deferred_mixin_test: RuntimeError
-deferred_no_such_method_test: RuntimeError
-deferred_only_constant_test: RuntimeError
-deferred_optimized_test: RuntimeError
-deferred_regression_22995_test: RuntimeError
-deferred_regression_28678_test: RuntimeError
-deferred_shadow_load_library_test: RuntimeError
-deferred_shared_and_unshared_classes_test: RuntimeError
-deferred_static_seperate_test: RuntimeError
-deferred_type_dependency_test/as: RuntimeError
-deferred_type_dependency_test/is: RuntimeError
-deferred_type_dependency_test/none: RuntimeError
-deferred_type_dependency_test/type_annotation: RuntimeError
+deferred_constraints_type_annotation_test/type_annotation_generic1: Fail # Missing dynamic type error
+deferred_constraints_type_annotation_test/type_annotation_generic4: Fail # Missing dynamic type error
+deferred_constraints_type_annotation_test/type_annotation1: Fail # Missing dynamic type error
 factory_redirection_test/08: Fail
 factory_redirection_test/09: Fail
 factory_redirection_test/10: Fail
@@ -194,9 +160,7 @@
 map_literal1_test/01: MissingCompileTimeError
 redirecting_factory_infinite_steps_test/01: Fail
 redirecting_factory_malbounded_test/01: Fail
-regress_22443_test: RuntimeError
 regress_26133_test: RuntimeError # Issue 26429
-regress_28278_test: RuntimeError
 regress_29405_test: RuntimeError # Issue 29422
 stacktrace_demangle_ctors_test: RuntimeError
 stacktrace_test: RuntimeError
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index edb651c..646ea75 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -303,7 +303,6 @@
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
-deferred_load_constants_test/none: RuntimeError
 deferred_load_library_wrong_args_test/01: MissingRuntimeError
 deferred_not_loaded_check_test: RuntimeError # Test out of date. Issue 31933
 deferred_redirecting_factory_test: RuntimeError
@@ -605,9 +604,6 @@
 call_method_implicit_tear_off_test/02: RuntimeError
 call_method_implicit_tear_off_test/04: RuntimeError
 canonical_const2_test: RuntimeError, OK # non JS number semantics
-cha_deopt1_test: RuntimeError
-cha_deopt2_test: RuntimeError
-cha_deopt3_test: RuntimeError
 check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
@@ -649,40 +645,15 @@
 cyclic_type_test/04: RuntimeError
 cyclic_typedef_test/10: Crash # Crash when compiling file:///usr/local/google/home/sra/Dart/sdk/out/ReleaseX64/generated_tests/language_2/cyclic_typedef_test_10.dart,
 cyclic_typedef_test/11: Crash # Crash when compiling file:///usr/local/google/home/sra/Dart/sdk/out/ReleaseX64/generated_tests/language_2/cyclic_typedef_test_11.dart,
-deferred_closurize_load_library_test: RuntimeError
-deferred_constant_list_test: RuntimeError
 deferred_constraints_constants_test/default_argument2: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred_constraints_constants_test/none: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
 deferred_constraints_constants_test/reference_after_load: Crash # Unsupported operation: KernelDeferredLoadTask.addMirrorElementsForLibrary
-deferred_constraints_type_annotation_test/new: RuntimeError
-deferred_constraints_type_annotation_test/new_generic1: RuntimeError
-deferred_constraints_type_annotation_test/none: RuntimeError
-deferred_constraints_type_annotation_test/static_method: RuntimeError
-deferred_constraints_type_annotation_test/type_annotation_non_deferred: RuntimeError
-deferred_function_type_test: RuntimeError
-deferred_global_test: RuntimeError
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
-deferred_inlined_test: RuntimeError
-deferred_load_constants_test/none: RuntimeError
-deferred_load_inval_code_test: RuntimeError
 deferred_load_library_wrong_args_test/01: CompileTimeError
-deferred_mixin_test: RuntimeError
-deferred_no_such_method_test: RuntimeError
 deferred_not_loaded_check_test: RuntimeError # Test out of date. Issue 31933
-deferred_only_constant_test: RuntimeError
-deferred_optimized_test: RuntimeError
 deferred_redirecting_factory_test: RuntimeError
-deferred_regression_22995_test: RuntimeError
-deferred_regression_28678_test: RuntimeError
-deferred_shadow_load_library_test: RuntimeError
-deferred_shared_and_unshared_classes_test: RuntimeError
-deferred_static_seperate_test: RuntimeError
-deferred_type_dependency_test/as: RuntimeError
-deferred_type_dependency_test/is: RuntimeError
-deferred_type_dependency_test/none: RuntimeError
-deferred_type_dependency_test/type_annotation: RuntimeError
 double_int_to_string_test: RuntimeError, OK # non JS number semantics
 duplicate_export_negative_test: Fail
 duplicate_implements_test/01: MissingCompileTimeError
@@ -904,13 +875,11 @@
 redirecting_factory_default_values_test/01: MissingCompileTimeError
 redirecting_factory_default_values_test/02: MissingCompileTimeError
 redirecting_factory_reflection_test: RuntimeError
-regress_22443_test: RuntimeError
 regress_23089_test: Crash # Crash when compiling file:///usr/local/google/home/sra/Dart/sdk/tests/language_2/regress_23089_test.dart,
 regress_23408_test: CompileTimeError
 regress_24283_test: RuntimeError # non JS number semantics
 regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
 regress_28255_test: RuntimeError
-regress_28278_test: RuntimeError
 regress_29025_test: CompileTimeError
 regress_29405_test: CompileTimeError
 regress_29784_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in () for j:constructor(A.ok).
@@ -1021,7 +990,6 @@
 async_or_generator_return_type_stacktrace_test/02: MissingCompileTimeError
 async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError
 async_return_types_test/nestedFuture: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_return_types_test/tooManyTypeParameters: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
 async_return_types_test/wrongReturnType: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
 async_star_cancel_while_paused_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
 async_star_test/01: RuntimeError
@@ -1045,9 +1013,6 @@
 call_non_method_field_test/01: MissingCompileTimeError
 call_non_method_field_test/02: MissingCompileTimeError
 canonical_const2_test: RuntimeError, OK # non JS number semantics
-cha_deopt1_test: RuntimeError
-cha_deopt2_test: RuntimeError
-cha_deopt3_test: RuntimeError
 check_member_static_test/01: MissingCompileTimeError
 check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
@@ -1106,40 +1071,15 @@
 cyclic_typedef_test/11: Crash # Stack Overflow
 default_factory2_test/01: MissingCompileTimeError
 default_factory_test/01: MissingCompileTimeError
-deferred_closurize_load_library_test: RuntimeError
-deferred_constant_list_test: RuntimeError
 deferred_constraints_constants_test/none: RuntimeError
 deferred_constraints_constants_test/reference_after_load: RuntimeError
-deferred_constraints_type_annotation_test/new: RuntimeError
-deferred_constraints_type_annotation_test/new_generic1: RuntimeError
-deferred_constraints_type_annotation_test/none: RuntimeError
-deferred_constraints_type_annotation_test/static_method: RuntimeError
-deferred_constraints_type_annotation_test/type_annotation_non_deferred: RuntimeError
-deferred_function_type_test: RuntimeError
-deferred_global_test: RuntimeError
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
 deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError
-deferred_inlined_test: RuntimeError
-deferred_load_constants_test/none: RuntimeError
-deferred_load_inval_code_test: RuntimeError
 deferred_load_library_wrong_args_test/01: CompileTimeError
-deferred_mixin_test: RuntimeError
-deferred_no_such_method_test: RuntimeError
 deferred_not_loaded_check_test: RuntimeError # Test out of date. Issue 31933
-deferred_only_constant_test: RuntimeError
-deferred_optimized_test: RuntimeError
 deferred_redirecting_factory_test: RuntimeError
-deferred_regression_22995_test: RuntimeError
-deferred_regression_28678_test: RuntimeError
-deferred_shadow_load_library_test: RuntimeError
-deferred_shared_and_unshared_classes_test: RuntimeError
-deferred_static_seperate_test: RuntimeError
-deferred_type_dependency_test/as: RuntimeError
-deferred_type_dependency_test/is: RuntimeError
-deferred_type_dependency_test/none: RuntimeError
-deferred_type_dependency_test/type_annotation: RuntimeError
 double_int_to_string_test: RuntimeError, OK # non JS number semantics
 duplicate_export_negative_test: Fail
 duplicate_implements_test/01: MissingCompileTimeError
@@ -1383,11 +1323,8 @@
 mixin_supertype_subclass_test/03: CompileTimeError
 mixin_supertype_subclass_test/04: CompileTimeError
 mixin_supertype_subclass_test/none: CompileTimeError
-mixin_type_parameters_errors_test/01: MissingCompileTimeError
-mixin_type_parameters_errors_test/02: MissingCompileTimeError
 mixin_type_parameters_errors_test/03: MissingCompileTimeError
 mixin_type_parameters_errors_test/04: MissingCompileTimeError
-mixin_type_parameters_errors_test/05: MissingCompileTimeError
 modulo_test: RuntimeError # non JS number semantics
 multiline_newline_test/04: MissingCompileTimeError
 multiline_newline_test/04r: MissingCompileTimeError
@@ -1451,13 +1388,11 @@
 redirecting_factory_reflection_test: RuntimeError
 regress_13462_1_test: RuntimeError
 regress_18535_test: RuntimeError
-regress_22443_test: RuntimeError
 regress_23089_test: Crash # Stack Overflow
 regress_23408_test: CompileTimeError
 regress_24283_test: RuntimeError # non JS number semantics
 regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
 regress_28255_test: RuntimeError
-regress_28278_test: RuntimeError
 regress_29025_test: CompileTimeError
 regress_29405_test: CompileTimeError
 regress_29784_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in () for j:constructor(A.ok).
@@ -1642,7 +1577,6 @@
 async_or_generator_return_type_stacktrace_test/02: MissingCompileTimeError
 async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError
 async_return_types_test/nestedFuture: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_return_types_test/tooManyTypeParameters: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 async_return_types_test/wrongReturnType: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 async_star_cancel_while_paused_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 async_star_test/01: RuntimeError
@@ -1667,9 +1601,6 @@
 call_non_method_field_test/02: MissingCompileTimeError
 call_with_no_such_method_test: RuntimeError
 canonical_const2_test: RuntimeError, OK # non JS number semantics
-cha_deopt1_test: RuntimeError
-cha_deopt2_test: RuntimeError
-cha_deopt3_test: RuntimeError
 check_member_static_test/01: MissingCompileTimeError
 check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
@@ -1723,40 +1654,15 @@
 cyclic_typedef_test/11: Crash # Stack Overflow
 default_factory2_test/01: MissingCompileTimeError
 default_factory_test/01: MissingCompileTimeError
-deferred_closurize_load_library_test: RuntimeError
-deferred_constant_list_test: RuntimeError
 deferred_constraints_constants_test/none: RuntimeError
 deferred_constraints_constants_test/reference_after_load: RuntimeError
-deferred_constraints_type_annotation_test/new: RuntimeError
-deferred_constraints_type_annotation_test/new_generic1: RuntimeError
-deferred_constraints_type_annotation_test/none: RuntimeError
-deferred_constraints_type_annotation_test/static_method: RuntimeError
-deferred_constraints_type_annotation_test/type_annotation_non_deferred: RuntimeError
-deferred_function_type_test: RuntimeError
-deferred_global_test: RuntimeError
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
 deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError
-deferred_inlined_test: RuntimeError
-deferred_load_constants_test/none: RuntimeError
-deferred_load_inval_code_test: RuntimeError
 deferred_load_library_wrong_args_test/01: CompileTimeError
-deferred_mixin_test: RuntimeError
-deferred_no_such_method_test: RuntimeError
 deferred_not_loaded_check_test: RuntimeError # Test out of date. Issue 31933
-deferred_only_constant_test: RuntimeError
-deferred_optimized_test: RuntimeError
 deferred_redirecting_factory_test: RuntimeError
-deferred_regression_22995_test: RuntimeError
-deferred_regression_28678_test: RuntimeError
-deferred_shadow_load_library_test: RuntimeError
-deferred_shared_and_unshared_classes_test: RuntimeError
-deferred_static_seperate_test: RuntimeError
-deferred_type_dependency_test/as: RuntimeError
-deferred_type_dependency_test/is: RuntimeError
-deferred_type_dependency_test/none: RuntimeError
-deferred_type_dependency_test/type_annotation: RuntimeError
 double_int_to_string_test: RuntimeError, OK # non JS number semantics
 duplicate_export_negative_test: Fail
 duplicate_implements_test/01: MissingCompileTimeError
@@ -1999,11 +1905,8 @@
 mixin_supertype_subclass_test/03: CompileTimeError
 mixin_supertype_subclass_test/04: CompileTimeError
 mixin_supertype_subclass_test/none: CompileTimeError
-mixin_type_parameters_errors_test/01: MissingCompileTimeError
-mixin_type_parameters_errors_test/02: MissingCompileTimeError
 mixin_type_parameters_errors_test/03: MissingCompileTimeError
 mixin_type_parameters_errors_test/04: MissingCompileTimeError
-mixin_type_parameters_errors_test/05: MissingCompileTimeError
 mock_writable_final_field_test: RuntimeError # Issue 30847
 mock_writable_final_private_field_test: RuntimeError # Issue 17526, 30847
 modulo_test: RuntimeError # non JS number semantics
@@ -2067,13 +1970,11 @@
 regress_13462_1_test: RuntimeError
 regress_18535_test: RuntimeError
 regress_21795_test: RuntimeError # Issue 12605
-regress_22443_test: RuntimeError
 regress_23089_test: Crash # Stack Overflow
 regress_23408_test: CompileTimeError
 regress_24283_test: RuntimeError, OK # Requires 64 bit numbers.
 regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
 regress_28255_test: RuntimeError
-regress_28278_test: RuntimeError
 regress_29025_test: CompileTimeError
 regress_29405_test: CompileTimeError
 regress_29784_test/01: Crash # Issue 29784
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index 47cd057..c407314 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -293,7 +293,6 @@
 async_or_generator_return_type_stacktrace_test/02: MissingCompileTimeError
 async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError
 async_return_types_test/nestedFuture: MissingCompileTimeError
-async_return_types_test/tooManyTypeParameters: MissingCompileTimeError
 async_return_types_test/wrongReturnType: MissingCompileTimeError
 bad_override_test/01: MissingCompileTimeError
 bad_override_test/02: MissingCompileTimeError
@@ -525,11 +524,8 @@
 mixin_super_use_test: RuntimeError
 mixin_supertype_subclass_test/02: MissingCompileTimeError
 mixin_supertype_subclass_test/05: MissingCompileTimeError
-mixin_type_parameters_errors_test/01: MissingCompileTimeError
-mixin_type_parameters_errors_test/02: MissingCompileTimeError
 mixin_type_parameters_errors_test/03: MissingCompileTimeError
 mixin_type_parameters_errors_test/04: MissingCompileTimeError
-mixin_type_parameters_errors_test/05: MissingCompileTimeError
 mock_writable_final_private_field_test: RuntimeError
 multiline_newline_test/06: MissingCompileTimeError
 multiline_newline_test/06r: MissingCompileTimeError
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index 3e8a0a8..611f8e8 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -62,7 +62,6 @@
 async_or_generator_return_type_stacktrace_test/02: MissingCompileTimeError
 async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError
 async_return_types_test/nestedFuture: MissingCompileTimeError
-async_return_types_test/tooManyTypeParameters: MissingCompileTimeError
 async_return_types_test/wrongReturnType: MissingCompileTimeError
 bad_override_test/01: MissingCompileTimeError
 bad_override_test/02: MissingCompileTimeError
@@ -161,11 +160,8 @@
 mixin_super_bound_test/02: MissingCompileTimeError
 mixin_super_constructor_named_test/01: MissingCompileTimeError # KernelVM bug: Issue 15101
 mixin_super_constructor_positionals_test/01: MissingCompileTimeError # KernelVM bug: Issue 15101
-mixin_type_parameters_errors_test/01: MissingCompileTimeError
-mixin_type_parameters_errors_test/02: MissingCompileTimeError
 mixin_type_parameters_errors_test/03: MissingCompileTimeError
 mixin_type_parameters_errors_test/04: MissingCompileTimeError
-mixin_type_parameters_errors_test/05: MissingCompileTimeError
 named_constructor_test/01: MissingCompileTimeError
 named_parameters_default_eq_test/02: MissingCompileTimeError # Fasta bug: Default values are not allowed on redirecting factory constructors.
 override_field_test/02: MissingCompileTimeError
@@ -175,6 +171,7 @@
 override_inheritance_field_test/48: MissingCompileTimeError
 override_inheritance_field_test/53: MissingCompileTimeError
 override_inheritance_field_test/54: MissingCompileTimeError
+override_inheritance_mixed_test/07: MissingCompileTimeError # Issue 32613
 override_inheritance_mixed_test/09: MissingCompileTimeError
 partial_tearoff_instantiation_test/05: MissingCompileTimeError
 partial_tearoff_instantiation_test/06: MissingCompileTimeError
@@ -1362,6 +1359,7 @@
 async_congruence_method_test/01: MissingCompileTimeError
 async_congruence_unnamed_test/01: MissingCompileTimeError
 async_congruence_unnamed_test/02: MissingCompileTimeError
+async_return_types_test/tooManyTypeParameters: MissingCompileTimeError
 async_return_types_test/wrongTypeParameter: MissingCompileTimeError
 bad_named_parameters2_test/01: MissingCompileTimeError
 bad_named_parameters_test/01: MissingCompileTimeError
@@ -1835,6 +1833,9 @@
 mixin_type_parameter_inference_test/11: MissingCompileTimeError
 mixin_type_parameter_inference_test/14: MissingCompileTimeError
 mixin_type_parameter_inference_test/15: MissingCompileTimeError
+mixin_type_parameters_errors_test/01: MissingCompileTimeError
+mixin_type_parameters_errors_test/02: MissingCompileTimeError
+mixin_type_parameters_errors_test/05: MissingCompileTimeError
 mixin_with_two_implicit_constructors_test: MissingCompileTimeError
 multiline_newline_test/04: MissingCompileTimeError
 multiline_newline_test/04r: MissingCompileTimeError
diff --git a/tests/language_2/regress_33009_lib.dart b/tests/language_2/regress_33009_lib.dart
new file mode 100644
index 0000000..28afdbb
--- /dev/null
+++ b/tests/language_2/regress_33009_lib.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class I<T> {
+  T get foo => _foo;
+  T _foo = null;
+}
diff --git a/tests/language_2/regress_33009_test.dart b/tests/language_2/regress_33009_test.dart
new file mode 100644
index 0000000..7291ff0
--- /dev/null
+++ b/tests/language_2/regress_33009_test.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'regress_33009_lib.dart';
+
+class A implements I<dynamic> {
+  dynamic get foo => 1;
+}
+
+main() {}
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index cd95ea9..db296c2 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -21,13 +21,10 @@
 mirrors/generic_bounded_test/01: MissingCompileTimeError
 mirrors/generic_bounded_test/02: MissingCompileTimeError
 mirrors/generic_interface_test/01: MissingCompileTimeError
-mirrors/generics_test/01: MissingCompileTimeError
 mirrors/metadata_allowed_values_test/13: MissingCompileTimeError
 mirrors/metadata_allowed_values_test/14: MissingCompileTimeError
-mirrors/reflected_type_classes_test/01: MissingCompileTimeError
 mirrors/reflected_type_classes_test/02: MissingCompileTimeError
 mirrors/reflected_type_classes_test/03: MissingCompileTimeError
-mirrors/reflected_type_test/01: MissingCompileTimeError
 mirrors/reflected_type_test/02: MissingCompileTimeError
 mirrors/reflected_type_test/03: MissingCompileTimeError
 mirrors/variable_is_const_test/01: MissingCompileTimeError
@@ -181,11 +178,9 @@
 mirrors/redirecting_factory_test/02: RuntimeError
 mirrors/redirecting_factory_test/none: RuntimeError
 mirrors/reflect_class_test/none: RuntimeError
-mirrors/reflected_type_classes_test/01: RuntimeError
 mirrors/reflected_type_function_type_test: RuntimeError
 mirrors/reflected_type_generics_test/01: RuntimeError
 mirrors/reflected_type_generics_test/02: RuntimeError
-mirrors/reflected_type_test/01: RuntimeError
 mirrors/reflected_type_typedefs_test: RuntimeError
 mirrors/reflected_type_typevars_test: RuntimeError
 mirrors/regress_26187_test: RuntimeError
@@ -348,6 +343,7 @@
 [ $fasta && !$strong ]
 isolate/isolate_import_test/01: MissingCompileTimeError
 isolate/isolate_stress_test: CompileTimeError
+mirrors/generics_test/01: MissingCompileTimeError
 mirrors/metadata_allowed_values_test/02: MissingCompileTimeError
 mirrors/metadata_allowed_values_test/27: MissingCompileTimeError
 mirrors/metadata_constructor_arguments_test/04: MissingCompileTimeError
@@ -355,6 +351,8 @@
 mirrors/redirecting_factory_different_type_test/01: MissingCompileTimeError
 mirrors/reflect_class_test/01: MissingCompileTimeError
 mirrors/reflect_class_test/02: MissingCompileTimeError
+mirrors/reflected_type_classes_test/01: MissingCompileTimeError
+mirrors/reflected_type_test/01: MissingCompileTimeError
 mirrors/regress_16321_test/01: MissingCompileTimeError
 mirrors/top_level_accessors_test/01: MissingCompileTimeError
 typed_data/float32x4_static_test: MissingCompileTimeError
diff --git a/tools/VERSION b/tools/VERSION
index 0a3d56d..9095694 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 0
 PATCH 0
-PRERELEASE 51
+PRERELEASE 52
 PRERELEASE_PATCH 0
diff --git a/tools/infra/config/cq.cfg b/tools/infra/config/cq.cfg
index cb94e5f..2bf13e2 100644
--- a/tools/infra/config/cq.cfg
+++ b/tools/infra/config/cq.cfg
@@ -19,22 +19,23 @@
   try_job {
     buckets {
       name: "luci.dart.try"
-      builders { name: "analyzer-linux-release-strong-hostchecked-try"}
-      builders { name: "vm-canary-linux-debug-try"}
-      builders { name: "vm-linux-release-x64-try"}
-      builders { name: "vm-mac-release-x64-try"}
-      builders { name: "dart2js-linux-d8-hostchecked-try"}
-      builders { name: "dart2js-linux-d8-kernel-minified-try"}
-      builders { name: "dart2js-linux-none-only-unittest-try"}
-      builders { name: "dart2js-linux-x64-chrome-try"}
-      builders { name: "pkg-linux-release-try"}
-      builders { name: "ddc-linux-release-chrome-try"}
-      builders { name: "vm-linux-product-x64-try"}
-      builders { name: "dart-sdk-windows-try"}
-      builders { name: "vm-kernel-legacy-linux-release-x64-try"}
-      builders { name: "vm-kernel-mac-release-x64-try"}
-      builders { name: "benchmark-linux-try"}
-      builders { name: "front-end-linux-release-x64-try"}
+      builders { name: "analyzer-linux-release-strong-hostchecked-try" }
+      builders { name: "benchmark-linux-try" }
+      builders { name: "dart-sdk-windows-try" }
+      builders { name: "dart2js-linux-d8-hostchecked-try" }
+      builders { name: "dart2js-linux-d8-kernel-minified-try" }
+      builders { name: "dart2js-linux-none-only-unittest-try" }
+      builders { name: "dart2js-linux-x64-chrome-try" }
+      builders { name: "ddc-linux-release-chrome-try" }
+      builders { name: "front-end-linux-release-x64-try" }
+      builders { name: "pkg-linux-release-try" }
+      builders { name: "vm-canary-linux-debug-try" }
+      builders { name: "vm-kernel-legacy-linux-release-x64-try" }
+      builders { name: "vm-kernel-mac-release-x64-try" experiment_percentage: 100 }
+      builders { name: "vm-kernel-linux-release-x64-try" }
+      builders { name: "vm-linux-product-x64-try" }
+      builders { name: "vm-linux-release-x64-try" }
+      builders { name: "vm-mac-release-x64-try" }
     }
     try_job_retry_config {
       try_job_retry_quota: 0
diff --git a/tools/sdks/linux/dart-sdk.tar.gz.sha1 b/tools/sdks/linux/dart-sdk.tar.gz.sha1
index 0e891a6..69598a2 100644
--- a/tools/sdks/linux/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/linux/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-2bb209191a1e2928b322636727c681cc0c3cf825
\ No newline at end of file
+7e1de2bcab2ea482aa9b4d955cab201913878c78
diff --git a/tools/sdks/mac/dart-sdk.tar.gz.sha1 b/tools/sdks/mac/dart-sdk.tar.gz.sha1
index d5aa942..60dba1a 100644
--- a/tools/sdks/mac/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/mac/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-32908822cad77ec2ea148440cc6f99d172f477dc
\ No newline at end of file
+2329404025ecfec4b51319427100e55bc14fd96f
\ No newline at end of file
diff --git a/tools/sdks/win/dart-sdk.tar.gz.sha1 b/tools/sdks/win/dart-sdk.tar.gz.sha1
index 7d2efd4..952fc08 100644
--- a/tools/sdks/win/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/win/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-e8959966bba1424ac2573d15caff499281cb7d87
\ No newline at end of file
+552657620bcb08d2c45b32af33c2b3d988494b4b
\ No newline at end of file
diff --git a/tools/testing/dart/browser_test.dart b/tools/testing/dart/browser_test.dart
index 19b39a7..4c2d536 100644
--- a/tools/testing/dart/browser_test.dart
+++ b/tools/testing/dart/browser_test.dart
@@ -40,8 +40,7 @@
 /// The [testName] is the short name of the test without any subdirectory path
 /// or extension, like "math_test". The [testJSDir] is the relative path to the
 /// build directory where the dartdevc-generated JS file is stored.
-String dartdevcHtml(String testName, String testJSDir, String buildDir,
-    {bool syncAsync}) {
+String dartdevcHtml(String testName, String testJSDir, String buildDir) {
   var packagePaths = testPackages
       .map((package) => '    "$package": "/root_dart/$buildDir/gen/utils/'
           'dartdevc/pkg/$package",')
@@ -87,7 +86,6 @@
 requirejs(["$testName", "dart_sdk", "async_helper"],
     function($testName, sdk, async_helper) {  
   sdk.dart.ignoreWhitelistedErrors(false);
-  if ($syncAsync) sdk.dart.setStartAsyncSynchronously();
   // TODO(rnystrom): This uses DDC's forked version of async_helper. Unfork
   // these packages when possible.
   async_helper.async_helper.asyncTestInitialize(function() {});
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 25e8a79..479c94f 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -1062,7 +1062,7 @@
         // Always run with synchronous starts of `async` functions.
         // If we want to make this dependent on other parameters or flags,
         // this flag could be become conditional.
-        content = dartdevcHtml(nameNoExt, jsDir, buildDir, syncAsync: true);
+        content = dartdevcHtml(nameNoExt, jsDir, buildDir);
       }
     }